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

> 기본 버전과 같은 참조 비디오 생성에 최대 3개의 커스텀 LoRA 적용

필수 `prompt`와 움직임 및 구조를 위한 참조 `video_url`로 비디오를 생성하며, 최대 3개의 LoRA 파일(각 최대 3 GB)인 `loras`도 필요합니다. 선택 사항인 첫·중간·마지막 키프레임 이미지(`image_url`, `mid_image_url`, `end_image_url`)로 외형을 고정합니다. `video_strength`와 `strength`의 범위는 0 to 1이고, `num_frames`의 범위는 9 to 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/ko/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 |  |  | 생성을 지시하는 프롬프트입니다. |
| `video_url` | `video` | string (video URL) | yes |  |  | 동작과 구조를 안내하는 참조 동영상을 가리키는 URL입니다. |
| `control_video_url` |  | string (video URL) \| null | no |  |  | `skip_control_preprocess`와 함께 제공하면 기본 제공 제어 추정 대신 사용하는 선택적 사전 계산 제어 동영상입니다. 출력 크기와 프레임 수에 맞게 리샘플링한 후 직접 제어 신호가 됩니다. 예를 들어 이미 렌더링된 깊이, 에지 또는 포즈 합성을 포함할 수 있습니다. |
| `skip_control_preprocess` |  | boolean | no | `false` |  | `control_video_url`을 사용해 깊이, 에지 또는 포즈를 내부에서 추정하는 대신 직접 제어하는 모드입니다. 해당 URL이 없으면 이 설정은 무시됩니다. 이 모드의 출력 크기 조정은 RGB 동영상과 제어 동영상의 크기를 일치시키기 위해 64 단위 정렬을 적용한 명시적 크기를 따르며, `auto`는 LTX 제한 내에서 소스 크기와 화면비를 사용합니다. |
| `preserve_original_video` |  | boolean | no | `false` |  | `skip_control_preprocess`, `video_url`, `control_video_url`과 함께만 사용할 수 있는 원본 동영상 보존 모드입니다. 기본적으로 비활성화되어 표준 제어 처리를 유지하며, 활성화하면 `video_url`에서 생성을 시작하는 동시에 `control_video_url`의 구조 가이던스를 유지합니다. `strength`를 통한 디노이징으로 보존량을 설정하며, 값이 낮을수록 원본 픽셀을 더 많이 보존합니다. |
| `image_url` | `image` | string (image URL) \| null | no |  |  | 첫 프레임 키프레임으로 사용할 선택적 이미지 앵커 스타일 또는 캐릭터 정체성입니다. |
| `mid_image_url` |  | string (image URL) \| null | no |  |  | 클립 중간 지점 부근의 선택적 이미지 앵커 외형으로, 초기 `image_url` 키프레임을 보완합니다. 외형이 흔들리지 않고 카메라 움직임을 따라가도록 하며, `image_url`이 필요합니다. |
| `end_image_url` | `end_image` | string (image URL) \| null | no |  |  | 클립 마지막 프레임의 선택적 이미지 앵커 외형입니다. 카메라 움직임이 시작 이미지와 다른 위치에서 끝날 때 유용하며, `image_url`이 필요합니다. |
| `video_strength` |  | number | no | `0.6` | 0 – 1 | 참조 동영상에서 동작과 구조를 변경할 수 있는 정도를 이 조건화 강도로 제어합니다. 값이 작을수록 더 크게 변경할 수 있습니다. |
| `strength` |  | number | no | `1` | 0 – 1 | `preserve_original_video`에 따라 효과가 달라지는 참조 동영상-동영상 샘플링용 디노이징 제어입니다. 해당 모드가 꺼져 있으면 디노이징 일정을 단축할 뿐이며, 켜져 있으면 소스 픽셀의 변환을 제어합니다. 1.0은 모든 것을 다시 생성하고, 낮은 값은 더 많이 보존합니다(예: 0.5는 약 50%를 보존). |
| `num_frames` |  | integer | no | `121` | 9 – 481 | 출력 프레임 수이며, 해상도와 프레임 수를 곱해 계산한 IC-LoRA 안정성 한도의 적용을 받습니다. 422 응답은 해당 한도를 초과했다는 뜻이므로 해상도 또는 `num_frames`를 낮춰야 합니다. 이 한도는 720p급 크기에서 약 150프레임을 허용하며 더 작은 크기에서는 더 많은 프레임을 허용합니다. |
| `resolution` |  | object {width, height} \| enum (string) | no | `auto` | `auto`, `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | 출력 동영상 크기이며 안정적인 길이에도 영향을 줍니다. 작은 크기에서는 더 많은 프레임을 허용하고 큰 크기에서는 최대 프레임 수가 줄어듭니다. 기본 제공 제어 추정은 공식 제어 워크플로에 가까운 크기를 유지합니다. `skip_control_preprocess`와 `control_video_url`을 통한 직접 제어는 대신 64px 정렬을 적용한 명시적 크기를 따릅니다. 직접 제어 모드에서 `auto`는 LTX 제한 내에서 소스 크기와 화면비를 상속합니다. |
| `frames_per_second` |  | number | no | `24` | 1 – 60 | 초당 프레임 수로 측정한 출력 동영상 프레임 속도입니다. |
| `num_inference_steps` |  | integer | no | `15` | 8 – 30 | 실행할 추론 단계를 최대 30까지 설정합니다. 변경하지 않으면 15를 사용합니다. |
| `guidance_scale` |  | number | no | `1` | 1 – 20 | 이 배율로 classifier-free guidance를 조정합니다. 기본 조정은 높은 품질과 빠른 생성을 모두 목표로 합니다. |
| `generate_audio` |  | boolean | no | `true` |  | 반환되는 MP4의 오디오 트랙 토글입니다. 끄면 동영상 전용 파일을 만들고, 켜면 오디오를 포함합니다. |
| `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` |  | 생성에서 피해야 할 항목을 지정하는 부정 프롬프트입니다. |
| `seed` |  | integer \| null | no |  |  | 생성을 재현 가능하게 하는 시드입니다. None으로 설정하면 무작위로 선택됩니다. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | 프롬프트 확장 활성화 여부를 제어합니다. |
| `enable_safety_checker` |  | boolean | no | `true` |  | 안전 검사를 활성화할지 제어합니다. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | 출력 동영상에 적용되는 품질 프리셋입니다. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | 결과 동영상의 기록 모드입니다. |
| `loras` |  | array of object {path, scale, transformer} | yes |  | ≤ 3 items | LTX-2.3용 LoRA 추가 항목입니다. 각각 3 GB로 제한되며 최대 3개까지 허용됩니다. 레지스트리의 SSRF 안전 다운로더가 각 경로를 가져온 후에만 로드됩니다. |
| `loras[].path` |  | string | yes |  | ≤ 2048 characters | 3 GB 이하의 LoRA .safetensors 파일에 대한 직접 HTTP(S) URL입니다. 로드 전에 SSRF 안전 다운로더로 가져옵니다. |
| `loras[].scale` |  | number | no | `1` | 0 – 2 | 0.0–2.0 범위에서 이 강도가 높을수록 생성 동영상에 대한 LoRA 영향이 커집니다. |
| `loras[].transformer` |  | enum (string) | no | `both` | `high`, `low`, `both` | Transformer 선택 플래그입니다. LTX-2.3은 transformer가 하나뿐이므로 거의 모든 사용자에게 'both'가 적합합니다. 여러 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} | 모델이 생성한 동영상입니다. |
| `seed` | integer | 생성에 실제로 적용된 시드입니다. |
| `prompt` | string | 사용 전에 적용된 확장을 포함한 생성 프롬프트입니다. |

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