LTX 2.5 Pro API

LTX Studiovideo$2.06 / run

Submit a LTX 2.5 Pro run over HTTP, then poll it or take a webhook. Results are files on media.ezflows.io. Try it in the playground first.

Async: the POST answers at once with a request id. Poll it, or take the webhook.

  1. 01

    Submit

    Parameters at the top level of the JSON body. Answers 202 with a request id.

    curlPOST /v1/models/ltx-2.5-pro
    curl -X POST https://api.ezflows.io/v1/models/ltx-2.5-pro \
      -H "Authorization: Bearer $EZFLOWS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "prompt": "The waterfall thunders down the mossy cliffs, churning the turquoise pool below as mist swirls through golden sunbeams; tropical birds glide across the frame while the camera slowly drifts in. Ambient rainforest sounds of rushing water, distant birdsong and gentle wind.",
        "aspect_ratio": "16:9",
        "resolution": "1080p",
        "duration": 6
      }'
    
    # 202 Accepted, at once — it never waits for the model:
    # {"request_id": "req_8f2a41c9b70e4d15", "status": "queued",
    #  "poll_url": "https://api.ezflows.io/v1/requests/req_8f2a41c9b70e4d15"}
  2. 02

    Poll

    Same bearer header, every few seconds, until the status is final.

    curlGET /v1/requests/:id
    REQUEST_ID=req_8f2a41c9b70e4d15   # from the POST
    
    while :; do
      BODY=$(curl -s https://api.ezflows.io/v1/requests/$REQUEST_ID \
        -H "Authorization: Bearer $EZFLOWS_API_KEY")
      STATUS=$(echo "$BODY" | jq -r .data.status)
      case "$STATUS" in succeeded|failed|cancelled) break ;; esac
      sleep 3
    done
    
    echo "$BODY" | jq -r '.data.output.artifacts[].url'   # media.ezflows.io, kept 90 days
  3. 03

    Response

    Files are on media.ezflows.io, kept 90 days. A failed run says why and costs nothing.

    json200 · succeeded
    {
      "data": {
        "id": "req_8f2a41c9b70e4d15",
        "model_slug": "ltx-2.5-pro",
        "status": "succeeded",
        "http_status": 200,
        "cost": 2.059516,
        "auth_method": "api_key",
        "error": null,
        "submitted_at": "2026-09-12T18:07:21.114Z",
        "queue_started_at": "2026-09-12T18:07:21.402Z",
        "execution_started_at": "2026-09-12T18:07:22.010Z",
        "first_byte_at": "2026-09-12T18:07:52.871Z",
        "finished_at": "2026-09-12T18:07:55.203Z",
        "io_deleted_at": null,
        "canvas_id": null,
        "canvas_node_id": null,
        "client_attempt_id": null,
        "idempotency_key": null,
        "input": {
          "prompt": "The waterfall thunders down the mossy cliffs, churning the turquoise pool below as mist swirls through golden sunbeams; tropical birds glide across the frame while the camera slowly drifts in. Ambient rainforest sounds of rushing water, distant birdsong and gentle wind.",
          "aspect_ratio": "16:9",
          "resolution": "1080p",
          "duration": 6
        },
        "output": {
          "artifacts": [
            {
              "index": 0,
              "kind": "video",
              "contentType": "video/mp4",
              "url": "https://media.ezflows.io/outputs/<account>/req_8f2a41c9b70e4d15/0.mp4"
            }
          ]
        }
      }
    }
  4. 04

    Webhook

    Skip polling: we POST the result to your endpoint, at least once.

    Register
    Create an endpoint under Webhooks in the dashboard; the signing secret is shown once.
    Events
    request.succeeded · request.failed · request.cancelled
    Headers
    ezflows-event-id (dedupe on it) · ezflows-timestamp (unix seconds) · ezflows-signature t=<ts>,v1=<hex HMAC-SHA256 of "<ts>.<raw body>">
    Verify
    Over the exact bytes received, in constant time; reject anything older than five minutes.
    Respond
    Any 2xx within 10 s. Redirects are not followed.
    Retries
    Five, with backoff: 30 s · 60 s · 2 min · 4 min · 8 min. Disabled after five consecutive dead deliveries.
    jsonDelivery body
    {
      "id": "82cf46a4-841e-41d6-b3c7-facc937d3252",
      "type": "request.succeeded",
      "created_at": "2026-09-12T18:07:55Z",
      "data": {
        "id": "req_8f2a41c9b70e4d15",
        "model_slug": "ltx-2.5-pro",
        "status": "succeeded",
        "cost": 2.059516,
        "output": {
          "artifacts": [
            {
              "url": "https://media.ezflows.io/…/0.mp4"
            }
          ]
        }
      }
    }
    curlverify.sh
    # Create the endpoint under Webhooks in the dashboard; the signing secret is shown once.
    # ezflows-signature: t=<ts>,v1=<hex HMAC-SHA256 of "<ts>.<raw body>">
    # body.json = the exact bytes received. Reject anything older than five minutes.
    EXPECTED=$({ printf '%s.' "$TS"; cat body.json; } \
      | openssl dgst -sha256 -hmac "$EZFLOWS_WEBHOOK_SECRET" -r | cut -d' ' -f1)
    
    [ "$EXPECTED" = "$V1" ] && echo "valid" || echo "reject"

Parameters 9

NameTypeDefaultAllowedDescription
promptrequiredstringThe waterfall thunders down the mossy cliffs, churning the turquoise pool below as mist swirls through golden sunbeams; tropical birds glide across the frame while the camera slowly drifts in. Ambient rainforest sounds of rushing water, distant birdsong and gentle wind.—Describe scene, action, camera and audio in one flowing paragraph. Add sound cues for native audio.
imagestring—one image urlOptional first frame; adding it switches to image-to-video. Use a high-resolution JPEG or PNG.
aspect_ratioenum16:916:9 · 9:16Output orientation. Use 16:9 for landscape, 9:16 for portrait and social.
resolutionenum1080p720p · 1080pOutput resolution, 720p or 1080p. Pick 1080p for final delivery, 720p for drafts.
durationenum66 · 8 · 10Clip length in seconds: 6, 8 or 10. Use 6 for single actions, 10 for sequences.
fpsenum2424 · 25 · 50Frame rate. Choose 24 or 25 for cinematic, 50 for smooth action.
generate_audiobooleantrue—Generates a synchronized audio track. Turn off for silent video.
camera_motionenumautoauto · static · dolly_in · dolly_out · dolly_left · dolly_right · jib_up · jib_down · focus_shiftForces a camera move. Leave on auto to let the prompt drive it.
last_frame_uristring—one image urlOptional closing frame for image-to-video interpolation. Cannot combine with automatic duration.

File inputs (image: one image url · last_frame_uri: one image url) take URLs. Upload the raw file to POST /v1/uploads with its own Content-Type and pass the url it returns. Inputs are kept 90 days.