Seedance 1 API
ReachAPI exposes the Seedance 1 family through the public model IDs seedance-1-0-pro and seedance-1-0-pro-fast.
This page describes how to call Seedance 1 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-1-0-pro,seedance-1-0-pro-fast - Execution mode: asynchronous task
- All requests must now send explicit
input.content - ReachAPI no longer assembles
input.contentfrom legacy convenience fields such aspromptorimage_url
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/jsonHeader details:
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Platform API key in the format Bearer sk-xxxxxx |
Content-Type | Yes | Must be application/json |
3. Model Capability Summary
| Model | Duration | Resolution | Aspect ratio | input.content | Notes |
|---|---|---|---|---|---|
seedance-1-0-pro | 2-12s | 480p, 720p, 1080p | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Required | Supports text, first-frame image, last-frame image |
seedance-1-0-pro-fast | 2-12s | 480p, 720p, 1080p | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Required | Supports text and first-frame image only |
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 | Token price | Notes |
|---|---|---|
seedance-1-0-pro | $2.50 / 1M tokens | Applies to successful video generation |
seedance-1-0-pro-fast | $1.00 / 1M tokens | Applies to successful video generation |
4. Create Task
Request body example:
{
"model": "seedance-1-0-pro",
"callback_url": "https://your-domain.com/callback",
"input": {
"content": [
{
"type": "text",
"text": "A cinematic drone shot passing over a coastline at sunrise"
}
],
"duration_seconds": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}
}4.1 Top-Level Parameters
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Must be seedance-1-0-pro or seedance-1-0-pro-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 content input. Must be a non-empty array |
duration_seconds | integer | No | Output duration. Must be between 2 and 12 |
resolution | string | Yes | Output resolution. Supported values: 480p, 720p, 1080p |
aspect_ratio | string | No | Output aspect ratio. Supported values: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 |
5. input.content Structure
Supported type values:
textimage_url
Supported role values:
first_framelast_frame
Field details:
| Field | Type | Required | Description |
|---|---|---|---|
content[].type | string | Yes | Must be text or image_url |
content[].text | string | Required for type = text | Text prompt |
content[].role | string | Conditionally required | Must be first_frame or last_frame. A single first-frame image may omit role and will be treated as first_frame |
content[].image_url.url | string | Required for type = image_url | Image URL, Base64 image, or uploaded asset ID |
Content constraints:
contentmust contain at least 1 item- Maximum 1
text - Maximum 2
image_url - Maximum 1
first_frame - Maximum 1
last_frame last_framerequiresfirst_frameseedance-1-0-pro-fastdoes not supportlast_frame
6. Legacy Fields No Longer Supported
The following legacy fields are no longer used for automatic content assembly and now return 400:
input.promptinput.image_urlinput.image_urlsinput.last_image_urlinput.video_urlsinput.audio_urls
The following fields are also unsupported in the current Reach Seedance gateway:
input.negative_promptinput.parametersinput.instancesinput.service_tierinput.execution_expires_afterinput.safety_identifierinput.seedinput.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-1-0-pro",
"input": {
"content": [
{
"type": "text",
"text": "A paper boat floating through a neon-lit rainy street at night"
}
],
"duration_seconds": 4,
"resolution": "720p",
"aspect_ratio": "16:9"
}
}'7.2 First-Frame Image-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-1-0-pro-fast",
"input": {
"content": [
{
"type": "text",
"text": "A product shot transitions into a dramatic rotating hero reveal"
},
{
"type": "image_url",
"role": "first_frame",
"image_url": {
"url": "https://cdn.example.com/product.png"
}
}
],
"duration_seconds": 3,
"resolution": "720p",
"aspect_ratio": "1:1"
}
}'7.3 First-Frame and Last-Frame Guided 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-1-0-pro",
"input": {
"content": [
{
"type": "text",
"text": "The character slowly turns toward the camera and smiles"
},
{
"type": "image_url",
"role": "first_frame",
"image_url": {
"url": "https://cdn.example.com/first-frame.png"
}
},
{
"type": "image_url",
"role": "last_frame",
"image_url": {
"url": "https://cdn.example.com/last-frame.png"
}
}
],
"duration_seconds": 5,
"resolution": "1080p",
"aspect_ratio": "9:16"
}
}'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
Failed response example:
{
"code": 400,
"msg": "Field `input.content` is required",
"status": "failed",
"task_id": "task_xxx",
"data": [],
"error_code": "RJ_INVALID_REQUEST_BODY",
"cost": {
"spend": 0
}
}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.
Callback constraints:
- Only
httpsURLs are supported - Maximum length:
2048 localhost,.local, and obvious private-network targets are rejected- Single delivery timeout:
10s - Up to 2 retries after failure, for a maximum of 3 delivery attempts
11. Constraints and Notes
input.contentis requiredresolutionis requiredduration_secondsmust be between2and12seedance-1-0-pro-fastdoes not supportlast_frame- Input asset values must be non-empty and server-accessible when URLs are used