Call seedance-2.5 on Lazu for $0.103 / second.
Seedance 2.5 by ByteDance. Text-to-video, first/last-frame and multimodal reference generation (images, video, audio), 4-30 s at 480p, 720p or 1080p, with native audio.
Prices and lanes
USD per million tokens. Availability covers the last 7 days, 2 hours per bar.
- 480p
- $0.103 / second
- 720p
- $0.231 / second
- 1080p
- $0.569 / second
- Reference video
- Billed by the second with the output
- Charge
- What the provider reports for the finished clip
Prices checked 2026-11-03 19:02 UTC · How to choose a lane · seedance-2.5.json · seedance-2.5.md
Capabilities
Example request
# 1. Submit: HTTP 202 with the job id (mjob_...) and the amount held
curl https://api.lazu.ai/v1/videos \
-H "Authorization: Bearer $LAZU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "A cinematic product reveal on a clean studio table",
"seconds": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}'
# 2. Wait: answers when the status changes or the job finishes (60 s at most),
# with progress and eta_seconds; repeat until status is succeeded or failed
curl "https://api.lazu.ai/v1/videos/mjob_...?wait=60" \
-H "Authorization: Bearer $LAZU_API_KEY"
# 3. Download the MP4
curl --fail https://api.lazu.ai/v1/videos/mjob_.../content \
-H "Authorization: Bearer $LAZU_API_KEY" -o video.mp4
import os
import requests
API = "https://api.lazu.ai/v1/videos"
headers = {"Authorization": "Bearer " + os.environ["LAZU_API_KEY"]}
job = requests.post(API, headers=headers, json={
"model": "seedance-2.5",
"prompt": "A cinematic product reveal on a clean studio table",
"seconds": 5,
"resolution": "720p",
}).json()
while job["status"] in ("pending", "running"):
# Answers when the status changes or the job finishes, 60 s at most.
job = requests.get(f"{API}/{job['id']}", params={"wait": 60},
headers=headers, timeout=90).json()
print(job["status"], job.get("progress"), "%")
if job["status"] == "succeeded":
video = requests.get(job["artifact"]["url"], timeout=300)
open("video.mp4", "wb").write(video.content)
const API = "https://api.lazu.ai/v1/videos";
const headers = {
Authorization: `Bearer ${process.env.LAZU_API_KEY}`,
"Content-Type": "application/json",
};
let job = await (await fetch(API, {
method: "POST",
headers,
body: JSON.stringify({
model: "seedance-2.5",
prompt: "A cinematic product reveal on a clean studio table",
seconds: 5,
resolution: "720p",
}),
})).json();
while (job.status === "pending" || job.status === "running") {
// Answers when the status changes or the job finishes, 60 s at most.
job = await (await fetch(`${API}/${job.id}?wait=60`, { headers })).json();
console.log(job.status, job.progress, "%");
}
if (job.status === "succeeded") console.log(job.artifact.url);
Video is a job: submit it, wait for it, then download the file. The guide covers every field, references and billing. Video guide
Questions
How do I call seedance-2.5?
Video generation is a job. POST /v1/videos returns a job id at once. Read GET /v1/videos/{id}?wait=60 until its status is succeeded: each answer comes as soon as the status changes, with progress and eta_seconds, or follow GET /v1/videos/{id}/events for live updates. Then download artifact.url, a link that works for an hour, or GET /v1/videos/{id}/content with your key. Videos made through the API are kept for 3 days.
Can I use the OpenAI SDK?
Not for video. OpenAI retired its own video API, and its SDK helpers expect different statuses and fields. Call the HTTP endpoints above from any language; they are three plain requests.
How is it billed?
Per second of video, at the resolution you choose. Submitting holds the price of the seconds you ask for; when the video is done Lazu charges what the provider reports and returns the rest at once, and a failed job is refunded in full. Each job shows in your usage log from the moment it is submitted, as in progress, until it settles.