Create video
Last updated September 8, 2026
Generate with bytedance/seedance-2.5 in Volcengine Ark's native shape; existing Ark clients work as-is.
Generate with bytedance/seedance-2.5 in the Volcengine Ark native shape: prompt and material live in
one content[] array. If you already have Ark code, point base_url at this site.
https://gateway.amux.ai/api/v3/contents/generations/tasksAuthorization
headerAuthorizationstringRequiredBearer <your Amux AI key> Your Amux API key.
Request
application/jsonmodelstringRequiredAlways bytedance/seedance-2.5. The bare doubao-seedance-2-5 works too, and it is case-insensitive.
contentarray<object>RequiredPrompt and input material live in one array.
The text item is not required -- a single first frame, or reference material alone,
is a valid request. The only requirement is that the array is not empty. This is the
opposite of the MiniMax shape.
›contentarray<object>
type"text" | "image_url" | "video_url" | "audio_url"RequiredWhat kind this item is. Required: it is not the role -- the role is on role.
textstringThe prompt, when type is text. Refer to material in plain language
("the person in reference image 1"); this model has no [Image 1] style markers.
role"first_frame" | "last_frame" | "reference_image" | "reference_video" | "reference_audio"What this material is for. Limits: one first frame, one last frame, 30 reference images, 10 reference videos and 10 reference audio clips (video and audio clips run 2-30s each and cap at 30s combined).
Reference audio alone, with no image or video, is allowed.
⚠️ Frames and reference material are mutually exclusive — the vendor defines first frame, first-and-last frame and omni reference as three separate modes; mixing them is rejected.
image_urlobjectRequired: the URL is nested in an object named after type (image_url /
video_url / audio_url), not a flat url. Only publicly reachable https URLs.
›image_urlobject
urlstringA publicly reachable https URL. The model fetches it itself; we never do.
resolution"480p" | "720p" | "1080p"Default "720p"Output resolution tier. This model offers 480p / 720p / 1080p.
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 token rate.
Required: output at those tiers is 10-bit H.265/HEVC, which a few players cannot open.
durationintegerDefault -1Output length in seconds: -1 or an integer from 4 to 30. -1 lets the model pick within that range.
⚠️ 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.
⚠️ Only adaptive is accepted when a first frame is given, or for video edit / extend: the output ratio follows that image or the source video, and a concrete ratio is rejected at submit time.
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 "AI generated" watermark in the bottom-right corner.
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 next segment's first frame
to chain continuous video.
output_format"mp4" | "mov"Default "mp4"Container format. mov is the high-colour-fidelity format for
post-production (H.264 + yuv444p + PCM); use it for grading, keying and
compositing. Some players cannot open it.
omni_reference_task_type"auto" | "reference" | "edit" | "extend"Default "auto"Sub-type of an omni-reference task. 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 running.
⚠️ edit carries two hard constraints: ratio must be adaptive,
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.
›toolsarray<object>
type"web_search"RequiredAlways web_search; it is the only tool today.
priorityintegerDefault 0Queue priority; higher goes first. It reorders the queue within one
endpoint only 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.
callback_urlstringWhere to POST the result once the task is terminal. **This is the site's
webhook_url** under the vendor's field name; the payload is identical to the unified
entry point. Must be a deliverable public https URL.
Response
200responseAccepted. The body carries only id, matching the vendor.
400responseInvalid parameters, an impossible material combination, or a 1.x parameter this generation does not accept.
402responseThe available balance does not cover the reservation upper bound.
503responseNo provider is currently available for this model.
Three key request-body conventions
1. The prompt is optional
content may carry no text item at all — a first frame alone, first-and-last frames, even reference audio on its own,
are all combinations the vendor supports. The only requirement is a non-empty array.
This is the opposite of the MiniMax shape, where the prompt is always required.
2. type is not the role, and the URL is not flat
{
"content": [
{ "type": "text", "text": "the person walks toward the camera" },
{ "type": "image_url", "role": "first_frame", "image_url": { "url": "https://…/a.png" } }
]
}| Field | What it is |
|---|---|
type | The media kind: text / image_url / video_url / audio_url |
role | The purpose: first frame, last frame, reference image / video / audio |
<type>.url | The URL, nested in an object named after type |
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.
3. The three modes are mutually exclusive
First frame, first-and-last frame and omni reference are three separate modes, and mixing them is rejected upstream. Coming from MiniMax this is the easiest one to hit, since that shape lets you combine frames and reference material.
Value ranges
| Parameter | This model |
|---|---|
resolution | 480p / 720p / 1080p |
duration | -1 or an integer from 4 to 30 |
ratio / aspect_ratio | adaptive or one of six ratios. Required: first-frame, edit and extend scenes take only adaptive |
| Material limits | 1 first frame, 1 last frame, 30 reference images, 10 reference videos, 10 reference audio clips (2-30s each, 30s combined) |
| Audio alone | allowed |
output_format | mp4 / mov |
omni_reference_task_type | auto / reference / edit / extend |
Required: with a first frame, ratio accepts only adaptive — the output ratio
always follows that image, and a concrete ratio is rejected at submit time.
Seedance 1.x parameters are rejected
seed, camera_fixed, frames, draft and service_tier=flex are valid on 1.x and
no Seedance 2.x model accepts them. Sending one is rejected at submit time rather than
dropped silently — dropping it silently means you think seed applied and get a random
result back.
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 is per token
Every other video model here bills output seconds. Seedance does not:
tokens = width x height x frames / 1024 frames = seconds x 24 + 1
So a higher resolution or a longer clip usually costs more, driven by token count. Reference images and audio are free; reference video's cost is already inside that token count, and a request carrying reference video moves the whole task to a lower rate.
On retrieval, usage.output_video_tokens is what the charge is computed from (see
the unified shape).
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>"
}