Seedance 2 API
ReachAPI exposes the Seedance 2 family through the public model IDs seedance-2 and seedance-2-fast.
This page describes how to call Seedance 2 models on ReachAPI, including request fields, constraints, and examples.
Important:
- Create task:
POST /v1/vids/create - Query task:
GET /v1/tasks/{task_id} - Model IDs:
seedance-2,seedance-2-fast - Execution mode: asynchronous task
- All requests must now send explicit
input.content
1. API Overview
- HTTP method:
POST - Request path:
/v1/vids/create - Content-Type:
application/json - Result delivery:
- The submission response returns task acceptance information
- The final result is obtained by polling
/v1/tasks/{task_id}or bycallback_url
2. Authentication and Headers
Example headers:
Authorization: Bearer YOUR_REACH_API_KEY
Content-Type: application/json3. Model Capability Summary
| Model | Duration | Resolution | Aspect ratio | input.content | Notes |
|---|---|---|---|---|---|
seedance-2 | 4-15s | 480p, 720p, 1080p | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, adaptive | Required | Supports text, image, video, audio reference, editing, and extension |
seedance-2-fast | 4-15s | 480p, 720p | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, adaptive | Required | Same fields as seedance-2, but 1080p is not currently supported |
Notes:
duration_seconds = -1is supported and allows the model to choose the duration automatically
Billing and Usage
Seedance video tasks are billed by returned token usage, not by video seconds. Estimated price = token unit price × token consumption. The final bill uses usage.output_tokens in the ReachAPI task response, mapped from BytePlus usage.completion_tokens.
| Model | Video input | Resolution | Token price |
|---|---|---|---|
seedance-2 | No | 480p / 720p | $7.00 / 1M tokens |
seedance-2 | No | 1080p | $7.70 / 1M tokens |
seedance-2 | Yes | 480p / 720p | $4.30 / 1M tokens |
seedance-2 | Yes | 1080p | $4.70 / 1M tokens |
seedance-2-fast | No | 480p / 720p | $5.60 / 1M tokens |
seedance-2-fast | Yes | 480p / 720p | $3.30 / 1M tokens |
seedance-2-fast | Any | 1080p | Not supported |
4. Create Task
Request body example:
{
"model": "seedance-2",
"callback_url": "https://your-domain.com/callback",
"input": {
"content": [
{
"type": "text",
"text": "A cinematic drone shot passing over a coastline at sunrise"
}
],
"duration_seconds": 6,
"resolution": "720p",
"aspect_ratio": "16:9"
}
}4.1 Top-Level Parameters
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Must be seedance-2 or seedance-2-fast |
callback_url | string | No | HTTPS callback URL for terminal task states. Maximum length 2048. Localhost, local network, and private network targets are rejected |
input | object | Yes | Video generation parameters |
4.2 input Parameters
| Field | Type | Required | Description |
|---|---|---|---|
content | array<object> | Yes | Explicit multimodal input. Must be a non-empty array |
duration_seconds | integer | No | Output duration. Use 4-15 or -1 for automatic duration selection |
resolution | string | Yes | Output resolution. seedance-2: 480p, 720p, 1080p; seedance-2-fast: 480p, 720p |
aspect_ratio | string | No | Output aspect ratio. Supported values: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, adaptive |
generate_audio | boolean | No | Requests generated audio |
seed | integer | No | Random seed. Supported range: -1 to 4294967295. Use -1 for a random result |
safety_identifier | string | No | End-user safety identifier. Must be an ASCII string up to 64 characters |
watermark | boolean | No | Passes watermark preference to the underlying model |
return_last_frame | boolean | No | Requests the last frame image |
edit_mode | string | No | Controls edit behavior in supported scenarios |
extend_mode | string | No | Controls extension behavior in supported scenarios |
5. input.content Structure
Supported type values:
textimage_urlvideo_urlaudio_url
Supported role values:
first_framelast_framereference_imagereference_videoreference_audio
Field details:
| Field | Type | Required | Description |
|---|---|---|---|
content[].type | string | Yes | Must be text, image_url, video_url, or audio_url |
content[].role | string | No | If provided, it must be one of the supported roles above. Non-text items should usually provide a role explicitly |
content[].text | string | Required for type = text | Text prompt |
content[].image_url.url | string | Required for type = image_url | Image URL or uploaded asset ID |
content[].video_url.url | string | Required for type = video_url | Video URL or uploaded asset ID. Video Base64 is not currently supported |
content[].audio_url.url | string | Required for type = audio_url | Audio URL or uploaded asset ID |
Content constraints:
contentmust contain at least 1 item- Maximum 9 images
- Maximum 3 videos
- Maximum 3 audio files
textandaudiocan appear together only when at least onereference_imageorreference_videois also present- Audio-only input is not supported
text + audioby itself is not supportedfirst_frame/last_framecannot be mixed withreference_image/reference_video/reference_audioin the same request
Supported Seedance 2 input combinations:
text- optional
text+image_url - optional
text+video_url - optional
text+image_url+audio_url - optional
text+image_url+video_url - optional
text+video_url+audio_url - optional
text+image_url+video_url+audio_url
6. Legacy Fields No Longer Supported
The following fields now return 400:
input.promptinput.image_urlinput.image_urlsinput.last_image_urlinput.video_urlsinput.audio_urlsinput.negative_promptinput.parametersinput.instancesinput.service_tierinput.execution_expires_afterinput.framesinput.camera_fixedinput.draftinput.content[].draft_task- Any undocumented custom fields
7. Request Examples
7.1 Text-to-Video
curl -X POST "https://direct.reachapi.ai/v1/vids/create" \
-H "Authorization: Bearer YOUR_REACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2",
"input": {
"content": [
{
"type": "text",
"text": "A stylized travel film scene with dynamic camera movement"
}
],
"duration_seconds": 8,
"resolution": "1080p",
"aspect_ratio": "adaptive",
"watermark": false
}
}'7.2 Explicit Multimodal Reference Input
curl -X POST "https://direct.reachapi.ai/v1/vids/create" \
-H "Authorization: Bearer YOUR_REACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2",
"input": {
"content": [
{
"type": "text",
"text": "A stylized travel film scene with dynamic camera movement"
},
{
"type": "image_url",
"role": "reference_image",
"image_url": {
"url": "https://cdn.example.com/scene-start.png"
}
},
{
"type": "video_url",
"role": "reference_video",
"video_url": {
"url": "https://cdn.example.com/reference-motion.mp4"
}
}
],
"duration_seconds": 8,
"resolution": "1080p",
"aspect_ratio": "adaptive",
"watermark": false
}
}'7.3 Reference Video Extension
curl -X POST "https://direct.reachapi.ai/v1/vids/create" \
-H "Authorization: Bearer YOUR_REACH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-fast",
"input": {
"content": [
{
"type": "text",
"text": "Extend this clip into a faster action sequence"
},
{
"type": "video_url",
"role": "reference_video",
"video_url": {
"url": "https://cdn.example.com/reference-1.mp4"
}
}
],
"duration_seconds": 6,
"resolution": "480p",
"aspect_ratio": "16:9",
"extend_mode": "continue"
}
}'8. Create Task Response
Example response:
{
"code": 200,
"msg": "",
"status": "queued",
"task_id": "task_xxx",
"data": []
}9. Query Task Status
Request example:
curl -X GET "https://direct.reachapi.ai/v1/tasks/task_xxx" \
-H "Authorization: Bearer YOUR_REACH_API_KEY"Successful response example:
{
"code": 200,
"msg": "",
"status": "success",
"task_id": "task_xxx",
"data": [
{
"url": "https://cdn.example.com/generated/video-1.mp4"
}
],
"usage": {
"input_tokens": 0,
"output_tokens": 102960,
"total_tokens": 102960
},
"cost": {
"spend": 0.12
}
}Notes:
datacontains video result items- ReachAPI guarantees
data[].urlfor successful video outputs
10. Callback Delivery
If callback_url is provided when the task is created, the gateway sends a POST request to that URL when the task reaches a terminal state. The callback body uses the same JSON structure as the task query response.
11. Constraints and Notes
input.contentis requiredresolutionis requiredduration_secondsmust be-1or within4-15seedance-2-fastdoes not currently support1080paspect_ratiosupportsadaptive- Input asset values must be non-empty and server-accessible when URLs are used