Skip to content
Sign in

LTX23 Video API

Create Standard AV image-to-video jobs with the LTX23 video API.

The LTX23 Video API exposes a small asynchronous image-to-video surface under `/api/ltx23/v1`. Submit a prompt and input image, receive a `request_id`, then poll the status endpoint until the job returns a generated MP4 URL or a failure reason.

POST/api/ltx23/v1/videos/generations

Start image-to-video generation

Creates a Standard AV job. The public route validates the API key, records usage, and forwards the request to the Django task queue backed by the broker-managed LTX23 worker pool.

GET/api/ltx23/v1/videos/{request_id}

Check generation status

Returns `queued`, `processing`, `done`, `failed`, or `canceled`. When the job is done, the response includes `video.url`.

JSON request fields

The endpoint accepts JSON only. For direct file uploads from your own server or browser, convert the image to a base64 data URL and send it as image.url. Remote image URLs must be publicly reachable.

FieldTypeRequiredNotes
modelstringNoDefaults to `ltx23-standard`. Accepted aliases include `ltx23-standard`, `ltx23-standard-fast`, `ltx23-standard-quality`, `ltx23-standard-full`, `ltx23-standard-distilled`, `ltx23`, and `ltx-2.3`.
promptstringYesText instruction for how the input image should animate.
image.urlstringYesA base64 data URL, a same-site `/uploads/...` path, or a public `http(s)` image URL. JPG, PNG, and WEBP are accepted up to 25 MB. Private network hosts and redirects are rejected for remote URLs.
durationintegerNoDefaults to 5. Must be between 2 and 10 seconds.
aspect_ratiostringNoDefaults to `16:9`. Supported values are `16:9`, `9:16`, and `1:1`. The camelCase alias `aspectRatio` is also accepted.
resolutionstringNoDefaults to `720p`. Supported values are `480p` and `720p`.
seedintegerNoUse `-1` or omit the field for a random seed. Non-negative seeds are clamped to the service-safe range.

POST /api/ltx23/v1/videos/generations

Sample
curl -sS \
  -X POST \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "model": "ltx23-standard",
    "prompt": "A cinematic product shot with gentle camera motion.",
    "image": {
      "url": "https://example.com/input.png"
    },
    "duration": 5,
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "seed": -1
  }' \
  "https://kaleidovid.com/api/ltx23/v1/videos/generations"

Queued response example

Sample
{
  "request_id": "6bcd2f29-4b74-4479-a3b3-f71a50a77dab",
  "status": "queued",
  "model": "ltx23-standard"
}

GET /api/ltx23/v1/videos/{request_id}

Sample
curl -sS \
  -H "x-api-key: YOUR_API_KEY" \
  "https://kaleidovid.com/api/ltx23/v1/videos/6bcd2f29-4b74-4479-a3b3-f71a50a77dab"

Done response example

Sample
{
  "request_id": "6bcd2f29-4b74-4479-a3b3-f71a50a77dab",
  "status": "done",
  "model": "ltx23-standard",
  "video": {
    "url": "/uploads/generations/ltx23/ltx23_av_20260426_abcdef.mp4"
  }
}

Status response fields

FieldTypeRequiredNotes
request_idstringAlwaysCelery task id used to poll the status endpoint.
statusstringAlwaysOne of `queued`, `processing`, `done`, `failed`, or `canceled`.
modelstringAlwaysThe public model alias associated with the request.
video.urlstringWhen doneRelative or absolute URL of the generated MP4. Present only when `status=done`.
progressobjectMaybeBest-effort task progress metadata while the job is processing.
errorstringOn failureFailure reason returned when the job fails.

Python polling example

Sample
# pip install requests

import base64
import mimetypes
import time
from pathlib import Path

import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://kaleidovid.com/api/ltx23/v1"
image_path = Path("input.png")
mime_type = mimetypes.guess_type(image_path.name)[0] or "image/png"
image_data_url = (
    f"data:{mime_type};base64,"
    + base64.b64encode(image_path.read_bytes()).decode("ascii")
)

start = requests.post(
    f"{BASE_URL}/videos/generations",
    headers={"x-api-key": API_KEY},
    json={
        "model": "ltx23-standard",
        "prompt": "A cinematic product shot with gentle camera motion.",
        "image": {"url": image_data_url},
        "duration": 5,
        "aspect_ratio": "16:9",
        "resolution": "720p",
        "seed": -1,
    },
    timeout=180,
)
start.raise_for_status()
request_id = start.json()["request_id"]

while True:
    status = requests.get(f"{BASE_URL}/videos/{request_id}", headers={"x-api-key": API_KEY}, timeout=60)
    status.raise_for_status()
    payload = status.json()
    if payload["status"] in {"done", "failed", "canceled"}:
        break
    time.sleep(5)

print(payload)

Failed response example

Sample
{
  "request_id": "6bcd2f29-4b74-4479-a3b3-f71a50a77dab",
  "status": "failed",
  "model": "ltx23-standard",
  "error": "Remote LTX image-to-video failed: upstream message"
}
The public model aliases map to the same Standard AV backend. `ltx23-standard`, `ltx23-standard-fast`, and `ltx23-standard-distilled` use the distilled variant; `ltx23-standard-quality` and `ltx23-standard-full` request the full variant. Use the status endpoint instead of holding a long HTTP connection open.