NezhaGateNezhaGate
← Guides

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 idseedance-2.5
EndpointPOST https://nezhagate.com/v1/videos/generations, then GET /v1/videos/jobs/{id}
Lengthany whole number of seconds from 4 to 30 (duration)
Resolution480P, 720P (default); 1080P coming soon
Aspect ratio16:9 (default), 9:16, 1:1, 4:3, 3:4 (size)
Referencesup to 30 images, 10 videos (30 s in total) and 10 audio clips, in one request
Audionative soundtrack, on by default (audio: false turns it off)
Promptup to 11,000 characters, Chinese and English counted the same
Outputan 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.

ResolutionPer second5 s10 s15 s30 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

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

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 full

Node.js

Node.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).

JSON
{
  "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

Every one of these returns a readable error, and a job that fails after submission is refunded in full.

How long a render takes

5.8 minMedian render time, real customer jobs over the last 7 days
9.8 min90% of jobs finish within
86.5%Success rate over the same days

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?
On NezhaGate, $0.10 per second at 480P and $0.158 per second at 720P, for any length from 4 to 30 seconds. A 5-second 720P clip is $0.79 and a 30-second one $4.74; the fixed 30-second model seedance-2.5-30s is $1.50 per clip.
How long can a Seedance 2.5 video be?
Any whole number of seconds from 4 to 30 in one generation. Set duration (or seconds) in the request; the clip is billed for exactly that many seconds.
Does Seedance 2.5 support image-to-video?
Yes, through reference images: send up to 30 images and name them in the prompt as @Image1, @Image2 and so on. Seedance treats every image as a reference for characters, objects, scenes or style; there is no first-frame mode, so an image is not guaranteed to be the opening frame.
Can I use a reference video or audio?
Yes. Up to 10 reference videos (30 seconds in total) and up to 10 reference audio clips, alongside reference images in the same request; address them as @Video1 and @Audio1. On NezhaGate reference videos are not billed, only the seconds you generate.
How long does a Seedance 2.5 render take?
Usually a few minutes, and longer when the backend is busy. Submit the job, keep the id and poll it; do not resubmit, because each submission is a new paid job. If a job fails or times out it is refunded in full.
Is 1080P available?
Not yet on NezhaGate: 480P and 720P are open today and 1080P is coming soon.
Try it on NezhaGate

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 providers

More guides: Seedance 30-Second Video API: Price, Samples, Code