Seedance is Volcengine's video generation model, supporting text-to-video, image-to-video, and video-to-video modes.

Available models

Supported unified parameters

Unified fieldSupportedDescription
modelYesmodel
promptYescontent[]{ type: "text", text }
imageYescontent[]image_url entries
videoYescontent[]video_url entries
audioYescontent[]audio_url entries
ratioYesratio: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive
resolutionYesresolution: 480p, 720p (all models); 1080p (not supported by Seedance 2.0 Fast / Mini); 4k (Seedance 2.0 only)
headersYesCustom HTTP headers

upstream_options for Seedance

OptionTypeSupported modelsDescription
callback_urlstringAllCallback URL for task status change notifications. Ark will POST to this URL when the task status changes
return_last_framebooleanAllWhether to return the last frame image (PNG, no watermark). Useful for chained generation: use the last frame as the first frame of the next task
service_tier'default' | 'flex'AllService tier: default for online inference (lower quota, low latency); flex for offline inference (higher quota, 50% price)
execution_expires_afternumberAllTask timeout in seconds from creation time. Default 172800 (48h), range [3600, 259200]
generate_audiobooleanAllWhether to generate synchronized audio (voice, sound effects, background music). Put dialogue in quotes for better results
draftbooleanAllWhether to enable draft mode. true generates a preview video with fewer tokens at lower cost for quick validation
toolsArray<{ type: string }>Seedance 2.0 series onlyTool definitions, e.g. web search: [{ "type": "web_search" }]
safety_identifierstringAllUnique end-user identifier (≤64 chars) to assist with abuse detection. Hash the value before passing
prioritynumberAllExecution priority, 0–9. Higher values get queued ahead of lower-priority requests on the same endpoint
durationnumberAllVideo duration in seconds: 1.0 Pro / 1.0 Pro Fast: [2, 12]; 1.5 Pro: [4, 12] or -1; 2.0 series: [4, 15] or -1
framesnumberAllFrame count, [29, 289], must satisfy 25+4n (n = positive integer). Frames = duration × 24
seednumberAllRandom seed, [-1, 2^32-1]. Same seed produces similar results (not guaranteed identical); -1 for random
camera_fixedbooleanAllWhether to fix the camera. true appends a fixed-camera instruction to the prompt (best-effort)
watermarkbooleanAllWhether to include a watermark. false = no watermark; true = "AI-generated" watermark in bottom-right

Media input mapping

Media input parameter handling:

User inputResult
image: "https://..."{ "type": "image_url", "image_url": { "url": "..." }, "role": "reference_image" }
image: { "type": "first_frame", "url": "..." }{ "type": "image_url", "image_url": { "url": "..." }, "role": "first_frame" }
video: "https://..."{ "type": "video_url", "video_url": { "url": "..." }, "role": "reference_video" }
video: { "type": "reference_video", "url": "..." }{ "type": "video_url", "video_url": { "url": "..." }, "role": "reference_video" }
audio: "https://..."{ "type": "audio_url", "audio_url": { "url": "..." }, "role": "reference_audio" }
audio: { "type": "reference_audio", "url": "..." }{ "type": "audio_url", "audio_url": { "url": "..." }, "role": "reference_audio" }

Arrays are expanded per entry. Strings use the default role. Objects use their type field as the role.

Example: Text-to-video

curl -X POST https://ai.win10030.com/video/v1/generations \
  -H 'Authorization: Bearer sk-xxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "doubao-seedance-1-0-pro-250528",
    "prompt": "A golden retriever running on the beach, sunset backlight, slow motion",
    "resolution": "720p",
    "ratio": "16:9",
    "upstream_options": {
      "duration": 5,
      "watermark": false,
      "service_tier": "default"
    }
  }'

Example: Video input

curl -X POST https://ai.win10030.com/video/v1/generations \
  -H 'Authorization: Bearer sk-xxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "doubao-seedance-1-0-pro-250528",
    "prompt": "Generate a sequel based on the reference video, keep characters and setting consistent",
    "video": { "type": "reference_video", "url": "https://example.com/reference.mp4" },
    "resolution": "720p",
    "upstream_options": { "duration": 5 }
  }'

Example: Multi-modal (image + video + audio)

curl -X POST https://ai.win10030.com/video/v1/generations \
  -H 'Authorization: Bearer sk-xxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "doubao-seedance-1-0-pro-250528",
    "prompt": "Generate a commercial based on the first frame, reference video, and background music",
    "image": { "type": "first_frame", "url": "https://example.com/first.jpg" },
    "video": "https://example.com/reference.mp4",
    "audio": "https://example.com/bgm.mp3",
    "resolution": "1080p",
    "ratio": "16:9",
    "upstream_options": {
      "duration": 8,
      "generate_audio": true,
      "watermark": false
    }
  }'

Billing

Seedance uses billingMethod: "modality_tokens":

Request has video inputCustomer price fieldUsage field
Nooutput_tokens_pricingusage.output_tokens
Yesinput_video_output_tokens_pricingusage.output_tokens

has_input_video is determined solely by the video field in the request body: any non-empty string, non-empty URL object, or valid video entry in an array counts as true.