Pixazo APIModelsSeedance 2
Pixazo APIModelsSeedance 2

Seedance 2.0 Mini API, Seedance 2.0 API, 1.0 Pro & Lite API: Pricing, Documentation

by BytePlus

Seedance 2.0 Mini API by ByteDance offers professional AI video generation with Lite and Pro variants optimized for different quality and speed requirements. Through Pixazo's API, developers can generate videos from images and text with ByteDance's advanced motion synthesis technology. The API includes specialized features like OmniHuman for realistic human animation, making it ideal for social content and marketing videos.

Get API Key
Seedance AI API
View in Playground

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

No strings attached — add funds and get $5 bonus instantly

Claim Your $5 →

Seedance 2.0 Mini API Documentation

Seedance 2.0 Mini is the most affordable version of Seedance 2.0 — the cheapest way to create a video (480p and 720p).

What this does: Describe a scene in plain words and get a short video of it.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-mini/text-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Text to Video - Seedance 2.0 Mini API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-mini/text-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [{"type": "text", "text": "A cat walking on the beach"}]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-mini/text-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [{"type": "text", "text": "A cat walking on the beach"}]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-mini/text-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [{ type: 'text', text: 'A cat walking on the beach' }]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-mini/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [{"type": "text", "text": "A cat walking on the beach"}]
  }'

Output

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Request Parameters - Seedance 2.0 Mini text-to-video

Parameter Required Type Default Allowed values / range Description
contentYesarray1+ text itemInput content array. Pass a single text item: {"type":"text","text":"…"}.
content[].typeYesstring"text"Content item type.
content[].textYesstringRecommended: under 1000 wordsPrompt describing the desired video. English, Japanese, Indonesian, Spanish, and Portuguese prompts are supported.
toolsNoarray[{"type":"web_search"}]Optional enhancement — text-to-video only.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p"Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available.
durationNointeger54–15, or -1 (auto)Output video length in seconds. Set -1 to let the model pick the best length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types

TypeFormatDescription
text{"type":"text","text":"..."}The generation prompt (required). May include in-prompt directives below.

In-Prompt Directives (optional)

Seedance 2.0 Mini also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "A cinematic shot of a cat on a tropical beach at golden hour --resolution 720p --seed 42 --framepersecond 24 --camerafixed false"}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 15,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-mini' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Mini API Pricing — Per-Second Rates

Seedance 2.0 is the production model. Mini is the cheapest tier; Fast trades quality for speed. 1.0 Pro / 1.0 Lite are legacy variants.

ResolutionPrice (USD)
480p$0.0355/sec
720p$0.0799/sec
Image to video

Seedance 2.0 Mini API Documentation

Seedance 2.0 Mini is the most affordable version of Seedance 2.0 — the cheapest way to create a video (480p and 720p).

What this does: Give a starting image (and optionally an ending image), and it creates a video that animates between them.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-mini/first-last-frame-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Image to Video (First & Last Frames) - Seedance 2.0 Mini API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-mini/first-last-frame-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-mini/first-last-frame-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-mini/first-last-frame-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png' } },
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-mini/first-last-frame-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type":"image_url","image_url":{"url":"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
      {"type":"image_url","image_url":{"url":"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 Mini image-to-video (first & last frames)

Parameter Required Type Default Allowed values / range Description
contentYesarray1 or 2 image_url; optional textFirst-frame (1 image) or first+last-frame (2 images) mode.
content[].typeYesstring"text", "image_url"Content item type.
content[].textNostringRecommended: under 1000 wordsOptional motion guidance prompt.
content[].image_url.urlYesstringURL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; under 30 MB; 300–6000 px per sideFrame image.
content[].roleRequired when 2 imagesstring"first_frame" (single image)"first_frame", "last_frame"Frame position. Optional for a single image (treated as first_frame); in two-frame mode both images need a role — first_frame on the first, last_frame on the second.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p"Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available.
durationNointeger54–15, or -1 (auto)Output video length in seconds. Set -1 to let the model pick the best length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types

TypeMaxFormat / SizeDescription
image_url2JPG, PNG, WEBP · < 30 MB each1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}}
text1Optional motion/style prompt. {"type":"text","text":"..."}

In-Prompt Directives (optional)

Seedance 2.0 Mini also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Content Item Types

Type Format Description
text{"type":"text","text":"..."}Optional. Text prompt describing motion / scene transition. Maximum 1 text item.
image_url (1st){"type":"image_url","image_url":{"url":"https://..."}}Required. First image_url in array order. Worker auto-injects role first_frame.
image_url (2nd){"type":"image_url","image_url":{"url":"https://..."}}Required. Second image_url in array order. Worker auto-injects role last_frame.
video_urlNot accepted on this route (rejected with 400).
audio_urlNot accepted on this route (rejected with 400).

Image Constraints (per image_url item)

Constraint Value
FormatThe URL of the starting frame image to animate. Supported formats: JPEG, PNG, WebP. Max 30 MB.

Example Request

