# Ltx 2.3 Quality · Extend Video · LoRA API

> Étend une vidéo vers l'avant ou l'arrière avec jusqu'à 3 LoRA personnalisés appliqués

Extension vidéo qui accepte également une liste `loras` obligatoire contenant jusqu'à 3 LoRA personnalisés, de 3 GB chacun au maximum. Un `prompt` décrit la suite du clip, et `extend_direction` sélectionne `forward` ou `backward`. `num_context_frames` (9 à 121) contrôle le chevauchement avec la source, `num_frames` (9 à 481) la taille du segment, et `end_image_url` peut définir une image clé finale.

- Model id: `ltx-2.3-quality/extend-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/extend-video/lora`
- Quote: `POST https://api.doitong.ru/v1/quote/ltx-2.3-quality/extend-video/lora`
- Docs page: https://doitong.com/fr-FR/developers/models/ltx-2.3-quality/extend-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/extend-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 |  |  | Invite spécifiant la continuation souhaitée de la vidéo. |
| `video_url` | `video` | string (video URL) | yes |  |  | URL pointant vers la vidéo qui sera prolongée. |
| `extend_direction` |  | enum (string) | no | `forward` | `forward`, `backward` | Mode de prolongation vidéo : `'backward'` crée un nouveau début, tandis que `'forward'` poursuit la vidéo au-delà de sa fin. |
| `num_frames` |  | integer | no | `121` | 9 – 481 | Nombre d’images de prolongation, soumis à un budget de génération stable sur la résolution multipliée par le nombre d’images : à 24 fps, environ 20 secondes en 480p, 11 secondes en 720p ou 5 secondes en 1080p. Les requêtes dépassant le budget renvoient 422 ; réduisez `num_frames` ou choisissez une résolution inférieure. Le nombre inclut `num_context_frames` images qui chevauchent la source ; la durée ajoutée est donc environ (`num_frames` - `num_context_frames`) / `frames_per_second` secondes. |
| `num_context_frames` |  | integer | no | `25` | 9 – 121 | Nombre d’images source demandé pour le contexte ou le chevauchement de la prolongation, limité par le nombre d’images de la source. Le nombre est arrondi à l’entier inférieur pour respecter la grille LTX de 8k+1. |
| `end_image_url` | `end_image` | string (image URL) \| null | no |  |  | Image clé facultative définissant la nouvelle première image de la prolongation vers l’arrière ou sa dernière image de la prolongation vers l’avant. |
| `end_image_strength` |  | number | no | `1` | 0 – 1 | Intensité facultative du conditionnement de l’image clé finale : la réduire laisse davantage de liberté au modèle, tandis que 1.0 impose une correspondance exacte. |
| `resolution` |  | object {width, height} \| enum (string) | no | `auto` | `auto`, `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | Dimensions de la vidéo générée, alignées sur des incréments de 32px — par exemple, 1920x1080 devient 1888x1056 — la source étant redimensionnée à ces dimensions pour la sortie assemblée. Les prolongations stables peuvent être plus longues à basse résolution et plus courtes à haute résolution. Choisir `'auto'` conserve autant que possible les dimensions et le ratio d’aspect de la source dans les limites de LTX. |
| `match_input_fps` |  | boolean | no | `true` |  | Alignement de la fréquence d’images de sortie sur celle de la source lorsqu’il est activé, remplaçant `frames_per_second`. Les FPS source sont arrondis à un entier et limités à la plage prise en charge. |
| `frames_per_second` |  | number | no | `24` | 1 – 60 | Fréquence d’images de la vidéo de sortie, mesurée en images par seconde. |
| `video_strength` |  | number | no | `1` | 0 – 1 | Intensité du conditionnement du contexte source : la réduire permet davantage de liberté au modèle. À 1.0, les images qui se chevauchent restent verrouillées sur la source, ce qui rend la transition fluide. |
| `num_inference_steps` |  | integer | no | `15` | 8 – 30 | Définissez le nombre de pas d’inférence à exécuter, jusqu’à 30 ; laisser ce réglage inchangé utilise 15. |
| `guidance_scale` |  | number | no | `1` | 1 – 20 | Ajustez le classifier-free guidance avec cette échelle ; son réglage par défaut vise à la fois une qualité élevée et une génération rapide. |
| `generate_audio` |  | boolean | no | `true` |  | Option audio de prolongation : désactivée, elle laisse le segment ajouté silencieux tout en conservant la piste audio de la vidéo source. Activée, elle génère l’audio de la prolongation et le fondu enchaîné avec la source au raccord. |
| `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` |  | Invite négative indiquant ce que la génération doit éviter. |
| `seed` |  | integer \| null | no |  |  | Graine qui rend la génération reproductible. La définir sur None sélectionne une graine aléatoirement. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | Contrôle l’activation de l’expansion de l’invite. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Contrôle l'activation de la vérification de sécurité. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | Préréglage de qualité appliqué à la vidéo de sortie. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | Mode d’écriture de la vidéo résultante. |
| `loras` |  | array of object {path, scale, transformer} | yes |  | ≤ 3 items | Ajouts LoRA pour LTX-2.3, limités à 3 GB chacun, avec 3 entrées maximum. Le chargement n’a lieu qu’après récupération de chaque chemin par le téléchargeur du registre sécurisé contre les SSRF. |
| `loras[].path` |  | string | yes |  | ≤ 2048 characters | URL HTTP(S) directe vers un fichier LoRA `.safetensors` d’une taille maximale de 3 GB. Le chargement est précédé d’une récupération par un téléchargeur sécurisé contre les SSRF. |
| `loras[].scale` |  | number | no | `1` | 0 – 2 | L’influence de la LoRA sur la vidéo générée augmente avec cette intensité dans la plage 0.0–2.0. |
| `loras[].transformer` |  | enum (string) | no | `both` | `high`, `low`, `both` | Indicateur de sélection du transformer : `'both'` convient à presque tous les utilisateurs de LTX-2.3, car le modèle ne possède qu’un seul transformer. Cet indicateur prend en charge les architectures futures dotées de plusieurs transformers. |

File parameters (`video`, `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/extend-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/extend-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/extend-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/extend-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/extend-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} | Vidéo produite par le modèle. |
| `seed` | integer | Seed effectivement appliquée pendant la génération. |
| `prompt` | string | Invite de génération, y compris toute expansion appliquée avant son utilisation. |

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