# Kling Video · v3 · Pro · Motion Control API

> Pro tier motion transfer that applies a reference video's character movement to a character image

Combines a character image in `image_url` with movements from a reference video in `video_url`. `character_orientation` is required and chooses whether orientation follows the image or the video. An optional `prompt` up to 2500 characters is supported, `keep_original_sound` retains the reference audio, and one facial element can be bound through `elements` to help preserve identity.

- Model id: `kling-video/v3/pro/motion-control`
- Made by: Kling
- Category: Video to Video
- Output: video
- Price per second of your input video: $0.168 / second of input video (cheapest run $0.168 (168 API credits))
- Run: `POST https://api.doitong.com/v1/run/kling-video/v3/pro/motion-control`
- Quote: `POST https://api.doitong.com/v1/quote/kling-video/v3/pro/motion-control`
- Docs page: https://doitong.com/developers/models/kling-video/v3/pro/motion-control

## Pricing

Price: **$0.168 / second of input video**. Price per second of your input video: the input files are measured before the run (length, resolution, frame rate). The quote measures the same files and is exactly what the run charges.

The full example input below costs $1.68 = 1680 API credits (10 s input video × $0.168).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/kling-video/v3/pro/motion-control` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `enable_safety_checker` |  | boolean | no | `true` |  | Safety checks can be disabled only with account authorization; requests without authorization always undergo checking. |
| `prompt` |  | string \| null | no |  | ≤ 2500 characters |  |
| `image_url` | `image` | string (image URL) | yes |  |  | Reference-image URL for video generation, with a file-size ceiling of 10.0MB, width and height each from 340px to 3850px, and aspect ratio from 0.40 to 2.50. This image guides the video's characters, backgrounds, and other elements. For characters, ensure clear body proportions, no occlusion, and coverage exceeding 5% of the image area. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL pointing to the video whose character actions guide the output; it should show an unobstructed, realistic-style character with the head and either the full body or upper body visible. The character_orientation setting limits duration to 10s for 'image' or 30s for 'video'. File limits: at most 100 MB, width and height each between 340px and 3850px, and duration between 3.0s and 30.05s. |
| `keep_original_sound` |  | boolean | no | `true` |  | Controls retention of the reference video's original sound. |
| `character_orientation` |  | enum (string) | yes |  | `image`, `video` | Character orientation source: 'image' matches the reference image and is better for following camera movements, with a 10-second maximum. For complex motions, 'video' is better: it matches the reference video's orientation and allows up to 30 seconds. |
| `elements` |  | array of object {frontal_image_url, reference_image_urls} \| null | no |  |  | Optional facial element binding to improve identity preservation in the output video, limited to 1 uploaded element. Use @Element1 to address it in the prompt. Binding is available only with character_orientation set to 'video'. |
| `elements[].frontal_image_url` |  | string (image URL) \| null | no |  |  | Front-facing image showing the element's main view. File size must not exceed 50 MB; width and height must each be at least 300px, with an aspect ratio between 0.40 and 2.50. |
| `elements[].reference_image_urls` |  | array of image URL \| null | no |  |  | Supply 1–3 additional reference images showing different angles. Each image must have an aspect ratio between 0.40 and 2.50, measure at least 300px in both dimensions, and be no larger than 50.0MB. |

File parameters (`image`, `video`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "image": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
  "video": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
  "character_orientation": "image"
}
```

A fuller example:

```json
{
  "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
  "character_orientation": "image"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/kling-video/v3/pro/motion-control?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "character_orientation": "image"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/kling-video/v3/pro/motion-control?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "character_orientation": "image"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "character_orientation": "image",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/kling-video/v3/pro/motion-control", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "kling-video/v3/pro/motion-control",
      "input": {
        "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
        "character_orientation": "image"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "kling-video/v3/pro/motion-control",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 1680,
    "usd": "1.68",
    "charged": 1680,
    "refunded": 0
  },
  "input": {
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "character_orientation": "image"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    }
  },
  "outputs": [
    {
      "type": "video",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_size": 1843200,
      "width": 1280,
      "height": 720,
      "duration": 5,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} | Video produced by the model. |

## Related models

- [Kling Video · v3 · Standard · Motion Control](https://doitong.com/developers/models/kling-video/v3/standard/motion-control.md) (`kling-video/v3/standard/motion-control`): $0.126 / second of input video
- [Kling O1 Edit Video \[Pro\]](https://doitong.com/developers/models/kling-video/o1/video-to-video/edit.md) (`kling-video/o1/video-to-video/edit`): $0.168 / second of input video
- [Kling O1 Edit Video \[Standard\]](https://doitong.com/developers/models/kling-video/o1/standard/video-to-video/edit.md) (`kling-video/o1/standard/video-to-video/edit`): $0.126 / second of input video
- [Kling O1 Reference Video to Video \[Pro\]](https://doitong.com/developers/models/kling-video/o1/video-to-video/reference.md) (`kling-video/o1/video-to-video/reference`): $0.168 / second
- [Kling O1 Reference Video to Video \[Standard\]](https://doitong.com/developers/models/kling-video/o1/standard/video-to-video/reference.md) (`kling-video/o1/standard/video-to-video/reference`): $0.126 / second
- [Kling O3 Edit Video \[Pro\]](https://doitong.com/developers/models/kling-video/o3/pro/video-to-video/edit.md) (`kling-video/o3/pro/video-to-video/edit`): $0.168 / second of input video
- [Kling O3 Edit Video \[Standard\]](https://doitong.com/developers/models/kling-video/o3/standard/video-to-video/edit.md) (`kling-video/o3/standard/video-to-video/edit`): $0.126 / second of input video
- [Kling O3 Reference Video to Video \[Pro\]](https://doitong.com/developers/models/kling-video/o3/pro/video-to-video/reference.md) (`kling-video/o3/pro/video-to-video/reference`): $0.168 / second

## Links

- HTML page: https://doitong.com/developers/models/kling-video/v3/pro/motion-control
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=kling-video/v3/pro/motion-control
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/kling-video/v3/pro/motion-control
