The silver-haired senior woman in the flowing white tai chi uniform performs the slow, continuous tai chi routine from the reference video in a quiet misty park, keeping her face, hairstyle and identity perfectly consistent, soft morning light, green trees in the background
Kling 2.6 Standard Motion Control API
kwaivgi/kling-v2.6-std/motion-controlKling 2.6 Standard Motion Control (Motion-Control) transforms a character image and reference video into 720p motion-transfer clips, with full-body tracking, precise timing retention, and prompt-guided scene control. It preserves facial features, proportions, and character identity while applying complex reference actions such as dance, martial arts, and athletic movement.
Drag and drop files, paste from clipboard, or provide a URL.
1/1 files added
Drag and drop files, paste from clipboard, or provide a URL.
1/1 files added
Examples
REST API
Quick Start
Authenticate, submit a valid input object, then use task_id to retrieve the video.
Connect to the Vidgo API
Create an API key, keep it only on your server, and send Authorization: Bearer VIDGO_API_KEY.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Run the smallest valid payload for this workflow. The model must be kwaivgi/kling-v2.6-std/motion-control. A successful submission immediately returns task_id without waiting for the video.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v2.6-std/motion-control",
"input": {
"prompt": "The silver-haired senior woman in the flowing white tai chi uniform performs the slow, continuous tai chi routine from the reference video in a quiet misty park, keeping her face, hairstyle and identity perfectly consistent, soft morning light, green trees in the background",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v2.6-std/motion-control/v1/02/input-image.png"
],
"video_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v2.6-std/motion-control/v1/02/input-video.mp4"
],
"character_orientation": "image",
"resolution": "720p"
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Wait for the result
Query with task_id, continue for not_started/running, and stop for finished/failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll about every 2 seconds, then back off gradually. Continue only for not_started or running and stop on finished or failed. You can instead add callback_url to the same top-level request contract.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "running",
"created_time": "2025-12-25T10:59:37Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete runnable example
Expand for a complete script with HTTP and business-code checks, task_id validation, polling, terminal-state handling, and a timeout boundary.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v2.6-std/motion-control",
"input": {
"prompt": "The silver-haired senior woman in the flowing white tai chi uniform performs the slow, continuous tai chi routine from the reference video in a quiet misty park, keeping her face, hairstyle and identity perfectly consistent, soft morning light, green trees in the background",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v2.6-std/motion-control/v1/02/input-image.png"
],
"video_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v2.6-std/motion-control/v1/02/input-video.mp4"
],
"character_orientation": "image",
"resolution": "720p"
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneInput parameters
These are the fields accepted inside input. The request example shows the required top-level model field.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | No | — | Optional; null, empty, and whitespace-only prompts are treated as omitted. Nonempty text is trimmed and limited to 2,500 characters. |
| image_urls | array | Yes | — | Single character image URL (JPEG, PNG, WEBP, max 10MB). Exactly one URL. |
| video_urls | array | Yes | — | Single reference video URL (MP4, MOV, MKV, max 100MB). Exactly one URL. |
| character_orientation | string | Yes | — | Character orientation mode. image or video. |
| resolution | string | No | 720p | Optional; defaults to 720p. Explicit values must be 720p. |
Response Fields
Submission returns task identity immediately. Status responses add progress, every output file, or a failure message.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code; successful responses use 0 or 200. |
| message | string | Human-readable message or error detail when present. |
| data.task_id | string | Task ID used in the status endpoint path. |
| data.status | string | not_started, running, finished, or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | integer | Task progress from 0 to 100, when included in the response. |
| data.files[] | array | All output files from a successful task, in response order. |
| data.files[].file_url | string | Public URL for a generated video. |
| data.files[].file_type | string | File type, such as video. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Treat not_started and running as non-terminal states. finished and failed are terminal alternatives; stop polling when either is returned.
not_startedThe task was accepted and is waiting to begin.
runningGeneration is in progress. Continue polling the same task_id.
finishedGeneration succeeded. Read every video URL from data.files[].file_url.
failedGeneration stopped with an error. Read data.error_message and stop polling.
Polling and Errors
- AuthenticationA 401 response means the Bearer API key is missing or invalid. Correct it before retrying.
- ValidationA 400 response identifies an invalid field, unsupported media key, or insufficient credit balance. Correct the request before resubmitting.
- Network and timeoutA transport failure is different from a failed task. Retry status checks with a bounded timeout before deciding that the task failed.
- Polling intervalStart around every 2 seconds and increase the interval gradually for a long-running task.
- Terminal statesContinue only for not_started or running. Stop immediately on finished or failed.
- Callback optionProvide callback_url at the request top level to receive the final flat task object; polling remains available if delivery fails.
Endpoint limits
| Specification | Value | Details |
|---|---|---|
| Input mode | 1 image + 1 video | image_urls and video_urls each require exactly one URL. prompt is optional. |
| Output | Video task | The endpoint returns an asynchronous task ID. |
| Resolution | 720p | Required and fixed by model ID kwaivgi/kling-v2.6-std/motion-control. |
| Reference duration | 3–10s / 3–30s | image orientation: 3–10 seconds. video orientation: 3–30 seconds. Do not send duration; the backend probes the file. |
| Billing basis | 8 credits/sec | Credits = ceil(detected seconds × 8); multiply by the per-second rate before rounding the total credits up. |
Related Models
Kling 2.6 Standard Motion Control — Frequently asked questions
What is Kling 2.6 Standard Motion Control (Motion-Control) API?
Kling 2.6 Standard Motion Control is Kuaishou's model for transferring motion from a reference video onto a character image, producing 720p clips billed at 8 credits per second. From one character image, one reference video, and an optional scene prompt, it delivers full-body tracking, precise timing retention, and prompt-guided environment control. Built on skeletal tracking and identity-aware mapping, it preserves facial features and proportions while applying the reference performance's gestures, weight shifts, and body mechanics. You can call it programmatically or try it from the playground above.
How accurate is Kling 2.6 Standard Motion Control tracking?
It delivers full-body motion tracking that mirrors reference timing, facial expression, and limb coordination. Use a clear character image with visible head, shoulders, and torso, plus a reference video where the subject remains unobstructed, so tracking can follow the performance closely.
Does Kling 2.6 Standard Motion Control support complex motions?
Yes. It handles demanding patterns such as martial arts, dance choreography, athletic drills, and multi-limb transitions. Choose character_orientation video when spatial orientation should follow the reference clip for complex full-body performances.
What resolution does Kling 2.6 Standard Motion Control output?
This endpoint outputs 720p only. Resolution is optional and defaults to 720p for model kwaivgi/kling-v2.6-std/motion-control, making it a cost-efficient tier for iteration and portrait-to-action workflows.
How long can Kling 2.6 Standard Motion Control reference videos run?
Reference videos must be at least 3 seconds. With character_orientation set to image, the clip can run up to 10 seconds; with video, up to 30 seconds. Do not send duration—the backend probes the reference file and bills by that probed length.
How does Kling 2.6 Standard Motion Control pricing differ from Pro?
Standard 720p costs 8 credits/sec; Pro 1080p costs 12 credits/sec. Both multiply detected seconds by the rate before rounding total credits up. A 5.2-second clip costs 42 credits on Standard or 63 on Pro.
Can Kling 2.6 Standard Motion Control preserve character identity?
Yes. The model maps reference motion onto your character while keeping facial features, proportions, and overall look consistent across the clip. Clear, well-framed character images give the strongest identity retention during transfer.
Which character_orientation mode should Kling 2.6 Standard Motion Control use?
Use image when the output should match the photograph's facing direction and you want stronger camera-follow behavior within a 10-second window. Use video when orientation should follow the reference clip for complex motions up to 30 seconds.















