Skip to content

Seedance Video API

Use this page when you want to create or query Seedance video generation tasks through Exchange Token.

Supported models and endpoints

ItemValue
Public modelsdoubao-seedance-2-0-260128, seedance-2.0, seedance-2.0-fast
Create taskPOST /api/v3/contents/generations/tasks
Query taskGET /api/v3/contents/generations/tasks/{id}
Base URL examplehttps://api.exchangetoken.ai
Recommended authAuthorization: Bearer <YOUR_API_KEY>

Request body

FieldTypeRequiredDescription
modelstringYesExact model name enabled for your account, such as doubao-seedance-2-0-260128 or seedance-2.0
contentobject[]YesInput array
generate_audiobooleanNoDefault true
toolsobject[]NoEnvironment-dependent capability
resolutionstringNo480p or 720p
ratiostringNo21:9, 16:9, 4:3, 1:1, 3:4, 9:16, adaptive
durationintegerNo4 to 15, or -1
watermarkbooleanNoFollow upstream capability

Avoid depending on service_tier, draft, frames, or camera_fixed.

Model selection

Use doubao-seedance-2-0-260128 when you need compatibility with the domestic Doubao/Seedance 2.0 model ID. Use seedance-2.0 when your account is configured for the Exchange Token generic Seedance alias. Fast-tier access through seedance-2.0-fast is account-dependent.

Domestic-compatible and international-compatible Seedance pools should use different public model names. Do not assume assets or tasks created for one compatibility pool are valid for another unless your account manager has enabled that workflow.

Asset-backed domestic 2.0 requests

To use your own image, video, or audio media with doubao-seedance-2-0-260128, create an Exchange Token Seedance asset first, then reference it in the video task as asset://<ASSET_ID>.

CreateAssetGroup and CreateAsset are Exchange Token Seedance asset gateway endpoints. They are not OpenAI file upload endpoints and they do not accept multipart file uploads. CreateAsset currently takes a public HTTPS media URL and returns the stable asset ID that video requests should reference.

Minimal flow:

  1. Call POST /open/CreateAssetGroup and save GROUP_ID
  2. Call POST /open/CreateAsset with GroupId and a public media URL, then save ASSET_ID
  3. Poll POST /open/GetAsset until Result.Status = "Active"
  4. Submit the video task with asset://$ASSET_ID

Example video request:

bash
curl -sS "$ET_BASE/api/v3/contents/generations/tasks" \
  -H "Authorization: Bearer $ET_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"model\":\"doubao-seedance-2-0-260128\",
    \"content\":[
      {\"type\":\"text\",\"text\":\"Make the character smile naturally and gently wave while the camera slowly pushes in\"},
      {\"type\":\"image_url\",\"image_url\":{\"url\":\"asset://$ASSET_ID\"},\"role\":\"first_frame\"}
    ],
    \"duration\":5,
    \"watermark\":false
  }"

Supported content and roles

Content types

typeDescription
textPrompt text
image_urlImage input
video_urlVideo input
audio_urlAudio input

Roles

Input typeRoleDescription
image_urlfirst_frameFirst-frame image-to-video
image_urllast_frameLast-frame image-to-video
image_urlreference_imageMultimodal reference image
video_urlreference_videoReference video
audio_urlreference_audioReference audio

Supported URL forms

Input typeURL forms
image_urlPublic URL, Base64, asset://<ASSET_ID>
video_urlPublic URL, asset://<ASSET_ID>
audio_urlPublic URL, Base64, asset://<ASSET_ID>

If you plan to reference asset://<ASSET_ID>, create assets first on the Seedance Asset API page.

Valid request patterns

ScenarioMinimum input
Text to videotext
First-frame image to videoimage_url(first_frame) with optional text
First and last frame image to videoimage_url(first_frame) + image_url(last_frame) with optional text
Multimodal guided generationLegal combinations of reference_image, reference_video, reference_audio, with optional text
Video editingreference_video with optional reference_image and text
Video extensionreference_video with optional text

Request rules and media limits

