# Kling Video · v3 · Pro · Motion Control API

> Μεταφορά κίνησης επιπέδου Pro, που εφαρμόζει την κίνηση χαρακτήρα βίντεο αναφοράς σε εικόνα χαρακτήρα

Συνδυάζει εικόνα χαρακτήρα στο `image_url` με κινήσεις από βίντεο αναφοράς στο `video_url`. Το `character_orientation` είναι υποχρεωτικό και επιλέγει αν ο προσανατολισμός ακολουθεί την εικόνα ή το βίντεο. Υποστηρίζεται προαιρετικό `prompt` έως 2500 χαρακτήρες, το `keep_original_sound` διατηρεί τον ήχο αναφοράς και ένα στοιχείο προσώπου μπορεί να συνδεθεί μέσω `elements` για καλύτερη διατήρηση της ταυτότητας.

- 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/el/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` |  | Οι έλεγχοι ασφαλείας μπορούν να απενεργοποιηθούν μόνο με εξουσιοδότηση λογαριασμού· τα αιτήματα χωρίς εξουσιοδότηση ελέγχονται πάντα. |
| `prompt` |  | string \| null | no |  | ≤ 2500 characters |  |
| `image_url` | `image` | string (image URL) | yes |  |  | URL εικόνας αναφοράς για παραγωγή βίντεο, με μέγιστο μέγεθος αρχείου 10.0MB, πλάτος και ύψος από 340px έως 3850px και αναλογία διαστάσεων από 0.40 έως 2.50. Αυτή η εικόνα καθοδηγεί τους χαρακτήρες, τα φόντα και άλλα στοιχεία του βίντεο. Για χαρακτήρες, διασφαλίστε σαφείς αναλογίες σώματος, χωρίς απόκρυψη και κάλυψη άνω του 5% της επιφάνειας της εικόνας. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL που παραπέμπει στο βίντεο του οποίου οι κινήσεις χαρακτήρων καθοδηγούν την έξοδο· πρέπει να δείχνει έναν ανεμπόδιστο χαρακτήρα σε ρεαλιστικό στυλ, με ορατό το κεφάλι και είτε ολόκληρο το σώμα είτε το πάνω μέρος του σώματος. Η ρύθμιση character_orientation περιορίζει τη διάρκεια στα 10s για το 'image' ή στα 30s για το 'video'. Όρια αρχείου: έως 100 MB, πλάτος και ύψος μεταξύ 340px και 3850px και διάρκεια μεταξύ 3.0s και 30.05s. |
| `keep_original_sound` |  | boolean | no | `true` |  | Καθορίζει αν διατηρείται ο αρχικός ήχος του βίντεο αναφοράς. |
| `character_orientation` |  | enum (string) | yes |  | `image`, `video` | Πηγή προσανατολισμού χαρακτήρα: το 'image' αντιστοιχεί στην εικόνα αναφοράς και είναι καταλληλότερο για την παρακολούθηση κινήσεων κάμερας, με μέγιστο 10 δευτερόλεπτα. Για σύνθετες κινήσεις, το 'video' είναι καταλληλότερο: αντιστοιχεί στον προσανατολισμό του βίντεο αναφοράς και επιτρέπει έως 30 δευτερόλεπτα. |
| `elements` |  | array of object {frontal_image_url, reference_image_urls} \| null | no |  |  | Προαιρετική σύνδεση στοιχείου προσώπου για βελτίωση της διατήρησης ταυτότητας στο βίντεο εξόδου, με όριο 1 μεταφορτωμένο στοιχείο. Χρησιμοποιήστε το @Element1 για αναφορά σε αυτό στο prompt. Η σύνδεση είναι διαθέσιμη μόνο όταν το character_orientation έχει οριστεί σε 'video'. |
| `elements[].frontal_image_url` |  | string (image URL) \| null | no |  |  | Μετωπική εικόνα που δείχνει την κύρια όψη του στοιχείου. Το μέγεθος αρχείου δεν πρέπει να υπερβαίνει τα 50 MB· το πλάτος και το ύψος πρέπει να είναι τουλάχιστον 300px το καθένα, με αναλογία διαστάσεων μεταξύ 0.40 και 2.50. |
| `elements[].reference_image_urls` |  | array of image URL \| null | no |  |  | Παρέχετε 1–3 επιπλέον εικόνες αναφοράς που δείχνουν διαφορετικές γωνίες. Κάθε εικόνα πρέπει να έχει αναλογία διαστάσεων μεταξύ 0.40 και 2.50, τουλάχιστον 300px και στις δύο διαστάσεις και μέγεθος έως 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} | Βίντεο που παράγεται από το μοντέλο. |

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