# Ltx 2.3 Quality · Reference Video to Video · LoRA API

> Tạo video tham chiếu như phiên bản cơ sở nhưng áp dụng tối đa 3 LoRA tùy chỉnh

Tạo video từ `prompt` bắt buộc và `video_url` tham chiếu cho chuyển động cùng cấu trúc, đồng thời yêu cầu `loras`, tối đa 3 tệp LoRA với mỗi tệp không quá 3 GB. Hình ảnh khung hình chính đầu, giữa và cuối tùy chọn (`image_url`, `mid_image_url`, `end_image_url`) neo diện mạo. `video_strength` và `strength` nằm trong khoảng từ 0 đến 1, còn `num_frames` từ 9 đến 481.

- Model id: `ltx-2.3-quality/reference-video-to-video/lora`
- Made by: Lightricks
- Category: Video to Video
- Output: video
- Price per megapixel of your output video: $0.00271 / megapixel of output video (cheapest run $0.003 (3 API credits))
- Run: `POST https://api.doitong.ru/v1/run/ltx-2.3-quality/reference-video-to-video/lora`
- Quote: `POST https://api.doitong.ru/v1/quote/ltx-2.3-quality/reference-video-to-video/lora`
- Docs page: https://doitong.com/vi/developers/models/ltx-2.3-quality/reference-video-to-video/lora

## Pricing

