# LTX-2.3 22B Video Trainer API

> Trainiert ein LTX-2.3 22B LoRA für benutzerdefinierte Videostile und Effekte, optional mit Audio

Trainiert ein LoRA auf dem Modell LTX-2.3 22B für benutzerdefinierte Stile und Effekte aus einem ZIP mit Videos oder Bildern, idealerweise mit mindestens 10 Dateien. `number_of_steps` reicht von 100 bis 6000 (Standardwert 2000), `frame_rate` ist standardmäßig 25 und `first_frame_conditioning_p` standardmäßig 0.5. `with_audio` erzwingt oder deaktiviert Audiotraining, und `generate_audio_in_validation` steuert Audio in Vorschauen.

- 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/de/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 eines ZIP-Archivs für ein Dataset, das ausschließlich Bilder oder ausschließlich Videos enthält; gemischte Mediendatasets werden nicht unterstützt. Verwende mindestens 10 Dateien, vorzugsweise eine größere Sammlung. Zulässige Erweiterungen sind .png, .jpg, .jpeg für Bilder sowie .mp4, .mov, .avi, .mkv für Videos. Optionale Untertiteldateien können die Medien begleiten; jede Untertiteldatei muss passend zu ihrer zugehörigen Mediendatei benannt sein. |
| `rank` |  | enum (integer) | no | `32` | `8`, `16`, `32`, `64`, `128` | LoRA-Anpassungsrang, der mit steigender Einstellung höheren Speicherverbrauch gegen größere Kapazität eintauscht. |
| `number_of_steps` |  | integer | no | `2000` | 100 – 6,000 | Gesamtzahl der Trainingsschritte. |
| `learning_rate` |  | number | no | `0.0002` | 0.000001 – 1 | Optimierungs-Lernrate, die einen möglichen Geschwindigkeitsgewinn beim Training gegen das bei einer Erhöhung steigende Risiko der Überanpassung abwägt. |
| `number_of_frames` |  | integer | no | `89` | 9 – 121 | Frame-Anzahl jedes Trainingsbeispiels. Beim Teilen der Anzahl durch 8 muss ein Rest von 1 verbleiben; Beispiele sind 1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97. |
| `frame_rate` |  | integer | no | `25` | 8 – 60 | Zielframerate des Videos, gemessen in Frames pro Sekunde. |
| `resolution` |  | enum (string) | no | `medium` | `low`, `medium`, `high` | Trainingsauflösung. Eine höhere Auflösung erhöht den Speicherbedarf. |
| `aspect_ratio` |  | enum (string) | no | `1:1` | `16:9`, `1:1`, `9:16` | Trainingsseitenverhältnis. |
| `trigger_phrase` |  | string | no | `` |  | Aktivierungsphrase für den LoRA-Stil, die beim Training am Anfang der Untertitel eingefügt wird. |
| `auto_scale_input` |  | boolean | no | `false` |  | Automatische Videoanpassung an die angeforderte FPS-Rate und Frame-Anzahl bei Aktivierung; Bilddatensätze bleiben unverändert. |
| `split_input_into_scenes` |  | boolean | no | `true` |  | Szenentrennung für Videos, die einen Dauerschwellenwert überschreiten, bei true aktiviert. |
| `split_input_duration_threshold` |  | number | no | `30` | 1 – 60 | Auslöser für die Szenentrennung als Dauer in Sekunden: Nur Videos, die länger als der Schwellenwert sind, werden geteilt. |
| `debug_dataset` |  | boolean | no | `false` |  | Inspektionsmodus der Vorverarbeitung zur Prüfung von Videos, Bildern und Untertiteln vor einem vollständigen Trainingslauf. Bei Aktivierung gibt der Trainer den verarbeiteten Trainingsdatensatz in einem herunterladbaren Archiv zur manuellen Prüfung zurück. |
| `with_audio` |  | boolean \| null | no |  |  | Wähle True, um Audiotraining zusammen mit Videotraining zu erzwingen, oder False, um Audio auszuschließen. Wenn die Einstellung auf ihrem Standardwert None belassen wird, erfolgt die Auswahl automatisch anhand dessen, ob die bereitgestellten Videos Audio enthalten. |
| `audio_normalize` |  | boolean | no | `true` |  | Spitzenamplituden-Normalisierung, empfohlen, um die Audiopegel im gesamten Dataset zu vereinheitlichen, indem die Spitzen auf ein gemeinsames Niveau gebracht werden. |
| `audio_preserve_pitch` |  | boolean | no | `true` |  | Tonhöhenerhalt bei unterschiedlichen Audio- und Videolängen: Aktiviert verwendet Zeitdehnung oder -kompression; deaktiviert verwendet stattdessen Kürzen oder Auffüllen mit Stille. |
| `first_frame_conditioning_p` |  | number | no | `0.5` | 0 – 1 | Verbessert die Bild-zu-Video-Leistung, indem die Häufigkeit der Konditionierung des ersten Frames im Training erhöht wird; dieser Wert legt die Wahrscheinlichkeit fest. |
| `validation` |  | array of object {prompt, image_url} | no | `[]` | ≤ 2 items | Trainingsvalidierungs-Promptliste, deren Eingaben entweder alle Bilder enthalten oder alle keine Bilder enthalten müssen. |
| `validation[].prompt` |  | string | yes |  |  | Während der Validierung verwendeter Prompt. |
| `validation[].image_url` |  | string (image URL) \| null | no |  |  | Bild für die Bild-zu-Video-Validierung, nur zulässig, wenn jede andere Validierungseingabe ebenfalls ein Bild enthält. |
| `validation_negative_prompt` |  | string | no | `worst quality, inconsistent motion, blurry, jittery, distorted` |  | Bei der Validierung angewendeter negativer Prompt. |
| `validation_number_of_frames` |  | integer | no | `89` | 9 – 121 | Frame-Anzahl jedes Validierungsvideos. |
| `validation_frame_rate` |  | integer | no | `25` | 8 – 60 | Zielframerate des Validierungsvideos, gemessen in Frames pro Sekunde. |
| `validation_resolution` |  | enum (string) | no | `high` | `low`, `medium`, `high` | Während der Validierung verwendete Auflösung. |
| `validation_aspect_ratio` |  | enum (string) | no | `1:1` | `16:9`, `1:1`, `9:16` | Während der Validierung verwendetes Seitenverhältnis. |
| `stg_scale` |  | number | no | `1` | 0 – 3 | Skala der Spatio-Temporal Guidance (STG), empfohlen mit 1.0; 0.0 deaktiviert STG. |
| `generate_audio_in_validation` |  | boolean | no | `true` |  | Steuert, ob Validierungsbeispiele generiertes Audio enthalten. |

## 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 für verfügbare Validierungsvideos. |
| `lora_file` | object {url, content_type, file_name, file_size} | URL trainierter LoRA-Gewichte im .safetensors-Format. |
| `config_file` | object {url, content_type, file_name, file_size} | Konfiguration für die Einrichtung des Inferenz-Endpunkts. |
| `debug_dataset` | object {url, content_type, file_name, file_size} \| null | Herunterladbares Debug-Archiv, das nur für Eingaben mit aktiviertem `debug_dataset` zurückgegeben wird; es enthält das vorverarbeitete Trainingsdataset einschließlich dekodiertem Audio und 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
