Skip to main content
kuaishou avatar

Kling 3.0 Motion Control API

kuaishou/kling-video/v3/motion-control

Transfer motion and facial expression from a driving video onto a character image, animating your character to perform the reference movements.

0.168 per second of output video

Model Input

Input

Reference character/appearance image. The generated character keeps this identity and look.

Reference/driving video whose character actions and facial expressions the output follows. Max 30s when character_orientation is 'video', 10s when 'image'.

Whether the output character's orientation and framing match the reference image ('image') or the driving video ('video').

Optional text guidance to steer the motion or scene.

Additional Settings

Customize your input with more control.

Keep the driving video's original audio in the generated video.

You need to be logged in to run this model and view results.
Log in

Model Output

Output

Loading
Generated in 167.339 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1Example output 2

Kling 3.0 Motion Control API

Kling 3.0 Motion Control is a video-to-video AI model by kuaishou. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.168 per second of video.

POST https://queue.modelrunner.run/kuaishou/kling-video/v3/motion-control

cURL

# Submit a request to the queue. Input fields go at the top level of the
# body. The optional reserved "metadata" object holds your own flat string
# tags — stored on the request, never sent to the model; filter later with
# GET https://queue.modelrunner.run/requests?metadata=<url-encoded JSON>.
curl -X POST https://queue.modelrunner.run/kuaishou/kling-video/v3/motion-control \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "the man speaks warmly to the camera with natural head movement",
    "image_url": "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg",
    "video_url": "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4",
    "keep_original_sound": false,
    "character_orientation": "image",
    "metadata": {
      "project": "my-project"
    }
  }'
# → { "request_id": "...", "status_url": "...", "response_url": "..." }

# Poll status_url until "COMPLETED", then fetch the result
curl "https://queue.modelrunner.run/kuaishou/kling-video/v3/motion-control/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/kuaishou/kling-video/v3/motion-control/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("kuaishou/kling-video/v3/motion-control", {
  input: {
    "prompt": "the man speaks warmly to the camera with natural head movement",
    "image_url": "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg",
    "video_url": "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4",
    "keep_original_sound": false,
    "character_orientation": "image"
  },
});
console.log(result);

Python

import os
import requests

headers = {"Authorization": f"Key {os.environ['MRUN_API_KEY']}"}

submitted = requests.post(
    "https://queue.modelrunner.run/kuaishou/kling-video/v3/motion-control",
    headers=headers,
    json={
      "prompt": "the man speaks warmly to the camera with natural head movement",
      "image_url": "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg",
      "video_url": "https://media.modelrunner.ai/m7GgVU46xQgWaPJGl3kD7.mp4",
      "keep_original_sound": false,
      "character_orientation": "image"
    },
).json()

# Poll submitted["status_url"] until "COMPLETED", then:
result = requests.get(submitted["response_url"], headers=headers).json()

Input parameters

NameTypeRequiredDescription
image_urlstring (uri)yesReference character/appearance image. The generated character keeps this identity and look.
video_urlstring (uri)yesReference/driving video whose character actions and facial expressions the output follows. Max 30s when character_orientation is 'video', 10s when 'image'.
character_orientationenumyesWhether the output character's orientation and framing match the reference image ('image') or the driving video ('video'). Default: "image".
promptstringnoOptional text guidance to steer the motion or scene.
keep_original_soundbooleannoKeep the driving video's original audio in the generated video. Default: true.

Machine-readable: OpenAPI schema · llms.txt

Use Kling 3.0 Motion Control from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Kling 3.0 Motion Control becomes a tool your assistant can call directly — it authorizes via OAuth (no API key in config) and runs this model with the run_model tool using the endpoint kuaishou/kling-video/v3/motion-control.

MCP client config (Claude Desktop, Cursor)

{
  "mcpServers": {
    "modelrunner": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.modelrunner.run/mcp"]
    }
  }
}

Claude Code

claude mcp add --transport http modelrunner https://mcp.modelrunner.run/mcp

Then ask your assistant, for example: “Run kuaishou/kling-video/v3/motion-control on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Kling 3.0 Motion Control is a video-to-video motion-transfer model: give it a reference character image and a driving video, and it extracts the character's actions, gestures, and facial expressions from the video and applies them to the character in your image, producing a new video in which your character performs the reference movements. This is motion control / motion transfer, not text-driven animation - the movement comes from a real driving clip, so timing and performance stay faithful to the source. Use `character_orientation` to choose whether the output follows the framing of your image or of the driving video, and add an optional `prompt` for extra steering.

## Best for - Motion control: animate a character or portrait using the movement in a driving video - Motion transfer: copy dance, gestures, or a full performance from a reference clip onto a still character - Making a specific character perform an existing action while keeping their identity and look - Talking or presenter-style clips where a source video drives both movement and expression

## Choose another model when - You want to animate a still image with motion described only by a text prompt and no driving video - use an image-to-video model - You want a clip generated purely from text with no reference image or video - use a text-to-video model - You need a single still image rather than a video - use a text-to-image model

## Tips - `character_orientation: 'image'` keeps your image's framing and caps the driving video at 10 seconds; `'video'` follows the driving video's framing and allows up to 30 seconds - Use a JPEG or WebP character image with a clear, front-facing subject; PNG sources are sometimes rejected - Pick a driving video with clear character motion and a visible face so both the movement and the expression transfer cleanly - `keep_original_sound` (default true) keeps the driving video's audio; turn it off for a silent result

To run via the ModelRunner JavaScript client: ```js import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("kuaishou/kling-video/v3/motion-control", { input: { image_url: "https://media.modelrunner.ai/qf7LUwPh7gD0iVj0lMoCF.jpeg", video_url: "https://media.modelrunner.ai/xCu3Uic8zYdc9dHfxmTCU.mp4", character_orientation: "image", prompt: "the person speaks and gestures naturally to the camera", }, }); ```