Seedance Video Generation (Dreamina)
Use EasyRouter's unified API to call Dreamina Seedance 2.0 video generation models. Supports text-to-video, image-to-video, and video input continuation.
Dreamina Seedance 2.0 is the next-generation video model family, supporting text-to-video, image-to-video, and video input continuation / editing. EasyRouter exposes it via the async task endpoint /v1/video/generations.
Seedance uses an async task-based API: submit a request, receive a task_id, poll for status, and download the video when ready.
1. Supported Models
| Model | Description | Capabilities |
|---|---|---|
dreamina-seedance-2-0 | Standard Seedance 2.0, quality-oriented | Text-to-video, image-to-video, video continuation |
dreamina-seedance-2-0-fast | Fast variant of Seedance 2.0, lower latency | Text-to-video, image-to-video, video continuation |
Both models support video as input (continuation / editing) by passing a video_url in metadata.content.
2. Common Endpoints
2.1 Submit Task
POST /v1/video/generationsRequest Headers
| Header | Required | Description |
|---|---|---|
Authorization | ✓ | Bearer sk-YourApiKey |
Content-Type | ✓ | application/json |
Request Body Fields
| Field | Type | Required | Description |
|---|---|---|---|
model | string | ✓ | Seedance model name (see table above) |
prompt | string | ✓ | Text prompt |
image | string | — | Reference image for image-to-video (URL or base64 data URI) |
images | string[] | — | Multi-image references (URL or base64 data URI) |
duration | int | — | Duration in seconds (typically 5 or 10, default 5) |
seconds | string | — | String form of duration (OpenAI Sora compatibility). Must be a numeric string like "5" or "10", not with units. Only used when top-level duration is 0 or not set. |
metadata | object | — | Container for Seedance-specific parameters (see Section 3) |
Response
{
"id": "task_xxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxx",
"object": "video",
"model": "dreamina-seedance-2-0",
"status": "queued",
"progress": 0,
"created_at": 1730000000
}The id / task_id is a public ID generated by EasyRouter (prefixed with task_). It is not the same as the upstream task id.
2.2 Query Task Status
GET /v1/video/generations/{task_id}The response is wrapped in {code, message, data}. On success, code is "success" and data contains the task detail object.
Response Example (completed)
{
"code": "success",
"message": "",
"data": {
"id": 6,
"task_id": "task_jEctEHDF1vefS2L3HND2JnzXPslnAYby",
"platform": "45",
"user_id": 1,
"group": "default",
"channel_id": 12,
"quota": 818125,
"action": "generate",
"status": "SUCCESS",
"fail_reason": "",
"result_url": "https://ark-acg-...volces.com/xxx.mp4?X-Tos-...",
"submit_time": 1778236598,
"start_time": 1778236601,
"finish_time": 1778236698,
"created_at": 1778236598,
"updated_at": 1778236698,
"progress": "100%",
"properties": {
"input": "",
"upstream_model_name": "dreamina-seedance-2-0-260128",
"origin_model_name": "dreamina-seedance-2-0"
},
"data": {
"id": "cgt-20260508183637-m6gj8",
"seed": 42,
"draft": false,
"model": "dreamina-seedance-2-0-260128",
"ratio": "16:9",
"usage": {
"total_tokens": 108900,
"completion_tokens": 108900
},
"status": "succeeded",
"content": {
"video_url": "https://ark-acg-...volces.com/xxx.mp4?X-Tos-..."
},
"duration": 5,
"resolution": "720p",
"service_tier": "default",
"generate_audio": true,
"framespersecond": 24,
"execution_expires_after": 172800,
"created_at": 1778236598,
"updated_at": 1778236696
}
}
}data Field Reference
| Field | Type | Description |
|---|---|---|
id | int | Internal auto-increment task ID |
task_id | string | EasyRouter public task ID (prefixed with task_); use this for subsequent queries |
platform | string | Upstream platform code |
user_id | int | User ID |
group | string | User group |
channel_id | int | Channel ID that actually served the request |
quota | int | Raw quota charged for this task |
action | string | Task action, typically generate |
status | string | Task status: SUBMITTED / QUEUED / IN_PROGRESS / SUCCESS / FAILURE |
fail_reason | string | Failure reason (non-empty only when status = FAILURE) |
result_url | string | Video result URL (present on success, upstream temporary link) |
progress | string | Progress string like "100%" |
submit_time / start_time / finish_time | int64 | Submit / start / finish Unix timestamps (seconds) |
created_at / updated_at | int64 | Record creation / last update timestamps |
properties.upstream_model_name | string | Model name actually sent to the upstream provider |
properties.origin_model_name | string | Model name requested by the client |
data | object | Raw upstream response (includes usage, content.video_url, resolution, framespersecond, etc.) |
Status Enum
| Status | Description |
|---|---|
SUBMITTED | Submitted |
QUEUED | Queued on upstream |
IN_PROGRESS | Generating |
SUCCESS | Finished, result_url contains the video URL |
FAILURE | Failed, fail_reason contains the failure reason |
2.3 Download Video Content
GET /v1/videos/{task_id}/contentReturns raw video bytes (Content-Type: video/mp4). EasyRouter proxies the upstream URL.
Strongly recommended: use the /content proxy endpoint to download videos, not the raw result_url. The latter is an upstream temporary link with limited validity.
3. Seedance-Specific Parameters (metadata)
All Seedance-specific fields are passed via the metadata object and forwarded to the upstream API.
3.1 Resolution / Ratio / Duration
| Field | Type | Description | Examples |
|---|---|---|---|
resolution | string | Resolution tier | 480p, 720p, 1080p |
ratio | string | Aspect ratio | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive |
duration | int | Duration in seconds. Note: the top-level duration (or seconds) takes precedence over metadata.duration. | 5, 10 |
frames | int | Specify frame count (optional, mutex with duration) | e.g. 121 |
seed | int | Random seed | 0 ~ 2^31-1 |
3.2 Camera and Content Control
| Field | Type | Description |
|---|---|---|
camera_fixed | bool | Fixed camera (true = camera still) |
watermark | bool | Add official watermark |
3.3 Advanced Parameters
| Field | Type | Description |
|---|---|---|
service_tier | string | Service tier affecting speed and quota (e.g., auto / default / priority) |
execution_expires_after | int | Task execution timeout (seconds) |
generate_audio | bool | Generate audio alongside video |
draft | bool | Draft mode (faster, cheaper, slightly lower quality) |
return_last_frame | bool | Return the last frame as an image in the response |
callback_url | string | Webhook URL for task completion notification |
3.4 Multimodal Input (content array)
In addition to top-level image / images, you can pass a multimodal input array via metadata.content, which supports mixed image and video inputs:
{
"model": "dreamina-seedance-2-0",
"prompt": "Extend this video: make the cat walk out of frame",
"metadata": {
"content": [
{
"type": "video_url",
"video_url": {
"url": "https://example.com/cat.mp4"
}
}
],
"resolution": "720p"
}
}type | Usage |
|---|---|
image_url + image_url.url | Image reference (image-to-video) |
video_url + video_url.url | Video input (continuation / editing) |
4. Full Examples
# Step 1: Submit the task
curl -X POST https://easyrouter.io/v1/video/generations \
-H "Authorization: Bearer sk-YourApiKey" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"prompt": "A cat walking on the moon with a starry background",
"duration": 5,
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"seed": 42
}
}'
# Step 2: Poll for task status
curl https://easyrouter.io/v1/video/generations/task_abc123 \
-H "Authorization: Bearer sk-YourApiKey"
# Step 3: Download the video
curl https://easyrouter.io/v1/videos/task_abc123/content \
-H "Authorization: Bearer sk-YourApiKey" \
-o cat_on_moon.mp4curl -X POST https://easyrouter.io/v1/video/generations \
-H "Authorization: Bearer sk-YourApiKey" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"prompt": "Make the cat jump",
"image": "https://example.com/cat.jpg",
"duration": 5,
"metadata": {
"resolution": "720p",
"ratio": "16:9"
}
}'# Video continuation / editing
curl -X POST https://easyrouter.io/v1/video/generations \
-H "Authorization: Bearer sk-YourApiKey" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"prompt": "Extend this video: make the cat walk out of frame",
"metadata": {
"content": [
{
"type": "video_url",
"video_url": {
"url": "https://example.com/cat-original.mp4"
}
}
],
"resolution": "720p",
"duration": 5
}
}'# Fast variant: speed-oriented, lower latency
curl -X POST https://easyrouter.io/v1/video/generations \
-H "Authorization: Bearer sk-YourApiKey" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0-fast",
"prompt": "Cyberpunk city street with neon lights on a rainy night",
"duration": 5,
"metadata": {
"resolution": "720p",
"ratio": "16:9",
"camera_fixed": false,
"generate_audio": true
}
}'5. Error Handling
5.1 HTTP 400 Invalid Parameters
- Model not allowed or unauthorized:
model not allowed - Empty prompt:
prompt is required - Invalid resolution / duration combination: returned by upstream with details
5.2 HTTP 401 / 403 Auth Errors
401 Unauthorized: API Key invalid or expired403 Forbidden: API Key not authorized for this model (check token model whitelist)
5.3 HTTP 402 Insufficient Balance
Returns insufficient user quota.
5.4 Task failed Status
Common reasons:
| Reason | Suggestion |
|---|---|
| Content moderation failed | Revise prompt to avoid sensitive content |
| Image / video URL not accessible | Use publicly accessible URLs or switch to base64 |
| Upstream timeout | Retry later, or switch to dreamina-seedance-2-0-fast |
On failed status, EasyRouter automatically refunds the pre-charged amount.