# LTX-2.3 22B Video to Video Trainer API

> Trainéiert eng LTX-2.3 22B LoRA fir Videotransformatioun oder video-bedéngte Generatioun aus Referenzvideoen

Trainéiert eng LoRA um Modell LTX-2.3 22B fir Videotransformatioun, mat engem zip aus Videoen oder Biller (mp4, mov, avi, mkv, png, jpg, jpeg); op d'mannst ongeféier 10 Dateien si recommandéiert. `number_of_steps` geet vun 1 bis 20000 (Standard 2000), an `frame_rate` ass standardméisseg 25. `first_frame_conditioning_p` ass standardméisseg 0.1. D'Validéierung akzeptéiert bis zu 2 Prompts mat Referenzvideoen.

- Model id: `ltx23-v2v-trainer`
- Made by: Lightricks
- Category: Training
- Output: file
- Price: $0.0135 / step (cheapest run $27.00 (27000 API credits))
- Run: `POST https://api.doitong.com/v1/run/ltx23-v2v-trainer`
- Quote: `POST https://api.doitong.com/v1/quote/ltx23-v2v-trainer`
- Docs page: https://doitong.com/lb/developers/models/ltx23-v2v-trainer

## Pricing

Price: **$0.0135 / step**. Billed per training step (`number_of_steps`).

