Kling 2.6 Motion Control
kwaivgi/kling-v2.6/motion-control
Kling 2.6 Motion Control turns reference motion clips (dance, action, gesture) into smooth, realistic animations. Upload a character image (or source video) and a motion video; the model transfers the movement while preserving identity and temporal consistency.
Examples
Parameters
| Name | Type | Default | Constraints | Description |
|---|---|---|---|---|
| image *Character Image | image_upload | — | image/jpeg,image/jpg,image/png · 0–1 items | Upload a character image. Supported formats: .jpg/.jpeg/.png. Max file size: 10MB. Min dimensions: 300x300px. Aspect ratio: 1:2.5 to 2.5:1. |
| character_orientationCharacter Orientation | select | image | image | video | Choose whether to use an image or video as the character source. |
| promptPrompt | text | — | ≤ 500 chars | Optional positive prompt for the generation. |
| negative_promptNegative Prompt | text | — | ≤ 500 chars | Optional negative prompt for the generation. |
| resolutionGeneration Mode | select | 1080P | 720P | 1080P | |
| keep_original_soundKeep Original Sound | boolean | true | — | Whether to retain the original video sound in the output. |
API
Call this model through one unified REST API. Get a key on the API Keys page.
cURL
# 1) Submit — returns { "task_uuid": "..." }
curl -X POST "https://www.namifusion.com/api/v1/marketplace/run/kwaivgi/kling-v2.6/motion-control" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": {
"image": [
"https://assets.namifusion.com/uploads/image/e6d71928-36de-4d71-a26c-9b1b427a6dfd/2026-03-27/0847e5142a20.jpg?imageMogr2/thumbnail/600x/format/webp/quality/85"
],
"character_orientation": "image",
"resolution": "1080P",
"keep_original_sound": true
}
}'
# 2) Poll until status is "completed", then read the output URLs
curl "https://www.namifusion.com/api/v1/marketplace/run/tasks/TASK_UUID" \
-H "Authorization: Bearer YOUR_API_KEY"Python
import time, requests
API_KEY = "YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# 1) Submit
resp = requests.post(
"https://www.namifusion.com/api/v1/marketplace/run/kwaivgi/kling-v2.6/motion-control",
headers=HEADERS,
json={
"input": {
"image": [
"https://assets.namifusion.com/uploads/image/e6d71928-36de-4d71-a26c-9b1b427a6dfd/2026-03-27/0847e5142a20.jpg?imageMogr2/thumbnail/600x/format/webp/quality/85"
],
"character_orientation": "image",
"resolution": "1080P",
"keep_original_sound": True
}
},
)
resp.raise_for_status() # 401/402/429/5xx stop here instead of polling a bad task
task = resp.json()
# 2) Poll until a terminal state (completed / failed / cancelled).
# This model is allowed up to 600s server-side.
deadline = time.time() + 660
while task.get("status") not in ("completed", "failed", "cancelled"):
if time.time() > deadline:
raise TimeoutError(f"still {task.get('status')} — keep the task_uuid and poll later")
time.sleep(3)
poll = requests.get(f"https://www.namifusion.com/api/v1/marketplace/run/tasks/{task['task_uuid']}", headers=HEADERS)
poll.raise_for_status()
task = poll.json()
print(task["status"], task.get("output"))JavaScript
const API_KEY = "YOUR_API_KEY";
const HEADERS = { Authorization: `Bearer ${API_KEY}` };
// 1) Submit
const resp = await fetch("https://www.namifusion.com/api/v1/marketplace/run/kwaivgi/kling-v2.6/motion-control", {
method: "POST",
headers: { ...HEADERS, "Content-Type": "application/json" },
body: JSON.stringify({
"input": {
"image": [
"https://assets.namifusion.com/uploads/image/e6d71928-36de-4d71-a26c-9b1b427a6dfd/2026-03-27/0847e5142a20.jpg?imageMogr2/thumbnail/600x/format/webp/quality/85"
],
"character_orientation": "image",
"resolution": "1080P",
"keep_original_sound": true
}
}),
});
if (!resp.ok) throw new Error(`submit failed: ${resp.status} ${await resp.text()}`);
let task = await resp.json();
// 2) Poll until a terminal state (completed / failed / cancelled).
// This model is allowed up to 600s server-side.
const deadline = Date.now() + 660 * 1000;
while (!["completed", "failed", "cancelled"].includes(task.status)) {
if (Date.now() > deadline) throw new Error(`still ${task.status} — keep the task_uuid and poll later`);
await new Promise((r) => setTimeout(r, 3000));
const poll = await fetch(`https://www.namifusion.com/api/v1/marketplace/run/tasks/${task.task_uuid}`, { headers: HEADERS });
if (!poll.ok) throw new Error(`poll failed: ${poll.status}`);
task = await poll.json();
}
console.log(task.status, task.output);Documentation
NamiFusion Kling 2.6 Motion Control
AI motion-controlled video generation: upload a character image and a motion reference video to create an animated video that preserves the character's identity.
NamiFusion Kling 2.6 Motion Control is a video generation service designed for motion transfer scenarios. It takes a character image and a motion reference video, transfers the dance, action, or gesture from the reference video onto the target character, and outputs a result video with better identity consistency and temporal coherence.
Key Features
- Motion Transfer: Transfer body movements from a reference video to a target character, suitable for dance, performance, and action demonstration scenarios.
- Character Consistency: Uses the character image as the visual subject of the generated video and preserves the person's appearance and identity features as much as possible.
- Optional Prompt Control: Supports
promptandnegative_promptto provide additional guidance for style and undesired content. - Async Tasks: Returns a
task_uuidafter submission, and you can retrieve processing status and final results through polling.
Technical Specifications
| Parameter | Details |
|---|---|
| Model ID | kwaivgi/kling-v2.6-pro/motion-control |
| Request Method | Async POST (submit task + poll for results) |
| Input | Character image URL + motion reference video URL |
| Output | Generated video URL |
| Processing Time | Typically tens of seconds to several minutes, with a maximum polling wait time of 10 minutes |
| Pricing | $0.07 / second for 720P, $0.112 / second for 1080P, minimum charge of 3 seconds |
Quick Start
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/v1/marketplace/run/kwaivgi/kling-v2.6/motion-control | POST | Submit a motion control task |
/api/v1/marketplace/run/tasks/{task_uuid} | GET | Query task status and results |
Authentication
Include your API Key in the request header:
X-API-Key: sk-your-api-key
Usage Example
Step 1: Submit a Task
curl -X POST "https://www.namifusion.com/api/v1/marketplace/run/kwaivgi/kling-v2.6/motion-control" \
-H "X-API-Key: sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"input": {
"image": "https://static.example.com/character.png",
"video": "https://static.example.com/motion.mp4",
"character_orientation": "image",
"prompt": "full body, natural motion, cinematic lighting",
"negative_prompt": "blur, distortion, extra limbs, low quality",
"keep_original_sound": true
}
}'
Response Example:
{
"task_uuid": "443ea3cd-4025-40d2-901f-ef18970dbc43",
"status": "pending",
"cost_credits": 0
}
Step 2: Poll Task Status
curl -X GET "https://www.namifusion.com/api/v1/marketplace/run/tasks/443ea3cd-4025-40d2-901f-ef18970dbc43" \
-H "X-API-Key: sk-your-api-key"
Processing:
{
"task_uuid": "443ea3cd-4025-40d2-901f-ef18970dbc43",
"status": "processing"
}
Completed:
{
"task_uuid": "443ea3cd-4025-40d2-901f-ef18970dbc43",
"model_id": "kwaivgi/kling-v2.6-pro/motion-control",
"status": "completed",
"output": {
"video_url": "https://cdn.example.com/results/kling_motion_control_output.mp4"
},
"cost_credits": 0,
"created_at": "2026-03-27T11:40:00Z",
"completed_at": "2026-03-27T11:41:20Z"
}
Python Example
import requests
import time
API_KEY = "sk-your-api-key"
BASE_URL = "https://www.namifusion.com/api/v1/marketplace/run"
HEADERS = {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
}
payload = {
"input": {
"image": "https://static.example.com/character.png",
"video": "https://static.example.com/motion.mp4",
"character_orientation": "image",
"prompt": "full body, natural motion, cinematic lighting",
"negative_prompt": "blur, distortion, extra limbs, low quality",
"keep_original_sound": True,
}
}
submit_resp = requests.post(
f"{BASE_URL}/kwaivgi/kling-v2.6-pro/motion-control",
headers=HEADERS,
json=payload,
)
submit_resp.raise_for_status()
task = submit_resp.json()
task_uuid = task["task_uuid"]
print(f"Task submitted: {task_uuid}")
while True:
status_resp = requests.get(
f"{BASE_URL}/tasks/{task_uuid}",
headers=HEADERS,
)
status_resp.raise_for_status()
result = status_resp.json()
status = result["status"]
print(f"Status: {status}")
if status == "completed":
print("Result:", result["output"]["video_url"])
break
if status == "failed":
print("Failed:", result.get("error_message", "Unknown error"))
break
time.sleep(5)
Detailed Parameters and Return Values
Request Parameters
The request body is JSON, and all parameters are placed inside the input object:
{
"input": {
"image": "https://...",
"video": "https://...",
"character_orientation": "image",
"prompt": "full body, natural motion",
"negative_prompt": "blur, low quality",
"keep_original_sound": true
}
}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
image | string | Yes | - | Character image URL. Supports .jpg, .jpeg, and .png, with a maximum file size of 10MB, minimum dimensions of 300x300, and an aspect ratio range from 1:2.5 to 2.5:1. |
video | string | Yes | - | Motion reference video URL. Supports .mp4 and .mov, with a maximum file size of 10MB, minimum dimensions of 300x300, and an aspect ratio range from 1:2.5 to 2.5:1. |
character_orientation | string | No | "image" | Character source type. The current model configuration uses image as the default. Supported values: image, video. |
prompt | string | No | null | Optional positive prompt for describing motion style, camera mood, character expression, and similar guidance. Maximum length is 500 characters. |
negative_prompt | string | No | null | Optional negative prompt for constraining unwanted content. Maximum length is 500 characters. |
keep_original_sound | boolean | No | true | Whether to preserve the original audio from the motion reference video. |
Task Status
After submitting the task, query its status by polling. A 5-second polling interval is recommended:
| Status | Description |
|---|---|
pending | The task has been created and is waiting to be processed. |
processing | The task is being processed. |
completed | The task is completed, and the result video URL is available in output.video_url. |
failed | The task failed. Check error_message for the reason. |
Return Value Structure
Task Submission Response
| Field | Type | Description |
|---|---|---|
task_uuid | string | Unique task identifier used for later status queries. |
status | string | Initial task status, usually pending. |
cost_credits | number | Credits consumed by this task. |
Task Completion Response
| Field | Type | Description |
|---|---|---|
task_uuid | string | Unique task identifier. |
model_id | string | Model ID (kwaivgi/kling-v2.6-pro/motion-control). |
status | string | Task status. |
output.video_url | string | Generated result video URL. |
cost_credits | number | Credits consumed. |
created_at | string | Task creation time (ISO 8601). |
completed_at | string | Task completion time (ISO 8601). |
error_message | string | Error message, returned only when failed. |
How Parameters Affect the Output
| Parameter | Effect on Output |
|---|---|
image | Determines the appearance of the main character in the final video. A clear character image with no occlusion and complete framing is recommended. |
video | Provides the motion trajectory and rhythm reference. Clearer movement and a more prominent subject usually lead to more stable transfer results. |
prompt | Adds guidance for camera style, motion atmosphere, clothing details, or scene tendencies, but does not replace the reference motion itself. |
negative_prompt | Helps reduce issues such as blur, distortion, extra limbs, and low-quality details. |
keep_original_sound: true | The output video preserves the original sound from the reference video as much as possible, making it more suitable for dance and performance scenarios. |
keep_original_sound: false | The output video does not preserve the original sound from the reference video, making it more suitable for later audio replacement or editing. |
Notes
- Input URLs must be publicly accessible: Both
imageandvideoshould be public URLs that the server can download directly. - Using an image as the character input is recommended: The current model configuration defaults to
character_orientation: "image", which is also the most stable and clearly defined integration method. - Keep prompts concise and specific:
promptandnegative_promptwork best as supplemental guidance. Avoid stacking too many conflicting descriptions. - A 5-second polling interval is recommended: This model uses async task processing. Query the task status every 5 seconds, with a maximum wait time of 600 seconds.
- The result field is a single video URL: After task completion, read the result from
output.video_urlrather than from an array field likevideos.