Seedance 2.5 Request and Response Parameters
Configure omni_reference_task_type, edit and extend constraints, native and generic responses, and asynchronous errors.
Verified on 2026-09-07 against Volcengine's official create task API (updated 2026-09-04), get task API (updated 2026-08-19), and the current ModelSell request/response converters.
Examples use the official model ID doubao-seedance-2-5-260628. With ModelSell, use an available model name and your ModelSell API key. Channel aliases and -max suffixes are not official Model IDs.
Task type guidance
omni_reference_task_type is an optional string request field, defaults to auto upstream, and is supported only by Seedance 2.5. It guides the interpretation of an omni-reference task; the model still determines the actual task type.
| Value | Purpose | Additional constraints |
|---|---|---|
auto | Infer the task from inputs and prompt | Omitting the field leaves the upstream default in effect |
reference | Generate a new video from references | No extra task-specific constraints; normal model limits still apply |
edit | Edit the source video's visuals or audio | At least one reference_video; source duration 4–30 seconds; ratio: "adaptive"; duration: -1 |
extend | Extend the source video backward or forward | At least one reference_video; ratio: "adaptive"; an explicit duration or -1 |
Use the top-level field in native requests. Generic requests also support the top-level field, with metadata.omni_reference_task_type as a fallback; the top-level value wins when both exist. Explicitly set the required edit/extend parameters. ModelSell validates the enum and related fields; the upstream validates the actual source-video duration.
Native request fields
Use POST /api/v3/contents/generations/tasks. Defaults and ranges below describe the official models. Field availability also depends on the selected channel. The built-in Volcengine channel and all six Seedance profiles forward these native options. Generic calls use metadata.<field> for advanced options; actual feature support still depends on the upstream model.
| Field | Type | Default and meaning |
|---|---|---|
model | string, required | An available model name |
content | object array, required | Non-empty inputs: text uses type: "text" and text; media use image_url, video_url, or audio_url with a nested url |
omni_reference_task_type | string | auto, reference, edit, extend; default auto; 2.5 only |
resolution | string | Default 720p; 2.5 supports 480p, 720p, 1080p; standard 2.0 also supports 4k; 2.0 fast/mini support only 480p, 720p |
ratio | string | Default adaptive; also 16:9, 4:3, 1:1, 3:4, 9:16, 21:9. For 2.5 edit, extend, first-frame, and first/last-frame tasks, use adaptive |
duration | integer | 2.5 defaults to -1 and accepts -1 or 4–30 seconds; 2.0 accepts -1 or 4–15 seconds. -1 lets the model choose; required for 2.5 editing |
generate_audio | boolean | Default true; false produces silent video. Generated audio is mono |
watermark | boolean | Official default false |
output_format | string | Default mp4; accepts mp4 or mov, 2.5 only. Forwarded from the native root and generic metadata.output_format |
return_last_frame | boolean | Default false; requests a PNG last-frame URL in the query result; channel support required |
callback_url | string | Receives POST notifications on state changes, with the official query response structure; channel support required. Do not assume callback task IDs have been replaced with ModelSell IDs |
execution_expires_after | integer | Default 172800 seconds; range 3600–259200, measured from creation; channel support required |
priority | integer | Default 0, range 0–9; larger values advance queued tasks within the same Endpoint without interrupting running tasks; channel support required |
safety_identifier | string | Stable end-user identifier, up to 64 characters; a hash is recommended; channel support required |
tools | object array | Search tool item: {"type":"web_search"}. The model decides whether to search; channel support required |
Other fields on the shared official API page—frames, seed, camera_fixed, draft, and service_tier: "flex"—apply to other models and do not establish support for Seedance 2.5. Use duration for integer-second output requests.
On 2026-09-09, option forwarding was completed against the official SDK request structure. Missing options do not inject defaults; explicit false and 0 are preserved. See Generic Video Format for the full mapping and last-frame example.
Media and roles
Image roles are reference_image, first_frame, or last_frame; video uses reference_video and audio uses reference_audio. First-frame, first/last-frame, and omni-reference modes are mutually exclusive. Do not combine frame roles with reference-media mode.
2.5 accepts up to 30 reference images, 10 videos, and 10 audio clips. Total video duration and total audio duration are each capped at 30 seconds. Individual reference videos are normally 2–30 seconds, or 4–30 seconds for editing; individual audio clips are 2–30 seconds. For 2.0, the corresponding limits are 9 images, 3 videos, 3 audio clips, and 15 seconds each for total video/audio duration.
Official image/audio inputs accept URLs, Base64 Data URLs, and supported asset:// references. Video accepts URLs or supported asset:// references, not Base64. Official limits are under 30 MB per image, at most 200 MB per video, 15 MB per audio clip, and 64 MB per request body; channels may impose smaller limits. The official 2.5 API accepts audio-only inputs, and ModelSell native/generic entry points accept valid media or draft content without a placeholder prompt; the upstream validates supported combinations.
Edit request
Replace the example URL with an accessible 4–30 second source video:
curl -X POST "$MODELSELL_BASE_URL/api/v3/contents/generations/tasks" \
-H "Authorization: Bearer $MODELSELL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2-5-260628",
"omni_reference_task_type": "edit",
"content": [
{"type": "text", "text": "Edit the reference video: replace the background with snowy mountains and preserve its motion and camera shots."},
{"type": "video_url", "video_url": {"url": "https://example.com/reference-video.mp4"}, "role": "reference_video"}
],
"ratio": "adaptive",
"duration": -1,
"resolution": "720p",
"generate_audio": true
}'For extension, keep the reference-video structure, use extend, explicitly ask to extend the source video forward or backward, keep ratio: "adaptive", and optionally set duration: 10. For a new video inspired by references, use reference and describe the new result.
Create and query responses
The minimum official create response contains only id; it does not mean generation has finished. ModelSell replaces the upstream ID with a public task ID. Poll with the returned id:
{"id":"task_UPUfjg0S3UXekH2OgTZBXyqgGhsxgkp6"}curl "$MODELSELL_BASE_URL/api/v3/contents/generations/tasks/task_UPUfjg0S3UXekH2OgTZBXyqgGhsxgkp6" \
-H "Authorization: Bearer $MODELSELL_API_KEY"The following fields describe channels using Ark's native response. Availability depends on status, model, and channel. The official response schema does not list omni_reference_task_type; do not rely on it being echoed.
| Field | Type | Meaning |
|---|---|---|
id, model | string | Public task ID and model name/version |
status | string | queued, running, succeeded, failed, cancelled; an exceeded execution deadline can produce expired |
content.video_url | string | Successful result URL |
content.last_frame_url | string | Last-frame URL when requested and supported by the channel |
created_at, updated_at | integer | Unix timestamps in seconds |
duration | integer | Approximate actual output duration, not the request sentinel -1; the official rule is total frames divided by 24, rounded down |
framespersecond | integer | Output frame rate |
resolution, ratio | string | Actual output resolution and aspect ratio |
output_format | string | Actual mp4 or mov format; 2.5 field |
generate_audio | boolean | Whether the result contains synchronized audio |
usage.completion_tokens | integer | Video-generation token usage |
usage.total_tokens | integer | Official total tokens; input tokens are not counted for video, so this equals completion tokens |
usage.tool_usage.web_search | integer | Actual search calls when search is enabled; may be 0 |
tools[].type | string | Tools actually used; can be absent when no tool is used |
execution_expires_after | integer | Task lifetime in seconds from creation |
safety_identifier | string | Echoed identifier when set and supported |
error | object or null | May be null on success; read error.code and error.message on failure |
frames, seed, service_tier, draft, draft_task_id | Varies | Model-dependent fields in the shared response; frames and duration are mutually exclusive. Their presence does not establish support for corresponding 2.5 request options |
Official video URLs expire after 24 hours; 2.5 video URLs allow at most 100 downloads. Official queries cover the most recent 7 days. These are Ark upstream limits; other channels and ModelSell's local task retention can differ. Save successful outputs promptly.
{
"id": "task_UPUfjg0S3UXekH2OgTZBXyqgGhsxgkp6",
"model": "doubao-seedance-2-5-260628",
"status": "succeeded",
"content": {"video_url": "https://example.com/seedance/result.mp4"},
"created_at": 1788753600,
"updated_at": 1788753660,
"duration": 8,
"framespersecond": 24,
"resolution": "720p",
"ratio": "16:9",
"output_format": "mp4",
"generate_audio": true,
"usage": {"completion_tokens": 108900, "total_tokens": 108900},
"error": null
}Other channels and generic responses
Service Inference / Max native responses expose the upstream task fields at the top level. Success is completed, the URL is outputs[0], duration may be duration_seconds, and completion time is completed_at. Optional fields include usage, last_frame_url, prep, and a string error. This differs from Ark's content.video_url structure.
{
"id": "task_UPUfjg0S3UXekH2OgTZBXyqgGhsxgkp6",
"status": "completed",
"model": "doubao-seedance-2-5-260628-max",
"outputs": ["https://example.com/seedance/result.mp4"],
"duration_seconds": 8,
"error": null
}GET /v1/videos/{task_id} returns normalized object: "video" with queued, in_progress, completed, or failed status. Read video_url / metadata.url, metadata.last_frame_url, metadata.usage, and metadata.output_format when returned upstream. GET /v1/video/generations/{task_id} retains the {code, data} envelope, with data.status and the upstream snapshot in data.data. The legacy task_id field may be absent; persist id. Some channels use this generic response even on the native route, so choose parsing rules for your channel. See Generic Video Format.
Immediate and asynchronous errors
| Stage | Result | Action |
|---|---|---|
| Explicit task-type validation fails | Create fails immediately; no task is created | Correct the enum, reference video, ratio, or duration before polling |
auto infers a task incompatible with the parameters | Asynchronous InvalidParameter.TaskTypeConstraint | Correct parameters for the actual task and resubmit |
| Actual task conflicts with the requested type | Asynchronous InvalidParameter.TaskTypeMismatch | Align the prompt's edit, extend, or reference-generation intent with the selected type |
{
"id": "task_UPUfjg0S3UXekH2OgTZBXyqgGhsxgkp6",
"status": "failed",
"error": {
"code": "InvalidParameter.TaskTypeMismatch",
"message": "The detected task type does not match omni_reference_task_type."
}
}The message above is illustrative; actual wording comes from the upstream. Generic responses may normalize error.code to failed instead of preserving the original Ark code. Stop polling on failed, cancelled, or expired, and use a local deadline.