Price: **$0.00271 / megapixel of output video**. Price per megapixel 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 $0.304 = 304 API credits (112 MP output video × $0.002708).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/ltx-2.3-quality/reference-video-to-video/lora` 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 dùng để định hướng tạo sinh. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL trỏ đến video tham chiếu dùng để hướng dẫn chuyển động và cấu trúc. |
| `control_video_url` |  | string (video URL) \| null | no |  |  | Video điều khiển được tính toán trước, tùy chọn, dùng thay cho việc ước tính điều khiển tích hợp khi được cung cấp cùng `skip_control_preprocess`. Video trở thành tín hiệu điều khiển trực tiếp sau khi được lấy mẫu lại để khớp kích thước đầu ra và số khung hình. Ví dụ, video có thể chứa tổng hợp độ sâu, cạnh hoặc tư thế đã được kết xuất sẵn. |
| `skip_control_preprocess` |  | boolean | no | `false` |  | Chế độ điều khiển trực tiếp dùng `control_video_url` thay vì ước tính độ sâu, cạnh hoặc tư thế nội bộ; nếu không có URL đó, thiết lập này bị bỏ qua. Việc định cỡ đầu ra ở chế độ này tôn trọng kích thước rõ ràng với căn chỉnh 64 để giữ video RGB và video điều khiển đồng nhất, còn `auto` lấy kích thước và tỷ lệ khung hình nguồn trong giới hạn LTX. |
| `preserve_original_video` |  | boolean | no | `false` |  | Chế độ giữ lại video gốc, chỉ khả dụng với `skip_control_preprocess`, `video_url` và `control_video_url`. Theo mặc định bị tắt, chế độ này giữ nguyên xử lý điều khiển tiêu chuẩn; khi bật, quá trình tạo sinh bắt đầu từ `video_url` đồng thời giữ hướng dẫn cấu trúc từ `control_video_url`. Khử nhiễu qua `strength` đặt lượng được giữ lại; giá trị thấp hơn giữ nhiều điểm ảnh gốc hơn. |
| `image_url` | `image` | string (image URL) \| null | no |  |  | Kiểu neo hình ảnh hoặc danh tính nhân vật tùy chọn ở khung hình đầu tiên. |
| `mid_image_url` |  | string (image URL) \| null | no |  |  | Diện mạo neo hình ảnh tùy chọn gần điểm giữa clip, bổ sung cho khung hình neo `image_url` ban đầu. Tùy chọn này giúp diện mạo bám theo chuyển động máy quay thay vì bị trôi; yêu cầu `image_url`. |
| `end_image_url` | `end_image` | string (image URL) \| null | no |  |  | Diện mạo neo hình ảnh tùy chọn ở khung hình cuối của clip. Hữu ích khi chuyển động máy quay kết thúc tại vị trí khác với hình ảnh ban đầu; yêu cầu `image_url`. |
| `video_strength` |  | number | no | `0.6` | 0 – 1 | Mức tự do thay đổi chuyển động và cấu trúc từ video tham chiếu được kiểm soát bởi cường độ điều kiện này: thiết lập nhỏ hơn cho phép thay đổi nhiều hơn. |
| `strength` |  | number | no | `1` | 0 – 1 | Điều khiển khử nhiễu cho việc lấy mẫu video-từ-video tham chiếu, với tác động phụ thuộc vào `preserve_original_video`. Khi chế độ này tắt, nó chỉ rút ngắn lịch khử nhiễu; khi bật, nó điều khiển việc biến đổi điểm ảnh nguồn, trong đó 1.0 tái tạo mọi thứ còn giá trị thấp hơn giữ lại nhiều hơn (ví dụ: 0.5 giữ khoảng 50%). |
| `num_frames` |  | integer | no | `121` | 9 – 481 | Số khung hình đầu ra, chịu giới hạn ổn định IC-LoRA dựa trên tích của độ phân giải và số khung hình. Phản hồi 422 nghĩa là đã vượt giới hạn đó: hãy giảm độ phân giải hoặc `num_frames`. Giới hạn cho phép khoảng 150 khung hình ở kích thước tương đương 720p và nhiều hơn ở kích thước nhỏ hơn. |
| `resolution` |  | object {width, height} \| enum (string) | no | `auto` | `auto`, `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | Kích thước video đầu ra, đồng thời ảnh hưởng đến thời lượng ổn định: kích thước nhỏ hơn cho phép nhiều khung hình hơn, còn kích thước lớn hơn làm giảm mức tối đa. Việc ước tính điều khiển tích hợp giữ kích thước gần với quy trình điều khiển chính thức; điều khiển trực tiếp qua `skip_control_preprocess` và `control_video_url` thay vào đó tôn trọng kích thước rõ ràng với căn chỉnh 64px. Ở chế độ điều khiển trực tiếp, `auto` kế thừa kích thước và tỷ lệ khung hình nguồn trong giới hạn LTX. |
| `frames_per_second` |  | number | no | `24` | 1 – 60 | Tốc độ khung hình video đầu ra, tính bằng khung hình trên giây. |
| `num_inference_steps` |  | integer | no | `15` | 8 – 30 | Đặt số bước suy luận cần chạy, tối đa 30; giữ nguyên giá trị này sẽ dùng 15. |
| `guidance_scale` |  | number | no | `1` | 1 – 20 | Điều chỉnh classifier-free guidance bằng thang đo này; tinh chỉnh mặc định hướng đến chất lượng cao và tạo sinh nhanh. |
| `generate_audio` |  | boolean | no | `true` |  | Bật/tắt bản âm thanh cho MP4 trả về: tắt tạo tệp chỉ có video, bật sẽ bao gồm âm thanh. |
| `negative_prompt` |  | string | no | `color distortion, overexposure, static, blurry details, subtitles, style, artwork, painting, frame, still, dim overall tone, worst quality, low quality, JPEG compression artifacts, ugly, mutilated, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, malformed limbs, fused fingers, motionless frame, cluttered background, three legs, crowded background, walking backwards` |  | Lời nhắc phủ định chỉ rõ những gì quá trình tạo sinh cần tránh. |
| `seed` |  | integer \| null | no |  |  | Seed giúp quá trình tạo sinh có thể tái lập. Đặt thành None sẽ chọn seed ngẫu nhiên. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | Kiểm soát việc bật mở rộng lời nhắc. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Kiểm soát việc bật kiểm tra an toàn. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Thiết lập chất lượng áp dụng cho video đầu ra. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Chế độ ghi của video kết quả. |
| `loras` |  | array of object {path, scale, transformer} | yes |  | ≤ 3 items | Các phần bổ sung LoRA cho LTX-2.3, mỗi phần tối đa 3 GB và cho phép tối đa 3 mục. Việc tải chỉ diễn ra sau khi trình tải an toàn SSRF của registry truy xuất từng đường dẫn. |
| `loras[].path` |  | string | yes |  | ≤ 2048 characters | URL HTTP(S) trực tiếp đến tệp LoRA .safetensors không lớn hơn 3 GB. Việc tải được thực hiện sau khi truy xuất bằng trình tải an toàn SSRF. |
| `loras[].scale` |  | number | no | `1` | 0 – 2 | Ảnh hưởng của LoRA lên video tạo sinh tăng khi độ mạnh tăng trong phạm vi 0.0–2.0. |
| `loras[].transformer` |  | enum (string) | no | `both` | `high`, `low`, `both` | Cờ lựa chọn Transformer: 'both' phù hợp với hầu hết người dùng LTX-2.3 vì mô hình chỉ có một transformer. Cờ này tồn tại để hỗ trợ các kiến trúc tương lai có nhiều transformer. |

