Seedance 2.0 Mini
Seedance 2.0 Mini API reference: video generation, frames and references, request examples, task polling, downloads and pricing.
Seedance 2.0 Mini supports text, first and last frames, and image, video and audio references, with output at 480p, 720p. Generate up to 15 seconds per request. Model details and Playground.
Connect to Wan API
Use https://api.wanapi.app as the API base URL. Create a key with the Seedance model family in API key settings and send it as Authorization: Bearer YOUR_API_KEY. Keep keys on your server. Playground uses your website session and charges the same account balance; it does not require pasting a key into the browser.
Access requires an enabled account with sufficient balance. GET /v1/models lists the models available to your key. Seedance models use POST /v1/videos; select the model in the JSON body.
| Setting | Seedance 2.0 Mini |
|---|---|
| Model ID | bytedance/seedance-2.0-mini |
resolution | 480p, 720p; default: 720p. |
duration | 4–15 output seconds, or -1 for automatic; default: 5. |
aspectRatio | adaptive, 16:9, 4:3, 1:1, 3:4, 9:16, 21:9; default: adaptive. |
generateAudio | true by default. false does not reduce the token rate. |
| Output | One video per request, at 24 fps. |
The request fields describe all 13 top-level fields. Use the field names shown here, including aspectRatio and generateAudio.
Submit a Seedance 2.0 Mini task
This is a four-second text-to-video request at 720p. Set WAN_API_KEY to your Seedance key on the server. Submit once and save the returned id.
curl https://api.wanapi.app/v1/videos \
-H "Authorization: Bearer $WAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2.0-mini",
"prompt": "A paper boat floats through a sunlit stream. Slow tracking shot.",
"resolution": "720p",
"aspectRatio": "16:9",
"duration": 4,
"generateAudio": true
}'Query a Seedance 2.0 Mini task
Save the returned id as TASK_ID, then query with the same key. Submission returns a task receipt; the video is available after completion. Begin polling every five seconds; see task statuses and downloads.
curl "https://api.wanapi.app/v1/videos/$TASK_ID" \
-H "Authorization: Bearer $WAN_API_KEY"Seedance 2.0 Mini pricing
Rates are in USD per one million video tokens. Input and output video tokens determine the final cost. Resolution, duration and reference video inputs affect usage; use the matching rate for requests with or without reference video. Audio has no separate price tier.
| Resolution | Reference video | Official price | Wan API price | You save |
|---|---|---|---|---|
| 480p | No video | $0.0352 | Unavailable | — |
| 480p | With video | $0.0211 | Unavailable | — |
| 720p | No video | $0.0756 | Unavailable | — |
| 720p | With video | $0.0454 | Unavailable | — |
Estimates use 16:9 output at 24 fps. Other aspect ratios and actual output dimensions can change the cost.
Without reference video, only output seconds count. With reference video, input and output seconds count; billable input time is at least two-thirds of the output duration, rounded up to a whole second.
Official comparison: BytePlus international on-demand pricing. Checked 2026-10-15. Wan API prices refresh automatically.
Input and output video tokens determine the final cost. Failed requests are not charged.
View Seedance 2.0 Mini pricing and estimates. Review the estimate in the Playground before submitting.
Request fields
Send a JSON object. model is required, together with a non-empty prompt or at least one media input. Other fields are optional. Unknown fields are rejected.
| Field | Type | Contract |
|---|---|---|
model | string | Required: bytedance/seedance-2.0-mini. |
prompt | string | Text instructions; up to 20,000 characters on this service. A prompt or media input is required. |
image | URL or URL object | First-frame image URL, or an object with type: "url", url and optional mediaType. Use image or frameImages, not both. |
frameImages | array | One first_frame and an optional last_frame. Each entry has frameType and image; see the frame example below. |
inputReferences | array | Up to 9 images and 3 videos. Each entry has type: "url", url and mediaType. The data/mediaType URL form is also accepted. |
aspectRatio | string | adaptive (default), 16:9, 4:3, 1:1, 3:4, 9:16, 21:9. |
resolution | string | 480p, 720p. Default: 720p. Also accepts 854x480, 1280x720 as resolution tiers; use aspectRatio to select the shape. |
duration | integer | 4–15 output seconds, or -1 for automatic. Default: 5. |
fps | integer | Fixed at 24; omit or send 24. |
seed | integer | Optional; -1 to 2147483647. No repeatability guarantee. Do not also specify providerOptions.bytedance.seed. |
generateAudio | boolean | Generate audio. Default: true; disabling it does not change the token rate. |
n | integer | Fixed at 1; one video per request. |
providerOptions | object | Optional bytedance object: referenceAudio (up to 3 HTTP(S) URLs), seed (same bounds as top-level seed). draft: true is not supported. Unknown options are rejected. |
Input combinations and media limits
-
Use
imagefor a first frame, orframeImagesfor a first frame and optional last frame. A last frame alone and duplicate frame types are rejected. -
Frames cannot be combined with
inputReferencesorproviderOptions.bytedance.referenceAudio. -
Reference mode accepts up to 9 images, 3 videos and 3 audio clips, with at most 15 references in total.
-
Media inputs must be public HTTP(S) URLs. Upload bytes and credential-bearing URLs are not accepted.
-
Images: JPEG, PNG, WebP, BMP, TIFF or GIF; below 30 MB; each side 300–6000 pixels; aspect ratio 0.4–2.5.
-
Videos: MP4 or MOV; at most 50 MB per file; each clip 2–15 seconds and at most 15 seconds combined; 300–6000 pixels per side, aspect ratio 0.4–2.5, 24–60 fps.
-
Audio: MP3 or WAV; at most 15 MB per file; each clip 2–15 seconds and at most 15 seconds combined. At least one reference image or video is required.
-
Remote media size, encoding and duration are checked during processing; URL validation alone cannot guarantee that a file is usable.
-
Draft-to-final rendering from an earlier task and arbitrary native task options are not exposed by this endpoint.
Frame and reference examples
Send these bodies to the same POST /v1/videos endpoint. Replace every example.com URL with your own directly accessible media URL before submitting. Keep input URLs available until the task finishes.
First and last frames
For a single first frame, use image: "https://example.com/first-frame.jpg" and omit frameImages. To set both endpoints of the clip, use:
{
"model": "bytedance/seedance-2.0-mini",
"prompt": "The camera slowly moves from the opening scene to the closing scene.",
"frameImages": [
{
"frameType": "first_frame",
"image": "https://example.com/first-frame.jpg"
},
{
"frameType": "last_frame",
"image": "https://example.com/last-frame.jpg"
}
],
"aspectRatio": "adaptive",
"resolution": "720p",
"duration": 4
}Image, video and audio references
Put image and video inputs in inputReferences, with an explicit MIME type. Put audio URLs in providerOptions.bytedance.referenceAudio. Do not add frame inputs to this request.
{
"model": "bytedance/seedance-2.0-mini",
"prompt": "Use the character from the image and the camera movement from the video.",
"inputReferences": [
{
"type": "url",
"url": "https://example.com/character.jpg",
"mediaType": "image/jpeg"
},
{
"type": "url",
"url": "https://example.com/motion.mp4",
"mediaType": "video/mp4"
}
],
"providerOptions": {
"bytedance": {
"referenceAudio": [
"https://example.com/sound.wav"
]
}
},
"resolution": "720p",
"duration": 4
}Poll and download the video
An accepted task returns an object like this. Example IDs and timestamps are illustrative:
{
"id": "task_EXAMPLE",
"object": "video",
"model": "bytedance/seedance-2.0-mini",
"status": "queued",
"progress": 0,
"created_at": 1792022400
}Poll GET /v1/videos/{task_id} with your API key. The query returns the same public task ID and model. Use status to decide when to stop polling; progress is not an estimate of remaining time.
| Status | Meaning | Next step |
|---|---|---|
queued | The task has been accepted. | Continue polling. |
in_progress | Generation is running. | Continue polling. |
completed | The video is ready. | Read videos[0].url and download. |
failed | Generation failed. | Stop polling and inspect error. |
A completed query includes videos, an array of objects containing url and mediaType. Timestamps use Unix seconds; completed_at appears when completion is recorded.
{
"id": "task_EXAMPLE",
"object": "video",
"model": "bytedance/seedance-2.0-mini",
"status": "completed",
"progress": 100,
"created_at": 1792022400,
"completed_at": 1792022460,
"videos": [
{
"url": "/v1/tasks/task_EXAMPLE/artifacts/video/content",
"mediaType": "video/mp4"
}
]
}When the returned URL is a relative path, resolve it against https://api.wanapi.app and authenticate with your API key. For the example above:
curl "https://api.wanapi.app/v1/tasks/$TASK_ID/artifacts/video/content" \
-H "Authorization: Bearer $WAN_API_KEY" \
-o video.mp4If a signed HTTPS media URL is returned, use it directly without forwarding your API key to that host. Result URLs can expire. Save videos you want to keep to your own storage. Polling and downloading an existing result do not create another generation.
A failed task includes an error object with code and message, for example:
{
"id": "task_EXAMPLE",
"object": "video",
"model": "bytedance/seedance-2.0-mini",
"status": "failed",
"error": {
"code": "generation_failed",
"message": "Video generation failed"
}
}Billing and failure handling
The final charge follows actual video token usage and the current model rate. The Playground estimate is a maximum estimate, not a fixed quote. Longer clips and larger output resolutions can increase token usage. Failed requests are not charged.
- Invalid parameters: correct the fields or input combination before submitting again. Check media formats and limits as well as URL syntax.
- Authentication or model access: use a valid Seedance key enabled for the requested model.
- Insufficient balance: add funds before a new paid request. A key limit does not add account credit.
- Temporary polling failure: retry the GET with backoff and a maximum waiting period. A failed query does not mean the generation failed.
- Submission timeout or missing task ID: the outcome may be unknown. Do not automatically repeat the POST; it could create a second paid task.
- Download failure: retry the existing result before starting a new generation.
Keep the task ID and contact support if an uncertain submission needs investigation.