Seedance 2.5 is ByteDance's newest video model and the headline feature is native synchronized audio — rain sounds on rain, engine noise on cars, dialogue lip-synced to faces, all generated together with the frames. This tutorial shows the complete integration path: submit a task, poll until it finishes, and download the MP4. Working code included.
You need an API key from any provider that lists the model. On NovAI, registration takes under a minute and ships with $2 of trial credit — enough for two Seedance 2.5 clips. The model ID is doubao-seedance-2.5.
| Parameter | Supported values |
|---|---|
resolution | 480p, 720p (trial accounts: 480p) |
duration | 1–30 seconds (trial: ≤5s · top-up: ≤15s · $50+: ≤30s on NovAI) |
image | Optional reference image URL for image-to-video |
Video generation is asynchronous: you submit a task and receive a task ID immediately.
curl -X POST https://api.aiapi-pro.com/v1/video/generations \
-H "Authorization: Bearer $NOVAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2.5",
"prompt": "A street food stall at night, steam rising from a wok, the sizzle of oil, rain tapping on the awning",
"resolution": "720p",
"duration": 5
}'
Response:
{
"id": "cgt-20260818010541-h582g",
"request_id": "vidgen-48cf5f6d496049a996d07b07",
"status": "queued",
"model": "doubao-seedance-2.5",
"resolution": "720p",
"duration": 5
}
Note how the prompt above mentions sounds explicitly — the audio model listens to your prompt. Words like "sizzle", "rain tapping", "engine roaring" steer the generated soundtrack the same way visual adjectives steer the frames.
A 5-second clip typically completes in 1–3 minutes. Poll the task endpoint:
curl https://api.aiapi-pro.com/v1/video/generations/cgt-20260818010541-h582g \ -H "Authorization: Bearer $NOVAI_API_KEY"
The status field moves through queued → running → succeeded (or failed). When succeeded, the response contains a signed video_url valid for 24 hours:
{
"status": "succeeded",
"resolution": "720p",
"duration": 5,
"generate_audio": true,
"content": { "video_url": "https://.../cgt-20260818010541-h582g.mp4?..." },
"usage": { "completion_tokens": 108450, "total_tokens": 108450 }
}
import time, requests
API_KEY = "nvai-..."
BASE = "https://api.aiapi-pro.com"
H = {"Authorization": f"Bearer {API_KEY}"}
# 1. submit
r = requests.post(f"{BASE}/v1/video/generations", headers=H, json={
"model": "doubao-seedance-2.5",
"prompt": "A paper boat drifting across a pond at dusk, frogs croaking softly",
"resolution": "720p",
"duration": 5,
})
task_id = r.json()["id"]
# 2. poll
while True:
time.sleep(15)
st = requests.get(f"{BASE}/v1/video/generations/{task_id}", headers=H).json()
print(st["status"])
if st["status"] in ("succeeded", "failed"):
break
# 3. download
if st["status"] == "succeeded":
video = requests.get(st["content"]["video_url"]).content
open("output.mp4", "wb").write(video)
print("saved output.mp4 —", st["usage"]["total_tokens"], "tokens")
Add an image field with a URL to animate a reference image — the audio track is generated to match the scene too:
{
"model": "doubao-seedance-2.5",
"prompt": "The character waves at the camera while a crowd cheers",
"image": "https://example.com/character.jpg",
"resolution": "720p",
"duration": 10
}
On NovAI, billing is per finished second — $0.14/s at 480p, $0.32/s at 720p (full breakdown in our pricing article). The cost is pre-deducted when the task is accepted, and if the task later ends in failed status, the charge is refunded automatically — you will see a novai_refund object in the polling response.
Practical tips from our launch-day testing:
The audio-included output changes what a single API call can deliver: product ads that ship ready-to-post, game ambience loops, storyboards with sound, social teasers that don't need a separate sound-design pass. Combined with the 30-second duration ceiling, one call can now cover a complete short-form video slot.
$2 trial credit · doubao-seedance-2.5 · OpenAI-style async API
Start Free →Related: Seedance 2.5 pricing, explained · Seedance 2.5 review: what actually changed · Model page