Seedance 2.0 API: pricing, parameters and working code
Seedance 2.0 is ByteDance's multi-shot video model with sound. This guide covers what it is good at, every option the API accepts, what a clip costs at each resolution, and requests you can paste into a terminal.
What Seedance 2.0 is good at
ByteDance released Seedance 2.0 in February 2026. It generates the picture and the soundtrack in one pass, can cut between several shots inside a single clip, and holds a character and a visual style across those cuts. That makes it a strong default for short narrative video: product ads, story beats and social clips that need sound from the start.
- Multi-shot clips. Describe the shots in order and the model cuts between them while keeping the subject consistent.
- Sound in the same pass. Ambience, effects and speech are generated with the picture when you set
audiototrue. - Control from images. Start from a first frame, pin both a first and a last frame, or pass up to 9 reference images for a character, a product or a look.
- Flexible framing. Six fixed aspect ratios, from vertical 9:16 for social to 21:9 for cinematic work, plus an adaptive setting that follows your input image.
Where it is weaker: like most video models, Seedance 2.0 does not reliably render exact on-screen text, so add titles, prices and logos in your editor rather than in the prompt. Busy scenes with many people moving at once are hard for current video models in general; fewer subjects and clear actions give more dependable results.
Inputs and limits
These are the options the catalogue lists for Seedance 2.0. The request format is the same as for every other model on Revana; only the allowed values differ.
| Option | Seedance 2.0 |
|---|---|
| Model id | seedance-2.0 (lighter tiers: seedance-2.0-fast, seedance-2.0-mini) |
| Tasks | text to video, image to video, first and last frame and reference images |
| Resolution | 480p, 720p, 1080p and 4K |
| Duration | 4 to 15 s |
| Aspect ratio | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 or adaptive |
| Sound | audio: true or false |
| Reference images | up to 9, as image_urls |
A field or value the model does not support is rejected with a 422 error before anything is charged, so a typo in a request costs nothing.
Seedance 2.0 pricing (October 2026)
Seedance 2.0 is billed per second of output video. Prices below are from the Revana catalogue in October 2026, starting from $0.08 per second at 480p.
| Resolution | Per second | 5 s clip | 10 s clip | 15 s clip |
|---|---|---|---|---|
| 480p | $0.08 | $0.40 | $0.80 | $1.20 |
| 720p | $0.15 | $0.75 | $1.50 | $2.25 |
| 1080p | $0.40 | $2.00 | $4.00 | $6.00 |
| 4K | $0.83 | $4.15 | $8.30 | $12.45 |
There is no separate audio rate for Seedance 2.0: the listed price is the same with sound on or off.
The catalogue also lists a lower with video input rate ($0.10 per second at 720p) for jobs that use a reference video. The billed seconds for those jobs are the output length plus the length of the reference clip. A 5 second 720p clip guided by a 5 second reference video is billed as 10 seconds: $1.00, against $0.75 for the same clip without one.
When you submit a job, its price is held from your balance. You are charged only when the job succeeds; if it fails, the hold is released. The exact amount comes back on the generation as cost_usd. See pricing for credit packs and the full price table.
Seedance 2.0 Fast and Mini
The same family comes in two lighter tiers with the same tasks, aspect ratios, durations and up to 9 reference images, but they stop at 720p. They suit drafts and high-volume work; re-run the prompts you like on Seedance 2.0 for final quality and higher resolutions.
| Model | 480p / s | 720p / s | 5 s at 720p | Routes |
|---|---|---|---|---|
| Seedance 2.0 | $0.08 | $0.15 | $0.75 | three routes |
| Seedance 2.0 Fast | $0.05 | $0.11 | $0.55 | four routes |
| Seedance 2.0 Mini | $0.03 | $0.05 | $0.25 | four routes |
Generate a Seedance 2.0 video
Every request goes to POST /v1/generations with your API key as a bearer token. The call returns 202 straight away with a generation id; poll GET /v1/generations/{id} every few seconds until status is succeeded or failed. This example asks for a 5 second 720p clip with sound, which costs $0.75.
export REVANA_API_KEY="sr_live_..."
# 1. Submit the job (returns 202 with the generation id)
curl https://api.revana.si/v1/generations \
-H "Authorization: Bearer $REVANA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"input": {
"prompt": "A ceramic coffee mug on a sunlit kitchen counter. Shot 1: slow push-in as steam rises. Shot 2: close-up of a hand lifting the mug. Morning birdsong, a soft clink as the mug leaves the counter.",
"resolution": "720p",
"duration": 5,
"aspect_ratio": "16:9",
"audio": true
},
"max_cost_usd": 2
}'
# 2. Poll with the id from step 1 until status is "succeeded" or "failed"
curl https://api.revana.si/v1/generations/gen_01JBX7Q2M4 \
-H "Authorization: Bearer $REVANA_API_KEY"import os
import time
import requests
API = "https://api.revana.si/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['REVANA_API_KEY']}"}
resp = requests.post(f"{API}/generations", headers=HEADERS, json={
"model": "seedance-2.0",
"input": {
"prompt": "A ceramic coffee mug on a sunlit kitchen counter. Shot 1: slow push-in as steam rises. Shot 2: close-up of a hand lifting the mug. Morning birdsong, a soft clink as the mug leaves the counter.",
"resolution": "720p",
"duration": 5,
"aspect_ratio": "16:9",
"audio": True,
},
"max_cost_usd": 2,
})
resp.raise_for_status()
job = resp.json()
while job["status"] in ("queued", "running"):
time.sleep(5)
job = requests.get(f"{API}/generations/{job['id']}", headers=HEADERS).json()
if job["status"] == "succeeded":
print(job["output"]["urls"], job["cost_usd"])
else:
print("Failed:", job["error"])// Node 18 or later. Save as generate.mjs and run: node generate.mjs
const API = "https://api.revana.si/v1";
const headers = {
Authorization: `Bearer ${process.env.REVANA_API_KEY}`,
"Content-Type": "application/json",
};
const res = await fetch(`${API}/generations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "seedance-2.0",
input: {
prompt: "A ceramic coffee mug on a sunlit kitchen counter. Shot 1: slow push-in as steam rises. Shot 2: close-up of a hand lifting the mug. Morning birdsong, a soft clink as the mug leaves the counter.",
resolution: "720p",
duration: 5,
aspect_ratio: "16:9",
audio: true,
},
max_cost_usd: 2,
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
let job = await res.json();
while (job.status === "queued" || job.status === "running") {
await new Promise((r) => setTimeout(r, 5000));
job = await (await fetch(`${API}/generations/${job.id}`, { headers })).json();
}
if (job.status === "succeeded") console.log(job.output.urls, job.cost_usd);
else console.error("Failed:", job.error);max_cost_usd is a ceiling on what the job may cost: routes quoted above it are skipped, and if none fit, the job is not run. Set it a little above the price you expect. A finished generation looks like this:
{
"id": "gen_01JBX7Q2M4",
"model": "seedance-2.0",
"status": "succeeded",
"output": {
"urls": [
"https://cdn.revana.si/g/gen_01JBX7Q2M4/0.mp4"
]
},
"cost_usd": 0.75,
"attempts": 1,
"error": null,
"created_at": "2026-10-19T14:02:11Z",
"completed_at": "2026-10-19T14:03:47Z"
}Download the file soon after the job finishes: output links expire. The API docs list every field, status and error code.
Animate a still (image to video)
Pass a start frame as image_url. The prompt then describes motion and sound rather than the scene, which is already in the image. The adaptive aspect ratio follows the shape of your image.
{
"model": "seedance-2.0",
"input": {
"prompt": "She turns toward the camera and smiles as a light breeze moves her hair. Distant city traffic, a bus passing.",
"image_url": "https://example.com/first-frame.jpg",
"resolution": "1080p",
"duration": 5,
"aspect_ratio": "adaptive",
"audio": true
},
"max_cost_usd": 3
}Start and end frames
Add end_image_url to fix where the shot finishes. The model fills in the motion between the two frames, which works well for transitions, reveals and before-and-after shots.
{
"model": "seedance-2.0",
"input": {
"prompt": "Smooth orbit around the sneaker as the light shifts from daylight to neon night",
"image_url": "https://example.com/start.jpg",
"end_image_url": "https://example.com/end.jpg",
"resolution": "720p",
"duration": 6,
"aspect_ratio": "16:9",
"audio": false
},
"max_cost_usd": 2
}Reference images
To keep a character or product consistent without fixing the first frame, send up to 9 images as image_urls and describe each one in the prompt, for example "the woman from the first image". Use frames or references in a request, not both: they are separate modes, and a request that mixes them may be rejected.
{
"model": "seedance-2.0",
"input": {
"prompt": "The woman from the first image walks through the market from the second image, carrying the bag from the third image. Handheld camera, golden hour, market chatter.",
"image_urls": [
"https://example.com/woman.jpg",
"https://example.com/market.jpg",
"https://example.com/bag.jpg"
],
"resolution": "720p",
"duration": 8,
"aspect_ratio": "9:16",
"audio": true
},
"max_cost_usd": 2
}Prompt tips for Seedance 2.0
- Write the shots in order. Labels such as "Shot 1: wide establishing shot. Shot 2: close-up of her hands" give the model clear cut points.
- Name the camera move. Push-in, orbit, handheld, locked-off tripod, drone pull-back: one move per shot reads better than a list.
- Describe the sound. "Rain on a tin roof, distant thunder, no music" works better than leaving audio to chance. If you do not want speech, say so.
- Keep dialogue short. Put the line in quotes and say who speaks. A 5 second clip has room for one short sentence.
- Leave text out of the frame. Add captions, titles and logos in editing.
- Draft cheaply, then upscale. Iterate at 480p or on Seedance 2.0 Mini, then re-run the winning prompt at 1080p. Results are not identical across resolutions and tiers, so treat drafts as a guide.
How routing and fallback work for Seedance 2.0
Revana is an API router: one key and one request format in front of several upstream providers that serve the same model. Seedance 2.0 currently has three routes. The router sends each job to the cheapest route first; if that route fails or times out, it resubmits the job to the next one automatically.
- You pay the listed price whichever route serves the job, and only the route that succeeds is charged.
- The
attemptsfield on the generation tells you how many routes were tried. - If every route fails, the job ends as
failedwith an error and costs nothing.
Fallback raises the odds of getting a result, but it is not a promise of uptime or speed. Handle failed jobs in your app, for example by retrying later or offering another model.
Ready to try it? Get an API key, then compare Seedance 2.0 with the other video models.
Frequently asked questions
How much does the Seedance 2.0 API cost?
In October 2026, Seedance 2.0 costs $0.08 per second at 480p, $0.15 at 720p, $0.40 at 1080p and $0.83 at 4K. A 5 second 720p clip is $0.75. Sound is included in the same price.
Does Seedance 2.0 generate audio?
Yes. Set audio to true and the model generates ambience, effects and speech with the picture in the same pass. Set it to false for a silent clip; the price is the same either way.
How long can a Seedance 2.0 video be?
From 4 to 15 seconds per request. For longer pieces, generate several clips and edit them together, or use Seedance 2.5, which goes up to 30 seconds.
Can I use reference images with Seedance 2.0?
Yes, up to 9 images as image_urls, for characters, products or style. Use either frames (image_url and end_image_url) or references in one request, not both.
How do Seedance 2.0 Fast and Mini differ from Seedance 2.0?
They have the same tasks and options but stop at 720p. At 720p, Seedance 2.0 Fast is $0.11 per second and Seedance 2.0 Mini is $0.05, against $0.15 for Seedance 2.0.
What happens if a Seedance 2.0 generation fails?
The router tries the next route automatically. You are charged once, for the route that succeeds; if every route fails, the job fails and costs nothing.
Call Seedance 2.0 with one key
Create a key, add credit from $10, and use the same key for Seedance 2.0 and every other model in the catalogue.