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 AI 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/seedance-2.5 | 480p 720p 1080p | -1 or 4-30s | 30/10/10 reference material; has output_format and omni_reference_task_type |
bytedance/seedance-2.0 | 480p 720p 1080p 4k | -1 or 4-15s | 9/3/3 reference material |
bytedance/seedance-2.0-fast | 480p 720p | -1 or 4-15s | same as above |
bytedance/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.
role may be omitted in exactly three cases (matching the vendor):
a single image as the only material is treated as first_frame; a
video_url as reference_video; an audio_url as reference_audio.
Any other missing role returns a 400 rather than being guessed.
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/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/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/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/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/seedance-2.5 | 480p 720p 1080p | -1 or 4-30s | 30 / 10 / 10 | output_format, omni_reference_task_type |
bytedance/seedance-2.0 | 480p 720p 1080p 4k | -1 or 4-15s | 9 / 3 / 3 | — |
bytedance/seedance-2.0-fast | 480p 720p | -1 or 4-15s | 9 / 3 / 3 | — |
bytedance/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).
For exact value ranges, see the corresponding model reference: Seedance 2.5 · 2.0 · 2.0 Fast · 2.0 Mini.
⚠️ A request for a tier the model does not support is rejected, not silently downgraded. Silent downgrading would surface only after the task completes (typically ten or more minutes) and has been billed.
⚠️ 1080p and 4k output is 10-bit H.265/HEVC, which a few players cannot open.
Three differences from the MiniMax request 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/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 may be omitted in exactly three cases, matching the vendor: a single image as the only
material is treated as the first frame (first_frame); a video_url as reference_video; an
audio_url as reference_audio. First/last frames and reference images need an explicit role —
an image without one alongside other material returns a 400 rather than being guessed.
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.
Omni-reference subtasks (bytedance/seedance-2.5 only)
A request qualifies as an omni-reference task when content includes any of the
reference_image, reference_video, or reference_audio roles. The model further
classifies it into one of three subtasks based on prompt intent, and each subtask
enforces different constraints on ratio and duration:
| Subtask | Trigger | Enforced constraints |
|---|---|---|
Reference-to-video reference | Prompt expresses neither editing nor extension intent | None |
Video editing edit | Includes a reference video, and the prompt expresses editing intent (add, remove, replace, modify) | ratio must be adaptive; duration must be -1; the reference video must be 4-30 seconds |
Video extension extend | Includes a reference video, and the prompt expresses extension intent (continue, extend forward or backward) | ratio must be adaptive |
For editing and extension, the output aspect ratio always follows the selected reference video; for editing, the output duration follows it as well. These constraints therefore cannot be overridden.
Validation timing depends on omni_reference_task_type
| Value | Validation | On constraint violation |
|---|---|---|
edit / extend (explicit) | Synchronous, at submission | Immediate 400 |
auto or omitted | Asynchronous, after the task starts | Task ends as failed with InvalidParameter.TaskTypeConstraint |
Specifying the subtask explicitly moves validation to submission time and avoids
failures that surface only after the task has started. Note that the model still
determines the actual subtask from the prompt: if it disagrees with the value you
specified, the task fails asynchronously with InvalidParameter.TaskTypeMismatch.
Recommended configuration: when the subtask is not known in advance, use
omni_reference_task_type: "auto" together with ratio: "adaptive" and
duration: -1. That combination satisfies the constraints of all three subtasks.
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 + 1
Width and height follow the chosen resolution and the resulting aspect ratio, so a
higher resolution usually costs more, driven by token count rather than by unit price.
⚠️ 1080p and 4k each carry their own rate, and they do not move in the same
direction. On bytedance/seedance-2.0, 1080p is priced above the 480p / 720p
tier while 4k is priced below every other tier — the token count grows far more
than the rate falls, so 4k still costs more in total. Read the per-tier rates off the
pricing page rather than inferring them from resolution.
| 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). ⚠️ Not available on the current channel; setting it has no effect |
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. ⚠️ Not available on the current channel; output is always mp4 |
omni_reference_task_type | auto / reference / edit / extend. 2.5 only |
⚠️ The value of omni_reference_task_type carries different enforced constraints; see
Omni-reference subtasks.
⚠️ 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/seedance-2.5",
"content": [
{
"type": "text",
"text": "A ginger cat running through fresh snow, slow motion"
}
],
"resolution": "720p",
"duration": -1
}'{
"id": "<string>"
}