ByteDance Doubao Seedance 2.5, direct on the Volcengine Ark official channel (upstream doubao-seedance-2-5-260628). Against 2.0 it stretches clips to 30 seconds, takes 50 reference assets, and adds two new task types — video editing and video extension — plus a mov delivery format. Resolution is 480p and 720p only: no 1080p, and no 4K.
| Model | model | Resolution | Billing (per second) |
|---|---|---|---|
| Doubao Seedance 2.5 | seedance-2.5 | 480p / 720p | $0.134 / $0.300 |
| Seedance 2.0 Official | seedance-2.0-official | 480p / 720p / 1080p | $0.092 / $0.197 / $0.492 |
The second row is Seedance 2.0 Official, for comparison: 2.5 at 720p costs about 52% more, and buys 30-second clips, 50 reference assets and the edit / extend task types. Upstream bills on generation tokens, so the table shows derived per-second values; the charge follows the tokens actually produced. Charged only on success, refunded on failure.
A job that carries a reference video — editing or extension — is billed on (source seconds + output seconds), at 480p $0.080 and 720p $0.180.
Example: editing a 4.0-second 480p clip that comes back 3.7 seconds long → (4.0 + 3.7) × $0.080 ≈ $0.62.
⚠️ This is not a discount. The per-second rate is lower, but every second of the source clip is billed too — so editing a clip into an output of the same length costs 20-25% MORE than generating that length from scratch. If cost is what matters, generate; don’t route through editing.
At create time we read the source clip’s duration and freeze credits against the real length; the final charge follows the tokens upstream actually reports, with the difference refunded. If the duration cannot be read, we freeze against the 30-second ceiling and refund the difference on completion all the same.
Aliases: seedance-2-5 / seedance-2.5-official / doubao-seedance-2-5-260628 all point at the same model; the canonical name echoed in the response is seedance-2.5.
All requests carry the API key in the header:
Authorization: Bearer YOUR_API_KEY/api/v1/video/generations·GET/api/v1/video/generations?task_id=# Text-to-video (model: seedance-2.5)
curl -X POST https://apimodels.app/api/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "a hummingbird hovering near a bright flower, slow motion",
"resolution": "720p",
"aspect_ratio": "16:9",
"duration": 8
}'
# Poll until completed (result files are kept 7 days)
curl "https://apimodels.app/api/v1/video/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# "duration": -1 → the model picks the best length for the prompt.
# "output_format": "mov" → H.264 + yuv444p + PCM instead of the default mp4.
#
# Real person: register the face in the asset library first, then reference it —
# a RAW real face URL is rejected at create-time, asset:// passes:
# "reference_image_urls": ["asset://asset-2026...-xxxx"]| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | seedance-2.5 (aliases seedance-2-5 / seedance-2.5-official / doubao-seedance-2-5-260628) |
| prompt | Conditional | string | Prompt (required for text-to-video; optional when a visual input is provided) |
| resolution | No | string | 480p or 720p, default 720p. 2.5 has no 1080p and no 4K. |
| aspect_ratio | No | string | 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 / adaptive (default). Editing, extension and first-frame / first+last-frame accept adaptive only — see the task-type constraints below. |
| duration | No | number | 4-30 seconds; pass -1 to let the model pick the best length. Video editing accepts -1 only (or simply omit it). |
| generate_audio | No | boolean | Native synchronized audio, default true |
| output_format | No | string | mp4 (default) or mov. mov is H.264 + yuv444p + PCM — higher colour fidelity for grading and keying, at the cost of some players not opening it. |
| first_frame_url | No | string | First frame for image-to-video (https:// or asset://). With a first frame the ratio is forced to adaptive. |
| last_frame_url | No | string | Last frame for image-to-video; needs first_frame_url alongside it |
| reference_image_urls | No | string[] | Reference images, up to 30 (https:// or asset://; use asset:// for real people). Cite them in the prompt in order as 图片1 / @image1. |
| reference_video_urls | No | string[] | Reference videos, up to 10; each 2-30s and 30s in total. The source clip for editing and extension also goes here, cited as 视频1 / @video1. |
| reference_audio_urls | No | string[] | Reference audios, up to 10; each 2-30s and 30s in total. On 2.5 an audio-only reference is allowed (2.0 needs an image or video alongside). |
| web_search | No | boolean | Web search tool |
| task_type | No | string | generate / edit / extend — declare the task type outright instead of leaving the backend to infer it from the prompt (also the fix when that inference gets it wrong) |
One job takes up to 50 reference assets: 30 images + 10 videos + 10 audios. Assets are cited positionally in the prompt — the first entry of reference_image_urls is 图片1 / @image1, the first of reference_video_urls is 视频1 / @video1, and audios follow the same pattern. Telling each asset what to supply and what NOT to supply beats piling more of them on.
| Asset | Max count | Duration limit | Seedance 2.0 |
|---|---|---|---|
| reference_image_urls | 30 | — | 9 |
| reference_video_urls | 10 | 2-30s each, 30s in total | 3 |
| reference_audio_urls | 10 | 2-30s each, 30s in total | 3 |
On 2.5 you may pass audio as the only reference (a voice track with no image, say); 2.0 requires audio to come with an image or a video.
2.5 adds video editing (replace / add / remove objects in frame, and edit the audio track) and video extension (continue the clip forwards or backwards, round after round). Those two, plus first-frame and first+last-frame, all lock the output ratio — the result follows the source and you cannot override it.
| Task type | How you trigger it | aspect_ratio | duration |
|---|---|---|---|
| Text-to-video / multimodal reference | prompt (+ reference_*_urls) | any of the 7 values, default adaptive | 4-30 or -1 |
| Image-to-video (first frame / first+last frame) | first_frame_url (+ last_frame_url) | forced adaptive | 4-30 or -1 |
| Video editing | source clip in reference_video_urls + an edit prompt | forced adaptive | forced -1 |
| Video extension | source clip in reference_video_urls + a continuation prompt | forced adaptive | 4-30 or -1 |
Both task types share one endpoint: put the source clip in reference_video_urls, refer to it in the prompt as 视频1 / @video1, and spell out what to change or what to continue. task_type is optional (the backend infers it from the prompt) but stating it outright is more reliable.
# ── Video EDITING — replace / add / remove objects, or edit the audio track ──
# The source clip goes in reference_video_urls and is cited as 视频1 / @video1.
# Editing forces aspect_ratio "adaptive" AND duration -1 (the output keeps the
# source ratio and length). Send either one and you get an immediate 400.
curl -X POST https://apimodels.app/api/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "把视频1改成夜晚雨景,保留人物动作和镜头运动",
"reference_video_urls": ["https://example.com/source.mp4"],
"task_type": "edit"
}'
# ── Video EXTENSION — continue the clip forwards or backwards, round after round ──
# Extension also forces aspect_ratio "adaptive", but duration is yours: 4-30 or -1.
curl -X POST https://apimodels.app/api/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "续写视频1,人物继续向前走进地铁站",
"reference_video_urls": ["https://example.com/source.mp4"],
"duration": 10,
"task_type": "extend"
}'Billed on real upstream token usage (usage.completion_tokens), charged only on success and refunded on failure. Volcengine computes it as:
tokens = (input video seconds + output seconds) × width × height × fps ÷ 1024A job with a reference video is charged at a lower per-token rate, but it bills input seconds + output seconds. Break-even sits at input = output × 0.667 — so editing or extending a clip as long as the output costs about 20% MORE than generating the same length from scratch. This tier is not a discount; do not treat it as one.
The per-second prices in the tier table (480p $0.134, 720p $0.300) are display values derived from that formula; the real bill follows the tokens actually produced.
Try it in the Playground
$0.134 per second at 480p and $0.300 per second at 720p on apimodels.app. Upstream bills real token usage, so those are derived per-second values; you are charged only on success and refunded on failure. For reference, Seedance 2.0 Official is $0.092 / $0.197 / $0.492 for 480p / 720p / 1080p — 2.5 at 720p costs about 52% more.
480p and 720p only — 2.5 has no 1080p and no 4K (2.0 standard does have 1080p). Clips run 4 to 30 seconds, and duration: -1 lets the model pick the best length itself. Aspect ratios are 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 and adaptive (the default).
POST /api/v1/video/generations with the source clip in reference_video_urls (it must itself be 4-30s) and a prompt citing it as 视频1 / @video1 — "把视频1改成夜晚雨景" to edit, "续写视频1" to extend. Editing forces aspect_ratio "adaptive" and duration -1; extension forces adaptive. Pass anything else and our API returns 400 at create time instead of letting the task fail later upstream.
Up to 50 assets in one job: 30 images + 10 videos + 10 audios (2.0 takes 9 + 3 + 3). Each reference clip is 2-30s, with all videos together and all audios together capped at 30s. Audio-only references are allowed on 2.5, unlike 2.0.
No. A job with a reference video is charged at a lower per-token rate, but it bills input seconds plus output seconds (tokens = (input video seconds + output seconds) × width × height × fps ÷ 1024). Break-even is input = output × 0.667, so editing or extending a clip as long as the output costs about 20% more than generating the same length from scratch.