ByteDanceVideo
Seedance 2.5
4 to 30 s video with audio.
- Price
- 237 crper clip · 5 s · 720p
- Usual time
- ≈ 3 min
- Model id
video.seedance-2-5
Playground
A real result from Seedance 2.5.
# 1. Create the job. It is charged once and refunded if it fails.
JOB_ID=$(curl -s -X POST https://staglight.ai/api/v1/jobs \
-H "Authorization: Bearer $STAGLIGHT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"op": "video.seedance-2-5",
"params": {
"prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "9:16"
},
"max_credits": 237
}' | jq -r .id)
# 2. Poll until it finishes. Each call waits up to 30 seconds.
while :; do
JOB=$(curl -s "https://staglight.ai/api/v1/jobs/$JOB_ID?wait=30" -H "Authorization: Bearer $STAGLIGHT_API_KEY")
case "$(echo "$JOB" | jq -r .status)" in queued|running) ;; *) break ;; esac
done
# 3. Download the result from outputs[0].download_url.
DOWNLOAD_URL=$(echo "$JOB" | jq -r '.outputs[0].download_url')
curl -L -o result.mp4 "$DOWNLOAD_URL"
import os, uuid, requests
BASE = "https://staglight.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['STAGLIGHT_API_KEY']}"}
# 1. Create the job. It is charged once and refunded if it fails.
r = requests.post(f"{BASE}/jobs", timeout=60,
headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
json={
"op": "video.seedance-2-5",
"params": {
"prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "9:16"
},
"max_credits": 237
})
r.raise_for_status()
job = r.json()
# 2. Poll until it finishes. Each call waits up to 30 seconds.
while job["status"] in ("queued", "running"):
job = requests.get(f"{BASE}/jobs/{job['id']}", headers=HEADERS,
params={"wait": 30}, timeout=60).json()
# 3. Download the result from outputs[0].download_url.
print(job["outputs"][0]["download_url"] if job["outputs"] else job["data"] or job["error"])
// Node 18 or newer. Save as run.mjs: top-level await needs a module.
const BASE = "https://staglight.ai/api/v1";
const headers = { Authorization: `Bearer ${process.env.STAGLIGHT_API_KEY}` };
// 1. Create the job. It is charged once and refunded if it fails.
let res = await fetch(`${BASE}/jobs`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({
"op": "video.seedance-2-5",
"params": {
"prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "9:16"
},
"max_credits": 237
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
let job = await res.json();
// 2. Poll until it finishes. Each call waits up to 30 seconds.
while (job.status === "queued" || job.status === "running") {
job = await (await fetch(`${BASE}/jobs/${job.id}?wait=30`, { headers })).json();
}
// 3. Download the result from outputs[0].download_url.
console.log(job.outputs[0]?.download_url ?? job.data ?? job.error);
{
"id": "job_19a2b3c4d5e6f7a8b9c0d1",
"op": "video.seedance-2-5",
"status": "queued",
"credits": 237,
"title": "",
"params": {
"prompt": "A premium product shot of a glass serum bottle on wet stone, soft window light",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "9:16"
},
"progress": null,
"outputs": [],
"data": null,
"error": null,
"run_id": null,
"source": "api",
"created_at": "2026-11-06T12:00:00Z",
"finished_at": null,
"eta_seconds": 182
}
What it costs
| Duration (s) | 480p | 720p | 1080p |
|---|---|---|---|
| 4 s | 84 cr | 189 cr | 474 cr |
| 5 s | 105 cr | 237 cr | 593 cr |
| 15 s | 315 cr | 709 cr | 1,778 cr |
| 30 s | 630 cr | 1,418 cr | 3,555 cr |
480p draft also changes the price. The playground shows the exact price for your settings. A job is charged once when it is accepted, and refunded if it fails. The price is checked again with your file before it runs.
Parameters
| Name | Type | Default | Allowed |
|---|---|---|---|
promptrequiredDescription |
string |
Up to 20,000 characters | |
durationDuration (s) |
integer |
5 |
4 - 30 |
resolutionResolution |
enum |
720p |
480p, 720p, 1080p |
draft480p draft |
boolean |
false |
|
aspect_ratioAspect ratio |
enum |
9:16 |
9:16, 16:9, 1:1, 4:3, 3:4, 21:9, adaptive |
soundSound |
boolean |
true |
|
first_frameFirst frame |
media id |
Image | |
last_frameLast frame |
media id |
Image | |
reference_imagesReference images |
media id[] |
Image, up to 9 | |
reference_videoReference video |
media id |
Video |
Send these inside params. Files are media ids from POST /api/v1/uploads. View documentation
More models
-
Real output Video
Kling AI / Kling 3.0
3 to 15 s video from text or your first frame.
53 crper clip · 5 s · std
-
Real output Video
Kling AI / Kling 4.0
3 to 30 s video with sound from text or your reference pictures, in 720p or 1080p.
107 crper clip · 5 s · 720p
-
Real output Video
Kling AI / Kling 3.0 Motion Control
The character in your image copies the motion in your video.
150 crper clip · 720p · varies with length or size