Introduction
Kling 2.6 Motion Control copies a driving video's moves, expressions and gestures onto a character from a still photo. Give it one clear picture of the person and a clip of 3 to 30 seconds showing the performance, and it returns a silent video at 720p or 1080p that runs exactly as long as the driving clip.
Choose a Kling 2.6 mode by starting material
| What you have at the start | Mode |
|---|---|
| a written scene | Kling 2.6 Text to video |
| an approved opening image | Kling 2.6 Image to video |
| a driving clip and a character photo | Kling 2.6 Motion Control |
Key features & highlights
The character's own photo wins on everything the driving clip doesn't dictate
In our test, a hip-hop routine performed by one dancer was mapped onto a different man in a navy three-piece suit: the moves matched step for step, and his suit, loafers, face and the concrete loft from his own photo all carried over, rather than the driving clip's plain studio background.
Silent output, length set by the driving clip
There is no audio field on this endpoint - the result renders silent - and no duration field either, since the output always matches the driving clip's length, from 3 to 30 seconds.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | No | Optional. Use it only for what the driving clip doesn't already show - the setting to keep, a detail of wardrobe, anything you want held constant. at most 2500 characters |
image_url | Yes | The character to animate: one clear, full or half-body picture of the person. JPEG or PNG only. |
video_url | Yes | Driving clip, 3 to 30 seconds: the moves, expressions and gestures to copy. The result is exactly as long as this clip and has no audio. |
resolution | No | 720p or 1080p. Higher tiers cost more per second. |
Pricing
Billed per second of the driving clip's length - the output runs exactly as long as your video input.
| Specification | Price |
|---|---|
| $0.069 / second |
| $0.112 / second |
Use cases
Reusing one performance across several characters
Shoot or generate a single driving clip once, then run it against different character photos to recast the same routine, walk or gesture without re-animating it from scratch each time.
Adding motion to a still character design
Bring a character you've already designed or generated to life with an existing performance, when you need the movement to look deliberate rather than freeform.
Prompt guide & pro tips
Say what to keep, not what to copy
The driving clip already carries the moves, expressions and gestures - the prompt field is for anything it can't show, most often which setting to keep: the character's own room, rather than the one in the driving clip.
Match the driving clip and the photo in framing
Our test paired a full-body driving clip with a full-body character photo. A close framing mismatch between the two - a half-body photo driven by a full-body clip, for instance - is the kind of input worth testing at low resolution first.
Check both inputs are wide enough
Both the character photo and the driving clip need roughly 720 pixels or more on each side; a driving clip below that gets rejected before the job starts, not after you have paid for it. Check both dimensions on the driving clip, since a video can pass on width and still fail on height if it was shot in an unusual crop.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "kling/2.6/character-animation",
"input": {
"image_url": "https://example.com/reference.png",
"prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
"resolution": "720p",
"video_url": "https://example.com/reference.mp4"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.











