BeLive Token Hub
API ReferenceVideo

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

MethodPathDescription
POST/api/v3/contents/generations/tasksCreate a video generation task
GET/api/v3/contents/generations/tasks/{task_id}Query task status and result
POST/api/assets/uploadUpload an asset
GET/api/assets/{asset_id}Get one asset
GET/api/assetsList assets

Base URL: https://api.tokenhub.belivestudios.com. Authenticate with Authorization: Bearer YOUR_API_KEY and Content-Type: application/json.

Models and capabilities

ModelModel IDDurationResolutionOutput
Seedance 2.0doubao-seedance-2-0-2601284–15 s480p, 720p, 1080p, 4kmp4
Seedance 2.0 Fastdoubao-seedance-2-0-fast-2601284–15 s480p, 720pmp4
Seedance 2.0 Minidoubao-seedance-2-0-mini-2606154–15 s480p, 720pmp4
Seedance 2.5doubao-seedance-2-5-2606284–30 s480p, 720p, 1080pmp4, 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

FieldTypeRequiredDescription
modelstringYesModel ID
contentarrayYesText prompt and reference assets
content[].typestringYestext, image_url, video_url, or audio_url
content[].textstringConditionalText prompt
content[].image_url.urlstringConditionalImage URL
content[].video_url.urlstringConditionalVideo URL
content[].audio_url.urlstringConditionalAudio URL
content[].rolestringConditionalreference_image, reference_video, reference_audio, first_frame, or last_frame
generate_audiobooleanNoGenerate audio
resolutionstringNo480p, 720p, 1080p; 4k is available on standard 2.0
ratiostringNo21:9, 16:9, 4:3, 1:1, 3:4, 9:16; 2.5 also supports adaptive
durationintegerNo2.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_formatstringNoSettable only on 2.5: mp4 or mov; 2.0 output is fixed to mp4
watermarkbooleanNoAdd an AI-generated watermark
return_last_framebooleanNoReturn the output video's last frame (2.0)
omni_reference_task_typestringNo2.5: auto, reference, edit, or extend
toolsarrayNo2.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

LocationParameterTypeRequiredDescription
Pathtask_idstringYesThe task ID returned by the create request. In the current creation response, task_id and id have the same value.
HeaderAuthorizationstringYesBearer YOUR_API_KEY.
HeaderContent-TypestringNoapplication/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

FieldTypeDescription
contentobjectContainer for generated outputs.
content.video_urlstringVideo URL on success; download it before it expires.
idstringTask ID.
modelstringModel name and version used to execute the task; the exact format follows the API response.
statusstringqueued, running, succeeded, or failed.
created_at / updated_atintegerCreation and update times as Unix timestamps.
durationnumberActual output duration in seconds.
ratiostringActual output aspect ratio.
resolutionstringActual output resolution.
output_formatstringActual output format, such as mp4 or mov.
framespersecondintegerOutput video frame rate.
generate_audiobooleanWhether audio was generated.
seedintegerRandom seed used for generation.
usageobjectTask usage information.
usage.completion_tokens / usage.total_tokensintegerToken usage counters.
execution_expires_afterintegerTask execution expiry setting.
service_tierstringService tier.
priorityintegerTask priority.
draftbooleanWhether 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

FieldTypeDescription
idstringFailed task ID.
modelstringModel name and version used to execute the task; the exact format follows the API response.
statusstringfailed for a failed task.
errorobjectError object.
error.codestringError code, for example OutputVideoSensitiveContentDetected.
error.messagestringHuman-readable error message.
created_at / updated_atintegerCreation and update times as Unix timestamps.

Seedance 2.5 task constraints

Task typeTriggerParameter requirements
Text to videoText prompt onlyNo special ratio or duration restriction
First-frame generationMust include one first_frame imageratio must be adaptive
First/last-frame generationMust include both first_frame and last_frame imagesratio must be adaptive
Reference generationAt least one reference image, video, or audioNo special ratio or duration restriction
Video editingreference_video plus an editing promptratio: "adaptive", duration: -1; video must be 4–30 seconds
Video extensionreference_video plus an extension promptratio: "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

ParameterSeedance 2.0Seedance 2.5
resolutionStandard: 480p, 720p, 1080p, 4k; Fast/Mini: 480p, 720p480p, 720p, 1080p
ratio21:9, 16:9, 4:3, 1:1, 3:4, 9:16The same ratios plus adaptive
duration4–15 seconds; -1 unsupportedRegular, first/last-frame, and extension tasks: 4–30 seconds or -1; editing requires -1
output_formatFixed mp4mp4 or mov
watermarktrue / falsetrue / 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.

On this page