{
  "content": [
    {"type": "text", "text": "Time-lapse from winter to spring; snow melts, leaves green, flowers bloom; cinematic motion."},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "ratio": "adaptive",
  "duration": 5,
  "resolution": "720p",
  "generate_audio": true,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-mini' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Mini API Pricing — Per-Second Rates

ResolutionPrice (USD)
480p$0.0394/sec
720p$0.0885/sec
Reference to Video (Ref Image / Video / Audio)

Seedance 2.0 Mini API Documentation

Seedance 2.0 Mini is the most affordable version of Seedance 2.0 — the cheapest way to create a video (480p and 720p).

What this does: Give it photos (and/or short clips) of people or things, and it creates a video featuring them.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-mini/reference-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Reference to Video - Seedance 2.0 Mini API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-mini/reference-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-mini/reference-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-mini/reference-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-mini/reference-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 Mini reference-to-video

Parameter Required Type Default Allowed values / range Description
contentYesarrayoptional text + at least one image_url or video_url (audio_url cannot be the only reference); ordered text → images → videos → audioMultimodal reference input.
content[].typeYesstring"text", "image_url", "video_url", "audio_url"Content item type.
content[].textNostringRecommended: under 1000 words; may include @image1 / @video1 / @audio1 refsPrompt with optional reference handles.
content[].image_url.urlConditionalstringURL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; under 30 MB eachImage reference (up to 9).
content[].video_url.urlConditionalstringURL or asset://<ID>; mp4/mov; max 200 MB each; 2–15 s each, 15 s combinedVideo reference (up to 3).
content[].audio_url.urlConditionalstringURL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB each; 2–15 s each, 15 s combinedAudio reference (up to 3).
content[].roleRequired on refsstring"reference_image", "reference_video", "reference_audio"Asset role designation.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p"Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available.
durationNointeger54–15, or -1 (auto)Output video length in seconds. Set -1 to let the model pick the best length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types & Limits

TypeMax countFormat / SizeDescription
image_urlup to 9JPG, PNG, WEBP · < 30 MB eachReference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}}
video_urlup to 3MP4 · < 50 MB each · ≤ 15s combinedReference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}}
audio_urlup to 3MP3, WAV · ≤ 15s combined · < 15 MBReference audio for audio-driven generation & lip-sync. Requires at least one image or video reference. {"type":"audio_url","audio_url":{"url":"https://..."}}
text1Prompt. Address references by their 1-indexed array order — [Image1], [Video1], [Audio1] (plain "Image 1" also works).

The rule of 12: total references across all types may not exceed 12 (e.g. 9 images + 3 videos = 12, leaving no room for audio). Per-type caps (9 / 3 / 3) always apply within that budget.

In-Prompt Directives (optional)

Seedance 2.0 Mini also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Use Image 1 as the opening frame and Image 2 as the closing frame. Smooth cinematic transition between them with gentle camera motion. --resolution 720p"},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 11,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-mini' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Mini API Pricing — Per-Second Rates

ResolutionPrice (USD)
480p$0.0478/sec
720p$0.1074/sec
Video to Video (Video Editing)

Seedance 2.0 Mini API Documentation

Seedance 2.0 Mini is the most affordable version of Seedance 2.0 — the cheapest way to create a video (480p and 720p).

What this does: Upload a video plus a text instruction, and it changes the video to match your request.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-mini/edit-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Edit Video - Seedance 2.0 Mini API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-mini/edit-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "text", "text": "Make truck Orange"},
    {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-mini/edit-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "text", "text": "Make truck Orange"},
        {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-mini/edit-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'text', text: 'Make truck Orange' },
    { type: 'video_url', video_url: { url: 'https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-mini/edit-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type": "text", "text": "Make truck Orange"},
      {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 Mini edit-video

Parameter Required Type Default Allowed values / range Description
contentYesarray1 text + 1 image_url + 1 video_urlEdit instruction + reference object image + video to edit.
content[].typeYesstring"text", "image_url", "video_url"Content item type.
content[].textYesstringRecommended: under 1000 words; may use @image1 / @video1Edit instruction with reference handles.
content[].image_url.urlYesstringURL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; under 30 MBReference object image.
content[].video_url.urlYesstringURL or asset://<ID>; mp4/mov; max 200 MB; 2–15 sThe video to be edited.
content[].roleYesstring"reference_image", "reference_video"Asset role.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p"Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available.
durationNointeger54–15, or -1 (auto)Output video length in seconds. Set -1 to let the model pick the best length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types

TypeMaxFormat / SizeDescription
video_url1MP4 · < 50 MBSource video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}}
text1Edit instructions. {"type":"text","text":"..."}
image_url1JPG, PNG, WEBP · < 30 MBOptional style / reference image. {"type":"image_url","image_url":{"url":"https://..."}}

In-Prompt Directives (optional)

Seedance 2.0 Mini also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Restyle the source video using Image 1 color palette, framing Image 2 as the final beat. --resolution 720p"},
    {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 11,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-mini' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-mini",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-mini_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-mini",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-mini_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Mini API Pricing — Per-Second Rates

ResolutionPrice (USD)
480p$0.0478/sec
720p$0.1074/sec
2. Seedance 2.0

Seedance 2.0 API Documentation

Seedance 2.0 is a high-quality AI video generator. This is the standard model — best quality, with output up to 4K.

What this does: Describe a scene in plain words and get a short video of it.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0/v1/text-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Text to Video - Seedance 2.0 API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0/v1/text-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [{"type": "text", "text": "A cat walking on the beach"}]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0/v1/text-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [{"type": "text", "text": "A cat walking on the beach"}]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0/v1/text-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [{ type: 'text', text: 'A cat walking on the beach' }]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [{"type": "text", "text": "A cat walking on the beach"}]
  }'

Output

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Request Parameters - Seedance 2.0 text-to-video

Parameter Required Type Default Allowed values / range Description
contentYesarray1 text itemInput content array. Pass a single text item: {"type":"text","text":"…"}.
content[].typeYesstring"text"Content item type.
content[].textYesstringRecommended: under 1000 wordsPrompt describing the desired video. English, Japanese, Indonesian, Spanish and Portuguese are supported.
toolsNoarray[{"type":"web_search"}]Optional enhancement — text-to-video only.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p", "1080p", "4k"Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC).
durationNointeger54–15, or -1 (model auto-selects)Output video length in seconds. Use -1 to let the model pick a suitable length.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd an "AI Generated" watermark to the bottom-right corner of the output video.
return_last_frameNobooleanfalsetrue, falseAlso return the last frame of the generated video as a PNG (same dimensions as the video, no watermark) in the status result — useful for chaining consecutive clips.
execution_expires_afterNointeger1728003600–259200Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired.
priorityNointeger00–9Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted.
safety_identifierNostringstring, max 64 charactersStable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage.

Content Item Types

TypeFormatDescription
text{"type":"text","text":"..."}The generation prompt (required). May include in-prompt directives below.

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 1080pOutput resolution (480p / 720p / 1080p / 4k).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "A cinematic shot of a cat on a tropical beach at golden hour --resolution 1080p --seed 42 --framepersecond 24 --camerafixed false"}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 15,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 API Pricing — Per-Second Rates

