# ID-V2V API

> Biến đổi phong cách video từ khung hình đầu đã chỉnh sửa, đồng thời giữ nhận dạng và chuyển động của chủ thể

Tạo lại video nguồn (`video_url`) theo diện mạo của khung hình đầu đã chỉnh sửa (`image_url`), được điều khiển bằng `prompt`. Có thể dùng tối đa 5 `keyframes` để neo nhận dạng trong các clip dài hơn. Đầu ra là 480p hoặc 720p với `num_frames` từ 17 đến 241; `segmentation_prompt` (mặc định person) chọn chủ thể mà pixel của chủ thể đó dùng để điều kiện hóa kết quả.

- Model id: `id-v2v`
- Made by: Open model
- Category: Video to Video
- Output: video
- Price per second of your output video: $0.20 / second of output video (cheapest run $0.20 (200 API credits))
- Run: `POST https://api.doitong.com/v1/run/id-v2v`
- Quote: `POST https://api.doitong.com/v1/quote/id-v2v`
- Docs page: https://doitong.com/vi/developers/models/id-v2v

## Pricing

Price: **$0.20 / second of output video**. Price per second of your output 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.013 = 1013 API credits (5.0625 s output video × $0.20).

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/id-v2v` 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 |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | Lời nhắc chỉ định video đã chỉnh sửa mong muốn. |
| `video_url` | `video` | string (video URL) | yes |  |  | Tham chiếu chuyển động và khung hình cho quá trình tạo sinh, được cung cấp dưới dạng URL của video nguồn. |
| `image_url` | `image` | string (image URL) | yes |  |  | Tham chiếu danh tính và phong cách để tạo lại video, được cung cấp dưới dạng URL trỏ đến khung hình đầu tiên đã chỉnh sửa. |
| `keyframes` |  | array of object {image_url, frame_index} | no |  | ≤ 5 items | Neo danh tính tùy chọn cho video dài: cung cấp các khung hình chính đã chỉnh sửa cùng chỉ số khung hình đầu ra nơi chúng phải xuất hiện. |
| `keyframes[].image_url` |  | string (image URL) | yes |  |  | URL hình ảnh đã chỉnh sửa cho một neo danh tính trong video dài; tỷ lệ khung hình của hình ảnh không được chênh quá 0.1 so với đầu ra. Hình ảnh xuất hiện nguyên trạng tại `frame_index`. |
| `keyframes[].frame_index` |  | integer | yes |  | ≥ 1 | Đặt khung hình chính ở vị trí đầu ra tối thiểu là 1 và nhỏ hơn tổng số khung hình đầu ra, sử dụng chỉ mục bắt đầu từ 0. Vị trí 0 dành riêng cho khung hình bắt đầu đã chỉnh sửa từ `image_url`. |
| `resolution` |  | enum (string) | no | `720p` | `480p`, `720p` | Chọn 720p cho đầu ra 1280×720 hoặc 720×1280, hoặc 480p cho đầu ra 832×480 hoặc 480×832. Hướng của video nguồn quyết định kích thước nào được áp dụng. |
| `num_frames` |  | integer | no | `81` | 17 – 241 | Giới hạn số khung hình cần tạo; nếu nguồn có ít khung hình hơn, số khung hình của nguồn trở thành giới hạn trên. |
| `segmentation_prompt` |  | string | no | `person` | ≤ 100 characters | Lời nhắc chọn chủ thể cho SAM-3, xác định vùng có các pixel dùng để định hướng quá trình tạo sinh. Bên ngoài chủ thể được phân đoạn đó, quá trình tạo sinh không bị ràng buộc. |
| `num_inference_steps` |  | integer | no | `30` | 2 – 40 | Điều khiển chất lượng và tốc độ clip, được biểu thị bằng số bước lấy mẫu khuếch tán cho mỗi clip: nhiều bước hơn cải thiện chất lượng nhưng mất nhiều thời gian hơn. |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | Mức độ hướng dẫn không dùng bộ phân loại, cân bằng giữa việc bám sát lời nhắc và tính sáng tạo. |
| `vace_scale` |  | number | no | `1` | 0 – 2 | Mức độ bám sát cấu trúc của video nguồn, được điều chỉnh qua hệ số điều kiện hóa VACE. |
| `seed` |  | integer \| null | no |  |  | Seed ngẫu nhiên được chia sẻ giữa tất cả clip khi tạo nhiều clip, cho phép tái lập quá trình tạo sinh. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Bật kiểm tra an toàn trên cả đầu vào và đầu ra. |

File parameters (`video`, `image`) 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
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "video": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
  "image": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
  "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
}
```

## 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/id-v2v?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  }'

# 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/id-v2v?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  }),
});
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 = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/id-v2v", 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": "id-v2v",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
        "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
      },
      "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": "id-v2v",
  "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": 1013,
    "usd": "1.013",
    "charged": 1013,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  },
  "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
    },
    "seed": 42
  },
  "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} | Tệp video được tạo sinh. |
| `seed` | integer | Giá trị seed được áp dụng trong quá trình tạo sinh. |

## Related models

- [ID-V2V Relight](https://doitong.com/developers/models/id-v2v/relight.md) (`id-v2v/relight`): $0.20 / second of output video
- [AMT Interpolation](https://doitong.com/developers/models/amt-interpolation.md) (`amt-interpolation`): $0.000575 / second of processing time
- [AnimateDiff Turbo · Video to Video](https://doitong.com/developers/models/fast-animatediff/turbo/video-to-video.md) (`fast-animatediff/turbo/video-to-video`): $0.00125 / second of processing time
- [AnimateDiff · Video to Video](https://doitong.com/developers/models/fast-animatediff/video-to-video.md) (`fast-animatediff/video-to-video`): $0.00125 / second of processing time
- [Bernini-R Edit Video](https://doitong.com/developers/models/bernini-r/edit-video.md) (`bernini-r/edit-video`): from $0.04 / second of output video
- [Bernini-R Reference Edit Video](https://doitong.com/developers/models/bernini-r/reference-edit-video.md) (`bernini-r/reference-edit-video`): from $0.04 / second of output video
- [DWPose Pose Prediction · Video](https://doitong.com/developers/models/dwpose/video.md) (`dwpose/video`): $0.0006 / second of processing time
- [Editto](https://doitong.com/developers/models/editto.md) (`editto`): from $0.04 / second of output video

## Links

- HTML page: https://doitong.com/developers/models/id-v2v
- 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=id-v2v
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/id-v2v
