# Ltx 2.3 Quality · Reference Video to Video API

> Generación guiada por un prompt y un vídeo de referencia, con imágenes opcionales de fotograma clave inicial, central y final

Crea un vídeo nuevo a partir de un `prompt` obligatorio y un `video_url` de referencia que proporciona movimiento y estructura. `image_url`, `mid_image_url` y `end_image_url` opcionales fijan el aspecto al principio, en el centro y al final. `video_strength` y `strength` (ambos 0 to 1) controlan hasta qué punto sigue o conserva la fuente, y `control_video_url` puede proporcionar una señal de control precalculada. `resolution` ofrece ajustes automáticos o predefinidos 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-ES/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 utilizado para dirigir la generación. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL que apunta a un vídeo de referencia usado para guiar el movimiento y la estructura. |
| `control_video_url` |  | string (video URL) \| null | no |  |  | Vídeo 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 el número de fotogramas. El vídeo 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. En este modo, el tamaño de salida respeta las dimensiones explícitas con alineación de 64 para mantener sincronizados los vídeos RGB y 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 vídeo original, disponible solo 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 la cantidad conservada: los valores bajos conservan más píxeles originales. |
| `image_url` | `image` | string (image URL) \| null | no |  |  | Estilo de anclaje de imagen o identidad de personaje opcional 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 `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. Resulta ú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 | La libertad para modificar el movimiento y la estructura del vídeo de referencia se controla mediante esta intensidad de condicionamiento: 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 vídeo a vídeo de referencia, cuyo efecto depende de `preserve_original_video`. Cuando ese modo está desactivado, solo acorta la planificación de eliminación de ruido; cuando está activado, controla la transformación de los píxeles de origen: 1.0 lo regenera todo y los valores inferiores conservan más (por ejemplo, 0.5 conserva aproximadamente el 50 %). |
| `num_frames` |  | integer | no | `121` | 9 – 481 | Número de fotogramas de salida, sujeto a un presupuesto de estabilidad de IC-LoRA basado en la resolución multiplicada por los fotogramas. Una respuesta 422 indica que se ha superado 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 vídeo de salida, que también afectan a 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 de control oficial; 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 | Frecuencia de fotogramas del vídeo de salida, medida en fotogramas por segundo. |
| `num_inference_steps` |  | integer | no | `15` | 8 – 30 | Establece cuántos pasos de inferencia ejecutar, hasta 30; si no se modifica, usa 15. |
| `guidance_scale` |  | number | no | `1` | 1 – 20 | Ajusta la guía sin clasificador mediante esta escala; su ajuste predeterminado 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 vídeo 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 debe evitar la generación. |
| `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 está habilitada la expansión del prompt. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Controla si está activada la comprobación de seguridad. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Preajuste de calidad aplicado al vídeo de salida. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Modo de escritura del vídeo 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} | Vídeo producido por el modelo. |
| `seed` | integer | Semilla aplicada realmente 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