Seedance 2.0 is the production model. Mini is the cheapest tier; Fast trades quality for speed. 1.0 Pro / 1.0 Lite are legacy variants.

ResolutionPrice (USD)
480p$0.0711/sec
720p$0.1597/sec
1080p$0.3592/sec
4k$1.4368/sec
Image to video

Seedance 2.0 API Documentation

Seedance 2.0 is a high-quality AI video generator. This is the standard model — best quality, with output up to 4K.

What this does: Give a starting image (and optionally an ending image), and it creates a video that animates between them.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0/v1/first-last-frame-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Image to Video (First & Last Frames) - Seedance 2.0 API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0/v1/first-last-frame-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0/v1/first-last-frame-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0/v1/first-last-frame-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png' } },
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0/v1/first-last-frame-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type":"image_url","image_url":{"url":"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
      {"type":"image_url","image_url":{"url":"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 image-to-video (first & last frames)

Parameter Required Type Default Allowed values / range Description
contentYesarray1 or 2 image_url; optional textFirst-frame (1 image) or first+last-frame (2 images) mode.
content[].typeYesstring"text", "image_url"Content item type.
content[].textNostringRecommended: under 1000 wordsOptional motion guidance prompt.
content[].image_url.urlYesstringURL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per sideFrame image.
content[].roleRequired when 2 imagesstring"first_frame" (single image)"first_frame", "last_frame"Frame position. Required on the 2nd image in two-frame mode. If the two frames have different aspect ratios, the first frame takes precedence and the last frame is center-cropped.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p", "1080p", "4k"Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC).
durationNointeger54–15, or -1 (model auto-selects)Output video length in seconds. Use -1 to let the model pick a suitable length.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd an "AI Generated" watermark to the bottom-right corner of the output video.
return_last_frameNobooleanfalsetrue, falseAlso return the last frame of the generated video as a PNG (same dimensions as the video, no watermark) in the status result — useful for chaining consecutive clips.
execution_expires_afterNointeger1728003600–259200Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired.
priorityNointeger00–9Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted.
safety_identifierNostringstring, max 64 charactersStable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage.

Content Item Types

TypeMaxFormat / SizeDescription
image_url2JPG, PNG, WEBP · < 30 MB each1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}}
text1Optional motion/style prompt. {"type":"text","text":"..."}

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 1080pOutput resolution (480p / 720p / 1080p / 4k).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Content Item Types

Type Format Description
text{"type":"text","text":"..."}Optional. Text prompt describing motion / scene transition. Maximum 1 text item.
image_url (1st){"type":"image_url","image_url":{"url":"https://..."}}Required. First image_url in array order. Worker auto-injects role first_frame.
image_url (2nd){"type":"image_url","image_url":{"url":"https://..."}}Required. Second image_url in array order. Worker auto-injects role last_frame.
video_urlNot accepted on this route (rejected with 400).
audio_urlNot accepted on this route (rejected with 400).

Image Constraints (per image_url item)

Constraint Value
FormatThe URL of the starting frame image to animate. Supported formats: JPEG, PNG, WebP. Max 30 MB.

Example Request

{
  "content": [
    {"type": "text", "text": "Time-lapse from winter to spring; snow melts, leaves green, flowers bloom; cinematic motion."},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "ratio": "adaptive",
  "duration": 5,
  "resolution": "1080p",
  "generate_audio": true,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 API Pricing — Per-Second Rates

ResolutionPrice (USD)
480p$0.0787/sec
720p$0.1769/sec
1080p$0.3973/sec
4k$1.5892/sec
Reference to Video (Ref Image / Video / Audio)

Seedance 2.0 API Documentation

Seedance 2.0 is a high-quality AI video generator. This is the standard model — best quality, with output up to 4K.

What this does: Give it photos (and/or short clips) of people or things, and it creates a video featuring them.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0/v1/reference-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Reference to Video - Seedance 2.0 API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0/v1/reference-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0/v1/reference-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0/v1/reference-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0/v1/reference-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 reference-to-video

Parameter Required Type Default Allowed values / range Description
contentYesarrayoptional text + 1–9 images and/or 1–3 videos + 0–3 audio (audio cannot be the only reference)Multimodal reference input.
content[].typeYesstring"text", "image_url", "video_url", "audio_url"Content item type.
content[].textNostringRecommended: under 1000 wordsPrompt; refer to uploads by order, e.g. "Image 1", "Video 1".
content[].image_url.urlConditionalstringURL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per sideImage reference (up to 9).
content[].video_url.urlConditionalstringURL or asset://<ID>; mp4/mov; max 200 MB each; 2–15 s each, combined max 15 s; 24–60 FPSVideo reference (up to 3).
content[].audio_url.urlConditionalstringURL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB each; 2–15 s each, combined max 15 sAudio reference (up to 3).
content[].roleRequired on refsstring"reference_image", "reference_video", "reference_audio"Asset role designation.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p", "1080p", "4k"Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC).
durationNointeger54–15, or -1 (model auto-selects)Output video length in seconds. Use -1 to let the model pick a suitable length.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd an "AI Generated" watermark to the bottom-right corner of the output video.
return_last_frameNobooleanfalsetrue, falseAlso return the last frame of the generated video as a PNG (same dimensions as the video, no watermark) in the status result — useful for chaining consecutive clips.
execution_expires_afterNointeger1728003600–259200Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired.
priorityNointeger00–9Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted.
safety_identifierNostringstring, max 64 charactersStable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage.

Content Item Types & Limits

TypeMax countFormat / SizeDescription
image_urlup to 9JPG, PNG, WEBP · < 30 MB eachReference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}}
video_urlup to 3MP4 · < 50 MB each · ≤ 15s combinedReference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}}
audio_urlup to 3MP3, WAV · ≤ 15s combined · < 15 MBReference audio for audio-driven generation & lip-sync. Requires at least one image or video reference. {"type":"audio_url","audio_url":{"url":"https://..."}}
text1Prompt. Address references by their 1-indexed array order — [Image1], [Video1], [Audio1] (plain "Image 1" also works).

