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.
/api/ltx23/v1/videos/generationsStart 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.
/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.
| Field | Type | Required | Notes |
|---|---|---|---|
model | string | No | Defaults 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`. |
prompt | string | Yes | Text instruction for how the input image should animate. |
image.url | string | Yes | A 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. |
duration | integer | No | Defaults to 5. Must be between 2 and 10 seconds. |
aspect_ratio | string | No | Defaults to `16:9`. Supported values are `16:9`, `9:16`, and `1:1`. The camelCase alias `aspectRatio` is also accepted. |
resolution | string | No | Defaults to `720p`. Supported values are `480p` and `720p`. |
seed | integer | No | Use `-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
Samplecurl -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}
Samplecurl -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
| Field | Type | Required | Notes |
|---|---|---|---|
request_id | string | Always | Celery task id used to poll the status endpoint. |
status | string | Always | One of `queued`, `processing`, `done`, `failed`, or `canceled`. |
model | string | Always | The public model alias associated with the request. |
video.url | string | When done | Relative or absolute URL of the generated MP4. Present only when `status=done`. |
progress | object | Maybe | Best-effort task progress metadata while the job is processing. |
error | string | On failure | Failure 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"
}