# Ltx 2.3 Quality · Reference Video to Video API

> Generación guiada por prompt a partir de un video de referencia, con imágenes opcionales de fotogramas clave inicial, medio y final

Crea un video nuevo a partir de un `prompt` obligatorio y un `video_url` de referencia que proporciona movimiento y estructura. Los `image_url`, `mid_image_url` y `end_image_url` opcionales fijan la apariencia al inicio, en el medio y al final. `video_strength` y `strength` (both 0 to 1) controlan cuánto sigue o conserva la fuente, y `control_video_url` puede proporcionar una señal de control precalculada. `resolution` ofrece ajustes automáticos o preestablecidos fijos, como cuadrado y vertical u horizontal 16:9.

- Model id: `ltx-2.3-quality/reference-video-to-video`
- Made by: Lightricks
- Category: Video to Video
- Output: video
- Price per megapixel of your output video: $0.00241 / 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`
- Quote: `POST https://api.doitong.ru/v1/quote/ltx-2.3-quality/reference-video-to-video`
- Docs page: https://doitong.com/es-MX/developers/models/ltx-2.3-quality/reference-video-to-video

## Pricing

Price: **$0.00241 / 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.27 = 270 API credits (112 MP output video × $0.002408).

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` 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 |  |  | Prompt usado para dirigir la generación. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL que apunta a un video de referencia usado para guiar el movimiento y la estructura. |
| `control_video_url` |  | string (video URL) \| null | no |  |  | Video de control precalculado opcional, usado en lugar de la estimación de control integrada cuando se proporciona junto con `skip_control_preprocess`. Se convierte en la señal de control directa después de remuestrearse para coincidir con las dimensiones de salida y la cantidad de fotogramas. El video puede contener, por ejemplo, una composición de profundidad, bordes o pose ya renderizada. |
| `skip_control_preprocess` |  | boolean | no | `false` |  | Modo de control directo que usa `control_video_url` en lugar de estimar internamente la profundidad, los bordes o la pose; sin esa URL, esta configuración se ignora. El tamaño de salida en este modo respeta las dimensiones explícitas con alineación de 64 para mantener sincronizados el video RGB y el de control, mientras que `auto` toma las dimensiones y la relación de aspecto del origen dentro de los límites de LTX. |
| `preserve_original_video` |  | boolean | no | `false` |  | Modo de conservación del video original, disponible únicamente con `skip_control_preprocess`, `video_url` y `control_video_url`. Desactivado de forma predeterminada, mantiene intacto el procesamiento de control estándar; al activarlo, inicia la generación desde `video_url` y conserva la guía estructural de `control_video_url`. La eliminación de ruido mediante `strength` establece cuánto se conserva, y los valores más bajos mantienen más píxeles originales. |
| `image_url` | `image` | string (image URL) \| null | no |  |  | Estilo opcional de anclaje de imagen o identidad del personaje como fotograma clave del primer fotograma. |
| `mid_image_url` |  | string (image URL) \| null | no |  |  | Apariencia opcional de anclaje de imagen cerca del punto medio del clip, que complementa el fotograma clave inicial de `image_url`. Ayuda a que la apariencia siga el movimiento de la cámara en lugar de desviarse; requiere `image_url`. |
| `end_image_url` | `end_image` | string (image URL) \| null | no |  |  | Apariencia opcional de anclaje de imagen en el fotograma final del clip. Es útil cuando el movimiento de la cámara termina en una ubicación distinta de la imagen inicial; requiere `image_url`. |
| `video_strength` |  | number | no | `0.6` | 0 – 1 | Esta intensidad de condicionamiento controla la libertad para alterar el movimiento y la estructura del video de referencia: los valores más pequeños permiten cambios mayores. |
| `strength` |  | number | no | `1` | 0 – 1 | Control de eliminación de ruido para el muestreo de video a partir de video de referencia, cuyo efecto depende de `preserve_original_video`. Cuando ese modo está desactivado, solo acorta la programación de eliminación de ruido; cuando está activado, controla la transformación de los píxeles de origen: 1.0 regenera todo y los valores menores conservan más (por ejemplo, 0.5 conserva aproximadamente el 50%). |
| `num_frames` |  | integer | no | `121` | 9 – 481 | Cantidad de fotogramas de salida, sujeta a un presupuesto de estabilidad de IC-LoRA basado en la resolución multiplicada por los fotogramas. Una respuesta 422 indica que se excedió ese presupuesto: reduce la resolución o `num_frames`. El presupuesto permite aproximadamente 150 fotogramas con dimensiones de clase 720p y más con tamaños menores. |
| `resolution` |  | object {width, height} \| enum (string) | no | `auto` | `auto`, `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | Dimensiones del video de salida, que también afectan la duración estable: los tamaños menores permiten más fotogramas, mientras que los mayores reducen el máximo. La estimación de control integrada mantiene el tamaño cerca del flujo de trabajo oficial de control; el control directo mediante `skip_control_preprocess` y `control_video_url` respeta las dimensiones explícitas con alineación de 64px. En el modo de control directo, `auto` hereda las dimensiones y la relación de aspecto del origen dentro de los límites de LTX. |
| `frames_per_second` |  | number | no | `24` | 1 – 60 | Velocidad de fotogramas del video de salida, medida en fotogramas por segundo. |
| `num_inference_steps` |  | integer | no | `15` | 8 – 30 | Establece cuántos pasos de inferencia ejecutar, hasta 30; dejarlo sin cambios usa 15. |
| `guidance_scale` |  | number | no | `1` | 1 – 20 | Ajusta la guía sin clasificador mediante esta escala; su configuración predeterminada busca alta calidad y generación rápida. |
| `generate_audio` |  | boolean | no | `true` |  | Interruptor de la pista de audio del MP4 devuelto: desactivado produce un archivo solo de video y activado incluye audio. |
| `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` |  | Prompt negativo que especifica lo que la generación debe evitar. |
| `seed` |  | integer \| null | no |  |  | Semilla que hace reproducible la generación. Establecerla en None selecciona una semilla aleatoriamente. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | Controla si la expansión del prompt está habilitada. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Controla si la comprobación de seguridad está activada. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Preajuste de calidad aplicado al video de salida. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Modo de escritura del video resultante. |

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
{
  "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
{
  "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?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"
  }'

# 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?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"
  }),
});
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 = {
    "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", 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",
      "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"
      },
      "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",
  "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": 270,
    "usd": "0.27",
    "charged": 270,
    "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"
  },
  "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 producido por el modelo. |
| `seed` | integer | Semilla aplicada durante la generación. |
| `prompt` | string | Prompt de generación, incluida cualquier expansión aplicada antes de usarlo. |

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