The rule of 12: total references across all types may not exceed 12 (e.g. 9 images + 3 videos = 12, leaving no room for audio). Per-type caps (9 / 3 / 3) always apply within that budget.

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 1080pOutput resolution (480p / 720p / 1080p / 4k).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Use Image 1 as the opening frame and Image 2 as the closing frame. Smooth cinematic transition between them with gentle camera motion. --resolution 1080p"},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 11,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 API Pricing — Per-Second Rates

ResolutionPrice (USD)
480p$0.0957/sec
720p$0.2148/sec
1080p$0.483/sec
4k$1.932/sec
Video to Video (Video Editing)

Seedance 2.0 API Documentation

Seedance 2.0 is a high-quality AI video generator. This is the standard model — best quality, with output up to 4K.

What this does: Upload a video plus a text instruction, and it changes the video to match your request.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0/v1/edit-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Edit Video - Seedance 2.0 API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0/v1/edit-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "text", "text": "Make truck Orange"},
    {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0/v1/edit-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "text", "text": "Make truck Orange"},
        {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0/v1/edit-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'text', text: 'Make truck Orange' },
    { type: 'video_url', video_url: { url: 'https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0/v1/edit-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type": "text", "text": "Make truck Orange"},
      {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 edit-video

Parameter Required Type Default Allowed values / range Description
contentYesarray1 text + 1 image_url + 1 video_urlEdit instruction + reference object image + video to edit.
content[].typeYesstring"text", "image_url", "video_url"Content item type.
content[].textYesstringRecommended: under 1000 wordsEdit instruction; refer to uploads by order, e.g. "Image 1", "Video 1".
content[].image_url.urlYesstringURL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per sideReference object image.
content[].video_url.urlYesstringURL or asset://<ID>; mp4/mov; max 200 MB; 2–15 s; 24–60 FPSThe video to be edited.
content[].roleYesstring"reference_image", "reference_video"Asset role.
ratioNostring"adaptive""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio.
resolutionNostring"720p""480p", "720p", "1080p", "4k"Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC).
durationNointeger54–15, or -1 (model auto-selects)Output video length in seconds. Use -1 to let the model pick a suitable length.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd an "AI Generated" watermark to the bottom-right corner of the output video.
return_last_frameNobooleanfalsetrue, falseAlso return the last frame of the generated video as a PNG (same dimensions as the video, no watermark) in the status result — useful for chaining consecutive clips.
execution_expires_afterNointeger1728003600–259200Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired.
priorityNointeger00–9Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted.
safety_identifierNostringstring, max 64 charactersStable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage.

Content Item Types

TypeMaxFormat / SizeDescription
video_url1MP4 · < 50 MBSource video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}}
text1Edit instructions. {"type":"text","text":"..."}
image_url1JPG, PNG, WEBP · < 30 MBOptional style / reference image. {"type":"image_url","image_url":{"url":"https://..."}}

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 1080pOutput resolution (480p / 720p / 1080p / 4k).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Restyle the source video using Image 1 color palette, framing Image 2 as the final beat. --resolution 1080p"},
    {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 11,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 API Pricing — Per-Second Rates

ResolutionPrice (USD)
480p$0.0957/sec
720p$0.2148/sec
1080p$0.483/sec
4k$1.932/sec
3. Seedance 2.0 Fast

Seedance 2.0 Fast API Documentation

Seedance 2.0 Fast is the quicker, lower-cost version of Seedance 2.0 — ideal for drafts and fast results (480p and 720p).

What this does: Describe a scene in plain words and get a short video of it.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-fast/v1/text-to-video-fast

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Text to Video - Seedance 2.0 Fast API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-fast/v1/text-to-video-fast
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [{"type": "text", "text": "Neon city skyline at night with flying drones"}]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-fast/v1/text-to-video-fast"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [{"type": "text", "text": "Neon city skyline at night with flying drones"}]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-fast/v1/text-to-video-fast';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [{ type: 'text', text: 'Neon city skyline at night with flying drones' }]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-fast/v1/text-to-video-fast" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [{"type": "text", "text": "Neon city skyline at night with flying drones"}]
  }'

Output

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Request Parameters - Seedance 2.0 Fast text-to-video