Rules

  • first_frame and last_frame mode cannot be mixed with reference_image mode
  • Audio cannot be submitted alone
  • asset://<ASSET_ID> is only valid after the asset status becomes Active
  • tools=[{"type":"web_search"}] should be validated before production use

Media limits

InputLimits
Imagejpeg, png, webp, bmp, tiff, gif; aspect ratio (0.4, 2.5); 300 to 6000 px; < 30 MB each; request body <= 64 MB
Videomp4, mov; 480p or 720p; 2 to 15 s each; max 3 clips; total duration <= 15 s; 24 to 60 FPS; <= 50 MB each
Audiowav, mp3; 2 to 15 s each; max 3 clips; total duration <= 15 s; <= 15 MB each; request body <= 64 MB

Task responses

Create response

json
{
  "id": "sg_vid_m9xk3g_0f8a4c0d3a2b4e9f1c20"
}

Exchange Token returns its own queryable task ID. Use it for later polling.

Query response

json
{
  "id": "sg_vid_m9xk3g_0f8a4c0d3a2b4e9f1c20",
  "model": "doubao-seedance-2-0-260128",
  "status": "succeeded",
  "content": {
    "video_url": "https://example.com/output.mp4?sig=foo&x=1"
  },
  "usage": {
    "completion_tokens": 108900,
    "total_tokens": 108900
  },
  "created_at": 1776209922,
  "updated_at": 1776210072,
  "resolution": "720p",
  "ratio": "16:9",
  "duration": 5,
  "generate_audio": true
}

Typical statuses:

  • queued
  • running
  • succeeded
  • failed
  • cancelled

The response model may show the submitted model name or an upstream versioned model ID.

Error format

json
{
  "error": {
    "type": "invalid_request",
    "message": "..."
  }
}
HTTP statuserror.typeTypical meaning
400invalid_requestInvalid parameters or JSON
401unauthorizedMissing or invalid API key
402quota_exhaustedVideo quota exhausted
403forbiddenToken disabled, expired, or not allowed
404task_not_foundTask not found
429rate_limitedToo many requests
502upstream_errorUpstream submit or parse failure
503no_channel / async_task_unavailableNo available channel or async task unavailable

Examples

Before running the examples below:

bash
export ET_BASE='https://api.exchangetoken.ai'
export ET_TOKEN='sk-xxxxxx'
export ASSET_ID='asset-xxxxxxxx'
export TASK_ID='sg_vid_xxxxxxxx'

Text to video

bash
curl -sS "$ET_BASE/api/v3/contents/generations/tasks" \
  -H "Authorization: Bearer $ET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model":"doubao-seedance-2-0-260128",
    "content":[
      {"type":"text","text":"A short-haired woman turns back and smiles on a city street, cinematic style, stable forward camera movement"}
    ],
    "duration":5,
    "resolution":"720p",
    "watermark":false
  }'

Asset-backed first-frame generation

bash
curl -sS "$ET_BASE/api/v3/contents/generations/tasks" \
  -H "Authorization: Bearer $ET_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"model\":\"doubao-seedance-2-0-260128\",
    \"content\":[
      {\"type\":\"text\",\"text\":\"Make the character nod slightly and wave to the camera\"},
      {\"type\":\"image_url\",\"image_url\":{\"url\":\"asset://$ASSET_ID\"},\"role\":\"first_frame\"}
    ],
    \"duration\":5,
    \"watermark\":false
  }"

Query a task

bash
curl -sS "$ET_BASE/api/v3/contents/generations/tasks/$TASK_ID" \
  -H "Authorization: Bearer $ET_TOKEN"

Video extension

bash
curl -sS "$ET_BASE/api/v3/contents/generations/tasks" \
  -H "Authorization: Bearer $ET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
      "model": "seedance-2.0-fast",
      "content": [
        {
          "type": "text",
          "text": "Generate the content after [Video1]: the two men who are late run towards them, the five people finally meet and have a friendly chat."
        },
        {
          "type": "video_url",
          "video_url": {
            "url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_image/video_edit_prolong_ref_video.mp4"
          },
          "role": "reference_video"
        }
      ],
      "generate_audio": true,
      "ratio": "16:9",
      "duration": 5,
      "watermark": true
    }'