LTX 2.5 Text-to-Video generates high-fidelity synchronized audio-video content from text prompts, with flexible duration and 720P / 1080P / 2K / 4K output for cinematic videos, social content, ads, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
$0.5per run·~20 / $10
A young male saxophone player standing under a streetlamp at night in a quiet city square, wearing a dark coat and scarf, holding a golden saxophone, cobblestone ground reflecting the light, full body visible, cinematic music drama style. He lifts the saxophone and begins playing while the camera slowly circles around him. His coat moves lightly in the night breeze, and the glow of the streetlamp reflects off the instrument. Emotional performance, smooth circular camera movement, moody nighttime ambiance.
LTX-2.5 Text-to-Video generates synchronized video and audio directly from a text prompt. It supports multiple resolutions, landscape or vertical aspect ratios, and prompt-guided control over scene composition, subject motion, camera movement, and audio direction.
Text-to-video generation
Generate videos directly from natural-language prompts.
Native audio generation
Create synchronized audio together with the video output.
Multiple resolution options
Choose from 720p, 1080p, 2k, or 4k depending on quality and cost needs.
Landscape and vertical formats
Use 16:9 for landscape video or 9:16 for vertical content.
Controlled duration
Generate videos from 5 to 20 seconds.
Seed control
Use a fixed seed for more reproducible prompt testing and variation comparison.
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text description of the scene, subject, motion, camera movement, visual style, and audio direction. |
| resolution | No | Output resolution: 720p, 1080p, 2k, or 4k. Default: 720p. |
| aspect_ratio | No | Output aspect ratio: 16:9 or 9:16. Default: 16:9. |
| duration | No | Video length in seconds. Range: 5–20. |
| seed | No | Random seed. Use -1 for a random seed. |
720p, 1080p, 2k, or 4k.16:9 for landscape video or 9:16 for vertical content.5 to 20 seconds.-1 for a random seed.Pricing is based on generated video duration and selected resolution.
Native audio is included at every resolution and does not add a separate charge.
| Resolution | Per second | 5s | 10s | 20s |
|---|---|---|---|---|
| 720p | $0.10 | $0.50 | $1.00 | $2.00 |
| 1080p | $0.14 | $0.70 | $1.40 | $2.80 |
| 2k | $0.21 | $1.05 | $2.10 | $4.20 |
| 4k | $0.33 | $1.65 | $3.30 | $6.60 |
9:16 for vertical mobile content and 16:9 for landscape video.720p for lower-cost iteration and higher resolutions for final-quality outputs.seed when comparing prompt variations.Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/ltx-2.5/text-to-video with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Ltx 2.5 Text To Video below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"resolution": "720p",
"aspect_ratio": "16:9",
"duration": 5,
"seed": -1
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/ltx-2.5/text-to-video" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/ltx-2.5/text-to-video";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"resolution": "720p",
"aspect_ratio": "16:9",
"duration": 5,
"seed": -1
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
`https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"resolution": "720p",
"aspect_ratio": "16:9",
"duration": 5,
"seed": -1
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/ltx-2.5/text-to-video", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout"}:
raise RuntimeError(result)
if status not in {"created", "processing"}:
raise RuntimeError(f"Unexpected status: {status}")
time.sleep(2)Ltx 2.5 Text To Video is a WaveSpeedAI model for video generation, exposed as a REST API on WaveSpeedAI. LTX 2.5 Text-to-Video generates high-fidelity synchronized audio-video content from text prompts, with flexible duration and 720P / 1080P / 2K / 4K output for cinematic videos, social content, ads, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/ltx-2.5-text-to-video.
Ltx 2.5 Text To Video starts at $0.50 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `aspect_ratio`, `resolution`, `duration`, `seed`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/ltx-2.5-text-to-video.
Median end-to-end generation time on WaveSpeedAI is around 189 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.
Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.