# LTX-2.3 22B Video Trainer API

> Trainéiert eng LTX-2.3 22B LoRA fir personaliséiert Videostiler an Effekter, mat optionalem Audio

Trainéiert eng LoRA um Modell LTX-2.3 22B fir personaliséiert Stiler an Effekter aus engem zip mat Videoen oder Biller, idealerweis 10 oder méi Dateien. `number_of_steps` läit tëscht 100 an 6000 (Standard 2000), `frame_rate` ass standardméisseg 25, an `first_frame_conditioning_p` standardméisseg 0.5. `with_audio` forcéiert oder deaktivéiert Audiotraining, an `generate_audio_in_validation` steiert den Audio a Previews.

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

## Pricing

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

The full example input below costs $9.60 = 9600 API credits (2000 steps × 4.8 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-video-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` | 100 – 6,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. |
| `with_audio` |  | boolean \| null | no |  |  | Wielt True, fir Audio-Training zesumme mam Video-Training ze forcéieren, oder False, fir Audio auszeschléissen. Wann d'Astellung op hirem Standard None bleift, gëtt d'Wiel automatesch op Basis dovun getraff, ob déi geliwwert Videoen Audio enthalen. |
| `audio_normalize` |  | boolean | no | `true` |  | Normaliséierung vun der Spitzenamplitude, recommandéiert, fir d'Audioniveauen am ganzen Dataset konsequent ze maachen, andeems d'Spëtzten op e gemeinsamt Niveau bruecht ginn. |
| `audio_preserve_pitch` |  | boolean | no | `true` |  | Erhale vun der Tounhéicht, wann d'Längte vun Audio a Video ënnerschiddlech sinn: aktivéiert benotzt Zäitstreckung oder -kompressioun; deaktivéiert benotzt amplaz Ofschneiden oder Padding mat Stëllheet. |
| `first_frame_conditioning_p` |  | number | no | `0.5` | 0 – 1 | Verbessert d'Bild-zu-Video-Leeschtung, andeems d'Frequenz erhéicht 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, image_url} | no | `[]` | ≤ 2 items | Validatiouns-Prompt-Lëscht fir den Training, där hir Inputen entweder all Biller enthalen oder all keng Biller enthalen dierfen. |
| `validation[].prompt` |  | string | yes |  |  | Prompt, dee während der Validatioun benotzt gëtt. |
| `validation[].image_url` |  | string (image URL) \| null | no |  |  | Bild fir Bild-zu-Video-Validatioun, nëmmen erlaabt, wann all aner Validatiouns-Input och e Bild enthält. |
| `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. |
| `generate_audio_in_validation` |  | boolean | no | `true` |  | Steiert, ob Validatiounsbeispiller generéierten Audio enthalen. |

## 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-video-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-video-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-video-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-video-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-video-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": 9600,
    "usd": "9.60",
    "charged": 9600,
    "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. |
| `lora_file` | object {url, content_type, file_name, file_size} | URL fir trainéiert LoRA-Gewiichter 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 fir Inputen zeréckginn, bei deenen `debug_dataset` aktivéiert ass; et enthält de virveraarbechten Trainingsdataset, inklusiv decodéiertem Audio a Video. |

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