Create Seedance task
Last updated September 7, 2026
Submit a video task in Volcengine Ark's native shape. The prompt is optional and billing is per token.
Submit a video task in the shape of Volcengine Ark's v3 API. If you already have Ark
code, point base_url at Amux — request and response shapes match what you send today.
https://gateway.amux.ai/api/v3/contents/generations/tasksAuthorization
headerAuthorizationstringRequiredBearer <your Amux key> An Amux key created in the console. If you lose it, you can view it again on the keys page.
Request
application/jsonmodelstringRequiredThe Amux model ID. Four models serve this endpoint today, and they
differ item by item:
| Model | Resolution | Duration | Other |
|---|---|---|---|
bytedance/doubao-seedance-2-5 | 480p 720p 1080p | -1 or 4-30s | 30/10/10 reference material; has output_format and omni_reference_task_type |
bytedance/doubao-seedance-2-0 | 480p 720p 1080p 4k | -1 or 4-15s | 9/3/3 reference material |
bytedance/doubao-seedance-2-0-fast | 480p 720p | -1 or 4-15s | same as above |
bytedance/doubao-seedance-2-0-mini | 480p 720p | -1 or 4-15s | same as above |
Asking for a tier a model does not have is **rejected, not quietly
downgraded**: getting 720p when you asked for 1080p, and being billed
for 720p, is worse than a clear error.
You can also point this at an endpoint ID (ep-…) from your own
account — the upstream accepts either, and the mapping is per channel.
contentarray<object>RequiredThe prompt and the input material live in the same array.
Unlike the MiniMax shape, a text item is not required — a first
frame, or reference material on its own, is a valid request. What is
required is that the array is not empty.
›contentarray<object>
type"text" | "image_url" | "video_url" | "audio_url"RequiredWhat kind of item this is.
This is not the role — the role lives on role. They are two
separate fields.
textstringThe prompt, when type is text.
Refer to input material in plain language ("match the motion in
the first reference video").
urlstringWhere the material lives. Public https URLs only — the model
fetches it, Amux never does.
role"first_frame" | "last_frame" | "reference_image" | "reference_video" | "reference_audio"What this material is for. **The limits differ between the two
generations**:
| 2.5 | 2.0 / fast / mini | |
|---|---|---|
| First / last frame | 1 each | 1 each |
| Reference images | 30 | 9 |
| Reference videos | 10 clips, 2-30s each, 30s total | 3 clips, 2-15s each, 15s total |
| Reference audio | 10 clips, same caps | 3 clips, same caps |
| Audio alone | allowed | not allowed — at least one reference video or image is required |
Frames and reference material are mutually exclusive — this
is the easiest thing to get wrong when coming from the MiniMax
shape, where they can be combined.
resolution"480p" | "720p" | "1080p" | "4k"Default "720p"Output resolution tier. **A higher tier mostly costs more because it
produces more tokens**, not because it carries a different unit price —
the exceptions are 1080p and 4k, which each sit on their own rate.
Which tiers are legal depends on the model; see the table on model.
4k is only available on bytedance/doubao-seedance-2-0.
⚠️ 1080p and 4k output is 10-bit H.265/HEVC, which a few players
cannot open.
durationintegerDefault -1Output length in seconds. **-1 lets the model pick within the legal
range**, and all four models accept it (it is also the default on 2.5).
The range differs per model: 4-30s on 2.5, 4-15s on all three 2.0
models.
⚠️ Length drives the token count, which is what you are billed on.
ratio"adaptive" | "21:9" | "16:9" | "4:3" | "1:1" | "3:4" | "9:16"Default "adaptive"Aspect ratio. adaptive follows the input material.
⚠️ bytedance/doubao-seedance-2-5 accepts only adaptive when a
first frame is given, or for video edit / extend tasks: the output
ratio always follows that image or the source video. **The 2.0 models
do not carry this restriction** — they can be given an explicit ratio.
generate_audiobooleanDefault trueWhether the output carries a soundtrack. On by default — the model
generates matching dialogue, effects and score from the prompt and the
visuals. Pass false explicitly for a silent video.
watermarkbooleanDefault falseWhether to stamp an AIGC watermark on the output.
output_format"mp4" | "mov"Default "mp4"Container format of the generated file. **Only
bytedance/doubao-seedance-2-5 has this parameter.**
mov is the high-colour-fidelity format for post-production
(H.264 + yuv444p + PCM); some players cannot open it.
return_last_framebooleanDefault falseWhether to also return the last frame as a PNG (no watermark, same
dimensions as the video).
Feed it back as the first frame of the next call to chain continuous
segments.
omni_reference_task_type"auto" | "reference" | "edit" | "extend"Default "auto"Sub-type of an omni-reference task. **Only
bytedance/doubao-seedance-2-5 has this parameter.**
auto lets the model decide from the material and the prompt; naming
it explicitly moves validation to submit time instead of failing
asynchronously once the task is already running.
⚠️ edit carries two hard constraints: ratio must be adaptive and
duration must be -1, and at least one reference video is required.
toolsarray<object>Tool configuration; web search is the only one today. With it on, the
model decides for itself whether to search the web (products, weather
and the like) — better currency, some added latency.
On /v1/tasks this is a boolean called web_search.
›toolsarray<object>
type"web_search"RequiredAlways web_search; it is the only tool today.
priorityintegerDefault 0Queue priority; higher goes first. It only reorders the queue within
one endpoint and never interrupts a task already running.
execution_expires_afterintegerDefault 172800Task timeout in seconds, counted from creation; 48 hours by default.
Past it the task is terminated and marked expired.
safety_identifierstringA stable, unique identifier for your end user, used for abuse
attribution. Send a hash rather than a plaintext username or email.
On /v1/tasks this field is called user.
callback_urlstringCalled back when the task reaches a terminal state. **This is Amux's
webhook_url** -- we simply accept it under the vendor's field name; the payload
matches the unified endpoint exactly (the {event, sent_at, task} envelope, an
Amux-Signature header, and backoff retries).
https only, and never a private address. The URL is validated at submit time.
Response
200responseAccepted. The body carries only id — take it to GET /v1/tasks/{id}
(or the alias below) and poll.
400responseInvalid parameters, an empty request, more material than the model accepts,
or a Seedance 1.x parameter (seed, camera_fixed, frames, draft).
Those are rejected rather than dropped: thinking a seed applied and
getting a random result back is far harder to debug than an error.
402responseAvailable balance does not cover the reservation. It is taken for 15 seconds
of output, plus another 30 seconds when a reference video is present.
503responseNo provider can currently serve this model.
Models on this endpoint
| Model | Resolution | Duration | Ref. image / video / audio | Model-only params |
|---|---|---|---|---|
bytedance/doubao-seedance-2-5 | 480p 720p 1080p | -1 or 4-30s | 30 / 10 / 10 | output_format, omni_reference_task_type |
bytedance/doubao-seedance-2-0 | 480p 720p 1080p 4k | -1 or 4-15s | 9 / 3 / 3 | — |
bytedance/doubao-seedance-2-0-fast | 480p 720p | -1 or 4-15s | 9 / 3 / 3 | — |
bytedance/doubao-seedance-2-0-mini | 480p 720p | -1 or 4-15s | 9 / 3 / 3 | — |
-1 means the model picks the length within the legal range; all four accept it
(it is also the default on 2.5).
Exact value ranges live on each model's own page — this page only answers "which page should I read": Seedance 2.5 · 2.0 · 2.0 Fast · 2.0 Mini. The comparison table belongs here (you need it to choose), but the exact ranges should exist in exactly one place — kept in two, only one of them will ever get updated.
⚠️ Asking for a tier a model does not have is rejected, not quietly downgraded. Getting 720p when you asked for 1080p, and being billed for 720p, is worse than a clear error — with the downgrade you only find out ten-odd minutes and one payment later.
⚠️ 1080p and 4k output is 10-bit H.265/HEVC, which a few players cannot open.
Three things that differ from the MiniMax shape
The two request bodies look almost identical (same flat parameters, same heterogeneous
content[]), so coming from
POST /v2/video_generation the
differences all hide in the details:
1. The prompt is optional
The MiniMax shape requires one non-empty text item in content. This one does
not. Frames alone, or even a single reference audio clip, are combinations the vendor
supports. The only requirement is that content is not empty.
2. Frames and reference material are mutually exclusive
The MiniMax shape lets you combine them; this one does not. The vendor defines first frame, first-and-last frame, and multimodal reference as three separate modes, and mixing them is rejected upstream. Per-role limits differ between the two generations — do not read the 2.5 column and then call a 2.0 model:
| Role | 2.5 | 2.0 / fast / mini |
|---|---|---|
first_frame / last_frame | 1 each (a last frame requires a first frame) | 1 each |
reference_image | 30 | 9 |
reference_video | 10 clips, 2-30s each, 30s combined | 3 clips, 2-15s each, 15s combined |
reference_audio | 10 clips, same caps | 3 clips, same caps |
| Audio alone, no image or video | allowed | not allowed — at least one reference video or image is required |
⚠️ bytedance/doubao-seedance-2-5 accepts only adaptive for ratio when a first
frame is given: the output aspect ratio always follows that image, and a concrete ratio
is rejected at submit time. The 2.0 models do not carry this restriction — they can
be given an explicit ratio.
3. type is not the role
This part is the same on both, but it is still the easiest thing to get wrong anywhere on this path:
{
"content": [
{ "type": "text", "text": "Have the person walk toward the camera" },
{ "type": "image_url", "role": "first_frame", "image_url": { "url": "https://…/a.png" } }
]
}type is the media kind (image_url / video_url / audio_url); the role lives
on role. role cannot be omitted — leaving it out returns a 400 rather than being
guessed as a first frame.
Seedance 1.x parameters are rejected, not dropped
seed, camera_fixed, frames, draft and service_tier=flex are valid on 1.x and
supported by none of the four Seedance 2.x models. Sending one is rejected at submit
time.
That is deliberate. Dropping them silently means you think seed applied and get a
random result back, which costs far more to debug than an error does.
Billing: per token, not per second
Every other video model on Amux bills output seconds. This one does not. The upstream's own conversion is:
tokens = width x height x frames / 1024 frames = seconds x 24 fps
Width and height follow the chosen resolution and the resulting aspect ratio, so a
higher resolution costs more because it produces more tokens, not because it carries a
different unit price. The exceptions are 1080p and 4k — those two each sit on their
own token rate.
| Item | How it is billed |
|---|---|
| Generated video | usage.completion_tokens × the token rate |
| Reference video | Not billed separately — its cost is already inside that token count |
| Reference image / audio | Free |
⚠️ A request that includes reference video moves to a lower token rate, and the discount applies to the whole task, not just the input part.
The reservation taken at submit time is an upper bound: the tokens for 15 seconds of output, or for 45 seconds when a reference video is present. Settlement uses the token count the upstream reports and releases the difference.
The rest of the vendor parameter set
This endpoint accepts the full Volcengine Ark request, apart from the 1.x-only fields listed above:
| Parameter | What it does |
|---|---|
return_last_frame | Also return the last frame as a PNG (no watermark, video dimensions). Feed it back as the next segment's first frame to chain continuous video |
priority | Queue priority 0-9, higher goes first. Reorders the queue only; never interrupts a running task |
execution_expires_after | Task timeout in seconds, 3600-259200, 48 hours by default. Past it the task is marked expired |
safety_identifier | End-user identifier, up to 64 characters. Send a hash, not plaintext |
tools: [{"type":"web_search"}] | Web search; the model decides for itself whether to use it |
output_format | mp4 / mov. 2.5 only |
omni_reference_task_type | auto / reference / edit / extend. 2.5 only |
⚠️ omni_reference_task_type: "edit" carries two hard constraints: ratio must be
adaptive, duration must be -1, and at least one reference video is required. Naming
it explicitly moves validation to submit time instead of failing asynchronously once
the task is already running.
⚠️ Two fields are renamed on /v1/tasks: safety_identifier is called user, and
the tools array flattens to a boolean web_search. Everything else keeps its name.
The task ID is ours
The id you get back is the Amux task ID. Take it to
GET /v1/tasks/{id} or to the
Ark-shaped alias; both read the same task.
curl https://gateway.amux.ai/api/v3/contents/generations/tasks \
-H "Authorization: Bearer $AMUX_API_KEY" \
-d '{
"model": "bytedance/doubao-seedance-2-5",
"content": [
{
"type": "text",
"text": "A ginger cat running through fresh snow, slow motion"
}
],
"resolution": "720p",
"duration": -1
}'{
"id": "<string>"
}