The character performs the dance moves from the reference video, keeping her watercolor style and identity consistent.
Kling 3.0 std Motion Control API
kwaivgi/kling-v3.0-std/motion-controlKling 3.0 (std Motion Control) transforms one character image and one reference video into identity-locked 720p motion-transfer video, with precise action-trajectory transfer and temporal continuity. It preserves the character's facial details, clothing features, and body proportions while applying the reference video's motion range, pacing, and scene interaction.
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-v3.0-std/motion-control. A successful submission immediately returns task_id without waiting for the video.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v3.0-std/motion-control",
"input": {
"prompt": "The character performs the dance moves from the reference video, keeping her watercolor style and identity consistent.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3.0-std/motion-control/v1/01/input-image.png"
],
"video_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3.0-std/motion-control/v1/01/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": "2026-03-11T04:23:18Z"
}
}{
"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-v3.0-std/motion-control",
"input": {
"prompt": "The character performs the dance moves from the reference video, keeping her watercolor style and identity consistent.",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3.0-std/motion-control/v1/01/input-image.png"
],
"video_urls": [
"https://cdn.vidgo.ai/apis/models/kwaivgi/kling-v3.0-std/motion-control/v1/01/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 | — | Reference image URL array. Only one image is supported. Supports JPG, JPEG, PNG, max 10MB. |
| video_urls | array | Yes | — | Reference video URL array. Only one video is supported. Supports MP4, MOV, max 100MB. |
| character_orientation | string | Yes | — | Character orientation mode. image or video. |
| resolution | string | No | 720p | Output resolution. This model ID accepts 720p only. Do not send resolution to switch tiers. |
| kling_elements | array | No | — | Optional facial consistency element definitions. Only available when character_orientation is video. Only 1 element is supported and can be referenced in the prompt as @Element1. When an element is provided, both frontal_image_url and reference_image_urls are required. |
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 | Fixed by model ID kwaivgi/kling-v3.0-std/motion-control. Do not send resolution to switch tiers. |
| 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 | 9 credits/sec | Credits = ceil(detected seconds × 9); multiply by the per-second rate before rounding the total credits up. |
Related Models
Kling 3.0 std Motion Control — Frequently Asked Questions
What is the Kling 3.0 std Motion Control API?
Kling 3.0 std Motion Control is a Kuaishou (Kwai VGI) model for reference-driven video motion transfer. It turns one character image and one reference video into identity-locked 720p motion-transfer video, with precise action-trajectory transfer and temporal continuity. Built for visual motion migration, it preserves facial details, clothing features, and body proportions while applying the reference clip's motion range, pacing, and scene interaction. You can call it programmatically or try it from the playground above.
How should Kling 3.0 std Motion Control use character_orientation?
Choose image when you want the output character to keep the reference image's facing and staging, which fits fixed-subject poses and camera-led takes within a 3–10 second reference clip. Choose video when the character should follow the reference video's orientation and camera path, which suits complex full-body action and unlocks optional kling_elements for multi-angle facial detail within a 3–30 second clip.
What reference video duration does Kling 3.0 std Motion Control accept?
Reference video length must be at least 3 seconds. When character_orientation is image, the clip can run up to 10 seconds; when it is video, the clip can run up to 30 seconds. Output length follows the probed reference-video duration, so prepare clips inside those windows before you submit.
When should I choose Kling 3.0 std Motion Control 720p?
Use std Motion Control when you need fast 720p iteration for identity-locked animation, prompt tuning, and motion validation. For sharper client-facing delivery, switch to Kling 3.0 pro Motion Control, which keeps the same image-plus-video contract at 1080p.
How is Kling 3.0 std Motion Control billed per second?
Credits = ceil(detected seconds × 9); multiply by the per-second rate before rounding the total credits up. For example, 5.2 seconds costs 47 credits.
How can Kling 3.0 std Motion Control keep character consistency stable?
Start with a clear single-character image that shows face, outfit, and body proportions without obstruction, and pair it with a reference video where the full body or upper body plus head stay visible through the action. Keep one image and one video in the request, and describe scene context in the optional prompt when you need tighter staging guidance.
How do kling_elements improve facial consistency in Kling 3.0 std Motion Control?
When character_orientation is video, you can attach one facial consistency element through kling_elements, referenced in the prompt as @Element1. Provide both frontal_image_url and reference_image_urls for that element so multi-angle face detail stays anchored while the body follows the reference performance.
Can Kling 3.0 std Motion Control be used for commercial projects?
Commercial use is subject to the applicable model license and Vidgo service terms. Generated videos can support client work, marketing, training materials, and professional production pipelines that need identity-locked motion transfer.















