# Kling Video · v3 · Pro · Motion Control API

> Uhamishaji wa miondoko wa daraja la Pro unaotumia miondoko ya mhusika kutoka video ya marejeo kwenye picha ya mhusika

Huchanganya picha ya mhusika katika `image_url` na miondoko kutoka video ya marejeo katika `video_url`. `character_orientation` ni lazima na huchagua ikiwa mwelekeo utafuata picha au video. `prompt` ya hiari yenye hadi herufi 2500 inatumika, `keep_original_sound` huhifadhi sauti ya marejeo, na kipengele kimoja cha uso kinaweza kuunganishwa kupitia `elements` ili kusaidia kuhifadhi utambulisho.

- 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/sw/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` |  | Ukaguzi wa usalama unaweza kuzimwa tu kwa idhini ya akaunti; maombi yasiyo na idhini hukaguliwa kila wakati. |
| `prompt` |  | string \| null | no |  | ≤ 2500 characters |  |
| `image_url` | `image` | string (image URL) | yes |  |  | URL ya picha ya marejeleo kwa uzalishaji wa video, yenye kikomo cha ukubwa wa faili cha 10.0MB, upana na urefu kila kimoja kati ya 340px na 3850px, na uwiano wa pande kutoka 0.40 hadi 2.50. Picha hii huongoza wahusika, mandhari na vipengele vingine vya video. Kwa wahusika, hakikisha uwiano wa mwili unaonekana wazi, hakuna kuzibwa, na eneo linalofunikwa linazidi 5% ya eneo la picha. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL inayoelekeza kwenye video ambayo vitendo vya mhusika wake huongoza tokeo; inapaswa kuonyesha mhusika wa mtindo halisi asiyezuiwa, akiwa na kichwa na mwili mzima au sehemu ya juu ya mwili inayoonekana. Mipangilio ya character_orientation huweka kikomo cha urefu kuwa 10s kwa 'image' au 30s kwa 'video'. Vikomo vya faili: isiyozidi 100 MB, upana na urefu kila kimoja kati ya 340px na 3850px, na urefu kati ya 3.0s na 30.05s. |
| `keep_original_sound` |  | boolean | no | `true` |  | Hudhibiti uhifadhi wa sauti asilia ya video ya marejeleo. |
| `character_orientation` |  | enum (string) | yes |  | `image`, `video` | Chanzo cha mwelekeo wa mhusika: 'image' hulingana na picha ya marejeleo na ni bora zaidi kwa kufuata miondoko ya kamera, ikiwa na kiwango cha juu cha sekunde 10. Kwa miondoko changamano, 'video' ni bora: hulingana na mwelekeo wa video ya marejeleo na inaruhusu hadi sekunde 30. |
| `elements` |  | array of object {frontal_image_url, reference_image_urls} \| null | no |  |  | Ufungaji wa hiari wa kipengele cha uso ili kuboresha uhifadhi wa utambulisho katika video ya tokeo, ukiwa na kikomo cha kipengele 1 kilichopakiwa. Tumia @Element1 kukirejelea kwenye kidokezo. Ufungaji unapatikana tu kwa character_orientation iliyowekwa kuwa 'video'. |
| `elements[].frontal_image_url` |  | string (image URL) \| null | no |  |  | Picha ya mbele inayoonyesha mwonekano mkuu wa kipengele. Ukubwa wa faili lazima usizidi 50 MB; upana na urefu lazima kila kimoja kiwe angalau 300px, na uwiano wa pande uwe kati ya 0.40 na 2.50. |
| `elements[].reference_image_urls` |  | array of image URL \| null | no |  |  | Toa picha 1–3 za ziada za marejeleo zinazoonyesha pembe tofauti. Kila picha lazima iwe na uwiano wa pande kati ya 0.40 na 2.50, iwe na angalau 300px katika vipimo vyote viwili, na isiwe kubwa kuliko 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 iliyotolewa na modeli. |

## 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
