Seedance 2.0 is ByteDance's February 2026 video model. It generates 4-15 second clips at 480p, 720p, 1080p or 4K, with optional generated speech, sound effects and music. The mode depends on what you send: text only, 1-9 images, a first and last frame, or up to 3 reference clips plus 3 reference audio tracks. Setting duration to -1 lets the model choose the length. Prompts can be up to 20,000 characters, though under 500 is recommended.
Best for
- Short ads and social clips with dialogue and sound in one pass
- Animating a product photo or character art
- Transitions between a defined first and last frame
- Matching the motion or rhythm of a reference clip
Prompting tips
- Use shot language: shot size, camera move and pace, for example "slow dolly-in, medium close-up".
- Put dialogue in quotes and say who speaks; describe sound effects and music mood separately.
- With 1-2 images the model animates from them, while 3 or more act as references, so decide which behavior you want.
- Reference audio tracks (2-15 s each) need an image or clip in the same request.
FAQ
How much does the Seedance 2.0 API cost?
Seedance 2.0 costs from $0.157 per second. Reference clips are billed on top of the output, the estimate is returned before the job starts, and failed generations are not charged.
What is the maximum length and resolution of Seedance 2.0?
Clips run 4-15 seconds at up to 4K. With duration: -1 the model picks the length, and the cost estimate assumes 15 seconds.
Seedance 2.0 or Seedance 2.5?
Seedance 2.5 extends clips to 30 seconds, takes up to 30 reference images and can edit or extend a video, but stops at 1080p. Seedance 2.0 is the one with a 4K option.
How to call Seedance 2.0 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.0",
"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.0",
"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.0",
"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 4k | 720p |
duration | integer | 4-15 | 5 |
generate_audio | boolean | true | |
image_url | string | ||
end_image_url | string | ||
image_urls | array | max 9 | |
video_urls | array | max 3 | |
audio_urls | array | max 3 |
The same schema is available from GET /v1/models/seedance-2.0.









