Seedance
Seedance 2.0 and 2.5 video generation API reference: multimodal creation, task polling, and parameters.
Seedance uses an asynchronous task flow: submit a creation request, receive a task ID, then poll the task until the video is ready.
Endpoints
| Method | Path | Description |
|---|---|---|
| POST | /api/v3/contents/generations/tasks | Create a video generation task |
| GET | /api/v3/contents/generations/tasks/{task_id} | Query task status and result |
| POST | /api/assets/upload | Upload an asset |
| GET | /api/assets/{asset_id} | Get one asset |
| GET | /api/assets | List assets |
Base URL: https://api.tokenhub.belivestudios.com. Authenticate with Authorization: Bearer YOUR_API_KEY and Content-Type: application/json.
Models and capabilities
| Model | Model ID | Duration | Resolution | Output |
|---|---|---|---|---|
| Seedance 2.0 | doubao-seedance-2-0-260128 | 4–15 s | 480p, 720p, 1080p, 4k | mp4 |
| Seedance 2.0 Fast | doubao-seedance-2-0-fast-260128 | 4–15 s | 480p, 720p | mp4 |
| Seedance 2.0 Mini | doubao-seedance-2-0-mini-260615 | 4–15 s | 480p, 720p | mp4 |
| Seedance 2.5 | doubao-seedance-2-5-260628 | 4–30 s | 480p, 720p, 1080p | mp4, mov |
Both versions support text-to-video, first/last-frame generation, image or video references, video editing, video extension, audio generation, and watermarks. Seedance 2.5 additionally supports up to 50 multimodal references, audio-only references, adaptive ratio, duration: -1, and omni_reference_task_type.
Asset library
The asset library lets you upload images, videos, or audio in advance and reference them in video generation requests through asset URIs (asset://<asset_id>). Uploads are processed asynchronously: create an asset group, upload the asset to obtain its Id, then poll its status; only assets whose Status is Active can be used for generation.
Assets are scoped to the user that owns the API key, and the API is fully wire-compatible with the Volcengine Ark Assets API. For the complete reference — asset group management, asset upload/query/update/delete, pagination, and asset requirements — see Seedance Asset Library.
Create a task
POST /api/v3/contents/generations/tasks
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Model ID |
content | array | Yes | Text prompt and reference assets |
content[].type | string | Yes | text, image_url, video_url, or audio_url |
content[].text | string | Conditional | Text prompt |
content[].image_url.url | string | Conditional | Image URL |
content[].video_url.url | string | Conditional | Video URL |
content[].audio_url.url | string | Conditional | Audio URL |
content[].role | string | Conditional | reference_image, reference_video, reference_audio, first_frame, or last_frame |
generate_audio | boolean | No | Generate audio |
resolution | string | No | 480p, 720p, 1080p; 4k is available on standard 2.0 |
ratio | string | No | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16; 2.5 also supports adaptive |
duration | integer | No | 2.0: 4–15 seconds; -1 is unsupported. 2.5 regular and first/last-frame tasks: 4–30 seconds or -1; 2.5 editing requires -1, while extension supports 4–30 seconds or -1 |
output_format | string | No | Settable only on 2.5: mp4 or mov; 2.0 output is fixed to mp4 |
watermark | boolean | No | Add an AI-generated watermark |
return_last_frame | boolean | No | Return the output video's last frame (2.0) |
omni_reference_task_type | string | No | 2.5: auto, reference, edit, or extend |
tools | array | No | 2.0 web search: [{"type":"web_search"}], text-only input |
Assets can be passed by URL, Base64, or asset URI: images support all three, while videos support URL or asset URI and audio supports URL, Base64, or asset URI. Asset IDs must be formatted as asset://<asset_id> and cannot be passed bare. Refer to assets in prompts as “image 1,” “video 1,” and “audio 1”; numbering starts at 1 in request order for each media type. Asset IDs cannot be referenced directly in prompts.
Text to video
curl -X POST https://api.tokenhub.belivestudios.com/api/v3/contents/generations/tasks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "A cinematic steampunk miniature-world sequence."
}
],
"generate_audio": true,
"ratio": "16:9",
"duration": 30,
"output_format": "mp4"
}'Multimodal references
{
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "Use video 1 composition and audio 1 as background music."
},
{
"type": "image_url",
"role": "reference_image",
"image_url": {"url": "https://example.com/image.jpg"}
},
{
"type": "video_url",
"role": "reference_video",
"video_url": {"url": "https://example.com/video.mp4"}
},
{
"type": "audio_url",
"role": "reference_audio",
"audio_url": {"url": "https://example.com/audio.mp3"}
}
],
"generate_audio": true,
"ratio": "16:9",
"duration": 11,
"omni_reference_task_type": "reference"
}First/last-frame, editing, and extension
First-frame tasks must include one image with role first_frame; first/last-frame tasks must include both first_frame and last_frame images. Seedance 2.5 requires ratio: "adaptive" for both. Editing requires a 4–30 second reference video, duration: -1, and omni_reference_task_type: "edit". Extension uses omni_reference_task_type: "extend", ratio: "adaptive", and duration of 4–30 or -1.
Create response
{
"id": "task_xxx",
"task_id": "task_xxx",
"object": "video",
"model": "doubao-seedance-2-5-260628",
"status": "queued",
"progress": 0,
"created_at": 1788146961
}Use task_id for subsequent queries. id and task_id currently have the same value.
Query a task
GET /api/v3/contents/generations/tasks/{task_id}
Request parameters
| Location | Parameter | Type | Required | Description |
|---|---|---|---|---|
| Path | task_id | string | Yes | The task ID returned by the create request. In the current creation response, task_id and id have the same value. |
| Header | Authorization | string | Yes | Bearer YOUR_API_KEY. |
| Header | Content-Type | string | No | application/json is recommended; a GET request has no body. |
curl -X GET https://api.tokenhub.belivestudios.com/api/v3/contents/generations/tasks/task_xxx \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Successful response
{
"content": {"video_url": "https://example.com/video.mp4"},
"created_at": 1788146960,
"draft": false,
"duration": 11,
"execution_expires_after": 3600,
"framespersecond": 24,
"generate_audio": true,
"id": "task_xxx",
"model": "doubao-seedance-2-5-260628",
"output_format": "mp4",
"priority": 0,
"ratio": "16:9",
"resolution": "720p",
"seed": 62293,
"service_tier": "default",
"status": "succeeded",
"updated_at": 1788147156,
"usage": {
"completion_tokens": 393325,
"total_tokens": 393325
}
}Typical statuses are queued, running, succeeded, and failed. A failed response contains an error object with code and message.
Successful response fields
| Field | Type | Description |
|---|---|---|
content | object | Container for generated outputs. |
content.video_url | string | Video URL on success; download it before it expires. |
id | string | Task ID. |
model | string | Model name and version used to execute the task; the exact format follows the API response. |
status | string | queued, running, succeeded, or failed. |
created_at / updated_at | integer | Creation and update times as Unix timestamps. |
duration | number | Actual output duration in seconds. |
ratio | string | Actual output aspect ratio. |
resolution | string | Actual output resolution. |
output_format | string | Actual output format, such as mp4 or mov. |
framespersecond | integer | Output video frame rate. |
generate_audio | boolean | Whether audio was generated. |
seed | integer | Random seed used for generation. |
usage | object | Task usage information. |
usage.completion_tokens / usage.total_tokens | integer | Token usage counters. |
execution_expires_after | integer | Task execution expiry setting. |
service_tier | string | Service tier. |
priority | integer | Task priority. |
draft | boolean | Whether this is a draft task. |
Failed response
{
"id": "task_xxx",
"model": "doubao-seedance-2-5-260628",
"status": "failed",
"error": {
"code": "OutputVideoSensitiveContentDetected",
"message": "The request failed because the output video may contain sensitive information. Request ID: task_xxx"
},
"created_at": 1718049470,
"updated_at": 1718049470
}Failed response fields
| Field | Type | Description |
|---|---|---|
id | string | Failed task ID. |
model | string | Model name and version used to execute the task; the exact format follows the API response. |
status | string | failed for a failed task. |
error | object | Error object. |
error.code | string | Error code, for example OutputVideoSensitiveContentDetected. |
error.message | string | Human-readable error message. |
created_at / updated_at | integer | Creation and update times as Unix timestamps. |
Seedance 2.5 task constraints
| Task type | Trigger | Parameter requirements |
|---|---|---|
| Text to video | Text prompt only | No special ratio or duration restriction |
| First-frame generation | Must include one first_frame image | ratio must be adaptive |
| First/last-frame generation | Must include both first_frame and last_frame images | ratio must be adaptive |
| Reference generation | At least one reference image, video, or audio | No special ratio or duration restriction |
| Video editing | reference_video plus an editing prompt | ratio: "adaptive", duration: -1; video must be 4–30 seconds |
| Video extension | reference_video plus an extension prompt | ratio: "adaptive"; duration is 4–30 or -1 |
For multimodal tasks, omni_reference_task_type accepts auto, reference, edit, or extend. If omitted or set to auto, the model infers the task from the prompt and assets.
Output specifications
| Parameter | Seedance 2.0 | Seedance 2.5 |
|---|---|---|
resolution | Standard: 480p, 720p, 1080p, 4k; Fast/Mini: 480p, 720p | 480p, 720p, 1080p |
ratio | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | The same ratios plus adaptive |
duration | 4–15 seconds; -1 unsupported | Regular, first/last-frame, and extension tasks: 4–30 seconds or -1; editing requires -1 |
output_format | Fixed mp4 | mp4 or mov |
watermark | true / false | true / false |
Seedance 2.5 editing, extension, and first/last-frame tasks require ratio: "adaptive". Standard 2.0 4K and 2.5 1080p use 10-bit/H.265 encoding, which may not play in all players. On 2.5, mov is more suitable for editing and extension and uses professional encoding that may not play in all players. watermark: true adds an “AI-generated” mark in the lower-right corner.
Asset limits
Seedance 2.0: up to 9 images, 3 videos, and 3 audio files (15 total); text plus audio and audio-only input are unsupported; duration is 4–15 seconds and standard 2.0 supports 4K.
Seedance 2.5: up to 30 images, 10 videos, and 10 audio files (50 total); reference video and audio duration totals at most 30 seconds; audio-only references are supported; output duration is 4–30 seconds or -1. Images use jpeg/png/webp/bmp/tiff/gif/heic/heif, videos use mp4/mov, and audio uses wav/mp3. Task records are retained for 7 days and video URLs for 24 hours.
For 2.5, images must have an aspect ratio of 0.4–2.5, dimensions of 300–6000 px, and be under 30 MB each. Videos support 480p/720p, 24–60 FPS, an aspect ratio of 0.4–2.5, and up to 200 MB each; ordinary references are 2–30 seconds and editing references are 4–30 seconds. Audio is 2–30 seconds and under 15 MB per file. Request bodies are limited to 64 MB.
Web search (Seedance 2.0)
Web search is available for text-only input:
{
"model": "doubao-seedance-2-0-260128",
"content": [
{
"type": "text",
"text": "Create a city video based on today's weather."
}
],
"tools": [{"type": "web_search"}],
"ratio": "16:9",
"duration": 11
}The number of searches is returned in usage.tool_usage.web_search.
Rate limits
Official online inference reference limits are 600 RPM and 10 concurrent tasks for enterprise accounts, and 180 RPM and 3 concurrent tasks for personal accounts on non-4K tasks. Standard 2.0 4K tasks are limited to 15 RPM and 1 concurrent task for both account types. Actual account limits are enforced by the service.
Python polling example
import time
import requests
BASE = "https://api.tokenhub.belivestudios.com"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
payload = {
"model": "doubao-seedance-2-5-260628",
"content": [
{
"type": "text",
"text": "An orange cat running across a keyboard.",
}
],
"ratio": "16:9",
"duration": 5,
"generate_audio": True,
}
task = requests.post(
f"{BASE}/api/v3/contents/generations/tasks",
headers=HEADERS,
json=payload,
timeout=30,
).json()
task_id = task.get("task_id") or task["id"]
while True:
result = requests.get(
f"{BASE}/api/v3/contents/generations/tasks/{task_id}",
headers=HEADERS,
timeout=30,
).json()
if result["status"] == "succeeded":
print(result["content"]["video_url"])
break
if result["status"] == "failed":
raise RuntimeError(result.get("error"))
time.sleep(10)FAQ
Why does a task remain queued or running for a long time? Video generation is asynchronous. Poll at roughly 10–30 second intervals; official examples use either 10 or 30 seconds, and the practical interval should respect account rate limits. Read content.video_url after the task reaches succeeded.
Why is the video URL no longer accessible? Video URLs are retained for 24 hours and can be downloaded up to 100 times; task records are retained for 7 days. Download or transfer the video promptly after success.
How should I choose between 2.0 and 2.5? Both versions support multimodal image, video, and audio references. Use standard Seedance 2.0 when 4K is required; use Seedance 2.5 for up to 30-second output, up to 50 reference assets, audio-only references, duration: -1, or mov output.
Why can a task fail asynchronously after creation? Seedance 2.5 continues validating task type and parameter constraints after a multimodal or first/last-frame task starts. Editing requires ratio: "adaptive" and duration: -1; first/last-frame tasks require ratio: "adaptive". Violations may return InvalidParameter.TaskTypeConstraint. For an explicit task type, set omni_reference_task_type to enable earlier validation.
What duration does duration: -1 produce? For editing, the model aims to keep the output close to the edited video's duration. For other 2.5 tasks, it automatically selects a duration from 4–30 seconds based on the prompt and assets.