Parameter Required Type Default Allowed values / range Description
contentYesarray1+ text itemInput content array. Pass a single text item: {"type":"text","text":"…"}.
content[].typeYesstring"text"Content item type.
content[].textYesstringMax 500 Chinese / 1000 English wordsPrompt describing the desired video.
toolsNoarray[{"type":"web_search"}]Optional enhancement — text-to-video only.
ratioNostring"16:9""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio. The gateway applies "16:9" when omitted; pass "adaptive" to let the model pick the best ratio from the input.
resolutionNostring"720p""480p", "720p"Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway.
durationNointeger54–15, or -1 for autoOutput video length in seconds. Use -1 to let the model choose the length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types

TypeFormatDescription
text{"type":"text","text":"..."}The generation prompt (required). May include in-prompt directives below.

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p on the Fast variant).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Neon city skyline at night with flying drones --resolution 720p --seed 7 --framepersecond 24"}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 5,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-fast' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:01:15.000Z",
  "completed_at": "2026-04-07T10:01:15.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Fast API Pricing — Per-Second Rates

Seedance 2.0 is the production model. Mini is the cheapest tier; Fast trades quality for speed. 1.0 Pro / 1.0 Lite are legacy variants.

Your request will cost $0.24 per second.
e.g. $1.20 for a 5s video, $2.40 for a 10s video
Image to video

Seedance 2.0 Fast API Documentation

Seedance 2.0 Fast is the quicker, lower-cost version of Seedance 2.0 — ideal for drafts and fast results (480p and 720p).

What this does: Give a starting image (and optionally an ending image), and it creates a video that animates between them.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-fast/v1/first-last-frame-to-video-fast

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Image to Video (First & Last Frames) - Seedance 2.0 Fast API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-fast/v1/first-last-frame-to-video-fast
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-fast/v1/first-last-frame-to-video-fast"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-fast/v1/first-last-frame-to-video-fast';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png' } },
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-fast/v1/first-last-frame-to-video-fast" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type":"image_url","image_url":{"url":"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
      {"type":"image_url","image_url":{"url":"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 Fast image-to-video (first & last frames)

Parameter Required Type Default Allowed values / range Description
contentYesarray1 or 2 image_url; optional textFirst-frame (1 image) or first+last-frame (2 images) mode.
content[].typeYesstring"text", "image_url"Content item type.
content[].textNostringMax 500 Chinese / 1000 English wordsOptional motion guidance prompt.
content[].image_url.urlYesstringURL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; 300–6000 px; max 30 MBFrame image.
content[].roleNostringauto-assigned"first_frame", "last_frame"Frame position. The gateway assigns it automatically from image order (1st = first_frame, 2nd = last_frame) — you do not need to set it.
ratioNostring"16:9""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio. The gateway applies "16:9" when omitted; pass "adaptive" to let the model pick the best ratio from the input.
resolutionNostring"720p""480p", "720p"Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway.
durationNointeger54–15, or -1 for autoOutput video length in seconds. Use -1 to let the model choose the length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types

TypeMaxFormat / SizeDescription
image_url2JPG, PNG, WEBP · < 30 MB each1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}}
text1Optional motion/style prompt. {"type":"text","text":"..."}

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p on the Fast variant).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Content Item Types

Type Format Description
text{"type":"text","text":"..."}Optional. Text prompt describing motion / scene transition. Maximum 1 text item.
image_url (1st){"type":"image_url","image_url":{"url":"https://..."}}Required. First image_url in array order. Worker auto-injects role first_frame.
image_url (2nd){"type":"image_url","image_url":{"url":"https://..."}}Required. Second image_url in array order. Worker auto-injects role last_frame.
video_urlNot accepted on this route (rejected with 400).
audio_urlNot accepted on this route (rejected with 400).

Image Constraints (per image_url item)

Constraint Value
FormatThe URL of the starting frame image to animate. Supported formats: JPEG, PNG, WebP. Max 30 MB.

Pixel dimensions per ratio

Seedance 2.0 Fast supports 480p and 720p only.

Ratio 480p 720p
16:9864×4961280×720
4:3752×5601112×834
1:1640×640960×960
3:4560×752834×1112
9:16496×864720×1280
21:9992×4321470×630

Example Request

