Generate Videos with Seedance
What you can do
Use WorldRouter’s native async task API for text-to-video, video-to-video, and image-guided Seedance generation.
Before you start
Seedance uses WorldRouter’s native async task API. Create a task, then check its status until the video is ready.
- Send text-only and reference-video requests directly.
- Upload reference images first, then use the returned asset URL in your request.
Task routes
POST /api/v3/contents/generations/tasksGET /api/v3/contents/generations/tasks/{task_id}
Asset helper routes
Use these routes only for reference-image uploads:
POST /v1/asset-groupsPOST /v1/asset-groups/{asset_group_id}/assets
Start from Quickstart if you still need an API key or the
base URL. Use the same origin shown there: https://inference-api-pre-d80ca3.worldrouter.ai. Seedance task
routes append /api/v3/... and are not part of the OpenAI-compatible
/v1/videos surface, so do not nest them under /v1.
Quick start flow
The asset upload step depends on what kind of reference you pass:
- Text-only or with a video reference: skip the asset step. Send the request directly.
- With an image reference (required): upload the image through the asset helpers first; public image URLs are rejected.
- 1If you need an image reference, create an asset group and upload the image through the asset helpers (required for image references; skip this for text-only and video-reference flows).
- 2Create a Seedance task with
POST /api/v3/contents/generations/tasks. - 3Check task status with
GET /api/v3/contents/generations/tasks/{task_id}until the job reaches a terminal state. - 4Read
content.video_urlfrom the task response and download the generated video from that URL.
Supported request models
These are the request model names you should send in the model field:
| Model | Best for |
|---|---|
seedance-2.0 | Standard text-to-video. |
seedance-2.0-fast | Faster text-to-video iterations. |
Important behavior:
For text-only generation or reference-video generation, send your request directly with one of the model names above.
If you are using a reference image:
- Upload the image first through the asset helper routes.
- Use the returned
asset://...URL in your request. - Keep the public request model as
seedance-2.0orseedance-2.0-fast.
When you use an uploaded image asset, keep the public model as seedance-2.0 or seedance-2.0-fast. WorldRouter handles the asset flow automatically.
Direct public requests with model: "seedance-2.0-asset" are rejected.
Text-to-video
Start here if you want the simplest Seedance workflow.
This example shows the basic text-to-video flow: send a prompt, create a task, then check its progress until the video is ready.
curl -X POST "https://inference-api-pre-d80ca3.worldrouter.ai/api/v3/contents/generations/tasks" \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"content": [
{
"type": "text",
"text": "A cinematic video of a city street at sunset."
}
],
"resolution": "720p",
"duration": 5
}'You can start with this example as-is, then adjust the parts that matter most for your use case:
model: choose the standard or faster generation path.text: describe the subject, style, setting, and motion you want.resolution: choose the output quality supported by the model.duration: choose how long the generated video should be.
Typical create response:
{
"id": "task-123",
"requestId": "req-123"
}This response confirms that the task was created successfully. Your video is not ready yet.
Save the returned task id, then continue to Check task status.
Check task status
All Seedance requests follow the same async flow after task creation, including text-to-video, reference-video, and reference-image requests.
Use the task id returned from the create response to check whether the video is still running, has succeeded, or has failed.
curl "https://inference-api-pre-d80ca3.worldrouter.ai/api/v3/contents/generations/tasks/task-123" \
-H "Authorization: Bearer your_api_key"Typical status response:
{
"id": "task-123",
"model": "seedance-2.0",
"status": "succeeded",
"content": {
"video_url": "https://media.example.com/seedance/output.mp4"
},
"resolution": "720p",
"duration": 5,
"usage": {
"output_tokens": 7522
}
}When status becomes succeeded, use content.video_url to download the final video.
WorldRouter normalizes upstream task states into:
queuedrunningsucceededfailedcancelledexpired
Use a reference video
Reference videos can be sent directly in the request. Unlike image references, they do not require the asset helper flow.
{
"model": "seedance-2.0",
"content": [
{
"type": "text",
"text": "Keep the motion rhythm of the input video and restyle it into a cinematic tea scene."
},
{
"type": "video_url",
"role": "reference_video",
"video_url": {
"url": "https://example.com/input.mp4"
}
}
],
"resolution": "720p",
"duration": 5
}You can customize the same core fields here as well:
text: describe the style or transformation you want.video_url: provide the reference video.resolution: choose the output quality supported by the model.duration: choose the target output length.
After submitting the request, follow the same steps in Check task status to monitor the task and download the result.
Asset flow for image references
Image references are stricter. Public image URLs are rejected for Seedance generation. If you want a reference image, first upload it through the asset helper routes and then use the returned asset://... URL in your generation payload.
1. Create an asset group
curl -X POST "https://inference-api-pre-d80ca3.worldrouter.ai/v1/asset-groups" \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "seedance-demo-group",
"description": "reference assets for a Seedance run"
}'Response:
{
"id": "group-1",
"name": "seedance-demo-group",
"description": "reference assets for a Seedance run",
"requestId": "req-456"
}2. Upload the reference image into that group
curl -X POST "https://inference-api-pre-d80ca3.worldrouter.ai/v1/asset-groups/group-1/assets" \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "reference-image",
"description": "main character reference",
"type": "image",
"url": "https://example.com/reference.png"
}'Response:
{
"id": "asset-1",
"asset_group_id": "group-1",
"name": "reference-image",
"description": "main character reference",
"type": "image",
"url": "asset://asset-1",
"source_url": "https://example.com/reference.png",
"requestId": "req-789"
}3. Use asset://... in the generation payload
Keep the public request model as seedance-2.0 or seedance-2.0-fast:
{
"model": "seedance-2.0",
"asset_group_id": "group-1",
"content": [
{
"type": "text",
"text": "The reference character walks down a sunlit city street with a cinematic look."
},
{
"type": "image_url",
"role": "reference_image",
"image_url": {
"url": "asset://asset-1"
}
}
],
"resolution": "720p",
"duration": 5
}After submitting the request, follow the same steps in Check task status to monitor the task and download the result.
If you send a public image URL like https://.../ref.png directly inside the
Seedance content array, WorldRouter returns 400 invalid_request with the
message telling you to upload assets first.
Notes and limits
- Seedance requires a team-scoped key with enough available credits. Low balance returns
402 seedance_balance_too_low. - Pending Seedance jobs per user are capped. Too many running tasks return
429 seedance_too_many_pending_tasks. - Task reads are owner-scoped. You can only poll tasks created by the same authorized owner context.
- Asset groups and uploaded assets are also owner-scoped.
- The public task status endpoint returns metadata and
content.video_url; there is no separate public/v1/videos/{id}/contentdownload route for Seedance.
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
400 unsupported_model | You sent the wrong model or hit the wrong endpoint | Use seedance-2.0 or seedance-2.0-fast on POST /api/v3/contents/generations/tasks. |
400 invalid_request with “upload assets first” | You passed a public image URL in content | Create an asset group, upload the image, then use the returned asset://... URL. |
402 seedance_balance_too_low | The scoped team does not have enough available credits | Recharge on Credits and retry. |
403 media_resource_access_denied | The task, asset group, or asset belongs to another owner context | Reuse the same account/team/API key that created the resource. |
429 seedance_too_many_pending_tasks | Too many of your Seedance tasks are still running | Wait for active tasks to finish before creating more. |
424 with an error body | The upstream video provider failed or timed out | Transient provider failure — retry after a short wait. The body keeps the upstream error and upstream_status. |
See also
- Quickstart: API key and base URL setup.
- Models: current model catalog and pricing.
- API reference: chat-completions docs for text models.