Seedance 2.5
Generate videos with Seedance 2.5 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-5
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 · 1080p |
| Output duration | 4–30 seconds |
| Aspect ratio | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive |
| Reference images | Up to 30 images |
| Reference videos | Up to 10 videos |
| Reference audio files | Up to 10 audio files |
| All references combined | Up to 50 reference files in total |
| Total duration per video/audio group | 30 seconds |
| seed | Not supported |
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 | 10 credits/second | 6 credits/second |
720p | 20 credits/second | 12 credits/second |
1080p | 30 credits/second | 20 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 × 20 = 100 credits.
5-second 720p output with a 5-second reference video: (5 + 5) × 12 = 120 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.
How credits are charged when duration=-1
When duration is set to -1, the final output duration is not fixed; the model determines it.
In most cases, set duration to the video length you actually need instead of -1. We recommend using -1 only for video editing, not for other video generation scenarios.
| Reference inputs | How the charge is calculated | Example |
|---|---|---|
| With reference videos | Add up the durations of all reference videos and round the total up to the next whole second, calling it T. The charge is (T + T) × the with-video rate: one T represents the estimated output duration, and the other represents the input video duration. | 720p with a 5-second reference video: (5 + 5) × 12 = 120 credits. |
| Without reference videos (images or audio only) | Use 30 seconds as the estimated output duration. The charge is 30 × the without-video rate. | 720p without reference videos: 30 × 20 = 600 credits. |
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-5",
"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": 100
}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.5, set this field to seedance-2-5. |
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.draft | boolean | No | false | Create a 480p Draft preview. Seedance 2.5 only. Mutually exclusive with draft_task_id. Supported values true | false |
input.draft_task_id | string | No | — | Create a 1080p final from an owned, completed API Draft created less than 7 days ago. Supply the taskId returned by this API and omit inherited generation fields. Example: 3f2aK9mR7xQp4TnZ8bLc6YwH |
input.output_format | string | No | mp4 | Video output container. Supports mp4 and mov, including Draft and final requests. Supported values mp4 | mov |
input.prompt | string | Conditional | — | Required for ordinary generation and for creating a Draft. Do not send it when generating a final with draft_task_id; the Draft’s prompt is inherited. 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 30 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 10 videos and 30 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 10 audio files and 30 seconds combined. Ignored in other modes. Example: ["https://example.com/music.mp3"] |
input.duration | integer | No | 5 | Output duration: 4–30 seconds, default 5. duration=-1 is accepted for Drafts and reference-to-video. For a final, omit duration; it is inherited from the Draft. Supported values -1 | 4–30Example: 5 |
input.aspect_ratio | string | No | adaptive | Output aspect ratio. adaptive lets the model determine the ratio. image-to-video only accepts adaptive; omit this field or set it to adaptive. Supported values 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptiveExample: adaptive |
input.resolution | string | No | 720p | Ordinary generation defaults to 720p. Drafts only support 480p (the Draft default). Finals only support 1080p (the final default). Supported values 480p | 720p | 1080pExample: 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 |
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": 100
}Draft preview → 1080p final
Seedance 2.5 supports a two-step workflow: generate a 480p Draft to check the visuals and motion, then reuse it to create a 1080p final. Both steps use POST /v1/videos/generations and create separate, billable tasks.
Draft mode can reduce the cost of trying different ideas. Instead of generating every attempt at 1080p, create several lower-cost 480p Drafts, choose the one you like best, then use that Draft to generate a 1080p final. This lets you explore different results at a lower cost before paying for the selected version in high definition.
1. Generate a 480p Draft
Set input.draft=true and provide the usual prompt, references and generation settings. Resolution defaults to 480p in Draft mode; other resolutions are rejected. You can enable return_last_frame for the Draft, as shown below.
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-5",
"input": {
"prompt": "A cat surfing at sunset, cinematic lighting",
"draft": true,
"duration": 5,
"resolution": "480p",
"return_last_frame": true
}
}'{
"taskId": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"credits": 50
}2. Wait for the Draft to complete
Save taskId from the create response and query GET /v1/tasks/TASK_ID until status is completed. The query response has is_draft=true; preview the video in data.results. When available, the requested last frame is in data.last_frame_url.
You can also receive a Webhook when the Draft finishes. Set callback_url at the top level of the Draft creation request. Once the Draft completes, a notification is sent to that URL, and your service can handle the callback to save the result, update the task status, or trigger your own follow-up processing. See the Webhooks section on this page for the callback format.
curl --fail-with-body https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer $SEEVIO_API_KEY"{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652800,
"model": "seedance-2-5",
"is_draft": true,
"draft_task_id": null,
"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": "https://cdn.seevio.ai/api/images/draft-last-frame.jpg",
"processing_time": 48
}
}3. Generate a 1080p final
Replace draft_task_id in this example with your completed Draft’s taskId. The final inherits the Draft’s content and duration. Resolution defaults to 1080p and no other resolution is accepted. output_format, watermark and return_last_frame can be set independently for each final; callback_url remains at the request’s top level.
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-5",
"input": {
"draft_task_id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"resolution": "1080p",
"output_format": "mp4",
"watermark": false,
"return_last_frame": true
}
}'The response contains a new taskId for the final. Poll that new ID or wait for its webhook. The final’s query response has is_draft=false and draft_task_id equal to the original Draft’s API task ID. The original Draft remains available. Each accepted final request creates a new, separately billed task.
{
"taskId": "final_7mQx2pN8kR4vT9cL6bW3",
"credits": 150
}Draft and final billing
Drafts use the 480p rates above, including reference-video input when applicable. Finals use the 1080p output-only rate of 30 credits/second; reference-video input is not charged again. For example, a 5-second Draft without reference video costs 50 credits, and a 5-second final costs an additional 150 credits.
For duration=-1, a Draft and its final each reserve credits for up to 30 seconds of output, plus reference-video input for the Draft only. On completion, the charge is adjusted to the actual output duration when it can be determined, and unused reserved credits are returned. A final reserves up to 900 credits.
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-5",
"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-5",
"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-5",
"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-5",
"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"
}
}'Audio reference
Use audio as the only reference type, with a required text prompt describing the desired video.
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-5",
"input": {
"prompt": "Create a coastal sunrise scene matching the rhythm of this audio.",
"duration": 5,
"resolution": "720p",
"generation_type": "reference-to-video",
"audio_urls": [
"https://example.com/music.mp3"
]
}
}'Video editing
Describe the edit and provide the source video. Set duration=-1 and use adaptive aspect ratio. Use a source clip of at least 4 seconds for this workflow. The billing rule for duration=-1 is shown above.
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-5",
"input": {
"prompt": "Edit the source video: change the character’s coat to blue and preserve the camera movement.",
"duration": -1,
"resolution": "720p",
"generation_type": "reference-to-video",
"video_urls": [
"https://example.com/source.mp4"
],
"aspect_ratio": "adaptive"
}
}'Video extension
Describe how the source video should continue. Use adaptive aspect ratio and set a normal output duration within the model's range.
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-5",
"input": {
"prompt": "Continue the camera movement from the source video, revealing a forest clearing.",
"duration": 8,
"resolution": "720p",
"generation_type": "reference-to-video",
"video_urls": [
"https://example.com/source.mp4"
],
"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. |
is_draft | boolean | True for a 480p Draft; false for a final or ordinary video. |
draft_task_id | string | null | The source Draft’s API task ID for a final; null for Drafts and ordinary videos. |
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-5",
"is_draft": false,
"draft_task_id": null,
"status": "completed",
"billing_status": "charged",
"credits": 100,
"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-5",
"is_draft": false,
"draft_task_id": null,
"status": "failed",
"billing_status": "refunded",
"credits": 100,
"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-5",
"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"
}'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.
created_at is the event creation time; task_created_at is the task creation time in Unix seconds. Examples show the recommended fields; responses may contain additional fields.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652848,
"model": "seedance-2-5",
"status": "completed",
"task_created_at": 1788652800,
"billing_status": "charged",
"credits": 100,
"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
}
}Task failed: failure callback payload
When generation fails, the callback contains status=failed. Use id to identify the task, failed_reason for the failure reason and credits_refunded for the number of credits refunded.
{
"id": "3f2aK9mR7xQp4TnZ8bLc6YwH",
"created_at": 1788652848,
"model": "seedance-2-5",
"status": "failed",
"task_created_at": 1788652800,
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed",
"credits_refunded": 100
}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;
// 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 30 images, 10 videos, 10 audio files and 50 materials combined. Total video duration and total audio duration must each be at most 30 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.
- Each reference video and audio file must be 2–30 seconds. For video editing examples, use source clips of at least 4 seconds.
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.