File parameters (`video`, `control_video_url`, `image`, `mid_image_url`, `end_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
{
  "loras": [
    {
      "path": "https://example.com/your-file.safetensors"
    }
  ],
  "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"
}
```

A fuller example:

```json
{
  "loras": [
    {
      "path": "https://example.com/your-file.safetensors"
    }
  ],
  "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"
}
```

## 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.ru/v1/run/ltx-2.3-quality/reference-video-to-video/lora?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "loras": [
      {
        "path": "https://example.com/your-file.safetensors"
      }
    ],
    "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"
  }'

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

### JavaScript

```javascript
const API = "https://api.doitong.ru/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/ltx-2.3-quality/reference-video-to-video/lora?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "loras": [
      {
        "path": "https://example.com/your-file.safetensors"
      }
    ],
    "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"
  }),
});
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.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "loras": [
        {
            "path": "https://example.com/your-file.safetensors",
        },
    ],
    "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",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/ltx-2.3-quality/reference-video-to-video/lora", 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.ru/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": "ltx-2.3-quality/reference-video-to-video/lora",
      "input": {
        "loras": [
          {
            "path": "https://example.com/your-file.safetensors"
          }
        ],
        "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"
      },
      "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": "ltx-2.3-quality/reference-video-to-video/lora",
  "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": 304,
    "usd": "0.304",
    "charged": 304,
    "refunded": 0
  },
  "input": {
    "loras": [
      {
        "path": "https://example.com/your-file.safetensors"
      }
    ],
    "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"
  },
  "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,
    "prompt": "string"
  },
  "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.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} | Video do mô hình tạo ra. |
| `seed` | integer | Seed thực tế được áp dụng trong quá trình tạo sinh. |
| `prompt` | string | Lời nhắc tạo sinh, bao gồm mọi phần mở rộng được áp dụng trước khi sử dụng. |

## Related models

- [Ltx 2.3 Quality · Text to Video](https://doitong.com/developers/models/ltx-2.3-quality/text-to-video.md) (`ltx-2.3-quality/text-to-video`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Text to Video · LoRA](https://doitong.com/developers/models/ltx-2.3-quality/text-to-video/lora.md) (`ltx-2.3-quality/text-to-video/lora`): $0.00271 / megapixel of output video
- [Ltx 2.3 Quality · Image to Video](https://doitong.com/developers/models/ltx-2.3-quality/image-to-video.md) (`ltx-2.3-quality/image-to-video`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Image to Video · LoRA](https://doitong.com/developers/models/ltx-2.3-quality/image-to-video/lora.md) (`ltx-2.3-quality/image-to-video/lora`): $0.00271 / megapixel of output video
- [Ltx 2.3 Quality · Ingredient](https://doitong.com/developers/models/ltx-2.3-quality/ingredient.md) (`ltx-2.3-quality/ingredient`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Clean Plate](https://doitong.com/developers/models/ltx-2.3-quality/clean-plate.md) (`ltx-2.3-quality/clean-plate`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Colorization](https://doitong.com/developers/models/ltx-2.3-quality/colorization.md) (`ltx-2.3-quality/colorization`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Cross Eyed](https://doitong.com/developers/models/ltx-2.3-quality/cross-eyed.md) (`ltx-2.3-quality/cross-eyed`): $0.00241 / megapixel of output video

## Links

- HTML page: https://doitong.com/developers/models/ltx-2.3-quality/reference-video-to-video/lora
- 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=ltx-2.3-quality/reference-video-to-video/lora
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/ltx-2.3-quality/reference-video-to-video/lora
