Seedance 2.5 is ByteDance's July 2026 video model. It generates clips of 4-30 seconds at 480p, 720p or 1080p with generated speech, sound effects and music (mono). It takes up to 30 reference images, 10 reference clips and 10 audio tracks, and it can edit or extend a source video. Reference images and videos may contain real people. Seed control and mp4 or mov output are supported, and prompts can be up to 20,000 characters.
Best for
- 30-second ads and explainers in a single generation
- Keeping characters and products consistent with many references
- Extending an existing clip or editing its content
- Dialogue driven by a reference voice track
Prompting tips
- For longer clips, write the prompt as a timed shot list: "0-5 s: wide shot of..., 5-12 s: close-up of...".
- Frame roles, edit and extend force the
adaptiveratio, so crop afterwards if you need a fixed format. - Reference clips can be 2-30 s each with 30 s combined, and they are billed on top of the output.
- Audio can be the only reference; use it to set a voice or a beat.
FAQ
How much does the Seedance 2.5 API cost?
Seedance 2.5 is billed at from $0.261 per second. Reference clips add to the cost, the total appears as estimated_cost before the job runs, and failed generations are not charged.
How long can a Seedance 2.5 video be?
From 4 up to 30 seconds. With duration: -1 the model picks the length, and the estimate assumes 30 seconds.
Can Seedance 2.5 use photos of real people?
Yes, reference images and videos may contain real people. You need the rights and consent to use them, and outputs are yours as far as the law and ByteDance's terms allow.
How to call Seedance 2.5 via API
curl https://jantaris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $JANTARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}'import os, time, requests
API = "https://jantaris.com/v1"
H = {"Authorization": f"Bearer {os.environ['JANTARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "seedance-2.5",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://jantaris.com/v1";
const headers = { Authorization: `Bearer ${process.env.JANTARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "seedance-2.5",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Parameters
| Parameter | Type | Allowed | Default |
|---|---|---|---|
prompt * | string | ≤ 20000 chars | |
aspect_ratio | string | 16:9 9:16 1:1 4:3 3:4 21:9 adaptive | adaptive |
resolution | string | 480p 720p 1080p | 720p |
duration | integer | 4-30 | 5 |
generate_audio | boolean | true | |
image_url | string | ||
end_image_url | string | ||
image_urls | array | max 30 | |
video_urls | array | max 10 | |
audio_urls | array | max 10 | |
seed | integer |
The same schema is available from GET /v1/models/seedance-2.5.









