PixVerse V6 API, PixVerse C1 API, PixVerse V5.6 & Lipsync API: Pricing, Documentation
by Pixverse
Pixverse delivers powerful AI video generation capabilities designed for creating engaging, shareable video content. Through Pixazo's API, developers can generate videos from text and images with focus on visual appeal and motion quality. The API is optimized for social media and marketing use cases, producing videos that capture attention and drive engagement across digital platforms.

Models Version
Get 10% Cashback on Your First Payment (up to $500)
Add funds and get 10% cashback on your first payment (up to $500).
Pixverse v6 API Documentation
https://gateway.pixazo.ai/pixverse-v6-text-to-video/v1/pixverse-v6-text-to-video-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
PixVerse v6 Text to Video generate request
Request Code
POST https://gateway.pixazo.ai/pixverse-v6-text-to-video/v1/pixverse-v6-text-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"negative_prompt": "blurry, low quality, pixelated",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"style": "cyberpunk",
"generate_audio_switch": true
}
import requests
url = "https://gateway.pixazo.ai/pixverse-v6-text-to-video/v1/pixverse-v6-text-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"negative_prompt": "blurry, low quality, pixelated",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"style": "cyberpunk",
"generate_audio_switch": true
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/pixverse-v6-text-to-video/v1/pixverse-v6-text-to-video-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"negative_prompt": "blurry, low quality, pixelated",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"style": "cyberpunk",
"generate_audio_switch": true
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/pixverse-v6-text-to-video/v1/pixverse-v6-text-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"negative_prompt": "blurry, low quality, pixelated",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"style": "cyberpunk",
"generate_audio_switch": true
}'
Output
{
"request_id": "pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-v6-text-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-v6-text-to-video_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": "pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-v6-text-to-video",
"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 - PixVerse v6 Text to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text prompt describing the video to generate — include subject, action, camera movement, lighting and mood. Limited to 2048 UTF-8 encoded bytes. |
| aspect_ratio | No | string | 16:9 | 16:9, 4:3, 1:1, 3:4, 9:16, 2:3, 3:2, 21:9 | Aspect ratio of the generated video. |
| resolution | No | string | 720p | 360p, 540p, 720p, 1080p | Resolution of the generated video. |
| duration | No | integer | 5 | 1–15 (seconds) | Duration of the generated video in seconds. PixVerse v6 supports 1 to 15 seconds. |
| negative_prompt | No | string | "" (empty) | — | Describes undesired elements to exclude from the output (e.g. blurry, low quality). Limited to 2048 UTF-8 encoded bytes. |
| style | No | string | — | anime, 3d_animation, clay, comic, cyberpunk | Visual style of the generated video. Omit for the default realistic look. |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. The same seed with the same prompt and model version reproduces the same video; leave it empty for a different result each time. |
| generate_audio_switch | No | boolean | false | true, false | Enable audio generation (BGM, SFX and dialogue) alongside the video. Increases the cost per second. |
| generate_multi_clip_switch | No | boolean | false | true, false | Enable multi-clip generation with dynamic camera changes for more cinematic sequences. |
| thinking_type | No | string | — | enabled, disabled, auto | Prompt optimization mode: enabled to optimize the prompt, disabled to turn optimization off, auto to let the model decide. When omitted, the provider default applies. |
Example Request
{
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"negative_prompt": "blurry, low quality, pixelated",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"style": "cyberpunk",
"generate_audio_switch": true
}
Response
{
"request_id": "pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_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 'pixverse-v6-text-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-v6-text-to-video",
"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/pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-v6-text-to-video",
"error": null,
"output": { "media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-v6-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"], "media_type": "video/mp4" },
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00: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 | 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.
Pixverse v6 API Pricing
| Resolution | Audio | Price (USD) |
|---|---|---|
| 360p | Off | $0.025 per second |
| 360p | On | $0.035 per second |
| 540p | Off | $0.035 per second |
| 540p | On | $0.045 per second |
| 720p | Off | $0.045 per second |
| 720p | On | $0.06 per second |
| 1080p | Off | $0.09 per second |
| 1080p | On | $0.115 per second |
Pixverse v6 API Documentation
https://gateway.pixazo.ai/pixverse-v6-image-to-video/v1/pixverse-v6-image-to-video-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
PixVerse V6 Image to Video generate request - PixVerse V6 Image to Video
Request Code
POST /pixverse-v6-image-to-video-request HTTP/1.1
Host: gateway.pixazo.ai
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A gentle snowfall begins around the snow-covered tree, with soft flakes drifting down while the branches sway slightly in the winter breeze. The camera slowly orbits the tree, cinematic, peaceful winter atmosphere.",
"resolution": "720p",
"duration": 5,
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}
import requests
url = "https://gateway.pixazo.ai/pixverse-v6-image-to-video/v1/pixverse-v6-image-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A gentle snowfall begins around the snow-covered tree, with soft flakes drifting down while the branches sway slightly in the winter breeze. The camera slowly orbits the tree, cinematic, peaceful winter atmosphere.",
"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/pixverse-v6-image-to-video/v1/pixverse-v6-image-to-video-request';
const data = {
prompt: 'A gentle snowfall begins around the snow-covered tree, with soft flakes drifting down while the branches sway slightly in the winter breeze. The camera slowly orbits the tree, cinematic, peaceful winter atmosphere.',
resolution: '720p',
duration: 5,
image_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png'
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
},
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/pixverse-v6-image-to-video/v1/pixverse-v6-image-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A gentle snowfall begins around the snow-covered tree, with soft flakes drifting down while the branches sway slightly in the winter breeze. The camera slowly orbits the tree, cinematic, peaceful winter atmosphere.",
"resolution": "720p",
"duration": 5,
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}'
Output
{
"request_id": "pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-v6-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-v6-image-to-video_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": "pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-v6-image-to-video",
"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 - PixVerse V6 Image to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text prompt describing the desired motion and atmosphere for the animated image — include camera movement, lighting and mood. Limited to 2048 UTF-8 encoded bytes. |
| image_url | Yes | string | — | — | URL of the image to use as the first frame of the video. Must be a publicly reachable HTTP/HTTPS link to a JPEG, PNG or WebP image. |
| resolution | No | string | 720p | 360p, 540p, 720p, 1080p | Resolution of the generated video. |
| duration | No | integer | 5 | 1–15 (seconds) | Duration of the generated video in seconds. PixVerse v6 supports 1 to 15 seconds. |
| negative_prompt | No | string | "" (empty) | — | Describes undesired elements to exclude from the output (e.g. blurry, low quality). Limited to 2048 UTF-8 encoded bytes. |
| style | No | string | — | anime, 3d_animation, clay, comic, cyberpunk | Visual style of the generated video. Omit for the default realistic look. |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. The same seed with the same prompt and model version reproduces the same video; leave it empty for a different result each time. |
| generate_audio_switch | No | boolean | false | true, false | Enable audio generation (BGM, SFX and dialogue) alongside the video. Increases the cost per second. |
| generate_multi_clip_switch | No | boolean | false | true, false | Enable multi-clip generation with dynamic camera changes for more cinematic sequences. |
| thinking_type | No | string | — | enabled, disabled, auto | Prompt optimization mode: enabled to optimize the prompt, disabled to turn optimization off, auto to let the model decide. When omitted, the provider default applies. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | Input image to animate. |
Minimum Request
{
"prompt": "A gentle snowfall begins around the snow-covered tree, with soft flakes drifting down while the branches sway slightly in the winter breeze. The camera slowly orbits the tree, cinematic, peaceful winter atmosphere.",
"resolution": "720p",
"duration": 5,
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}
Full Request (all options)
{
"prompt": "A gentle snowfall begins around the snow-covered tree, with soft flakes drifting down while the branches sway slightly in the winter breeze. The camera slowly orbits the tree, cinematic, peaceful winter atmosphere.",
"resolution": "720p",
"duration": 5,
"negative_prompt": "blurry, low quality, low resolution, pixelated, noisy, grainy, out of focus, poorly lit, poorly exposed, poorly composed, poorly framed, poorly cropped, poorly color corrected, poorly color graded",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
}
Response
{
"request_id": "pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/pixverse-v6-image-to-video_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 for PixVerse V6 Image to Video generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 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 'pixverse-v6-image-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-v6-image-to-video",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET /v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"/v2/requests/status/pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "pixverse-v6-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-v6-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-v6-image-to-video_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00: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.
Pixverse v6 API Pricing
| Resolution | Audio | Price (USD) |
|---|---|---|
| 360p | Off | $0.025 per second |
| 360p | On | $0.035 per second |
| 540p | Off | $0.035 per second |
| 540p | On | $0.045 per second |
| 720p | Off | $0.045 per second |
| 720p | On | $0.06 per second |
| 1080p | Off | $0.09 per second |
| 1080p | On | $0.115 per second |
Pixverse c1 API Documentation
https://gateway.pixazo.ai/pixverse-c1-text-to-video/v1/pixverse-c1-text-to-video-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
PixVerse C1 Text to Video generate request
Request Code
POST https://gateway.pixazo.ai/pixverse-c1-text-to-video/v1/pixverse-c1-text-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}
import requests
url = "https://gateway.pixazo.ai/pixverse-c1-text-to-video/v1/pixverse-c1-text-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/pixverse-c1-text-to-video/v1/pixverse-c1-text-to-video-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
};
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/pixverse-c1-text-to-video/v1/pixverse-c1-text-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}'
Output
{
"request_id": "pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-c1-text-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-c1-text-to-video_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": "pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-c1-text-to-video",
"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 - PixVerse C1 Text to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text description of the video to generate. Limited to 2048 UTF-8 bytes — emoji and non-Latin or accented characters use several bytes each, so a visually short prompt can exceed the cap. Be detailed for best results. |
| aspect_ratio | No | enum | "16:9" | "16:9", "4:3", "1:1", "3:4", "9:16", "2:3", "3:2", "21:9" | Aspect ratio of the generated video. |
| resolution | No | enum | "720p" | "360p", "540p", "720p", "1080p" | Resolution of the generated video. Pricing varies by resolution. |
| duration | No | integer | 5 | 1–15 (seconds) | Duration of the generated video in seconds. Must be between 1 and 15 inclusive. |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. The same seed with the same prompt and settings reproduces the same video; leave it empty for a different result each time. |
| generate_audio_switch | No | boolean | false | — | Enable native audio generation, including background music (BGM), sound effects (SFX), and dialogue. |
Example Request
{
"prompt": "A cat sitting by a window watching birds outside, warm afternoon sunlight, cinematic",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}
Response
{
"request_id": "pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_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 'pixverse-c1-text-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-c1-text-to-video",
"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/pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "pixverse-c1-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-c1-text-to-video",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-c1-text-to-video_019dxxxx/output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00: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 | 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.
Pixverse c1 API Pricing
| Resolution | Audio | Price (USD) |
|---|---|---|
| 360p | Off | $0.03 per second |
| 360p | On | $0.04 per second |
| 540p | Off | $0.04 per second |
| 540p | On | $0.05 per second |
| 720p | Off | $0.05 per second |
| 720p | On | $0.065 per second |
| 1080p | Off | $0.095 per second |
| 1080p | On | $0.12 per second |
Pixverse c1 API Documentation
https://gateway.pixazo.ai/pixverse-c1-image-to-video/v1/pixverse-c1-image-to-video-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
PixVerse C1 Image to Video generate request
Request Code
POST https://gateway.pixazo.ai/pixverse-c1-image-to-video/v1/pixverse-c1-image-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A woman warrior with her hammer walking with her glacier wolf, cinematic camera move",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/Image.jpeg",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}
import requests
url = "https://gateway.pixazo.ai/pixverse-c1-image-to-video/v1/pixverse-c1-image-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "A woman warrior with her hammer walking with her glacier wolf, cinematic camera move",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/Image.jpeg",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/pixverse-c1-image-to-video/v1/pixverse-c1-image-to-video-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "A woman warrior with her hammer walking with her glacier wolf, cinematic camera move",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/Image.jpeg",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/pixverse-c1-image-to-video/v1/pixverse-c1-image-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "A woman warrior with her hammer walking with her glacier wolf, cinematic camera move",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/Image.jpeg",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}'
Output
{
"request_id": "pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-c1-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-c1-image-to-video_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": "pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-c1-image-to-video",
"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 - PixVerse C1 Image to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text description guiding the video motion and scene evolution. Limited to 2048 UTF-8 bytes — emoji and non-Latin or accented characters use several bytes each, so a visually short prompt can exceed the cap. Be detailed for best results. |
| image_url | Yes | string | — | — | URL of the image to use as the first frame of the video. Supported formats: jpg, jpeg, png, webp, gif, avif. |
| resolution | No | enum | "720p" | "360p", "540p", "720p", "1080p" | Resolution of the generated video. Pricing varies by resolution. |
| duration | No | integer | 5 | 1–15 (seconds) | Duration of the generated video in seconds. Must be between 1 and 15 inclusive. |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. The same seed with the same prompt and settings reproduces the same video; leave it empty for a different result each time. |
| generate_audio_switch | No | boolean | false | — | Enable native audio generation, including background music (BGM), sound effects (SFX), and dialogue synchronized with the video. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | Input image to animate. |
Example Request
{
"prompt": "A woman warrior with her hammer walking with her glacier wolf, cinematic camera move",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/Image.jpeg",
"resolution": "720p",
"duration": 5,
"generate_audio_switch": true
}
Response
{
"request_id": "pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_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 'pixverse-c1-image-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-c1-image-to-video",
"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/pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "pixverse-c1-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-c1-image-to-video",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-c1-image-to-video_019dxxxx/output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00: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 | 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.
Pixverse c1 API Pricing
| Resolution | Audio | Price (USD) |
|---|---|---|
| 360p | Off | $0.03 per second |
| 360p | On | $0.04 per second |
| 540p | Off | $0.04 per second |
| 540p | On | $0.05 per second |
| 720p | Off | $0.05 per second |
| 720p | On | $0.065 per second |
| 1080p | Off | $0.095 per second |
| 1080p | On | $0.12 per second |
Pixverse v5.6 API Documentation
https://gateway.pixazo.ai/pixverse/v1/pixverse-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Pixverse generate request - Pixverse
Request Code
POST /pixverse/v1/pixverse-request HTTP/1.1
Host: gateway.pixazo.ai
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A golden sunset timelapse over a coastal city, waves crashing against the pier, seagulls flying, warm cinematic lighting, aerial drone perspective",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "5"
}
import requests
url = "https://gateway.pixazo.ai/pixverse/v1/pixverse-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A golden sunset timelapse over a coastal city, waves crashing against the pier, seagulls flying, warm cinematic lighting, aerial drone perspective",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "5"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/pixverse/v1/pixverse-request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const body = {
prompt: 'A golden sunset timelapse over a coastal city, waves crashing against the pier, seagulls flying, warm cinematic lighting, aerial drone perspective',
aspect_ratio: '16:9',
resolution: '720p',
duration: '5'
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(body)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/pixverse/v1/pixverse-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A golden sunset timelapse over a coastal city, waves crashing against the pier, seagulls flying, warm cinematic lighting, aerial drone perspective",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "5"
}'
Output
{
"request_id": "pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse_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": "pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse",
"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 - Pixverse generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Up to 2048 UTF-8 bytes | Text prompt describing the video to generate, including motion, lighting and style. Limited to 2048 UTF-8 encoded bytes (emoji and non-Latin characters use several bytes each). |
| aspect_ratio | No | string | "16:9" | "16:9", "4:3", "1:1", "3:4", "9:16" | Aspect ratio of the generated video. |
| resolution | No | string | "720p" | "360p", "540p", "720p", "1080p" | Resolution of the generated video. |
| duration | No | string | "5" | "5", "8", "10" | Duration of the generated video in seconds. 1080p videos are limited to "5" or "8". |
| negative_prompt | No | string | "" | Up to 2048 UTF-8 bytes | Describes elements to avoid in the generated video (for example: blurry, low quality, pixelated). Limited to 2048 UTF-8 encoded bytes. |
| style | No | string | — | "anime", "3d_animation", "clay", "comic", "cyberpunk" | Visual style applied to the generated video. Omit for the default realistic look. |
| seed | No | integer | — | — | The same seed with the same prompt and model version returns the same video every time. Use it for reproducible results. |
| generate_audio_switch | No | boolean | false | true, false | Enable audio generation (background music, sound effects and dialogue) in the output video. |
| thinking_type | No | string | — | "enabled", "disabled", "auto" | Prompt-optimization mode. "enabled" rewrites your prompt for better results, "disabled" turns optimization off, "auto" lets the model decide. |
Minimum Request
{
"prompt": "A golden sunset timelapse over a coastal city, waves crashing against the pier, seagulls flying, warm cinematic lighting, aerial drone perspective",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "5"
}
Full Request (all options)
{
"prompt": "A golden sunset timelapse over a coastal city, waves crashing against the pier, seagulls flying, warm cinematic lighting, aerial drone perspective",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "5",
"negative_prompt": "blurry, low quality, low resolution, pixelated, noisy, grainy, out of focus, poorly lit, poorly exposed, poorly composed, poorly framed, poorly cropped, poorly color corrected, poorly color graded"
}
Response
{
"request_id": "pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Pixverse generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 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 'pixverse' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET /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/pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "pixverse_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00: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.
Pixverse v5.6 API Pricing
| Resolution | Audio | Price (USD) |
|---|---|---|
| 360p | Off | $0.07 per second |
| 360p | On | $0.16 per second |
| 540p | Off | $0.07 per second |
| 540p | On | $0.16 per second |
| 720p | Off | $0.09 per second |
| 720p | On | $0.18 per second |
| 1080p | Off | $0.15 per second |
| 1080p | On | $0.30 per second |
Pixverse v5.6 API Documentation
https://gateway.pixazo.ai/pixverse-i2v/v1/pixverse-i2v-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Pixverse i2v generate request - Pixverse i2v
Request Code
POST https://gateway.pixazo.ai/pixverse-i2v/v1/pixverse-i2v-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A fierce dragon breathing fire across a stormy night sky, lightning flashing in the background, cinematic dark fantasy",
"resolution": "720p",
"duration": "5",
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
import requests
url = "https://gateway.pixazo.ai/pixverse-i2v/v1/pixverse-i2v-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A fierce dragon breathing fire across a stormy night sky, lightning flashing in the background, cinematic dark fantasy",
"resolution": "720p",
"duration": "5",
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/pixverse-i2v/v1/pixverse-i2v-request';
const data = {
prompt: 'A fierce dragon breathing fire across a stormy night sky, lightning flashing in the background, cinematic dark fantasy',
resolution: '720p',
duration: '5',
image_url: 'https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png'
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
},
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/pixverse-i2v/v1/pixverse-i2v-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A fierce dragon breathing fire across a stormy night sky, lightning flashing in the background, cinematic dark fantasy",
"resolution": "720p",
"duration": "5",
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}'
Output
{
"request_id": "pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-i2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-i2v_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": "pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-i2v",
"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 - Pixverse i2v generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Up to 2048 UTF-8 bytes | Text prompt describing the motion and scene to animate from the input image. Limited to 2048 UTF-8 encoded bytes (emoji and non-Latin characters use several bytes each). |
| image_url | Yes | string | — | — | URL of the image to use as the first frame of the video. Must be a publicly accessible HTTP/HTTPS link. |
| resolution | No | string | "720p" | "360p", "540p", "720p", "1080p" | Resolution of the generated video. |
| duration | No | string | "5" | "5", "8", "10" | Duration of the generated video in seconds. 1080p videos are limited to "5" or "8". |
| negative_prompt | No | string | "" | Up to 2048 UTF-8 bytes | Describes elements to avoid in the generated video (for example: blurry, low quality, pixelated). Limited to 2048 UTF-8 encoded bytes. |
| style | No | string | — | "anime", "3d_animation", "clay", "comic", "cyberpunk" | Visual style applied to the generated video. Omit for the default realistic look. |
| seed | No | integer | — | — | The same seed with the same prompt and model version returns the same video every time. Use it for reproducible results. |
| generate_audio_switch | No | boolean | false | true, false | Enable audio generation (background music, sound effects and dialogue) in the output video. |
| thinking_type | No | string | — | "enabled", "disabled", "auto" | Prompt-optimization mode. "enabled" rewrites your prompt for better results, "disabled" turns optimization off, "auto" lets the model decide. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | Input image to animate. |
Minimum Request
{
"prompt": "A fierce dragon breathing fire across a stormy night sky, lightning flashing in the background, cinematic dark fantasy",
"resolution": "720p",
"duration": "5",
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
Full Request (all options)
{
"prompt": "A fierce dragon breathing fire across a stormy night sky, lightning flashing in the background, cinematic dark fantasy",
"resolution": "720p",
"duration": "5",
"negative_prompt": "blurry, low quality, low resolution, pixelated, noisy, grainy",
"image_url": "https://imagesai.appypie.com/7686410/ZU2sxXLmgRF6dgSktn9o_017731475651251.png"
}
Response
{
"request_id": "pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Pixverse i2v generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 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 'pixverse-i2v' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-i2v",
"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/pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "pixverse-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-i2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-i2v_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00: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.
Pixverse v5.6 API Pricing
| Resolution | Audio | Price (USD) |
|---|---|---|
| 360p | Off | $0.07 per second |
| 360p | On | $0.16 per second |
| 540p | Off | $0.07 per second |
| 540p | On | $0.16 per second |
| 720p | Off | $0.09 per second |
| 720p | On | $0.18 per second |
| 1080p | Off | $0.15 per second |
| 1080p | On | $0.30 per second |
Pixverse Lipsync API Documentation
POST https://gateway.pixazo.ai/pixverse-lipsync/v1/video-to-video/lip-sync
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Video + Audio to Video - Pixverse Lipsync
Request Code
POST https://gateway.pixazo.ai/pixverse-lipsync/v1/video-to-video/lip-sync
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-17s.mp4",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/test-audio/hg_audio17.mp3",
"voice_id": "Auto"
}
import requests
url = "https://gateway.pixazo.ai/pixverse-lipsync/v1/video-to-video/lip-sync"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
payload = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-17s.mp4",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/test-audio/hg_audio17.mp3",
"voice_id": "Auto"
}
resp = requests.post(url, headers=headers, json=payload)
print(resp.json()) # { "request_id": "...", "status": "QUEUED", "polling_url": "..." }
const res = await fetch("https://gateway.pixazo.ai/pixverse-lipsync/v1/video-to-video/lip-sync", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
video_url: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-17s.mp4",
audio_url: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/test-audio/hg_audio17.mp3",
voice_id: "Auto"
})
});
const data = await res.json();
console.log(data); // { request_id, status: "QUEUED", polling_url }
curl -X POST "https://gateway.pixazo.ai/pixverse-lipsync/v1/video-to-video/lip-sync" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-17s.mp4",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/test-audio/hg_audio17.mp3",
"voice_id": "Auto"
}'
Output
{
"request_id": "pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Instead of polling, you can receive a callback when the request reaches a terminal state. Pass the webhook headers on the submit request; the gateway will POST the result to your URL.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS URL to receive the callback. Providing it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED/ERROR; sync fires on each status transition. |
Example: enable webhook
curl -X POST "https://gateway.pixazo.ai/pixverse-lipsync/v1/video-to-video/lip-sync" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.com/webhooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
--data-raw '{ "video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-17s.mp4", "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/test-audio/hg_audio17.mp3" }'
Callback Payload (success)
{
"request_id": "pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-lipsync",
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-lipsync_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
}
}
Failure callback shape
{
"request_id": "pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"error": "Failed to download the file. Please check if the URL is accessible."
}
- terminal mode delivers one callback on COMPLETED or ERROR; sync mode delivers on each status transition.
- Deliveries are keyed by
request_id— make your handler idempotent. - Respond with HTTP 200 within a few seconds; non-2xx responses are retried.
- The webhook URL must be HTTPS and publicly reachable.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| video_url | Yes | string | — | mp4, mov, webm, m4v, gif | Public HTTPS URL of the source video whose lips will be re-synced. |
| audio_url | No | string | — | mp3, ogg, wav, m4a, aac | Public HTTPS URL of the audio track to sync the lips to. If omitted, speech is generated from text via TTS. |
| voice_id | No | string | Auto | Emily, James, Isabella, Liam, Chloe, Adrian, Harper, Ava, Sophia, Julia, Mason, Jack, Oliver, Ethan, Auto | Voice used for TTS when audio_url is not provided. Auto selects a voice automatically. |
| text | No | string | — | — | Text spoken by the TTS voice when audio_url is not provided. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video | 1 | MP4, MOV · < 250 MB | Source video. |
| audio | 1 | MP3, WAV · < 250 MB | Voice / audio track. |
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-17s.mp4",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/test-audio/hg_audio17.mp3",
"voice_id": "Auto"
}
Example Response
{
"request_id": "pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Required | Description |
|---|---|---|
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| Content-Type | Yes | Must be application/json. |
| X-Webhook-URL | No | HTTPS callback URL (see Webhook section). |
Response Handling
Common status codes returned by the submit endpoint.
| Status Code | Meaning |
|---|---|
| 202 Accepted | Request queued. Returns request_id, status: "QUEUED", and polling_url. |
| 400 Bad Request | Invalid request body or unknown model. |
| 401 Unauthorized | Missing or invalid subscription key. |
| 402 Payment Required | Insufficient wallet balance. |
| 403 Forbidden | Subscription not permitted to access this API. |
| 429 Too Many Requests | Rate limit exceeded. |
| 500 Internal Server Error | Unexpected gateway error. |
Error Responses
Queue-system errors are returned at submit time; generation errors are surfaced via the status endpoint / webhook with status: "ERROR".
// 402 — insufficient balance
{ "error": "Insufficient balance", "message": "Wallet balance is too low for this request." }
// 400 — model not found / invalid body
{ "error": "Model not found", "message": "Model 'pixverse-lipsync' not found or is disabled" }
// generation failure (via status / webhook)
{ "request_id": "pixverse-lipsync_019dxxxx...", "status": "ERROR", "error": "Failed to download the input file." }
Retrieving Results
Poll the status endpoint with the request_id until status is COMPLETED (or FAILED/ERROR).
curl -X GET "https://gateway.pixazo.ai/v2/requests/status/pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"
Completed response
{
"request_id": "pixverse-lipsync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-lipsync",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixverse-lipsync_019dxxxx.../output.mp4"],
"media_type": "video/mp4"
},
"created_at": "2026-06-30T09:20:33.812Z",
"completed_at": "2026-06-30T09:22:19.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request (pixverse-lipsync). |
| error | string | null | Error message when the request fails; null otherwise. |
| output.media_url | string[] | Array of URLs to the generated lip-synced MP4 video. |
| output.media_type | string | MIME type of the output (video/mp4). |
| created_at | string | ISO-8601 timestamp when the request was created. |
| completed_at | string | ISO-8601 timestamp when the request reached a terminal state. |
| polling_url | string | URL to poll for status (returned on submit). |
Status Values & Flow
| Status | Meaning |
|---|---|
| QUEUED | Request accepted and waiting to be processed. |
| PROCESSING | The lip-sync job is running. |
| COMPLETED | Done — output.media_url contains the synced video. |
| FAILED / ERROR | Generation failed — see error. |
Typical workflow
QUEUED → PROCESSING → COMPLETED (or FAILED / ERROR). Submit the request, then poll GET /v2/requests/status/{request_id} (or use a webhook) until the status is terminal, then download the video from output.media_url.
Pixverse Lipsync API Pricing
Pixverse Music Video API Documentation
Turn a song into a music video with PixVerse Music Video, with an optional character reference, style presets, lyric subtitles, five aspect ratios and 720p or 1080p output. The video runs for the length of the audio. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url. Generation typically takes several minutes, even for a short song, and longer for long ones.
POST https://gateway.pixazo.ai/pixverse-music-video/v1/music-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Music to Video - Pixverse Music Video
Request Code
POST https://gateway.pixazo.ai/pixverse-music-video/v1/music-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/pixverse-music-video/rock_en.wav",
"style": "Cinematic",
"aspect_ratio": "16:9",
"resolution": "720p"
}import requests
url = "https://gateway.pixazo.ai/pixverse-music-video/v1/music-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/pixverse-music-video/rock_en.wav",
"style": "Cinematic",
"aspect_ratio": "16:9",
"resolution": "720p"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/pixverse-music-video/v1/music-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/pixverse-music-video/rock_en.wav",
"style": "Cinematic",
"aspect_ratio": "16:9",
"resolution": "720p"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/pixverse-music-video/v1/music-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/pixverse-music-video/rock_en.wav", "style": "Cinematic", "aspect_ratio": "16:9", "resolution": "720p"}'Output
{
"request_id": "pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/pixverse-music-video/v1/music-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/pixverse-music-video/rock_en.wav", "style": "Cinematic", "aspect_ratio": "16:9", "resolution": "720p"}'Callback Payload (success)
{
"request_id": "pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-music-video",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}Failure callback shape
{
"request_id": "pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixverse-music-video",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
audio_url | Yes | string | — | https URL; MP3, WAV, M4A, OGG or AAC; 10 seconds to 6 minutes | The song. Its length sets the video length and the price — billing is per second of this audio. Must be publicly reachable; it is fetched when the request is accepted. |
image_url | No | string | — | https URL | Character reference image to feature in the video. |
style | No | string | Cinematic | Custom, Cinematic, Lo-fi, Dreamscape, Woolen Felt, Candy, Golden Age, Voxel, Retro Game, Claymation, Woodland Tale, Impressionism, Decadence, Futuristic, Chromatic Clash, Holiday | Visual style preset. Custom takes its look from style_image_url. |
style_image_url | No | string | — | https URL | Style reference image. Only used when style is Custom. |
music_style | No | string | — | Pop, Rock, Hip Hop, R&B, Jazz, Reggae, Country, Folk, Electronic, Classical, Soul, Funk, Metal, Ambient, Others | Musical genre used to guide the visuals. |
aspect_ratio | No | string | 16:9 | 16:9, 9:16, 1:1, 4:3, 3:4 | Aspect ratio of the video. |
resolution | No | string | 720p | 720p, 1080p | Output resolution, and therefore the per-second rate. 1080p costs more per second than 720p. |
lyrics | No | string | — | up to 5,000 characters | Lyrics to display as subtitles. |
Good to know
- Exactly one music video is generated per request. There is no batch option:
num_images,n,count,batch_sizeandnumber_of_imagesare rejected. - There is no
durationfield — the audio sets the length, sodurationandsecondsare rejected. - Audio must be 10 seconds to 6 minutes. Shorter or longer audio is rejected with a
400before anything is held. - MP3, WAV or M4A audio is measured when the request is accepted. For a format that cannot be measured there (some OGG or AAC files), the hold covers the 6-minute maximum and the charge settles to the length of the video produced.
- Cost depends on the length of the audio and the resolution; the current rates are in the pricing panel on this page.
Example Request
{
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/pixverse-music-video/rock_en.wav",
"style": "Cinematic",
"aspect_ratio": "16:9",
"resolution": "720p"
}Example Response
{
"request_id": "pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — audio_url missing, audio shorter than 10 seconds or longer than 6 minutes, a duration or batch field, or an option outside its allowed values. Anything checkable from the request body alone. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Only what can be judged from the request body itself is rejected synchronously. Everything that needs an input to be fetched or the model to run is reported through the status endpoint instead, as status: "ERROR". Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
audio_url missing, or not a string | synchronous 400 |
Audio shorter than 10 seconds or longer than 6 minutes (Input too short / Input too long) | synchronous 400 |
duration, seconds or a batch field sent | synchronous 400 |
resolution, style, aspect_ratio or music_style outside its allowed values, or lyrics over 5,000 characters | synchronous 400 |
| An audio URL that is not reachable or not audio | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the video from output.media_url. Generation typically takes several minutes, even for a short song, so poll every 15–30 seconds rather than continuously.
curl 'https://gateway.pixazo.ai/v2/requests/status/pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "pixverse-music-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixverse-music-video",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-09-22T11:56:21.804Z",
"completed_at": "2026-09-22T12:01:44.210Z"
}The video runs for exactly the length of your audio and carries the song as its soundtrack: an MP4 with H.264 video and AAC audio, at the resolution and aspect ratio you asked for.
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated music video. |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is per second of the audio you submit, measured when the request is accepted and rounded up to whole seconds, at the rate for the chosen resolution — 720p by default, 1080p costs more. Style, aspect ratio, lyrics and reference images do not change the price. Audio from 10 seconds to 6 minutes is accepted; anything outside that range is rejected before anything is held. If the request fails, the hold is released in full.
The current rates are shown in the pricing panel on this page.
Pixverse Music Video API Pricing
Billed per second of the audio you submit, rounded up to whole seconds (10 seconds to 6 minutes). Style, aspect ratio, lyrics and reference images do not change the price.
| Resolution | Price (USD) |
|---|---|
| 720p (default) | $0.063 per second of audio |
| 1080p | $0.0945 per second of audio |
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.