The full example input below costs $27.00 = 27000 API credits (2000 steps × 13.5 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/ltx23-v2v-trainer` 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

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `training_data_url` |  | string | yes |  |  | URL vun engem ZIP-Archiv mat engem Dataset, deen ausschliisslech Biller oder ausschliisslech Videoen enthält; gemëschte Medien-Datasets ginn net ënnerstëtzt. Zil op 10 Dateien oder méi, am beschten op eng méi grouss Sammlung. Akzeptéiert Extensioune si .png, .jpg, .jpeg fir Biller an .mp4, .mov, .avi, .mkv fir Videoen. Fakultativ Caption-Textdateie kënnen d'Medie begleeden; all Caption-Datei muss nom zougehéierege Medien-Fichier benannt sinn. |
| `rank` |  | enum (integer) | no | `32` | `8`, `16`, `32`, `64`, `128` | LoRA-Adaptatiounsrang, bei deem méi héije Wäerter méi Kapazitéit géint méi héije Memoryverbrauch ofwiichten. |
| `number_of_steps` |  | integer | no | `2000` | 1 – 20,000 | Gesamtzuel vun Trainingsschrëtt. |
| `learning_rate` |  | number | no | `0.0002` | 0.000001 – 1 | Léierquote fir d'Optimiséierung, déi e méigleche Geschwindegkeetsgewënn beim Training géint de Risiko vun Overfitting bei méi héije Wäerter ofwiicht. |
| `number_of_frames` |  | integer | no | `89` | 9 – 121 | Framezuel pro Trainingssample. D'Deelung vun der Zuel duerch 8 muss e Rescht vun 1 loossen; Beispiller sinn 1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97. |
| `frame_rate` |  | integer | no | `25` | 8 – 60 | Zil-Video-Frame-Rate, gemooss a Frames pro Sekonn. |
| `resolution` |  | enum (string) | no | `medium` | `low`, `medium`, `high` | Trainingsopléisung. Eng Erhéijung vun der Opléisung erhéicht d'Memoryufuerderungen. |
| `aspect_ratio` |  | enum (string) | no | `1:1` | `16:9`, `1:1`, `9:16` | Trainingsaspektverhältnis. |
| `trigger_phrase` |  | string | no | `` |  | LoRA-Stil-Aktivéierungsphrase, déi beim Training um Ufank vun de Captions agefouert gëtt. |
| `auto_scale_input` |  | boolean | no | `false` |  | Automatesch Videoanpassung un déi ugefrote FPS- a Framezuel beim Aktivéiere; Bilddatensätz bleiwen onverännert. |
| `split_input_into_scenes` |  | boolean | no | `true` |  | Szenendeelung fir Videoen iwwer engem Dauer-Schwellwäert, aktivéiert wann true. |
| `split_input_duration_threshold` |  | number | no | `30` | 1 – 60 | Trigger fir d'Szenendeelung als Dauer a Sekonnen: nëmme Videoe méi laang wéi de Schwellwäert ginn gedeelt. |
| `debug_dataset` |  | boolean | no | `false` |  | Inspektiounsmodus vun der Virveraarbechtung fir Videoen, Biller a Captions virun engem kompletten Training ze kontrolléieren. Beim Aktivéiere gëtt den veraarbechten Trainingsdatensaz an engem erofluedbaren Archiv fir d'manuell Iwwerpréiwung zeréckginn. |
| `first_frame_conditioning_p` |  | number | no | `0.1` | 0 – 1 | Begënschtegt Video-zu-Video-Transformatioun, andeems d'Frequenz reduzéiert gëtt, mat där den Training d'Konditionéierung mam éischte Frame benotzt; dëse Wäert setzt dës Wahrscheinlechkeet. |
| `validation` |  | array of object {prompt, reference_video_url} | no | `[]` | ≤ 2 items | Validatiouns-Input-Lëscht mat Prompts, déi mat Referenzvideoe gekoppelt sinn. |
| `validation[].prompt` |  | string | yes |  |  | Prompt, dee während der Validatioun benotzt gëtt. |
| `validation[].reference_video_url` |  | string (video URL) | yes |  | ≥ 1 characters | Gitt de Video, deen beim IC-LoRA-Validatiounslaf transforméiert soll ginn, iwwer seng URL un. |
| `validation_negative_prompt` |  | string | no | `worst quality, inconsistent motion, blurry, jittery, distorted` |  | Negativen Prompt, deen bei der Validatioun applizéiert gëtt. |
| `validation_number_of_frames` |  | integer | no | `89` | 9 – 121 | Framezuel fir all Validatiounsvideo. |
| `validation_frame_rate` |  | integer | no | `25` | 8 – 60 | Zil-Frame-Rate vum Validatiounsvideo, gemooss a Frames pro Sekonn. |
| `validation_resolution` |  | enum (string) | no | `high` | `low`, `medium`, `high` | Opléisung, déi während der Validatioun benotzt gëtt. |
| `validation_aspect_ratio` |  | enum (string) | no | `1:1` | `16:9`, `1:1`, `9:16` | Aspektverhältnis, dat während der Validatioun benotzt gëtt. |
| `stg_scale` |  | number | no | `1` | 0 – 3 | Spatio-Temporal-Guidance-(STG)-Skala, mat 1.0 recommandéiert an 0.0 fir STG auszeschalten. |

## Example input

Required parameters only:

```json
{
  "training_data_url": "https://example.com/your-file.zip"
}
```

A fuller example:

```json
{
  "training_data_url": "https://example.com/your-file.zip"
}
```

## 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.com/v1/run/ltx23-v2v-trainer?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "training_data_url": "https://example.com/your-file.zip"
  }'

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

### JavaScript

```javascript
const API = "https://api.doitong.com/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/ltx23-v2v-trainer?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "training_data_url": "https://example.com/your-file.zip"
  }),
});
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.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "training_data_url": "https://example.com/your-file.zip",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/ltx23-v2v-trainer", 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.com/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": "ltx23-v2v-trainer",
      "input": {
        "training_data_url": "https://example.com/your-file.zip"
      },
      "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": "ltx23-v2v-trainer",
  "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": 27000,
    "usd": "27.00",
    "charged": 27000,
    "refunded": 0
  },
  "input": {
    "training_data_url": "https://example.com/your-file.zip"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    },
    "lora_file": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    },
    "config_file": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    },
    "debug_dataset": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200
    }
  },
  "outputs": [
    {
      "type": "file",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_size": 1843200,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} \| null | URL fir all verfügbare Validatiounsvideoen, déi nieft hire Referenzvideoe gewise ginn. |
| `lora_file` | object {url, content_type, file_name, file_size} | URL vun der trainéierter IC-LoRA-Gewiichtsdatei am .safetensors-Format. |
| `config_file` | object {url, content_type, file_name, file_size} | Konfiguratioun fir d'Ariichtung vum Inferenz-Endpunkts. |
| `debug_dataset` | object {url, content_type, file_name, file_size} \| null | Erofluedbaren Debug-Archiv, nëmme verfügbar fir Inputen, déi `debug_dataset` aktivéieren; säin Trainingsdateninhalt ass virveraarbecht an enthält decodéiert Videoen. |

## Related models

- [LTX 2.3 Trainer (V2) - Audio Inpainting](https://doitong.com/developers/models/ltx23-trainer-v2/audio-inpaint.md) (`ltx23-trainer-v2/audio-inpaint`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Audio+Video Reference IC-LoRA](https://doitong.com/developers/models/ltx23-trainer-v2/ic-lora/av2av.md) (`ltx23-trainer-v2/ic-lora/av2av`): $0.0068 / step
- [LTX 2.3 Trainer (V2) - Audio+Video Reference Transformation](https://doitong.com/developers/models/ltx23-trainer-v2/av2av.md) (`ltx23-trainer-v2/av2av`): $0.0068 / step
- [LTX 2.3 Trainer (V2) - Audio-to-Audio](https://doitong.com/developers/models/ltx23-trainer-v2/a2a.md) (`ltx23-trainer-v2/a2a`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Audio-to-Audio IC-LoRA](https://doitong.com/developers/models/ltx23-trainer-v2/ic-lora/a2a.md) (`ltx23-trainer-v2/ic-lora/a2a`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Audio-to-Video](https://doitong.com/developers/models/ltx23-trainer-v2/a2v.md) (`ltx23-trainer-v2/a2v`): $0.006 / step
- [LTX 2.3 Trainer (V2) - Backward Audio Extension](https://doitong.com/developers/models/ltx23-trainer-v2/audio-extend-suffix.md) (`ltx23-trainer-v2/audio-extend-suffix`): $0.0023 / step
- [LTX 2.3 Trainer (V2) - Backward Video Extension](https://doitong.com/developers/models/ltx23-trainer-v2/extend-suffix.md) (`ltx23-trainer-v2/extend-suffix`): $0.0061 / step

## Links

- HTML page: https://doitong.com/developers/models/ltx23-v2v-trainer
- 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=ltx23-v2v-trainer
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/ltx23-v2v-trainer
