Seedance 2.0 Fast
Generate videos with Seedance 2.0 Fast using text, first and last frames, or multimodal references. This page covers the complete request-to-result workflow for this model.
API model ID: seedance-2-0-fast
Generation is asynchronous. Save the taskId returned when creating a task, then query its status or receive a webhook.
Capabilities
| Feature | Supported values |
|---|---|
| Output resolution | 480p · 720p |
| Output duration | 4–15 seconds |
| Aspect ratio | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive |
| Reference images | Up to 9 images |
| Reference videos | Up to 3 videos |
| Reference audio files | Up to 3 audio files |
| All references combined | Up to 12 reference files in total |
| Total duration per video/audio group | 15 seconds |
| seed | -1 to 4294967295 |
Pricing & credits
Video generation is charged in credits based on the billable duration in seconds. Without video input, the billable duration is the output duration; with video input, it also includes the reference video duration.
The table below lists the credits charged per second, not the total cost of a task. The rate depends on the model, output resolution, and whether reference videos are supplied in reference-to-video mode. See the formulas and examples below the table for the total cost calculation.
| Output resolution | Without video input | With video input |
|---|---|---|
480p | 5 credits/second | 3 credits/second |
720p | 10 credits/second | 6 credits/second |
- Without video input: output seconds × no-video rate.
- With video input: (output seconds + measured reference-video seconds) × with-video rate. The server measures the total reference-video duration and rounds it up to whole seconds before billing.
- Image or audio references alone use the no-video rate. The reference-video billing rate applies only in reference-to-video mode when video references are supplied.
Billing examples
5-second 720p text-to-video: 5 × 10 = 50 credits.
5-second 720p output with a 5-second reference video: (5 + 5) × 6 = 60 credits.
Credits are reserved on submission and charged on success. Failed or timed-out tasks enter the refund flow. A refund_failed billing status means the refund did not complete; check the API logs or contact support.
Authentication
Create an API key in the dashboard. The complete key is shown only once. Keep it on your server and send it as a Bearer token on every request.
Base URL
https://api.seevio.aiAuthorization: Bearer sk_live_your_api_key
Content-Type: application/jsonSet the SEEVIO_API_KEY environment variable before running these examples. JavaScript examples run on your server with Node.js; Python examples use the requests package.
Quickstart
Submit this minimal request, save the returned taskId, then use the task query example below. The credits value in the create response is the reserved amount.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-0-fast",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "text-to-video",
"aspect_ratio": "16:9",
"generate_audio": true
}
}'Create task response example
After the request above is accepted, the API returns this JSON response. taskId is the task identifier used for subsequent status queries; credits is the number of credits reserved for this task. This response confirms task creation, not that the video is ready. You need to poll the task status or use a Webhook to receive the video results.
{
"taskId": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"credits": 50
}Create a task
POST https://api.seevio.ai/v1/videos/generationsSend a JSON object containing model and input, plus an optional callback_url. Always specify the model ID shown on this page; omitting model selects seedance-2-0.
Request body
| Field | Type | Required | Description & constraints |
|---|---|---|---|
model | string | Yes | Model ID. To use Seedance 2.0 Fast, set this field to seedance-2-0-fast. |
callback_url | string | No | Public HTTPS endpoint for completion and failure POST callbacks. Private networks and localhost are not allowed. Example: https://example.com/webhooks/seevio |
input | object | Yes | Generation settings. Must contain a non-empty prompt. |
Input parameters
Provide image_urls, video_urls and audio_urls as arrays of URL strings (string[]). Every supplied URL must be publicly accessible over HTTPS, including media ignored by the selected mode.
| Field | Type | Required | Default | Description & constraints |
|---|---|---|---|---|
input.prompt | string | Yes | — | A prompt is required in every mode. It can contain at most 10,000 characters before trimming and cannot consist entirely of whitespace. Example: A cat surfing at sunset |
input.generation_type | string | No | text-to-video | text-to-video uses only the prompt; image-to-video uses 1–2 images; reference-to-video uses image, video and/or audio references. Supported values text-to-video | image-to-video | reference-to-video |
input.image_urls | string[] | Conditional | [] | image-to-video: 1 image for the first frame, or 2 ordered images for the first and last frames. reference-to-video: up to 9 images. Ignored in text-to-video. Example: ["https://example.com/first-frame.jpg"] |
input.video_urls | string[] | Conditional | [] | Only forwarded in reference-to-video; up to 3 videos and 15 seconds combined. Ignored in other modes. Example: ["https://example.com/source.mp4"] |
input.audio_urls | string[] | Conditional | [] | Only forwarded in reference-to-video; up to 3 audio files and 15 seconds combined. Ignored in other modes. Audio cannot be used as the only reference material for this model. When providing audio_urls, you must also provide at least one reference image in image_urls or one reference video in video_urls. Example: ["https://example.com/music.mp3"] |
input.duration | integer | No | 5 | Integer output duration from 4 to 15 seconds. Supported values 4–15Example: 5 |
input.aspect_ratio | string | No | adaptive | Output aspect ratio. adaptive lets the model determine the ratio. Supported values 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptiveExample: adaptive |
input.resolution | string | No | 720p | Use one of the supported output resolutions listed here. Supported values 480p | 720pExample: 720p |
input.generate_audio | boolean | No | true | Request synchronized audio generation. Supported values true | falseExample: true |
input.watermark | boolean | No | false | Request an AI watermark on the generated video. Supported values true | falseExample: false |
input.web_search | boolean | No | false | Allow web search when supported by the model. Supported values true | falseExample: false |
input.return_last_frame | boolean | No | false | Request the final frame. The query result contains data.last_frame_url when the frame is available; otherwise it is null. Supported values true | falseExample: true |
input.seed | integer | No | -1 | Integer from -1 to 4294967295. -1 chooses a random seed. Supported values -1 to 4294967295Example: 42 |
Boolean fields must be JSON true or false, not strings or numbers.
Create response
HTTP 200 returns taskId (string) and credits (number). This acknowledges task creation, not completion. The amount below corresponds to the 5-second 720p quickstart.
{
"taskId": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"credits": 50
}Generation modes & examples
Text to video
Generate from a text prompt. Media URLs are not forwarded in this mode.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-0-fast",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "text-to-video",
"aspect_ratio": "16:9",
"generate_audio": true
}
}'First frame
Provide one image as the first frame, then describe the motion in your prompt.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-0-fast",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "image-to-video",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "adaptive"
}
}'First and last frames
Provide two image URLs in order: first frame, then last frame. This example also requests the generated video's last frame.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-0-fast",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "image-to-video",
"image_urls": [
"https://example.com/first-frame.jpg",
"https://example.com/last-frame.jpg"
],
"aspect_ratio": "adaptive",
"return_last_frame": true
}
}'Multimodal reference
Combine image, video and audio references. The prompt remains required. Reference-video input changes the billing formula.
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-0-fast",
"input": {
"prompt": "Follow the reference camera movement and keep the character consistent. Use the audio for ambience.",
"duration": 5,
"resolution": "720p",
"generation_type": "reference-to-video",
"image_urls": [
"https://example.com/character.jpg"
],
"video_urls": [
"https://example.com/camera.mp4"
],
"audio_urls": [
"https://example.com/ambience.mp3"
],
"aspect_ratio": "adaptive"
}
}'Query a task
GET https://api.seevio.ai/v1/tasks/{taskId}Replace the example ID with the taskId returned by creation. Queries only return tasks owned by the API key's user; inaccessible or unknown IDs return HTTP 404.
Poll every 10–20 seconds as a starting point, back off on HTTP 429 and stop when the status is completed or failed. Prefer webhooks for production. Each code example below performs one query.
curl --fail-with-body https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer $SEEVIO_API_KEY"| Status | Description & constraints |
|---|---|
queued | Accepted and waiting for submission. |
generating | Generation is in progress. |
completed | Terminal success. Download data.results before expiry. |
failed | Terminal failure. Inspect failed_reason and billing_status. |
| Field | Type | Description & constraints |
|---|---|---|
id | string | Task identifier. This is taskId from the create response. |
created_at | number | Task creation time as Unix seconds. |
model | string | The public model ID used for this task. |
billing_status | string | reserved, charged, refunded or refund_failed. |
credits | number | Credits reserved for this task. This value is retained after a refund; inspect billing_status to determine the billing outcome. |
failed_reason | string | null | Failure reason on failed tasks; null otherwise. Failed query responses omit data. |
data | object | Present on non-failed task queries. Contains output and processing details. |
data.results | string[] | Video URL array. Empty until completion or after the video's expiry. |
data.video_expires_at | string | null | Video expiry as an ISO 8601 timestamp, or null before it is available. Save the result before this time. |
data.last_frame_url | string | null | Last-frame URL when requested and available, otherwise null. |
data.processing_time | number | null | Provider processing duration in seconds when available, otherwise null. |
Completed task: query response with video results
When the query returns status=completed, video generation has finished. Read the video URLs from data.results and download them before data.video_expires_at. billing_status=charged indicates that the reserved credits have been charged.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-0-fast",
"status": "completed",
"billing_status": "charged",
"credits": 50,
"failed_reason": null,
"data": {
"results": [
"https://cdn.seevio.ai/api/videos/example.mp4"
],
"video_expires_at": "2026-09-07T00:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Failed task: query response with failure and billing details
When the query returns status=failed, generation has ended unsuccessfully. Read failed_reason for the cause and billing_status for the refund outcome. In this example, refunded means the credits were returned. credits retains the original reserved amount, and the response does not include data.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-0-fast",
"status": "failed",
"billing_status": "refunded",
"credits": 50,
"failed_reason": "provider_failed"
}Webhooks
Set callback_url in the create request to receive a JSON POST when the task completes or fails. Return a 2xx response within 15 seconds. Failed deliveries are retried; process repeated deliveries idempotently by task ID.
Your callback endpoint must accept POST requests with a JSON request body (Content-Type: application/json).
Create a task with a callback
curl --fail-with-body https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer $SEEVIO_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance-2-0-fast",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"duration": 5,
"resolution": "720p",
"generation_type": "text-to-video",
"aspect_ratio": "16:9",
"generate_audio": true
},
"callback_url": "https://example.com/webhooks/seevio"
}'Webhook payloads differ from task query responses: they omit billing_status and credits; failure details are inside data.failed_reason and data.credits_refunded. Webhook created_at is the event creation time in Unix seconds.
Task completed: successful callback payload
When generation succeeds, the callback contains status=completed. Use id to identify the task and data.results to retrieve the video URLs. Download and save the results before data.video_expires_at.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-0-fast",
"status": "completed",
"data": {
"results": [
"https://cdn.seevio.ai/api/videos/example.mp4"
],
"video_expires_at": "2026-09-07T00:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Task failed: failure callback payload
When generation fails, the callback contains status=failed. Use id to identify the task, data.failed_reason for the failure reason and data.credits_refunded for the number of credits refunded.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-0-fast",
"status": "failed",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 50
}
}Receiver example
export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrls = callbackData.data.results;
// Save the video URLs and mark this task as completed in your application.
console.log(callbackData.id, videoUrls);
}
if (callbackData.status === "failed") {
const { failed_reason, credits_refunded } = callbackData.data;
// Record the failure reason and refunded credits for this task.
console.error(callbackData.id, failed_reason, credits_refunded);
}
return new Response(null, { status: 200 });
}This Next.js example reads the JSON callback body and handles completed and failed tasks directly. Add persistence and task-ID deduplication for your application; queue slow work before acknowledging the callback.
Media requirements & limitations
- All media and callback URLs must be public HTTPS URLs. Avoid localhost, private IPs and files that require cookies or login. Reference video/audio URLs must resolve to directly readable media.
- In reference-to-video, provide at least one reference, with no more than 9 images, 3 videos, 3 audio files and 12 materials combined. Total video duration and total audio duration must each be at most 15 seconds.
- text-to-video ignores all media references. image-to-video forwards only the first/last-frame images and ignores video and audio references. Use reference-to-video to combine media.
- For Seedance 2.0 models, use audio with at least one image or video for model compatibility. Audio-only examples are provided on the Seedance 2.5 page.
- Fast and Mini support 480p and 720p. Do not rely on higher resolution strings being accepted at request validation: they are not supported output tiers for this model.
Image requirements
- Each image must be smaller than 30 MB.
- Supported formats: jpeg, png, webp, bmp, tiff, gif.
- Aspect ratio (width ÷ height): 0.4 to 2.5, inclusive.
- Width and height must each be between 300 and 6,000 pixels, inclusive.
Video requirements
- Supported formats: mp4, mov.
- Each video must not exceed 100 MB.
- Frame rate: 24 to 60 FPS, inclusive.
- Aspect ratio (width ÷ height): 0.4 to 2.5, inclusive.
- Total pixels (width × height): 407,696 to 8,295,044, inclusive. For example, 614 × 664 = 407,696 and 3,326 × 2,494 = 8,295,044. These are examples of pixel counts, not fixed width and height requirements.
Audio requirements
- Supported formats: wav, mp3.
- Each audio file must not exceed 15 MB.
Errors
HTTP errors have an error object with code and message. A successfully accepted task can still fail later; query the task or handle its failure callback.
{
"error": {
"code": "invalid_request",
"message": "input.prompt is required."
}
}| HTTP | Field | What to do |
|---|---|---|
| 400 | invalid_request | Fix the JSON, missing prompt, parameter range or media URL before retrying. |
| 401 | invalid_api_key | Check the Bearer token and whether the API key is active. |
| 402 | insufficient_credits | Add credits or reduce the task cost. The response may include required and available amounts. |
| 403 | forbidden | Check the account-level restriction described in the error message. |
| 404 | not_found | Check the task ID and that the key belongs to the task's user. |
| 429 | rate_limited | Wait for the Retry-After interval before retrying. |
| 500 | internal_error | Inspect the error message and API logs. Retry cautiously; resubmitting a create request can create another billable task. |
Rate limits
Create tasks: each API key allows up to 100 requests per minute by default. Custom rate limits are not currently available.
Query tasks: each API key allows up to 120 requests per minute by default. Query requests and task creation requests are counted separately.