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.120 / $0.270 |
| 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 37% 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.072 and 720p $0.162.
Example: editing a 4.0-second 480p clip that comes back 3.7 seconds long → (4.0 + 3.7) × $0.072 ≈ $0.55.
⚠️ 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://api.apimodels.app/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://api.apimodels.app/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: raw real-person images/videos are accepted — on an upstream
# moderation rejection we auto-register the material and retry transparently.
# To REUSE a fixed person across tasks, register it once as asset://:
# "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://; raw real-person images are fine — use asset:// to reuse a fixed person across tasks). 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.
Beyond counts and durations, upstream hard-validates the media files themselves — out-of-spec input fails the task outright. The most common trap is frame rate: 120fps clips (phone slow-motion, screen recordings) are rejected; re-encode to 30fps first.
| Constraint | Image | Video | Audio |
|---|---|---|---|
| Formats | jpeg / png / webp / bmp / tiff / gif / heic / heif | mp4 / mov | wav / mp3 |
| How to pass | URL / Base64 / asset:// | URL / asset:// (no Base64) | URL / Base64 / asset:// |
| Single file size | < 30 MB | ≤ 200 MB | ≤ 15 MB |
| Edge length (px) | 300 – 6000 | 300 – 6000 | — |
| Aspect ratio (w ÷ h) | 0.4 – 2.5 | 0.4 – 2.5 | — |
| Total pixels (w × h) | — | 407,696 – 8,295,044 (roughly 614×664 to 3326×2494) | — |
| Frame rate | — | 24 – 60 FPS | — |
| Per-clip duration | — | 2–30s (4–30s for video-edit tasks) | 2–30s |
Request bodies with Base64 payloads are capped at 64 MB — pass large files as public URLs instead of inlining them. Out-of-range frame rates are validated locally at create-time with a clear 400, rather than failing mid-task.
Real-person reference images/videos can be passed as raw URLs — if upstream moderation rejects one, we auto-register it in the asset library and retry transparently (a few seconds of extra latency). To reuse the same person across tasks, or to skip that automatic step, register an asset:// reference once: it lasts, costs $0.01 per successful registration, and failures (HTTP 422) are never charged.
# 1) Create an asset group (once). Seedance 2.5 uses the DEFAULT asset library --
# do NOT pass "account": "intl" here (that is a separate library for the
# Dreamina international line; the two do not interoperate).
curl -X POST https://api.apimodels.app/v1/assets/groups \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"name": "my-people"}'
# -> { "data": { "id": 1, ... } }
# 2) Register the face from a public URL. The call waits until the asset is
# confirmed usable (~3s). Charged $0.01 ONLY on success -- an unfetchable or
# moderation-rejected image returns HTTP 422 and is NOT charged.
curl -X POST https://api.apimodels.app/v1/assets \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"url": "https://example.com/face.jpg", "asset_type": "Image", "group_id": 1}'
# -> { "data": { "id": "asset-2026...-xxxx", "asset_url": "asset://asset-2026...-xxxx", "status": "Active" } }
# 3) Use asset_url in the seedance-2.5 request -- reference_image_urls to borrow
# the person's look, or first_frame_url to animate exactly that person.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://api.apimodels.app/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://api.apimodels.app/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.120, 720p $0.270) are display values derived from that formula; the real bill follows the tokens actually produced.
Try it in the Playground
$0.120 per second at 480p and $0.270 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 37% 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.