Seedance 2.5 API, Seedance 2.0 Mini API, Seedance 2.0 API, 1.0 Pro & Lite API: Pricing, Documentation
by BytePlus
Seedance 2.5 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.
Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Seedance 2.5 API Documentation
Seedance 2.5 is a high-quality AI video generator. This is the standard model — best quality, with output up to 30 seconds at 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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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-5/v1/text-to-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Video - Seedance 2.5 API
Request Code
POST https://gateway.pixazo.ai/seedance-2-5/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-5/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-5/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-5/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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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.5 text-to-video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
content | Yes | array | — | 1 text item | Input content array. Pass a single text item: {"type":"text","text":"…"}. |
content[].type | Yes | string | — | "text" | Content item type. |
content[].text | Yes | string | — | Recommended: up to 1,000 English words (or 500 Chinese characters) | Prompt describing the desired video. Seedance 2.5 generates natively from English, Spanish, Indonesian, Portuguese, Japanese, Malay, Thai, Arabic, Vietnamese and Korean prompts. Very long prompts scatter the model’s attention and details start to get dropped. |
tools | No | array | — | [{"type":"web_search"}] | Optional enhancement — text-to-video only. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. adaptive lets the model choose the ratio from your prompt. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution — at 16:9, 480p is 854×480 and 720p is 1280×720. Seedance 2.5 does not support 1080p or 4k. |
duration | No | integer | -1 | 4–30, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model choose a suitable whole-second length inside the 4–30s range. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video — speech, sound effects and background music inferred from the prompt and the visuals. Put spoken lines in double quotes inside the prompt for the best result. Generated audio is returned as a 2-channel stereo track, though the stereo field is narrow; set false for a silent video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
output_format | No | string | "mp4" | "mp4", "mov" | Container for the generated video. mp4 plays everywhere; mov is the professional option (H.264 video, YUV 4:4:4 chroma, PCM audio) for colour grading, keying and compositing, and is recommended when the clip will be fed back in for editing or extension — some players cannot open it. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation (the default 172800 is 48 hours). Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; equal priorities stay FIFO and running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Format | Description |
|---|---|---|
| text | {"type":"text","text":"..."} | The generation prompt (required). May include in-prompt directives below. |
In-Prompt Directives (optional)
Seedance 2.5 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.5 API Pricing — Per-Second Rates
Seedance 2.5 is the newest generation: up to 30-second output, up to 50 multimodal reference assets, native multilingual audio, and video extension. 480p/720p only.
| Resolution | Price (USD) |
|---|---|
| 480p | $0.103/sec |
| 720p | $0.231/sec |
Seedance 2.5 API Documentation
Seedance 2.5 is a high-quality AI video generator. This is the standard model — best quality, with output up to 30 seconds at 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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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-5/v1/first-last-frame-to-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Image to Video (First & Last Frames) - Seedance 2.5 API
Request Code
POST https://gateway.pixazo.ai/seedance-2-5/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-5/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-5/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-5/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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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.5 image-to-video (first & last frames)
Note: For first/last-frame generation, ratio must be adaptive — the output follows the first frame's aspect ratio.
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
content | Yes | array | — | 1–2 image_url items; optional 1 text item | Input list. One image = first-frame mode; two images = first + last frame mode. video_url and audio_url items are rejected on this route with 400. |
content[].type | Yes | string | — | "text", "image_url" | Content item type. |
content[].text | No | string | — | Recommended: ≤ 1,000 English words (or 500 Chinese characters) | Optional motion / scene-transition prompt. English works on every model; Seedance 2.5 also accepts Spanish, Portuguese, Japanese, Korean, Indonesian, Malay, Thai, Arabic and Vietnamese. Very long prompts scatter the model's attention and details get dropped — keep it focused. |
content[].image_url.url | Yes | string | — | Public HTTPS URL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; 300–6000 px per side; aspect ratio (w/h) 0.4–2.5; < 30 MB per image | The frame image. With one image it is the first frame and motion is added from there; with two, the first is the opening frame and the second the closing frame. Base64 must be data:image/<format>;base64,… with a lowercase format. Each image must stay under 30 MB and the whole request body under 64 MB — use URLs rather than base64 for large files. |
content[].role | Required when 2 images | string | "first_frame" (single image) | "first_frame", "last_frame" | Frame position. In two-image mode the provider requires role on both items; the gateway auto-assigns first_frame to the 1st image and last_frame to the 2nd in array order if you omit it. The two frames may be identical. If their aspect ratios differ, the first frame takes precedence and the last frame is centre-cropped to match. |
ratio | No | string | "adaptive" | "adaptive" only | Locked for this task type — Seedance 2.5 first/last-frame generation accepts no other value and rejects one with 400. The output automatically keeps the first frame's aspect ratio. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. Seedance 2.5 does not support 1080p or 4k. |
duration | No | integer | -1 | 4–30, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model pick a suitable whole-second length inside the 4–30 s range. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio — voice, sound effects and background music — matched to the prompt and the visuals. Generated audio is returned as a 2-channel stereo track, though the stereo field is narrow. Put spoken lines in double quotes inside the prompt for the best dialogue result. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
output_format | No | string | "mp4" | "mp4", "mov" | Container for the generated video. mov carries higher colour precision and is recommended for video editing and extension; some players cannot open it. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image_url | 2 | jpeg/png/webp/bmp/tiff/gif/heic/heif · < 30 MB each | 1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}} |
| text | 1 | — | Optional motion/style prompt. {"type":"text","text":"..."} |
In-Prompt Directives (optional)
Seedance 2.5 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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_url | — | Not accepted on this route (rejected with 400). |
audio_url | — | Not accepted on this route (rejected with 400). |
Image Constraints (per image_url item)
| Constraint | Value |
|---|---|
| Formats | jpeg, png, webp, bmp, tiff, gif, heic, heif |
| Max file size | Under 30 MB per image; total request body under 64 MB |
| Pixel dimensions | 300–6000 px on each side |
| Aspect ratio (w/h) | 0.4 – 2.5 |
| Number of images | 1 (first frame only) or 2 (first + last frame) |
| How to supply | Public HTTPS URL, data:image/<format>;base64,… (lowercase format), or asset://<ID>. Prefer URLs for large files. |
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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.5 API Pricing — Per-Second Rates
Seedance 2.5 is the newest generation: up to 30-second output, up to 50 multimodal reference assets, native multilingual audio, and video extension. 480p/720p only.
| Resolution | Price (USD) |
|---|---|
| 480p | $0.103/sec |
| 720p | $0.231/sec |
Seedance 2.5 API Documentation
Seedance 2.5 is a high-quality AI video generator. This is the standard model — best quality, with output up to 30 seconds at 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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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-5/v1/reference-to-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Reference to Video - Seedance 2.5 API
Request Code
POST https://gateway.pixazo.ai/seedance-2-5/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-5/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-5/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-5/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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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.5 reference-to-video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
content | Yes | array | — | optional text + 0–30 images and/or 0–10 videos and/or 0–10 audio clips; 50 references max | Multimodal reference input. Any combination of image, video and audio references — in 2.5 audio alone is a valid reference. Keep the whole request body under 64 MB; send large assets as URLs rather than base64. |
content[].type | Yes | string | — | "text", "image_url", "video_url", "audio_url" | Content item type. |
content[].text | No | string | — | Recommended: ≤ 1,000 English words (≤ 500 Chinese characters) | Prompt; refer to uploads by order, e.g. "Image 1", "Video 1". English is supported by every Seedance model; 2.5 also generates natively from Spanish, Portuguese, Japanese, Korean, Indonesian, Malay, Thai, Arabic and Vietnamese prompts. Longer prompts scatter the model's attention and details start getting dropped. |
content[].image_url.url | Conditional | string | — | URL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB each; 300–6000 px per side; aspect ratio (w/h) 0.4–2.5; 1–30 images | Upload up to 30 reference images the model takes subject, style or composition cues from, to keep your result consistent. JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC or HEIF; under 30 MB each; every side 300–6000 px with a width/height ratio between 0.4 and 2.5. |
content[].video_url.url | Conditional | string | — | URL or asset://<ID>; mp4/mov; max 200 MB each; 2–30 s per clip and 30 s combined; 300–6000 px per side; aspect ratio (w/h) 0.4–2.5; 409,600–8,295,044 total pixels; 24–60 FPS | Upload up to 10 reference videos the model takes motion or style cues from. MP4 or MOV, 480p to 4K source; each clip 2–30 seconds and under 200 MB; 30 seconds combined across all videos. Clips under 20 seconds usually transfer motion best. |
content[].audio_url.url | Conditional | string | — | URL, base64 data URI, or asset://<ID>; wav/mp3; max 15 MB each; 2–30 s per clip and 30 s combined | Upload up to 10 audio clips as a reference for music, dialogue, voice, tone or timbre. MP3 or WAV; each clip 2–30 seconds and under 15 MB; 30 seconds combined. In Seedance 2.5 audio can be the only reference you send. |
content[].role | Required on refs | string | — | "reference_image", "reference_video", "reference_audio" | Role of each reference item — reference_image on images, reference_video on videos, reference_audio on audio. Required on every non-text item. (The provider's first_frame/last_frame roles belong to the separate image-to-video modes, which cannot be mixed with reference input.) |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. adaptive lets the model pick one from the task type and your inputs. Video-editing and video-extension requests keep the input video's ratio and accept only adaptive. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. Seedance 2.5 does not support 1080p or 4k. |
duration | No | integer | -1 | 4–30, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model choose a suitable length. Video-editing requests accept only -1 and keep the input clip's length. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video — speech, sound effects and music matched to the prompt and footage. Put spoken lines in double quotes to steer the dialogue. Generated audio is returned as a 2-channel stereo track, though the stereo field is narrow. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
output_format | No | string | "mp4" | "mp4", "mov" | Container for the generated video. mov carries higher colour precision and is recommended for video editing and extension; some players cannot open it. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types & Limits
| Type | Max count | Format / Size | Description |
|---|---|---|---|
| image_url | up to 30 | JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF · < 30 MB each · 300–6000 px/side | Reference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}} |
| video_url | up to 10 | MP4, MOV · ≤ 200 MB each · 2–30s per clip · ≤ 30s combined | Reference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}} |
| audio_url | up to 10 | MP3, WAV · 2–30s per clip · ≤ 30s combined · ≤ 15 MB each | Reference audio for audio-driven generation & lip-sync. In Seedance 2.5 audio can be the only reference. {"type":"audio_url","audio_url":{"url":"https://..."}} |
| text | 1 | — | Prompt. Address references by their 1-indexed array order — [Image1], [Video1], [Audio1] (plain "Image 1" also works). |
Asset budget: up to 50 references in total — at most 30 images, 10 videos and 10 audio clips. Video references may total 30 seconds combined, and audio references 30 seconds combined.
In-Prompt Directives (optional)
Seedance 2.5 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.5 API Pricing — Per-Second Rates
Seedance 2.5 is the newest generation: up to 30-second output, up to 50 multimodal reference assets, native multilingual audio, and video extension. 480p/720p only.
| Resolution | Price (USD) |
|---|---|
| 480p | $0.103/sec |
| 720p | $0.231/sec |
Seedance 2.5 API Documentation
Seedance 2.5 is a high-quality AI video generator. This is the standard model — best quality, with output up to 30 seconds at 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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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-5/v1/edit-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Edit Video - Seedance 2.5 API
Request Code
POST https://gateway.pixazo.ai/seedance-2-5/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-5/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-5/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-5/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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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.5 edit-video
Note: For video editing, ratio must be adaptive and duration must be -1 — the output tracks the input video.
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
content | Yes | array | — | 1 text + 1 video_url (required) + optional image_url | Edit instruction + the video to edit, plus an optional reference image. |
content[].type | Yes | string | — | "text", "image_url", "video_url" | Content item type. |
content[].text | Yes | string | — | Recommended: under 1000 words | Edit instruction; refer to uploads by order, e.g. "Image 1", "Video 1". Include an explicit edit verb (add, remove, replace, change, edit) so the model classifies the request as an edit instead of a new generation. |
content[].image_url.url | No | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per side; aspect ratio 0.4–2.5 | Optional reference image — the object, character, or scene to bring into the edited video. Under 30 MB. Omit it to edit the video from the text instruction alone. |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov (H.264 or H.265 video, AAC or MP3 audio); 4–30 s; 24–60 FPS; max 200 MB; 300–6000 px per side | Upload the video you want to edit. MP4 or MOV, up to 200 MB, and 4–30 seconds long — a source clip shorter than 4 s or longer than 30 s is rejected. MOV is recommended for editing (higher colour precision). |
content[].role | No | string | auto-assigned | "reference_image", "reference_video" | Asset role. The gateway sets it automatically from the item type; any value you send is overwritten. |
ratio | No | string | "adaptive" | "adaptive" only | Locked for video editing. The output always keeps the source video’s aspect ratio, so adaptive is the only accepted value. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. Seedance 2.5 does not support 1080p or 4k. |
duration | No | integer | -1 | -1 only | Locked for video editing. The output tracks the source video’s length (it may come back up to 0.4 s shorter, and may be a non-integer number of seconds), so -1 is the only accepted value. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
output_format | No | string | "mp4" | "mp4", "mov" | Container for the generated video. mov carries higher colour precision and is recommended for video editing and extension; some players cannot open it. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video_url | 10 | MP4 or MOV · ≤ 200 MB each · 4–30 s · 30 s total | Source video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}} |
| text | 1 | — | Edit instructions. {"type":"text","text":"..."} |
| image_url | 30 | JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF · < 30 MB each | Optional style / reference image. {"type":"image_url","image_url":{"url":"https://..."}} |
In-Prompt Directives (optional)
Seedance 2.5 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--rs | --rs 720p | Output resolution (480p / 720p). Equivalent to the resolution field. |
--wm | --wm true | Add the "AI Generated" watermark. Equivalent to the watermark field. |
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": "adaptive",
"duration": -1,
"watermark": false
}
Response
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.5 API Pricing — Per-Second Rates
Seedance 2.5 is the newest generation: up to 30-second output, up to 50 multimodal reference assets, native multilingual audio, and video extension. 480p/720p only.
| Resolution | Price (USD) |
|---|---|
| 480p | $0.103/sec |
| 720p | $0.231/sec |
Seedance 2.5 API Documentation
Seedance 2.5 is a high-quality AI video generator. This is the standard model — best quality, with output up to 30 seconds at 720p.
What this does: Upload a video plus a text instruction describing what should happen next, and it generates a continuation of that clip.
What you get back: a link to a finished video file (MP4) you can download.
How it works, in 3 simple steps:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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-5/v1/extend-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Extend Video - Seedance 2.5 API
Request Code
POST https://gateway.pixazo.ai/seedance-2-5/v1/extend-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"content": [
{"type": "text", "text": "Extend Video 1 forward: the truck keeps driving down the coast road as the sun sets behind it."},
{"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-5/v1/extend-video"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"content": [
{"type": "text", "text": "Extend Video 1 forward: the truck keeps driving down the coast road as the sun sets behind it."},
{"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-5/v1/extend-video';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
content: [
{ type: 'text', text: 'Extend Video 1 forward: the truck keeps driving down the coast road as the sun sets behind it.' },
{ 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-5/v1/extend-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": "Extend Video 1 forward: the truck keeps driving down the coast road as the sun sets behind it."},
{"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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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.5 extend-video
Note: For video extension, ratio must be adaptive; duration may be 4–30 or -1.
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
content | Yes | array | — | 1 text + 1 video_url (required), plus optional extra references — up to 50 assets total (30 images, 10 videos, 10 audio) | The extension instruction plus the clip you want to continue. Extra images, videos or audio can be attached as references. |
content[].type | Yes | string | — | "text", "image_url", "video_url", "audio_url" | Content item type. |
content[].text | Yes | string | — | Recommended: under 1000 words | Describes what happens in the continuation. Must contain an extension cue such as "extend forward", "extend backward", "continue" or "continue the story" — without one the model may classify the job as an edit instead and reject it. Refer to uploads by order, e.g. "Video 1", "Image 1". |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov; max 200 MB; 2–30 s; 24–60 FPS; 300–6000 px per side; aspect ratio 0.4–2.5 | The clip you want to extend. Accepts mp4 or mov — mov is recommended for the best colour and audio continuity across the join. Up to 200 MB and 2–30 seconds long. Extension can run forwards or backwards from this clip. |
content[].image_url.url | No | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per side; up to 30 images | Optional reference image — an object, character or scene to carry into the continuation. |
content[].audio_url.url | No | string | — | URL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB; 2–30 s; up to 10 clips (30 s combined) | Optional reference audio — voice, music or sound effects to guide the continuation’s soundtrack. |
content[].role | Conditional | string | — | "reference_video", "reference_image", "reference_audio", "first_frame", "last_frame" | Role of the attached asset. Videos use reference_video and audio uses reference_audio; images use reference_image, or first_frame/last_frame to pin an image to the start or end. |
ratio | No | string | "adaptive" | "adaptive" only | Output aspect ratio. Locked for video extension — the result always keeps the aspect ratio of the clip being extended, so adaptive is the only accepted value. Passing 16:9, 9:16 or any other ratio fails after the job is queued. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. Seedance 2.5 does not support 1080p or 4k. |
duration | No | integer | -1 | 4–30, or -1 (model auto-selects) | Length of the generated video in seconds. Use -1 to let the model pick a suitable whole-second length in the 4–30 range. The source clip has its own separate limit (2–30 s) and counts toward the 30 s reference-video budget. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
output_format | No | string | "mp4" | "mp4", "mov" | Container for the generated video. mov carries higher colour precision and is recommended for extension — ideally for both the source clip and the output, which gives the most seamless join. Some players cannot open mov. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video_url | 1 source (10 videos total) | MP4 or MOV · ≤ 200 MB · 2–30 s · 24–60 FPS | Source video to extend (required). {"type":"video_url","video_url":{"url":"https://..."}} |
| text | 1 | — | Extension instructions — must include an extension cue such as "continue" or "extend forward". {"type":"text","text":"..."} |
| image_url | 30 | JPG, PNG, WEBP · ≤ 30 MB | Optional style / reference image. {"type":"image_url","image_url":{"url":"https://..."}} |
| audio_url | 10 | WAV or MP3 · ≤ 15 MB · 2–30 s | Optional reference audio. {"type":"audio_url","audio_url":{"url":"https://..."}} |
In-Prompt Directives (optional)
Seedance 2.5 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true locks the camera; false allows camera motion. |
Example Request
{
"content": [
{"type": "text", "text": "Continue Video 1: the camera pulls back to reveal the whole valley, keeping the colour palette of Image 1 and ending on the composition in Image 2. --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": "adaptive",
"duration": 11,
"watermark": false
}
Response
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "seedance-2-5",
"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-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "seedance-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "seedance-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/seedance-2-5_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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.5 API Pricing — Per-Second Rates
Seedance 2.5 is the newest generation: up to 30-second output, up to 50 multimodal reference assets, native multilingual audio, and video extension. 480p/720p only.
| Resolution | Price (USD) |
|---|---|
| 480p | $0.103/sec |
| 720p | $0.231/sec |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1+ text item | Input content array. Pass a single text item: {"type":"text","text":"…"}. |
content[].type | Yes | string | — | "text" | Content item type. |
content[].text | Yes | string | — | Recommended: under 1000 words | Prompt describing the desired video. English, Japanese, Indonesian, Spanish, and Portuguese prompts are supported. |
tools | No | array | — | [{"type":"web_search"}] | Optional enhancement — text-to-video only. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available. |
duration | No | integer | 5 | 4–15, or -1 (auto) | Output video length in seconds. Set -1 to let the model pick the best length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Billing is per second of actual output video, rounded up to the next whole second — clips typically run ~0.1s over the requested duration, so a 5-second request usually bills 6 seconds. The JSON resolution field takes precedence over a --resolution text directive in the prompt; if omitted, the default is 720p (billed at the 720p rate). Set "resolution": "480p" in the JSON body for the 480p rate.
Content Item Types
| Type | Format | Description |
|---|---|---|
| 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.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.
| Resolution | Price (USD) |
|---|---|
| 480p | |
| 720p |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 or 2 image_url; optional text | First-frame (1 image) or first+last-frame (2 images) mode. |
content[].type | Yes | string | — | "text", "image_url" | Content item type. |
content[].text | No | string | — | Recommended: under 1000 words | Optional motion guidance prompt. |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; under 30 MB; 300–6000 px per side | Upload the image your video starts from — it becomes the first frame, then motion is added. JPG, PNG or WebP; under 30 MB. |
content[].role | Required when 2 images | string | "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. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available. |
duration | No | integer | 5 | 4–15, or -1 (auto) | Output video length in seconds. Set -1 to let the model pick the best length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Billing is per second of actual output video, rounded up to the next whole second — clips typically run ~0.1s over the requested duration, so a 5-second request usually bills 6 seconds. The JSON resolution field takes precedence over a --resolution text directive in the prompt; if omitted, the default is 720p (billed at the 720p rate). Set "resolution": "480p" in the JSON body for the 480p rate.
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image_url | 2 | JPG, PNG, WEBP · < 30 MB each | 1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}} |
| text | 1 | — | Optional motion/style prompt. {"type":"text","text":"..."} |
In-Prompt Directives (optional)
Seedance 2.0 Mini also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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_url | — | Not accepted on this route (rejected with 400). |
audio_url | — | Not accepted on this route (rejected with 400). |
Image Constraints (per image_url item)
| Constraint | Value |
|---|---|
| Format | The 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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Mini API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 480p | |
| 720p |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | optional text + at least one image_url or video_url (audio_url cannot be the only reference); ordered text → images → videos → audio | Multimodal reference input. |
content[].type | Yes | string | — | "text", "image_url", "video_url", "audio_url" | Content item type. |
content[].text | No | string | — | Recommended: under 1000 words; may include @image1 / @video1 / @audio1 refs | Prompt with optional reference handles. |
content[].image_url.url | Conditional | string | — | URL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; under 30 MB each | Upload up to 9 reference images the model takes style or subject cues from, to keep your result consistent. JPG, PNG or WebP; under 30 MB each. |
content[].video_url.url | Conditional | string | — | URL or asset://<ID>; mp4/mov; max 200 MB each; 2–15 s each, 15 s combined | Upload up to 3 reference videos the model takes motion or style cues from. MP4; under 50 MB each; up to 15 seconds total. |
content[].audio_url.url | Conditional | string | — | URL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB each; 2–15 s each, 15 s combined | Upload up to 3 audio clips as a reference. MP3 or WAV; under 15 MB each; up to 15 seconds total. |
content[].role | Required on refs | string | — | "reference_image", "reference_video", "reference_audio" | Asset role designation. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available. |
duration | No | integer | 5 | 4–15, or -1 (auto) | Output video length in seconds. Set -1 to let the model pick the best length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Billing is per second of actual output video, rounded up to the next whole second — clips typically run ~0.1s over the requested duration, so a 5-second request usually bills 6 seconds. The JSON resolution field takes precedence over a --resolution text directive in the prompt; if omitted, the default is 720p (billed at the 720p rate). Set "resolution": "480p" in the JSON body for the 480p rate.
Content Item Types & Limits
| Type | Max count | Format / Size | Description |
|---|---|---|---|
| image_url | up to 9 | JPG, PNG, WEBP · < 30 MB each | Reference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}} |
| video_url | up to 3 | MP4 · < 50 MB each · ≤ 15s combined | Reference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}} |
| audio_url | up to 3 | MP3, WAV · ≤ 15s combined · < 15 MB | Reference audio for audio-driven generation & lip-sync. Requires at least one image or video reference. {"type":"audio_url","audio_url":{"url":"https://..."}} |
| text | 1 | — | Prompt. 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Mini API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 480p | |
| 720p |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 text + 1 image_url + 1 video_url | Edit instruction + reference object image + video to edit. |
content[].type | Yes | string | — | "text", "image_url", "video_url" | Content item type. |
content[].text | Yes | string | — | Recommended: under 1000 words; may use @image1 / @video1 | Edit instruction with reference handles. |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; under 30 MB | Upload an image of the object, character, or scene to bring into the edited video. JPG, PNG or WebP; under 30 MB. |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov; max 200 MB; 2–15 s | Upload the video you want to edit. MP4; under 50 MB; 2–15 seconds. |
content[].role | No | string | auto-assigned | "reference_image", "reference_video" | Asset role. The gateway sets it automatically from the item type; any value you send is overwritten. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Mini variant supports 480p and 720p only — 1080p and 4k are not available. |
duration | No | integer | 5 | 4–15, or -1 (auto) | Output video length in seconds. Set -1 to let the model pick the best length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Billing is per second of actual output video, rounded up to the next whole second — clips typically run ~0.1s over the requested duration, so a 5-second request usually bills 6 seconds. The JSON resolution field takes precedence over a --resolution text directive in the prompt; if omitted, the default is 720p (billed at the 720p rate). Set "resolution": "480p" in the JSON body for the 480p rate.
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video_url | 1 | MP4 · < 50 MB | Source video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}} |
| text | 1 | — | Edit instructions. {"type":"text","text":"..."} |
| image_url | 1 | JPG, PNG, WEBP · < 30 MB | Optional 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Mini API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 480p | |
| 720p |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 text item | Input content array. Pass a single text item: {"type":"text","text":"…"}. |
content[].type | Yes | string | — | "text" | Content item type. |
content[].text | Yes | string | — | Recommended: under 1000 words | Prompt describing the desired video. English, Japanese, Indonesian, Spanish and Portuguese are supported. |
tools | No | array | — | [{"type":"web_search"}] | Optional enhancement — text-to-video only. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p", "1080p", "4k" | Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC). |
duration | No | integer | 5 | 4–15, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model pick a suitable length. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Format | Description |
|---|---|---|
| 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p / 4k). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.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.
| Resolution | Price (USD) |
|---|---|
| 480p | $0.07/sec |
| 720p | $0.1512/sec |
| 1080p | $0.3742/sec |
| 4k | $0.7776/sec |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 or 2 image_url; optional text | First-frame (1 image) or first+last-frame (2 images) mode. |
content[].type | Yes | string | — | "text", "image_url" | Content item type. |
content[].text | No | string | — | Recommended: under 1000 words | Optional motion guidance prompt. |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per side | Upload the image your video starts from — it becomes the first frame, then motion is added. JPG, PNG or WebP; under 30 MB. |
content[].role | Required when 2 images | string | "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. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p", "1080p", "4k" | Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC). |
duration | No | integer | 5 | 4–15, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model pick a suitable length. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image_url | 2 | JPG, PNG, WEBP · < 30 MB each | 1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}} |
| text | 1 | — | Optional motion/style prompt. {"type":"text","text":"..."} |
In-Prompt Directives (optional)
Seedance 2.0 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p / 4k). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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_url | — | Not accepted on this route (rejected with 400). |
audio_url | — | Not accepted on this route (rejected with 400). |
Image Constraints (per image_url item)
| Constraint | Value |
|---|---|
| Format | The 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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 480p | $0.07/sec |
| 720p | $0.1512/sec |
| 1080p | $0.3742/sec |
| 4k | $0.7776/sec |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | optional text + 1–9 images and/or 1–3 videos + 0–3 audio (audio cannot be the only reference) | Multimodal reference input. |
content[].type | Yes | string | — | "text", "image_url", "video_url", "audio_url" | Content item type. |
content[].text | No | string | — | Recommended: under 1000 words | Prompt; refer to uploads by order, e.g. "Image 1", "Video 1". |
content[].image_url.url | Conditional | string | — | URL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per side | Upload up to 9 reference images the model takes style or subject cues from, to keep your result consistent. JPG, PNG or WebP; under 30 MB each. |
content[].video_url.url | Conditional | string | — | URL or asset://<ID>; mp4/mov; max 200 MB each; 2–15 s each, combined max 15 s; 24–60 FPS | Upload up to 3 reference videos the model takes motion or style cues from. MP4; under 50 MB each; up to 15 seconds total. |
content[].audio_url.url | Conditional | string | — | URL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB each; 2–15 s each, combined max 15 s | Upload up to 3 audio clips as a reference. MP3 or WAV; under 15 MB each; up to 15 seconds total. |
content[].role | Required on refs | string | — | "reference_image", "reference_video", "reference_audio" | Asset role designation. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p", "1080p", "4k" | Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC). |
duration | No | integer | 5 | 4–15, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model pick a suitable length. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types & Limits
| Type | Max count | Format / Size | Description |
|---|---|---|---|
| image_url | up to 9 | JPG, PNG, WEBP · < 30 MB each | Reference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}} |
| video_url | up to 3 | MP4 · < 50 MB each · ≤ 15s combined | Reference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}} |
| audio_url | up to 3 | MP3, WAV · ≤ 15s combined · < 15 MB | Reference audio for audio-driven generation & lip-sync. Requires at least one image or video reference. {"type":"audio_url","audio_url":{"url":"https://..."}} |
| text | 1 | — | Prompt. 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p / 4k). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 480p | $0.0957/sec |
| 720p | $0.2148/sec |
| 1080p | $0.483/sec |
| 4k | $1.932/sec |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 text + 1 image_url + 1 video_url | Edit instruction + reference object image + video to edit. |
content[].type | Yes | string | — | "text", "image_url", "video_url" | Content item type. |
content[].text | Yes | string | — | Recommended: under 1000 words | Edit instruction; refer to uploads by order, e.g. "Image 1", "Video 1". |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB; 300–6000 px per side | Upload an image of the object, character, or scene to bring into the edited video. JPG, PNG or WebP; under 30 MB. |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov; max 200 MB; 2–15 s; 24–60 FPS | Upload the video you want to edit. MP4; under 50 MB; 2–15 seconds. |
content[].role | No | string | auto-assigned | "reference_image", "reference_video" | Asset role. The gateway sets it automatically from the item type; any value you send is overwritten. |
ratio | No | string | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p", "1080p", "4k" | Output resolution. Higher resolutions take longer to render. 4k output is 10-bit H.265 (HEVC). |
duration | No | integer | 5 | 4–15, or -1 (model auto-selects) | Output video length in seconds. Use -1 to let the model pick a suitable length. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add an "AI Generated" watermark to the bottom-right corner of the output video. |
return_last_frame | No | boolean | false | true, false | Also 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_after | No | integer | 172800 | 3600–259200 | Task expiry window in seconds, counted from task creation. Tasks still queued or running past this limit are marked expired. |
priority | No | integer | 0 | 0–9 | Queue priority. Higher values are dequeued first within your endpoint; running tasks are never interrupted. |
safety_identifier | No | string | — | string, max 64 characters | Stable, anonymized end-user ID (for example a hash of the username) that helps the provider detect policy-violating usage. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video_url | 1 | MP4 · < 50 MB | Source video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}} |
| text | 1 | — | Edit instructions. {"type":"text","text":"..."} |
| image_url | 1 | JPG, PNG, WEBP · < 30 MB | Optional 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p / 4k). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 480p | $0.0957/sec |
| 720p | $0.2148/sec |
| 1080p | $0.483/sec |
| 4k | $1.932/sec |
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1+ text item | Input content array. Pass a single text item: {"type":"text","text":"…"}. |
content[].type | Yes | string | — | "text" | Content item type. |
content[].text | Yes | string | — | Max 500 Chinese / 1000 English words | Prompt describing the desired video. |
tools | No | array | — | [{"type":"web_search"}] | Optional enhancement — text-to-video only. |
ratio | No | string | "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. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15, or -1 for auto | Output video length in seconds. Use -1 to let the model choose the length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Content Item Types
| Type | Format | Description |
|---|---|---|
| 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p on the Fast variant). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Fast API Pricing
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.
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 or 2 image_url; optional text | First-frame (1 image) or first+last-frame (2 images) mode. |
content[].type | Yes | string | — | "text", "image_url" | Content item type. |
content[].text | No | string | — | Max 500 Chinese / 1000 English words | Optional motion guidance prompt. |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; 300–6000 px; max 30 MB | Upload the image your video starts from — it becomes the first frame, then motion is added. JPG, PNG or WebP; under 30 MB. |
content[].role | No | string | auto-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. |
ratio | No | string | "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. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15, or -1 for auto | Output video length in seconds. Use -1 to let the model choose the length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image_url | 2 | JPG, PNG, WEBP · < 30 MB each | 1st = first frame (required); 2nd = last frame (optional). {"type":"image_url","image_url":{"url":"https://..."}} |
| text | 1 | — | Optional motion/style prompt. {"type":"text","text":"..."} |
In-Prompt Directives (optional)
Seedance 2.0 also accepts space-separated flags appended to the text prompt. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p on the Fast variant). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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_url | — | Not accepted on this route (rejected with 400). |
audio_url | — | Not accepted on this route (rejected with 400). |
Image Constraints (per image_url item)
| Constraint | Value |
|---|---|
| Format | The 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:9 | 864×496 | 1280×720 |
4:3 | 752×560 | 1112×834 |
1:1 | 640×640 | 960×960 |
3:4 | 560×752 | 834×1112 |
9:16 | 496×864 | 720×1280 |
21:9 | 992×432 | 1470×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-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Fast API Pricing
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | optional text + at least one of {image_url, video_url, audio_url}; ordered text → images → videos → audio | Multimodal reference input. |
content[].type | Yes | string | — | "text", "image_url", "video_url", "audio_url" | Content item type. |
content[].text | No | string | — | Max 500 Chinese / 1000 English words; may include @image1 / @video1 / @audio1 refs | Prompt with optional reference handles. |
content[].image_url.url | Conditional | string | — | URL, base64 data URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB | Upload up to 9 reference images the model takes style or subject cues from, to keep your result consistent. JPG, PNG or WebP; under 30 MB each. |
content[].video_url.url | Conditional | string | — | URL or asset://<ID>; mp4/mov; max 200 MB; 2–15 s each, ≤15 s total | Upload up to 3 reference videos the model takes motion or style cues from. MP4; under 50 MB each; up to 15 seconds total. |
content[].audio_url.url | Conditional | string | — | URL, base64 URI, or asset://<ID>; wav/mp3; 2–15 s each, ≤15 s total; max 15 MB | Upload up to 3 audio clips as a reference. MP3 or WAV; under 15 MB each; up to 15 seconds total. Audio alone won't work — add at least one image or video. |
content[].role | No | string | auto-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. |
ratio | No | string | "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. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15, or -1 for auto | Output video length in seconds. Use -1 to let the model choose the length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Content Item Types & Limits
| Type | Max count | Format / Size | Description |
|---|---|---|---|
| image_url | up to 9 | JPG, PNG, WEBP · < 30 MB each | Reference image for character consistency, style, or composition. {"type":"image_url","image_url":{"url":"https://..."}} |
| video_url | up to 3 | MP4 · < 50 MB each · ≤ 15s combined | Reference video for motion / style transfer. {"type":"video_url","video_url":{"url":"https://..."}} |
| audio_url | up to 3 | MP3, WAV · ≤ 15s combined · < 15 MB | Reference audio for audio-driven generation & lip-sync. Requires at least one image or video reference. {"type":"audio_url","audio_url":{"url":"https://..."}} |
| text | 1 | — | Prompt. 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p on the Fast variant). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Fast API Pricing
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:
- Send your request to the URL below, including your API key.
- You instantly get back a
request_idand a status link. Your video is then created in the background (this takes a little time). - 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.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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 ID —
asset://<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 |
|---|---|---|---|---|---|
content | Yes | array | — | 1 video_url + optional text + optional image_url | The video to edit, plus an optional edit instruction and optional reference object image. |
content[].type | Yes | string | — | "text", "image_url", "video_url" | Content item type. |
content[].text | No | string | — | Max 500 Chinese / 1000 English words; may use @image1 / @video1 | Edit instruction with reference handles (strongly recommended). |
content[].image_url.url | No | string | — | URL, base64 URI, or asset://<ID>; jpeg/png/webp/bmp/tiff/gif/heic/heif; max 30 MB | Optional. Upload an image of an object, character, or scene to bring into the edited video. JPG, PNG or WebP; under 30 MB. |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov; max 200 MB; 2–15 s | Upload the video you want to edit. MP4; under 50 MB; 2–15 seconds. |
content[].role | No | string | auto-assigned | "reference_image", "reference_video" | Asset role. The gateway sets it automatically from the item type; any value you send is overwritten. |
ratio | No | string | "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. |
resolution | No | string | "720p" | "480p", "720p" | Output resolution. The Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15, or -1 for auto | Output video length in seconds. Use -1 to let the model choose the length automatically. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio along with the video. |
watermark | No | boolean | false | true, false | Add a watermark to the output video. |
Content Item Types
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video_url | 1 | MP4 · < 50 MB | Source video to edit (required). {"type":"video_url","video_url":{"url":"https://..."}} |
| text | 1 | — | Edit instructions. {"type":"text","text":"..."} |
| image_url | 1 | JPG, PNG, WEBP · < 30 MB | Optional 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. If the matching JSON field is also present, the JSON field takes precedence and the directive is ignored.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 720p | Output resolution (480p / 720p on the Fast variant). |
--seed | --seed 42 | Reproducible seed. |
--framepersecond | --framepersecond 24 | Output frame rate (fps). |
--camerafixed | --camerafixed false | true 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 2.0 Fast API Pricing
Seedance 1.0 Pro API Documentation
https://gateway.pixazo.ai/byteplus/v1/generateImage2VideoTask
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | seedance-1-0-pro-250528 | The Seedance model ID. Use seedance-1-0-pro-250528 for Seedance 1.0 Pro image-to-video generation. |
| text | Yes | string | — | — | Prompt describing the desired motion. Control knobs can be embedded inline: --ratio, --resolution, --duration, --watermark, --seed, --camerafixed (see below). |
| image_url | Yes | string | — | — | Publicly accessible HTTPS URL of the source image used as the first frame of the video. |
| resolution | No | string | 720p | 480p, 720p, 1080p | Output resolution of the video. Appended to the prompt as --resolution when not already present. Higher resolutions cost more and take longer to generate. |
| duration | No | integer | 5 | 2–12 | Video duration in seconds (integers only). Appended to the prompt as --duration when not already present. |
| framepersecond | No | integer | 24 | 24 | Frame rate of the generated video. Seedance 1.0 Pro renders at a fixed 24 fps. |
| watermark | No | boolean | false | true, false | Whether the video carries an "AI Generated" watermark in the lower-right corner. |
| seed | No | integer | -1 | -1 to 4294967295 | Seed 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. |
| camerafixed | No | boolean | false | true, false | Whether to lock the camera position. When true, a fixed-camera instruction is appended to the prompt (result not guaranteed). |
| callback_url | No | string | — | — | Publicly 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. | |||||
| --ratio | No | string | adaptive | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive | Aspect 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. |
| --resolution | No | string | 720p | 480p, 720p, 1080p | Inline form of resolution. Abbreviation: --rs. |
| --duration | No | integer | 5 | 2–12 | Inline form of duration. Abbreviation: --dur. |
| --watermark | No | boolean | false | true, false | Inline form of watermark. Abbreviation: --wm. |
| --seed | No | integer | -1 | -1 to 4294967295 | Inline form of seed. |
| --camerafixed | No | boolean | false | true, false | Inline 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
| X-Webhook-URL | Optional callback URL |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type (video/mp4) |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 1.0 Pro API Pricing
Seedance 1.0 Pro API Documentation
https://gateway.pixazo.ai/byteplus/v1/generateVideoTask
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your 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
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (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-Mode | No | terminal | terminal — 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
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin 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
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | seedance-1-0-pro-250528 | The Seedance model ID. Use seedance-1-0-pro-250528 for Seedance 1.0 Pro text-to-video generation. |
| text | Yes | string | — | — | Prompt describing the video to generate. Control knobs can be embedded inline: --ratio, --resolution, --duration, --watermark, --seed, --camerafixed (see below). |
| resolution | No | string | 720p | 480p, 720p, 1080p | Output resolution of the video. Appended to the prompt as --resolution when not already present. Higher resolutions cost more and take longer to generate. |
| duration | No | integer | 5 | 2–12 | Video duration in seconds (integers only). Appended to the prompt as --duration when not already present. |
| framepersecond | No | integer | 24 | 24 | Frame rate of the generated video. Seedance 1.0 Pro renders at a fixed 24 fps. |
| watermark | No | boolean | false | true, false | Whether the video carries an "AI Generated" watermark in the lower-right corner. |
| seed | No | integer | -1 | -1 to 4294967295 | Seed 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. |
| camerafixed | No | boolean | false | true, false | Whether to lock the camera position. When true, a fixed-camera instruction is appended to the prompt (result not guaranteed). |
| callback_url | No | string | — | — | Publicly 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. | |||||
| --ratio | No | string | 16:9 | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 | Aspect 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. |
| --resolution | No | string | 720p | 480p, 720p, 1080p | Inline form of resolution. Abbreviation: --rs. |
| --duration | No | integer | 5 | 2–12 | Inline form of duration. Abbreviation: --dur. |
| --watermark | No | boolean | false | true, false | Inline form of watermark. Abbreviation: --wm. |
| --seed | No | integer | -1 | -1 to 4294967295 | Inline form of seed. |
| --camerafixed | No | boolean | false | true, false | Inline 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
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
| X-Webhook-URL | Optional callback URL |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal 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
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type (video/mp4) |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Seedance 1.0 Pro API Pricing
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.
