Seedance 2.5 API: price, parameters and code
Seedance 2.5 is ByteDance's video model that renders up to 30 seconds in a single shot, with native audio, from a text prompt or from up to 30 reference images, 10 videos and 10 audio clips. On NezhaGate it is an OpenAI-style async API: $0.10 per second at 480P, $0.158 at 720P, and a failed job costs nothing.
Updated 2026-10-03
Seedance 2.5 at a glance
ByteDance released Seedance 2.5 on 31 July 2026 (ByteDance Seed). Its headline is length: up to 30 seconds in one take, with native audio, where Seedance 2.0 stops at 15. On NezhaGate it sits behind the same API key as every other model.
| Model id | seedance-2.5 |
|---|---|
| Endpoint | POST https://nezhagate.com/v1/videos/generations, then GET /v1/videos/jobs/{id} |
| Length | any whole number of seconds from 4 to 30 (duration) |
| Resolution | 480P, 720P (default); 1080P coming soon |
| Aspect ratio | 16:9 (default), 9:16, 1:1, 4:3, 3:4 (size) |
| References | up to 30 images, 10 videos (30 s in total) and 10 audio clips, in one request |
| Audio | native soundtrack, on by default (audio: false turns it off) |
| Prompt | up to 11,000 characters, Chinese and English counted the same |
| Output | an mp4 link in data[0].url, hosted by us and kept for 60 days |
Price
Billed per second of video you generate. Reference images, videos and audio are not billed. A failed or timed-out job is refunded in full.
| Resolution | Per second | 5 s | 10 s | 15 s | 30 s |
|---|---|---|---|---|---|
| 480P | $0.10 | $0.50 | $1.00 | $1.50 | $3.00 |
| 720P | $0.158 | $0.79 | $1.58 | $2.37 | $4.74 |
ByteDance's official BytePlus price for 16:9 video is $0.103 per second at 480p and $0.231 at 720p: at 720P you save 31%. A fixed 30-second 720P clip on seedance-2.5-30s is $1.50. Every provider's price, side by side: Seedance API pricing compared.
Submit a job and get the video
Video is asynchronous: the submit call returns HTTP 202 and a job id right away, then you poll until status is succeeded and read data[0].url. Create a key in the console and set it as API_KEY.
curl
# 1) submit: returns {"id": "img_...", "status": "queued"}
curl https://nezhagate.com/v1/videos/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "A lighthouse keeper climbs the spiral stairs at dusk; the lamp flares on and sweeps across a stormy sea. Slow push-in, warm light, film grain.",
"duration": 10,
"resolution": "720P",
"size": "16:9"
}'
# 2) poll every 15 s until "status" is "succeeded", then read data[0].url
curl https://nezhagate.com/v1/videos/jobs/JOB_ID -H "Authorization: Bearer $API_KEY"Python
import os
import time
import requests
BASE = "https://nezhagate.com/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["API_KEY"]}
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
"model": "seedance-2.5",
"prompt": "A lighthouse keeper climbs the spiral stairs at dusk; the lamp flares on "
"and sweeps across a stormy sea. Slow push-in, warm light, film grain.",
"duration": 10,
"resolution": "720P",
"size": "16:9",
}).json()
print("job", job["id"])
while True:
time.sleep(15)
r = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()
if r["status"] == "succeeded":
print(r["data"][0]["url"])
break
if r["status"] == "failed":
raise SystemExit(r["error"]["message"]) # refunded in fullNode.js
const BASE = "https://nezhagate.com/v1";
const headers = { Authorization: `Bearer ${process.env.API_KEY}`, "Content-Type": "application/json" };
const job = await (await fetch(`${BASE}/videos/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "seedance-2.5",
prompt: "A lighthouse keeper climbs the spiral stairs at dusk; the lamp flares on and sweeps across a stormy sea.",
duration: 10,
resolution: "720P",
size: "16:9",
}),
})).json();
while (true) {
await new Promise((ok) => setTimeout(ok, 15000));
const r = await (await fetch(`${BASE}/videos/jobs/${job.id}`, { headers })).json();
if (r.status === "succeeded") { console.log(r.data[0].url); break; }
if (r.status === "failed") throw new Error(r.error.message);
}Reference images, videos and audio
Add references to the same request and name them in the prompt in order: @Image1, @Image2 for images, @Video1 for video_references, @Audio1 for audio_reference. Each item can be a public URL or a base64 data URI (we host it for 7 days).
{
"model": "seedance-2.5",
"prompt": "The dancer from @Image1 performs the moves of @Video1 on the rooftop from @Image2, cut to the beat of @Audio1.",
"images": ["https://example.com/dancer.png", "https://example.com/rooftop.png"],
"video_references": ["https://example.com/moves.mp4"],
"audio_reference": ["https://example.com/beat.mp3"],
"duration": 12,
"resolution": "720P",
"size": "9:16"
}Seedance has no first-frame mode: every image is a reference for a character, an object, a place or a style, so a reference image is not guaranteed to open the clip. Name each reference in the prompt and say what to keep from it.
Limits that make a request fail
- More than 30 images, 10 videos or 10 audio clips, or reference videos longer than 30 seconds in total: refused at submit, not truncated.
- A prompt over 11,000 characters.
- A duration outside 4 to 30 seconds, or a ratio outside the five above (21:9 is not available).
- Content the moderation check refuses. Photos of real people may be refused; characters you generate yourself, photoreal ones included, work as references.
Every one of these returns a readable error, and a job that fails after submission is refunded in full.
How long a render takes
Counted: real customer requests. Not counted: our own tests, requests rejected for client errors (4xx) and content the model refused. Failed calls are never billed. Updated every 10 minutes.
Longer and higher-resolution clips take longer, and so do busy hours. Keep the job id and poll it; do not resubmit, because every submission is a new paid job. A render that does not finish in time ends as failed, with the reason in error, and is refunded in full.
FAQ
How much does the Seedance 2.5 API cost?
How long can a Seedance 2.5 video be?
Does Seedance 2.5 support image-to-video?
Can I use a reference video or audio?
How long does a Seedance 2.5 render take?
Is 1080P available?
The same OpenAI-compatible key works for every other chat, image and video model on NezhaGate. Pay as you go; failed jobs are refunded in full.
Get an API key Try it in the playground Compare providersMore guides: Seedance 30-Second Video API: Price, Samples, Code