{
  "content": [
    {"type": "text", "text": "Time-lapse transition from winter to spring: snow melts off the plant, leaves turn green, flowers bloom into full color. Smooth cinematic motion."},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "duration": 5,
  "ratio": "adaptive",
  "resolution": "720p",
  "generate_audio": true,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-fast' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Fast API Pricing — Per-Second Rates

Your request will cost $0.24 per second.
e.g. $1.20 for a 5s video, $2.40 for a 10s video
Reference to Video (Ref Image / Video / Audio)

Seedance 2.0 Fast API Documentation

Seedance 2.0 Fast is the quicker, lower-cost version of Seedance 2.0 — ideal for drafts and fast results (480p and 720p).

What this does: Give it photos, clips, or audio of people or things, and it creates a video featuring them.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-fast/v1/reference-to-video-fast

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Reference to Video - Seedance 2.0 Fast API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-fast/v1/reference-to-video-fast
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-fast/v1/reference-to-video-fast"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-fast/v1/reference-to-video-fast';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'image_url', image_url: { url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-fast/v1/reference-to-video-fast" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 Fast multimodal reference

Parameter Required Type Default Allowed values / range Description
contentYesarrayoptional text + at least one of {image_url, video_url, audio_url}; ordered text → images → videos → audioMultimodal reference input.
content[].typeYesstring"text", "image_url", "video_url", "audio_url"Content item type.
content[].textNostringMax 500 Chinese / 1000 English words; may include @image1 / @video1 / @audio1 refsPrompt with optional reference handles.
content[].image_url.urlConditionalstringURL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MBImage reference (up to 9).
content[].video_url.urlConditionalstringURL or asset://<ID>; mp4/mov; max 200 MB; 2–15 s each, ≤15 s totalVideo reference (up to 3).
content[].audio_url.urlConditionalstringURL, base64 URI, or asset://<ID>; wav/mp3; 2–15 s each, ≤15 s total; max 15 MBAudio reference (up to 3). Cannot be the only reference — include at least one image or video.
content[].roleNostringauto-assigned"reference_image", "reference_video", "reference_audio"Asset role. The gateway sets it automatically from the item type (image → reference_image, video → reference_video, audio → reference_audio); any value you send is overwritten.
ratioNostring"16:9""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio. The gateway applies "16:9" when omitted; pass "adaptive" to let the model pick the best ratio from the input.
resolutionNostring"720p""480p", "720p"Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway.
durationNointeger54–15, or -1 for autoOutput video length in seconds. Use -1 to let the model choose the length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types & Limits

TypeMax countFormat / SizeDescription
image_urlup to 9JPG, PNG, WEBP · < 30 MB eachReference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}}
video_urlup to 3MP4 · < 50 MB each · ≤ 15s combinedReference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}}
audio_urlup to 3MP3, WAV · ≤ 15s combined · < 15 MBReference audio for audio-driven generation & lip-sync. Requires at least one image or video reference. {"type":"audio_url","audio_url":{"url":"https://..."}}
text1Prompt. Address references by their 1-indexed array order — [Image1], [Video1], [Audio1] (plain "Image 1" also works).

The rule of 12: total references across all types may not exceed 12 (e.g. 9 images + 3 videos = 12, leaving no room for audio). Per-type caps (9 / 3 / 3) always apply within that budget.

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p on the Fast variant).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Use Image 1 as the opening frame and Image 2 as the closing frame. Smooth cinematic transition. --resolution 720p"},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 11,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-fast' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:01:15.000Z",
  "completed_at": "2026-04-07T10:01:15.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Fast API Pricing — Per-Second Rates

Your request will cost $0.24 per second.
e.g. $1.20 for a 5s video, $2.40 for a 10s video
Video to Video (Video Editing)

Seedance 2.0 Fast API Documentation

Seedance 2.0 Fast is the quicker, lower-cost version of Seedance 2.0 — ideal for drafts and fast results (480p and 720p).

What this does: Upload a video plus a text instruction, and it changes the video to match your request.

What you get back: a link to a finished video file (MP4) you can download.

How it works, in 3 simple steps:

  1. Send your request to the URL below, including your API key.
  2. You instantly get back a request_id and a status link. Your video is then created in the background (this takes a little time).
  3. Open the status link every few seconds until it shows COMPLETED, then download your video from the link it returns. Prefer not to keep checking? Add a webhook (see the Webhook section) and we will notify your server automatically when it is ready.

Base URL

https://gateway.pixazo.ai/seedance-2-0-fast/v1/edit-video-fast

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Edit Video - Seedance 2.0 Fast API

Request Code

POST https://gateway.pixazo.ai/seedance-2-0-fast/v1/edit-video-fast
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "content": [
    {"type": "text", "text": "Make truck Orange"},
    {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
  ]
}
import requests

url = "https://gateway.pixazo.ai/seedance-2-0-fast/v1/edit-video-fast"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "content": [
        {"type": "text", "text": "Make truck Orange"},
        {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/seedance-2-0-fast/v1/edit-video-fast';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  content: [
    { type: 'text', text: 'Make truck Orange' },
    { type: 'video_url', video_url: { url: 'https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4' } }
  ]
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/seedance-2-0-fast/v1/edit-video-fast" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "content": [
      {"type": "text", "text": "Make truck Orange"},
      {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}}
    ]
  }'

Output

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Using images & real people

You can supply an image or video in three ways:

  • A web link (URL) — a public link to your image or video file.
  • Base64 — the file encoded as a text string (for images and audio).
  • An asset IDasset://<ID>, if you uploaded the file to the asset library earlier.

Real people are allowed. Photos and clips of real human faces work normally — the gateway automatically registers your reference media with the provider, so real-person content is not blocked. (Advanced: for formally consented real-person assets, add them in the BytePlus console and pass the resulting asset://<ID>.)

Request Parameters - Seedance 2.0 Fast video editing

Parameter Required Type Default Allowed values / range Description
contentYesarray1 video_url + optional text + optional image_urlThe video to edit, plus an optional edit instruction and optional reference object image.
content[].typeYesstring"text", "image_url", "video_url"Content item type.
content[].textNostringMax 500 Chinese / 1000 English words; may use @image1 / @video1Edit instruction with reference handles (strongly recommended).
content[].image_url.urlNostringURL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MBOptional reference object image.
content[].video_url.urlYesstringURL or asset://<ID>; mp4/mov; max 200 MB; 2–15 sThe video to be edited.
content[].roleNostringauto-assigned"reference_image", "reference_video"Asset role. The gateway sets it automatically from the item type; any value you send is overwritten.
ratioNostring"16:9""16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive"Output aspect ratio. The gateway applies "16:9" when omitted; pass "adaptive" to let the model pick the best ratio from the input.
resolutionNostring"720p""480p", "720p"Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway.
durationNointeger54–15, or -1 for autoOutput video length in seconds. Use -1 to let the model choose the length automatically.
generate_audioNobooleantruetrue, falseGenerate synchronized audio along with the video.
watermarkNobooleanfalsetrue, falseAdd a watermark to the output video.

Content Item Types

TypeMaxFormat / SizeDescription
video_url1MP4 · < 50 MBSource video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}}
text1Edit instructions. {"type":"text","text":"..."}
image_url1JPG, PNG, WEBP · < 30 MBOptional style / reference image. {"type":"image_url","image_url":{"url":"https://..."}}

