Seedance 2.0 API, Seedance 1.0 Pro API, 1.0 Lite API - AI Video Generation APIs
by BytePlus
Seedance 2.0 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.0 Text to Video API Documentation
https://gateway.pixazo.ai/seedance-2-0/v1
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.
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 | — | 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 | "adaptive" | "16:9", "4:3", "1:1", "3:4", "9:16", "21:9", "adaptive" | Output aspect ratio. |
resolution | No | string | "720p" | "480p", "720p", "1080p" | Output resolution. Higher resolutions take longer to render. |
duration | No | integer | 5 | 4–15 | Output video length in seconds. |
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. They override the matching JSON field when both are present.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p). |
--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 Text to Video API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| 480p | 1s | $0.0711 |
| 720p | 1s | $0.1597 |
| 1080p | 1s | $0.3592 |
Seedance 2.0 Image to video API Documentation
https://gateway.pixazo.ai/seedance-2-0/v1
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.
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 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> | Frame image. |
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. |
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" | Output resolution. Higher resolutions take longer to render. |
duration | No | integer | 5 | 4–15 | Output video length in seconds. |
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. They override the matching JSON field when both are present.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p). |
--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 Image to video API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| 480p | 1s | $0.0787 |
| 720p | 1s | $0.1769 |
| 1080p | 1s | $0.3973 |
Seedance 2.0 Reference to Video (Ref Image + Ref Video + Ref Audio to Video) API Documentation
https://gateway.pixazo.ai/seedance-2-0/v1
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.
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 reference-to-video
| 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> | Image reference (up to 9). |
content[].video_url.url | Conditional | string | — | URL or asset://<ID>; mp4/mov; max 50 MB; 2–15 s | Video reference (up to 3). |
content[].audio_url.url | Conditional | string | — | URL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB | Audio reference (up to 3). |
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" | Output resolution. Higher resolutions take longer to render. |
duration | No | integer | 5 | 4–15 | Output video length in seconds. |
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 | 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. They override the matching JSON field when both are present.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p). |
--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 Reference to Video (Ref Image + Ref Video + Ref Audio to Video) API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| 480p | 1s | $0.0957 |
| 720p | 1s | $0.2148 |
| 1080p | 1s | $0.483 |
Seedance 2.0 Video to Video (Video Editing) API Documentation
https://gateway.pixazo.ai/seedance-2-0/v1
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.
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 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 | — | Max 500 Chinese / 1000 English words; may use @image1 / @video1 | Edit instruction with reference handles. |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID> | Reference object image. |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov; max 50 MB; 2–15 s | The video to be edited. |
content[].role | Yes | string | — | "reference_image", "reference_video" | Asset role. |
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" | Output resolution. Higher resolutions take longer to render. |
duration | No | integer | 5 | 4–15, or -1 to inherit source length | Output video length in seconds. Use -1 to match the source video duration. |
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. They override the matching JSON field when both are present.
| Directive | Example | Description |
|---|---|---|
--resolution | --resolution 1080p | Output resolution (480p / 720p / 1080p). |
--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 Video to Video (Video Editing) API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| 480p | 1s | $0.0957 |
| 720p | 1s | $0.2148 |
| 1080p | 1s | $0.483 |
Seedance 2.0 Fast Text to Video API Documentation
https://gateway.pixazo.ai/seedance-2-0-fast/v1
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.
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 | "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 Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15 | Output video length in seconds. |
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. They override the matching JSON field when both are present.
| 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 Text to Video API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| per_second | 1s | $0.24 |
Seedance 2.0 Fast Image to video API Documentation
https://gateway.pixazo.ai/seedance-2-0-fast/v1
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.
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 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> | Frame image. |
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. |
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 Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15 | Output video length in seconds. |
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. They override the matching JSON field when both are present.
| 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 Image to video API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| per_second | 1s | $0.24 |
Seedance 2.0 Fast Reference to Video (Ref Image + Ref Video + Ref Audio to Video) API Documentation
https://gateway.pixazo.ai/seedance-2-0-fast/v1
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.
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 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> | Image reference (up to 9). |
content[].video_url.url | Conditional | string | — | URL or asset://<ID>; mp4/mov; max 50 MB; 2–15 s | Video reference (up to 3). |
content[].audio_url.url | Conditional | string | — | URL, base64 URI, or asset://<ID>; wav/mp3; max 15 MB | Audio reference (up to 3). |
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 Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15 | Output video length in seconds. |
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 | 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. They override the matching JSON field when both are present.
| 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 Reference to Video (Ref Image + Ref Video + Ref Audio to Video) API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| per_second | 1s | $0.24 |
Seedance 2.0 Fast Video to Video (Video Editing) API Documentation
https://gateway.pixazo.ai/seedance-2-0-fast/v1
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.
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 video editing
| 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 | — | Max 500 Chinese / 1000 English words; may use @image1 / @video1 | Edit instruction with reference handles. |
content[].image_url.url | Yes | string | — | URL, base64 URI, or asset://<ID> | Reference object image. |
content[].video_url.url | Yes | string | — | URL or asset://<ID>; mp4/mov; max 50 MB; 2–15 s | The video to be edited. |
content[].role | Yes | string | — | "reference_image", "reference_video" | Asset role. |
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 Fast variant supports 480p and 720p only — 1080p is rejected by the gateway. |
duration | No | integer | 5 | 4–15, or -1 to inherit source length | Output video length in seconds. Use -1 to match the source video duration. |
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. They override the matching JSON field when both are present.
| 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 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-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 Video to Video (Video Editing) API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| per_second | 1s | $0.24 |
Seedance 1.0 Pro Image to Video API Documentation
https://gateway.pixazo.ai/byteplus/v1
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.
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 | Description |
|---|---|---|---|---|
| model | Yes | string | — | The Seedance model ID. Use "seedance-1-0-pro-250528" for image-to-video. |
| content | Yes | array | — | Array of content blocks. Must include one text block (prompt with optional inline knobs) and one image_url block (source image URL). |
| content[].type | Yes | string | — | Block type: "text" or "image_url". |
| content[].text | For text block | string | — | Prompt describing the motion. Control knobs can be embedded: --ratio, --resolution, --duration, --camerafixed. |
| content[].image_url | For image_url block | string | — | Publicly accessible HTTPS URL of the source image. |
| Inline knobs (embedded in text block): | ||||
| --ratio | No | string | 16:9 | Aspect ratio: 16:9, 9:16, 1:1, 4:3, 3:4, adaptive. |
| --resolution | No | string | 720p | Output resolution: 480p, 720p, 1080p. |
| --duration | No | number | 5 | Video duration in seconds (3–12). |
| --camerafixed | No | boolean | false | Lock camera position. |
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 Image to Video API Pricing
| Resolution | Price (USD) |
|---|---|
| All Resolution | $0.2 |
Seedance 1.0 Pro Text to Video API Documentation
https://gateway.pixazo.ai/byteplus/v1
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.
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 | Description |
|---|---|---|---|---|
| model | Yes | string | — | The Seedance model ID. Use "seedance-1-0-pro-250528" for text-to-video generation. |
| text | Yes | string | — | Prompt describing the video. Control knobs can be embedded inline: --ratio, --resolution, --duration, --camerafixed. Abbreviations: --rt, --rs, --dur, --cf. |
Inline knobs (embedded in the text field): | ||||
| --ratio | No | string | 16:9 | Aspect ratio: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive. Abbreviation: --rt. |
| --resolution | No | string | 720p (lite) / 1080p (pro) | Output resolution: 480p, 720p, 1080p. Higher = more cost and longer processing. Abbreviation: --rs. |
| --duration | No | number | 5 | Video duration in seconds. Valid range: 3–12. Abbreviation: --dur. |
| --camerafixed | No | boolean | false | Lock camera position (adds instruction to prompt). 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 Text to Video API Pricing
| Resolution | Price (USD) |
|---|---|
| All Resolution | $0.2 |
Documentation coming soon!
apiId: bytedance-text-to-image and operation: frame-to-video