In-Prompt Directives (optional)

Seedance 2.0 also accepts space-separated flags appended to the text prompt. They override the matching JSON field when both are present.

DirectiveExampleDescription
--resolution--resolution 720pOutput resolution (480p / 720p on the Fast variant).
--seed--seed 42Reproducible seed.
--framepersecond--framepersecond 24Output frame rate (fps).
--camerafixed--camerafixed falsetrue locks the camera; false allows camera motion.

Example Request

{
  "content": [
    {"type": "text", "text": "Restyle the source video using Image 1 color palette, framing Image 2 as the final beat. --resolution 720p"},
    {"type": "video_url", "video_url": {"url": "https://ark-doc.tos-ap-southeast-1.bytepluses.com/doc_video/r2v_tea_video1.mp4"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"}},
    {"type": "image_url", "image_url": {"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"}}
  ],
  "generate_audio": true,
  "ratio": "16:9",
  "duration": 11,
  "watermark": false
}

Response

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'seedance-2-0-fast' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "seedance-2-0-fast",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "seedance-2-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "seedance-2-0-fast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-0-fast_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 2.0 Fast API Pricing — Per-Second Rates

Your request will cost $0.24 per second.
e.g. $1.20 for a 5s video, $2.40 for a 10s video
4. Seedance 1.0 Pro

Seedance 1.0 Pro API Documentation

https://gateway.pixazo.ai/byteplus/v1/generateImage2VideoTask

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Seedance 1.0 Image to Video - Bytedance API

Request Code

POST https://gateway.pixazo.ai/byteplus/v1/generateImage2VideoTask
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "model": "seedance-1-0-pro-250528",
  "text": "Soft cotton-like clouds drift with subtle layered motions across a pale blue sky. --ratio 16:9 --resolution 720p --duration 5",
  "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}
import requests

url = "https://gateway.pixazo.ai/byteplus/v1/generateImage2VideoTask"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
  "model": "seedance-1-0-pro-250528",
  "text": "Soft cotton-like clouds drift with subtle layered motions across a pale blue sky. --ratio 16:9 --resolution 720p --duration 5",
  "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/byteplus/v1/generateImage2VideoTask';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  "model": "seedance-1-0-pro-250528",
  "text": "Soft cotton-like clouds drift with subtle layered motions across a pale blue sky. --ratio 16:9 --resolution 720p --duration 5",
  "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/byteplus/v1/generateImage2VideoTask" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
  "model": "seedance-1-0-pro-250528",
  "text": "Soft cotton-like clouds drift with subtle layered motions across a pale blue sky. --ratio 16:9 --resolution 720p --duration 5",
  "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}'

Output

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "bytedance-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "bytedance-text-to-image",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/bytedance-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "bytedance-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "bytedance-text-to-image",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Request Parameters - Seedance 1.0 Image to Video - Bytedance API

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringseedance-1-0-pro-250528The Seedance model ID. Use seedance-1-0-pro-250528 for Seedance 1.0 Pro image-to-video generation.
textYesstringPrompt describing the desired motion. Control knobs can be embedded inline: --ratio, --resolution, --duration, --watermark, --seed, --camerafixed (see below).
image_urlYesstringPublicly accessible HTTPS URL of the source image used as the first frame of the video.
resolutionNostring720p480p, 720p, 1080pOutput resolution of the video. Appended to the prompt as --resolution when not already present. Higher resolutions cost more and take longer to generate.
durationNointeger52–12Video duration in seconds (integers only). Appended to the prompt as --duration when not already present.
framepersecondNointeger2424Frame rate of the generated video. Seedance 1.0 Pro renders at a fixed 24 fps.
watermarkNobooleanfalsetrue, falseWhether the video carries an "AI Generated" watermark in the lower-right corner.
seedNointeger-1-1 to 4294967295Seed controlling randomness. -1 uses a random seed. The same seed with an identical request produces similar (not guaranteed identical) results. Only sent upstream when set to a value other than -1.
camerafixedNobooleanfalsetrue, falseWhether to lock the camera position. When true, a fixed-camera instruction is appended to the prompt (result not guaranteed).
callback_urlNostringPublicly reachable URL that receives a POST notification from the provider each time the task status changes (queued, running, succeeded, failed, expired).
Inline knobs (embedded in the text prompt). Each body parameter above is auto-appended as its inline knob when not already present in the prompt; if you set a knob inline, use its full name (e.g. --resolution, not --rs) so the gateway does not append a conflicting default.
--ratioNostringadaptive16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptiveAspect ratio of the generated video. adaptive (default) picks the closest ratio to the uploaded image; if a fixed ratio differs from the image, the image is center-cropped. Abbreviation: --rt. Inline only — there is no body parameter for aspect ratio.
--resolutionNostring720p480p, 720p, 1080pInline form of resolution. Abbreviation: --rs.
--durationNointeger52–12Inline form of duration. Abbreviation: --dur.
--watermarkNobooleanfalsetrue, falseInline form of watermark. Abbreviation: --wm.
--seedNointeger-1-1 to 4294967295Inline form of seed.
--camerafixedNobooleanfalsetrue, falseInline form of camerafixed. Abbreviation: --cf.

Example Request

{
  "model": "seedance-1-0-pro-250528",
  "text": "Soft cotton-like clouds drift with subtle layered motions across a pale blue sky. --ratio 16:9 --resolution 720p --duration 5",
  "image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}

Response

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY
X-Webhook-URLOptional callback URL

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance. Required: $0.20"
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'byteplus' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "byteplus",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "byteplus",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-09T10:00:00.000Z",
  "updated_at": "2026-04-09 10:01:30",
  "completed_at": "2026-04-09 10:01:30"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type (video/mp4)
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 1.0 Pro API Pricing

Your request will cost $0.20 per video.
Text to Video

Seedance 1.0 Pro API Documentation

https://gateway.pixazo.ai/byteplus/v1/generateVideoTask

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Seedance 1.0 Pro Text to Video - Bytedance API

Request Code

POST https://gateway.pixazo.ai/byteplus/v1/generateVideoTask
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "model": "seedance-1-0-pro-250528",
  "text": "A vast expanse of white daisy fields under a clear blue sky. --ratio 16:9 --resolution 720p --duration 5 --camerafixed false"
}
import requests

url = "https://gateway.pixazo.ai/byteplus/v1/generateVideoTask"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
  "model": "seedance-1-0-pro-250528",
  "text": "A vast expanse of white daisy fields under a clear blue sky. --ratio 16:9 --resolution 720p --duration 5 --camerafixed false"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/byteplus/v1/generateVideoTask';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  "model": "seedance-1-0-pro-250528",
  "text": "A vast expanse of white daisy fields under a clear blue sky. --ratio 16:9 --resolution 720p --duration 5 --camerafixed false"
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/byteplus/v1/generateVideoTask" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
  "model": "seedance-1-0-pro-250528",
  "text": "A vast expanse of white daisy fields under a clear blue sky. --ratio 16:9 --resolution 720p --duration 5 --camerafixed false"
}'

Output

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.

Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.

Webhook Headers

HeaderRequiredDefaultDescription
X-Webhook-URLYes (to enable)HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed).
X-Webhook-ModeNoterminalterminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates.

Example: enable webhook

X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal

Callback Payload

Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):

{
  "request_id": "bytedance-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "bytedance-text-to-image",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/bytedance-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-05-22T13:17:32.110Z",
  "updated_at": "2026-05-22 13:19:23",
  "completed_at": "2026-05-22 13:19:23"
}

Failure callback shape

{
  "request_id": "bytedance-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "bytedance-text-to-image",
  "error": "Description of the error",
  "output": null,
  "created_at": "...",
  "updated_at": "...",
  "completed_at": "..."
}

Delivery semantics

  • terminal mode (default) — exactly one POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync modePOST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries.
  • HTTPS required — plain http:// URLs are rejected.

Request Parameters - Seedance 1.0 Pro Text to Video - Bytedance API

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringseedance-1-0-pro-250528The Seedance model ID. Use seedance-1-0-pro-250528 for Seedance 1.0 Pro text-to-video generation.
textYesstringPrompt describing the video to generate. Control knobs can be embedded inline: --ratio, --resolution, --duration, --watermark, --seed, --camerafixed (see below).
resolutionNostring720p480p, 720p, 1080pOutput resolution of the video. Appended to the prompt as --resolution when not already present. Higher resolutions cost more and take longer to generate.
durationNointeger52–12Video duration in seconds (integers only). Appended to the prompt as --duration when not already present.
framepersecondNointeger2424Frame rate of the generated video. Seedance 1.0 Pro renders at a fixed 24 fps.
watermarkNobooleanfalsetrue, falseWhether the video carries an "AI Generated" watermark in the lower-right corner.
seedNointeger-1-1 to 4294967295Seed controlling randomness. -1 uses a random seed. The same seed with an identical request produces similar (not guaranteed identical) results. Only sent upstream when set to a value other than -1.
camerafixedNobooleanfalsetrue, falseWhether to lock the camera position. When true, a fixed-camera instruction is appended to the prompt (result not guaranteed).
callback_urlNostringPublicly reachable URL that receives a POST notification from the provider each time the task status changes (queued, running, succeeded, failed, expired).
Inline knobs (embedded in the text prompt). Each body parameter above is auto-appended as its inline knob when not already present in the prompt; if you set a knob inline, use its full name (e.g. --resolution, not --rs) so the gateway does not append a conflicting default.
--ratioNostring16:916:9, 4:3, 1:1, 3:4, 9:16, 21:9Aspect ratio of the generated video. For text-to-video, adaptive is not supported by Seedance 1.0 Pro. Abbreviation: --rt. Inline only — there is no body parameter for aspect ratio.
--resolutionNostring720p480p, 720p, 1080pInline form of resolution. Abbreviation: --rs.
--durationNointeger52–12Inline form of duration. Abbreviation: --dur.
--watermarkNobooleanfalsetrue, falseInline form of watermark. Abbreviation: --wm.
--seedNointeger-1-1 to 4294967295Inline form of seed.
--camerafixedNobooleanfalsetrue, falseInline form of camerafixed. Abbreviation: --cf.

Example Request

{
  "model": "seedance-1-0-pro-250528",
  "text": "A vast expanse of white daisy fields under a clear blue sky. --ratio 16:9 --resolution 720p --duration 5 --camerafixed false"
}

Response

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

HeaderValue
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY
X-Webhook-URLOptional callback URL

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance. Required: $0.20"
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'byteplus' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "byteplus",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "byteplus",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/byteplus_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-09T10:00:00.000Z",
  "updated_at": "2026-04-09 10:01:30",
  "completed_at": "2026-04-09 10:01:30"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type (video/mp4)
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Seedance 1.0 Pro API Pricing

Your request will cost $0.20 per video.