Wan 2.7 Pro API, Wan 2.6 API, Wan 2.5 API, Wan 2.2 API: Pricing, Documentation
by Alibaba
Wan 2.7 Pro API, developers can access multiple Wan versions (2.2, 2.5, 2.6) for text-to-video, image-to-video, speech-to-video, and image generation. The API provides extensive capabilities including animation and flash video generation, making it one of the most versatile video AI solutions available.
Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Wan 2.7 API Documentation
https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan 2.7 Text to Image Request - Wan 2.7 API
Request Code
POST https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequest
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequest"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
payload = {
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequest", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
},
body: JSON.stringify({
prompt: "A charming flower shop with beautiful window displays filled with colorful flowers"
})
});
const data = await response.json();
console.log(data);
curl -X POST "https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequest" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-d '{"prompt":"A charming flower shop with beautiful window displays filled with colorful flowers"}'
Output
{
"status": "QUEUED",
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"message": "Request accepted and queued for processing"
}
Webhook (Optional)
You can optionally provide a webhook_url in your request body. When the request completes (success or failure), a POST request will be sent to your webhook URL with the result payload.
Webhook Payload (Success)
{
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184/output.png"
}
],
"description": ""
}
}
Webhook Payload (Failure)
{
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Content Policy
This model enforces strict content moderation. Wan 2.7 runs on Alibaba DashScope, which applies mandatory content inspection to every request. If the prompt or any input image is flagged, the request fails with status FAILED and error code DataInspectionFailed, and no image is produced.
Requests are commonly rejected for:
- Nudity, lingerie, sexually suggestive, or otherwise NSFW prompts or imagery
- Reproducing or preserving the likeness or identity of a real person from a reference photo
- Other content prohibited by the provider usage policy (violent, hateful, illegal, and similar)
Use compliant prompts and reference images to avoid rejection.
Request Parameters - Wan 2.7 Text to Image Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | ≤ 5000 characters | Text description of the image to generate. Supports Chinese and English. |
| size | No | string | "2K" | "1K", "2K", or a custom width*height (768-2048 px per side, aspect ratio 1:8 to 8:1) | Output resolution. "1K" = 1024x1024, "2K" = 2048x2048. 4K is not available on this model — use Wan 2.7 Pro for 4K. |
| n | No | integer | 1 | 1-4 (standard), up to 12 when enable_sequential is true | Number of images to generate. Each image generated is billed separately. |
| thinking_mode | No | boolean | true | true, false | Runs the model’s thinking pass for higher-quality output; increases generation time. Applies only to text-to-image in standard (non-sequential) mode. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the bottom-right corner of the image. |
| seed | No | integer | — | 0-2147483647 | Random seed that controls the generation’s randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| enable_sequential | No | boolean | false | true, false | Enables image-set (sequential) output mode, in which the model returns a themed set of related images and n may go up to 12. |
| color_palette | No | array | — | 3-10 colors | Custom colour theme. Array of objects with hex (string, e.g. "#C2D1E6") and ratio (string, e.g. "25.00%"); the ratios must add up to 100.00%. Only available when enable_sequential is false. |
| webhook_url | No | string | — | — | URL to receive a POST callback when the request completes. Must be a publicly accessible HTTPS endpoint. |
Minimum Request
{
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers"
}
Full Request (all options)
{
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers",
"size": "2K",
"n": 2,
"thinking_mode": true,
"watermark": false,
"seed": 12345
}
Response
{
"status": "QUEUED",
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"message": "Request accepted and queued for processing"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Wan 2.7 Text to Image Request.
| Code | Meaning |
|---|---|
| 202 | Accepted - Request queued for processing |
| 400 | Bad Request - Invalid parameters or missing required fields |
| 401 | Unauthorized - Invalid or missing API key |
| 402 | Payment Required - Insufficient wallet balance |
| 403 | Forbidden - Access denied |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Internal Server Error |
Error Responses
Error responses from the queue system and status/webhook errors.
Queue System Errors
{
"error": "Invalid request: prompt is required",
"status": 400
}
{
"error": "Unauthorized: invalid or missing API key",
"status": 401
}
{
"error": "Insufficient balance. Please top up your wallet.",
"status": 402
}
{
"error": "Rate limit exceeded. Please retry after some time.",
"status": 429
}
Status / Webhook Errors
{
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
{
"error": "Request not found",
"status": 404
}
Retrieving Results
After submitting a request, use the request_id from the queued response to check the status and retrieve results.
GET /v2/requests/status/{request_id}
GET https://gateway.pixazo.ai/v2/requests/status/wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Response (Queued / Processing)
{
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"status": "PROCESSING",
"message": "Request is being processed"
}
Response (Completed)
{
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184/output.png"
}
],
"description": ""
}
}
Response (Failed)
{
"request_id": "wan-2-7-api_019d4e3f-83c5-719c-dbba-039df43078184",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Response Fields - Wan 2.7 Text to Image Request
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. Use this to poll for status. |
| status | string | Current status of the request (QUEUED, PROCESSING, COMPLETED, FAILED). |
| message | string | Human-readable status message. |
| result | object | The result payload (present when status is COMPLETED). |
| images | array | Array of generated image objects. |
| images[].file_name | string | Name of the output file. |
| images[].content_type | string | MIME type of the output file (image/png). |
| images[].url | string | A link to download the generated image. |
| description | string | Optional description returned with the response. |
| error | string | Error message (present when status is FAILED). |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request has been accepted and is waiting in the queue. |
| PROCESSING | Request is currently being processed by the AI model. |
| COMPLETED | Request finished successfully. Results are available. |
| FAILED | Request failed during processing. Check the error field for details. |
Status Flow
QUEUED --> PROCESSING --> COMPLETED
\--> FAILED
Typical Workflow
- Submit a POST request to
https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequestwith your parameters. - Receive a
202 Acceptedresponse with arequest_idand statusQUEUED. - Poll the status endpoint
GET /v2/requests/status/{request_id}periodically (e.g. every 5-10 seconds). - Retrieve the result once status is
COMPLETED. Theresultobject contains image URLs. - (Optional) Use a
webhook_urlto receive results automatically without polling.
Wan 2.7 API Pricing
Wan 2.7 API Documentation
https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan 2.7 Edit Image Request - Wan 2.7 API
Request Code
POST https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequest
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],
"prompt": "Transform the tree into a lush green tree with vibrant flowers"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequest"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
payload = {
"images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],
"prompt": "Transform the tree into a lush green tree with vibrant flowers"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequest", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
},
body: JSON.stringify({
images: ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],
prompt: "Transform the tree into a lush green tree with vibrant flowers"
})
});
const data = await response.json();
console.log(data);
curl -X POST "https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequest" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-d '{"images":["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],"prompt":"Transform the tree into a lush green tree with vibrant flowers"}'
Output
{
"status": "QUEUED",
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"message": "Request accepted and queued for processing"
}
Webhook (Optional)
You can optionally provide a webhook_url in your request body. When the request completes (success or failure), a POST request will be sent to your webhook URL with the result payload.
Webhook Payload (Success)
{
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293/output.png"
}
],
"description": ""
}
}
Webhook Payload (Failure)
{
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Content Policy
This model enforces strict content moderation. Wan 2.7 runs on Alibaba DashScope, which applies mandatory content inspection to every request. If the prompt or any input image is flagged, the request fails with status FAILED and error code DataInspectionFailed, and no image is produced.
Requests are commonly rejected for:
- Nudity, lingerie, sexually suggestive, or otherwise NSFW prompts or imagery
- Reproducing or preserving the likeness or identity of a real person from a reference photo
- Other content prohibited by the provider usage policy (violent, hateful, illegal, and similar)
Use compliant prompts and reference images to avoid rejection.
Request Parameters - Wan 2.7 Edit Image Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| images | Yes | array | — | 1-9 image URLs | Array of image URLs to edit. Formats: JPEG, JPG, PNG (no alpha channel), BMP, WEBP. 240-8000 px per side, aspect ratio 1:8 to 8:1, max 20 MB each. URLs must be publicly accessible; the array order is preserved. |
| prompt | Yes | string | — | ≤ 5000 characters | Text description of the desired edit. Supports Chinese and English. |
| size | No | string | "2K" | "1K", "2K", or a custom width*height (768-2048 px per side, aspect ratio 1:8 to 8:1) | Output resolution. "1K" = 1024x1024, "2K" = 2048x2048. 4K is not available on this model. |
| n | No | integer | 1 | 1-4 (standard), up to 12 when enable_sequential is true | Number of images to generate. Each image generated is billed separately. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the bottom-right corner of the image. |
| seed | No | integer | — | 0-2147483647 | Random seed that controls the generation’s randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| bbox_list | No | array | — | Up to 2 boxes per image | Selected areas for interactive editing. The outer array must have one entry per input image; each entry lists that image’s boxes as [x1, y1, x2, y2] pixel coordinates (top-left origin), or [] for an image you are not box-editing. |
| enable_sequential | No | boolean | false | true, false | Enables image-set (sequential) output mode, in which the model returns a themed set of related images and n may go up to 12. |
| webhook_url | No | string | — | — | URL to receive a POST callback when the request completes. Must be a publicly accessible HTTPS endpoint. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | — | JPG, PNG, WEBP · < 20 MB | Image(s) to edit. |
Minimum Request
{
"images": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
],
"prompt": "Transform the tree into a lush green tree with vibrant flowers"
}
Full Request (all options)
{
"images": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
],
"prompt": "Transform the tree into a lush green tree with vibrant flowers",
"size": "2K",
"n": 1,
"watermark": false,
"seed": 42
}
Response
{
"status": "QUEUED",
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"message": "Request accepted and queued for processing"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Wan 2.7 Edit Image Request.
| Code | Meaning |
|---|---|
| 202 | Accepted - Request queued for processing |
| 400 | Bad Request - Invalid parameters or missing required fields |
| 401 | Unauthorized - Invalid or missing API key |
| 402 | Payment Required - Insufficient wallet balance |
| 403 | Forbidden - Access denied |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Internal Server Error |
Error Responses
Error responses from the queue system and status/webhook errors.
Queue System Errors
{
"error": "Invalid request: prompt is required",
"status": 400
}
{
"error": "Unauthorized: invalid or missing API key",
"status": 401
}
{
"error": "Insufficient balance. Please top up your wallet.",
"status": 402
}
{
"error": "Rate limit exceeded. Please retry after some time.",
"status": 429
}
Status / Webhook Errors
{
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
{
"error": "Request not found",
"status": 404
}
Retrieving Results
After submitting a request, use the request_id from the queued response to check the status and retrieve results.
GET /v2/requests/status/{request_id}
GET https://gateway.pixazo.ai/v2/requests/status/wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Response (Queued / Processing)
{
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"status": "PROCESSING",
"message": "Request is being processed"
}
Response (Completed)
{
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293/output.png"
}
],
"description": ""
}
}
Response (Failed)
{
"request_id": "wan-2-7-api_019d4e44-7a8e-7df1-fad0-926fa428ca293",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Response Fields - Wan 2.7 Edit Image Request
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. Use this to poll for status. |
| status | string | Current status of the request (QUEUED, PROCESSING, COMPLETED, FAILED). |
| message | string | Human-readable status message. |
| result | object | The result payload (present when status is COMPLETED). |
| images | array | Array of generated image objects. |
| images[].file_name | string | Name of the output file. |
| images[].content_type | string | MIME type of the output file (image/png). |
| images[].url | string | A link to download the generated image. |
| description | string | Optional description returned with the response. |
| error | string | Error message (present when status is FAILED). |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request has been accepted and is waiting in the queue. |
| PROCESSING | Request is currently being processed by the AI model. |
| COMPLETED | Request finished successfully. Results are available. |
| FAILED | Request failed during processing. Check the error field for details. |
Status Flow
QUEUED --> PROCESSING --> COMPLETED
\--> FAILED
Typical Workflow
- Submit a POST request to
https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequestwith your parameters. - Receive a
202 Acceptedresponse with arequest_idand statusQUEUED. - Poll the status endpoint
GET /v2/requests/status/{request_id}periodically (e.g. every 5-10 seconds). - Retrieve the result once status is
COMPLETED. Theresultobject contains image URLs. - (Optional) Use a
webhook_urlto receive results automatically without polling.
Wan 2.7 API Pricing
Wan 2.7 API Documentation
https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoStyleRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan 2.7 Video Style Transfer Request - Wan 2.7 Video API
Request Code
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoStyleRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2v/wan-t2v-6421dc79-417c-445c-96e3-65c333aeafb9.mp4",
"prompt": "Convert to claymation style"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoStyleRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2v/wan-t2v-6421dc79-417c-445c-96e3-65c333aeafb9.mp4",
"prompt": "Convert to claymation style"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoStyleRequest';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
video_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2v/wan-t2v-6421dc79-417c-445c-96e3-65c333aeafb9.mp4',
prompt: 'Convert to claymation style'
};
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/wan-2-7-video-api/v1/generateWan27VideoStyleRequest" \
-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/wan-t2v/wan-t2v-6421dc79-417c-445c-96e3-65c333aeafb9.mp4",
"prompt": "Convert to claymation style"
}'
Output
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_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": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_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": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-7-video-api",
"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 - Wan 2.7 Video Style Transfer Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| video_url | Yes | string | — | — | URL of the source video to edit. Formats: MP4, MOV. Duration 2-10s, 240-4096 px per side, aspect ratio 1:8 to 8:1, max 100 MB. Must be publicly accessible. |
| reference_images | No | array | — | 0-4 image URLs | Optional reference images that guide the edit (for example a style or subject reference). Formats: JPEG, JPG, PNG (no alpha channel), BMP, WEBP. 240-8000 px per side, max 20 MB each. Style transfer works from the prompt alone, so this field can be omitted. |
| prompt | Yes | string | — | ≤ 5000 characters | Text instruction describing the edit you want. Supports Chinese and English. |
| negative_prompt | No | string | — | ≤ 500 characters | Describes content you do not want in the video. |
| resolution | No | string | 1080P | 720P, 1080P | Resolution tier of the output video. Also selects the per-second price tier. |
| ratio | No | string | Matches the input video | 16:9, 9:16, 1:1, 4:3, 3:4 | Aspect ratio of the output video. If omitted, the output follows the aspect ratio of the input video. |
| duration | No | integer | 0 (no truncation) | 2-10 (seconds) | Length of the output video in seconds. Leave unset to keep the full length of the source video; set a value to truncate the source from 0s to that length. |
| audio_setting | No | string | auto | auto, origin | Audio track of the output. "auto" lets the model decide from the prompt; "origin" keeps the original audio of the source video. |
| prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the lower-right corner of the video. |
| seed | No | integer | — | 0-2147483647 | Random seed that controls the generation’s randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video | 1 | MP4, MOV · < 100 MB | Source video to edit. |
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2v/wan-t2v-6421dc79-417c-445c-96e3-65c333aeafb9.mp4",
"prompt": "Convert to claymation style",
"negative_prompt": "low quality, blurry",
"resolution": "1080P",
"ratio": "16:9",
"duration": 5,
"audio_setting": "origin",
"prompt_extend": false,
"watermark": true,
"seed": 12345
}
Response
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_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. Required: $0.01"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'wan-2-7-video-api' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-7-video-api",
"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/wan-2-7-video-api_019d52bf-9ae0-7faf-594a-08e2d4e7281b0"
Response (Completed)
{
"request_id": "wan-2-7-video-api_019d52bf-9ae0-7faf-594a-08e2d4e7281b0",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_019d52bf-9ae0-7faf-594a-08e2d4e7281b0/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-03-31T07:32:03.749Z",
"updated_at": "2026-03-31T07:32:20.000Z",
"completed_at": "2026-03-31T07:32:20.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 (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.
Wan 2.7 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720P | $0.10/sec |
| 1080P | $0.15/sec |
Wan 2.7 API Documentation
https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoEditRequest
Base URL
https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoEditRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan 2.7 Video Edit By Reference Request - Wan 2.7 Video API
Request Code
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoEditRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-video.mp4",
"reference_images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-videoedit-change-clothes.png"],
"prompt": "Replace the clothes with the ones from the image"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoEditRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-video.mp4",
"reference_images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-videoedit-change-clothes.png"],
"prompt": "Replace the clothes with the ones from the image"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27VideoEditRequest';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
video_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-video.mp4',
reference_images: ['https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-videoedit-change-clothes.png'],
prompt: 'Replace the clothes with the ones from the image'
};
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/wan-2-7-video-api/v1/generateWan27VideoEditRequest" \
-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/wan2.7-video.mp4",
"reference_images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-videoedit-change-clothes.png"],
"prompt": "Replace the clothes with the ones from the image"
}'
Output
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_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": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_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": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-7-video-api",
"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 - Wan 2.7 Video Edit By Reference Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| video_url | Yes | string | — | — | URL of the source video to edit. Formats: MP4, MOV. Duration 2-10s, 240-4096 px per side, aspect ratio 1:8 to 8:1, max 100 MB. Must be publicly accessible. |
| reference_images | Yes | array | — | 1-4 image URLs | Reference images supplying the content to bring into the video (for example a garment, character or object). Formats: JPEG, JPG, PNG (no alpha channel), BMP, WEBP. 240-8000 px per side, max 20 MB each. |
| prompt | Yes | string | — | ≤ 5000 characters | Text instruction describing the edit you want. Supports Chinese and English. |
| negative_prompt | No | string | — | ≤ 500 characters | Describes content you do not want in the video. |
| resolution | No | string | 1080P | 720P, 1080P | Resolution tier of the output video. Also selects the per-second price tier. |
| ratio | No | string | Matches the input video | 16:9, 9:16, 1:1, 4:3, 3:4 | Aspect ratio of the output video. If omitted, the output follows the aspect ratio of the input video. |
| duration | No | integer | 0 (no truncation) | 2-10 (seconds) | Length of the output video in seconds. Leave unset to keep the full length of the source video; set a value to truncate the source from 0s to that length. |
| audio_setting | No | string | auto | auto, origin | Audio track of the output. "auto" lets the model decide from the prompt; "origin" keeps the original audio of the source video. |
| prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the lower-right corner of the video. |
| seed | No | integer | — | 0-2147483647 | Random seed that controls the generation’s randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video | 1 | MP4, MOV · < 100 MB | Source video to edit. |
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-video.mp4",
"reference_images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan2.7-videoedit-change-clothes.png"],
"prompt": "Replace the clothes with the ones from the image",
"negative_prompt": "low quality, blurry",
"resolution": "1080P",
"ratio": "16:9",
"duration": 5,
"audio_setting": "origin",
"prompt_extend": false,
"watermark": true,
"seed": 12345
}
Response
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_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. Required: $0.01"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'wan-2-7-video-api' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-7-video-api",
"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/wan-2-7-video-api_019d52bf-9ae0-7faf-594a-08e2d4e7281b0"
Response (Completed)
{
"request_id": "wan-2-7-video-api_019d52bf-9ae0-7faf-594a-08e2d4e7281b0",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_019d52bf-9ae0-7faf-594a-08e2d4e7281b0/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-03-31T07:32:03.749Z",
"updated_at": "2026-03-31T07:32:20.000Z",
"completed_at": "2026-03-31T07:32:20.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 (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.
Wan 2.7 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720P | $0.10/sec |
| 1080P | $0.15/sec |
Wan 2.7 API Documentation
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequestAuthentication
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 - Wan 2.7
Request Code
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequest HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "A red fox running through a snowy forest, cinematic"
}import requests, time
API_KEY = "YOUR_API_KEY"
headers = {"Ocp-Apim-Subscription-Key": API_KEY, "Content-Type": "application/json"}
# 1. Submit
submit = requests.post(
"https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequest",
headers=headers,
json={"prompt": "A red fox running through a snowy forest, cinematic"},
)
job = submit.json()
print(job) # {"request_id": "...", "status": "QUEUED", "polling_url": "..."}
# 2. Poll until terminal
while True:
status = requests.get(job["polling_url"], headers=headers).json()
print(status["status"])
if status["status"] in ("COMPLETED", "FAILED", "ERROR"):
break
time.sleep(15)
# 3. Download the video
if status["status"] == "COMPLETED":
url = status["output"]["media_url"][0]
open("wan27-video.mp4", "wb").write(requests.get(url).content)const API_KEY = "YOUR_API_KEY";
const headers = {
"Ocp-Apim-Subscription-Key": API_KEY,
"Content-Type": "application/json",
};
// 1. Submit
const submit = await fetch("https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequest", {
method: "POST",
headers,
body: JSON.stringify({ prompt: "A red fox running through a snowy forest, cinematic" }),
});
const job = await submit.json(); // { request_id, status: "QUEUED", polling_url }
// 2. Poll until terminal
let status;
do {
await new Promise(r => setTimeout(r, 15000));
status = await (await fetch(job.polling_url, { headers })).json();
console.log(status.status);
} while (!["COMPLETED", "FAILED", "ERROR"].includes(status.status));
// 3. status.output.media_url[0] is the generated mp4 URL
console.log(status.output?.media_url?.[0]);curl -X POST "https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequest" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "A red fox running through a snowy forest, cinematic"}'Output
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_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: terminalCallback 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": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-08T12:06:52.606Z",
"updated_at": "2026-07-08 12:08:46",
"completed_at": "2026-07-08 12:08:46"
}Failure callback shape
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-7-video-api",
"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 - Text to Video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | ≤ 5000 characters (English or Chinese) | Text description of the video to generate. |
negative_prompt | No | string | — | ≤ 500 characters | What to avoid in the generation (e.g. blurry, watermark, text). |
audio_url | No | string (URL) | — | WAV/MP3, 2–30s, ≤ 15 MB | Optional audio track for the generated video, passed as a publicly fetchable URL. |
resolution | No | string | 1080P | 720P, 1080P | Output resolution. Also selects the per-second price tier. |
ratio | No | string | 16:9 | 16:9, 9:16, 1:1, 4:3, 3:4 | Output aspect ratio. |
duration | No | integer | 5 | 2–15 (seconds) | Length of the generated video in seconds. Billing scales with this value. |
prompt_extend | No | boolean | true | true, false | Intelligent prompt rewriting for richer results. |
watermark | No | boolean | false | true, false | Add a provider watermark to the output. |
seed | No | integer | — | 0–2147483647 | Fix the random seed for reproducible generations. |
Example Request
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequest
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "A red fox running through a snowy forest at golden hour, cinematic, shallow depth of field",
"negative_prompt": "blurry, low quality, distorted, watermark, text",
"audio_url": "https://example.com/soundtrack.mp3",
"resolution": "1080P",
"ratio": "16:9",
"duration": 10,
"prompt_extend": true,
"watermark": false,
"seed": 12345
}Response
HTTP 202 Accepted — the request is queued. Save request_id and poll polling_url.
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Value |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key |
Content-Type | Yes | application/json |
X-Webhook-URL | No | HTTPS callback URL (see Webhook section) |
X-Webhook-Mode | No | terminal (default) or sync |
Response Handling
| Status Code | Meaning | Action |
|---|---|---|
202 | Request accepted and queued | Poll polling_url (or wait for your webhook) |
400 | Invalid parameters (missing prompt, bad resolution, …) | Fix the request body and retry |
401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header |
402 | Insufficient wallet balance | Top up your account balance |
403 | Key not authorized for this API | Verify your subscription/product access |
429 | Rate limit exceeded | Back off and retry after a delay |
500 | Internal error | Retry; contact support if persistent |
Error Responses
Submit-time failures return a JSON error immediately (e.g. 402):
{
"error": "Insufficient balance",
"message": "Your wallet balance is too low to run this request."
}Failures after queuing surface through the status endpoint / webhook with status: "ERROR" and a populated error field — see the failure callback shape above. Failed requests are not billed.
Retrieving Results
Poll the status endpoint with the request_id from the submit response:
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \\
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-08T12:06:52.606Z",
"updated_at": "2026-07-08 12:08:46",
"completed_at": "2026-07-08 12:08:46"
}output.media_url[0] is a direct, downloadable URL of the generated video (hosted on our CDN) — a plain GET with no auth headers.
Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Unique id of your request; use it to poll and as your idempotency key |
status | string | QUEUED | PROCESSING | COMPLETED | FAILED | ERROR |
model_id | string | Always wan-2-7-video-api |
error | string | null | Error description when status is ERROR/FAILED |
output.media_url | string[] | Download URL(s) of the generated video (mp4) |
output.media_type | string | video/mp4 |
created_at / completed_at | string | Request lifecycle timestamps |
polling_url | string | Convenience URL for status polling (submit response only) |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted; waiting for a worker |
PROCESSING | Video generation in progress |
COMPLETED | Done — output.media_url is ready |
FAILED / ERROR | Terminal failure — see error; not billed |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST the JSON body with your
prompt→ getrequest_id - Poll
GET /v2/requests/status/{request_id}every 10–15s (or use a webhook) - On
COMPLETED, downloadoutput.media_url[0]
Notes
- Billing — per second of generated video by resolution: $0.10/s at
720P, $0.15/s at1080P. Default request (1080P, 5s) = $0.75. Failed requests are not billed. - Audio — pass
audio_url(WAV/MP3, 2–30s, ≤ 15 MB, public URL) to add a soundtrack to the generated video. - Duration — integer seconds, 2–15. Longer durations cost proportionally more and take longer to render.
- Prompts — English and Chinese are supported;
prompt_extend(default on) rewrites short prompts for richer results.
Wan 2.7 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720P | $0.10/sec |
| 1080P | $0.15/sec |
Wan 2.7 API Documentation
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-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 |
Image to Video - Wan 2.7
Request Code
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-to-video HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/your-image.png"
}import requests, time
API_KEY = "YOUR_API_KEY"
headers = {"Ocp-Apim-Subscription-Key": API_KEY, "Content-Type": "application/json"}
# 1. Submit
submit = requests.post(
"https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-to-video",
headers=headers,
json={"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/your-image.png"},
)
job = submit.json()
print(job) # {"request_id": "...", "status": "QUEUED", "polling_url": "..."}
# 2. Poll until terminal
while True:
status = requests.get(job["polling_url"], headers=headers).json()
print(status["status"])
if status["status"] in ("COMPLETED", "FAILED", "ERROR"):
break
time.sleep(15)
# 3. Download the video
if status["status"] == "COMPLETED":
url = status["output"]["media_url"][0]
open("wan27-video.mp4", "wb").write(requests.get(url).content)const API_KEY = "YOUR_API_KEY";
const headers = {
"Ocp-Apim-Subscription-Key": API_KEY,
"Content-Type": "application/json",
};
// 1. Submit
const submit = await fetch("https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-to-video", {
method: "POST",
headers,
body: JSON.stringify({ prompt: "A red fox running through a snowy forest, cinematic" }),
});
const job = await submit.json(); // { request_id, status: "QUEUED", polling_url }
// 2. Poll until terminal
let status;
do {
await new Promise(r => setTimeout(r, 15000));
status = await (await fetch(job.polling_url, { headers })).json();
console.log(status.status);
} while (!["COMPLETED", "FAILED", "ERROR"].includes(status.status));
// 3. status.output.media_url[0] is the generated mp4 URL
console.log(status.output?.media_url?.[0]);curl -X POST "https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-to-video" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/your-image.png"}'Output
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_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: terminalCallback 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": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-08T12:06:52.606Z",
"updated_at": "2026-07-08 12:08:46",
"completed_at": "2026-07-08 12:08:46"
}Failure callback shape
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-7-video-api",
"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 - Image to Video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
first_frame_url | Yes | string (URL) | — | JPG/PNG, at least 240×240 px, publicly fetchable | The input image used as the video's first frame. The generated video animates from this image. |
prompt | No | string | — | ≤ 5000 characters (English or Chinese) | Optional text guidance for the motion and scene. |
negative_prompt | No | string | — | ≤ 500 characters | What to avoid in the generation (e.g. blurry, watermark, text). |
audio_url | No | string (URL) | — | WAV/MP3, 2–30s, ≤ 15 MB | Optional driving audio track for the generated video, passed as a publicly fetchable URL. |
resolution | No | string | 1080P | 720P, 1080P | Output resolution. Also selects the per-second price tier. |
duration | No | integer | 5 | 2–15 (seconds) | Length of the generated video in seconds. Billing scales with this value. |
prompt_extend | No | boolean | true | true, false | Intelligent prompt rewriting for richer results. |
watermark | No | boolean | false | true, false | Add a provider watermark to the output. |
seed | No | integer | — | 0–2147483647 | Fix the random seed for reproducible generations. |
Example Request
POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-to-video
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/your-image.png",
"prompt": "gentle camera push-in, cinematic",
"negative_prompt": "blurry, low quality, distorted",
"audio_url": "https://example.com/soundtrack.mp3",
"resolution": "1080P",
"duration": 10,
"prompt_extend": true,
"watermark": false,
"seed": 12345
}Response
HTTP 202 Accepted — the request is queued. Save request_id and poll polling_url.
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Value |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key |
Content-Type | Yes | application/json |
X-Webhook-URL | No | HTTPS callback URL (see Webhook section) |
X-Webhook-Mode | No | terminal (default) or sync |
Response Handling
| Status Code | Meaning | Action |
|---|---|---|
202 | Request accepted and queued | Poll polling_url (or wait for your webhook) |
400 | Invalid parameters (missing prompt, bad resolution, …) | Fix the request body and retry |
401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header |
402 | Insufficient wallet balance | Top up your account balance |
403 | Key not authorized for this API | Verify your subscription/product access |
429 | Rate limit exceeded | Back off and retry after a delay |
500 | Internal error | Retry; contact support if persistent |
Error Responses
Submit-time failures return a JSON error immediately (e.g. 402):
{
"error": "Insufficient balance",
"message": "Your wallet balance is too low to run this request."
}Failures after queuing surface through the status endpoint / webhook with status: "ERROR" and a populated error field — see the failure callback shape above. Failed requests are not billed.
Retrieving Results
Poll the status endpoint with the request_id from the submit response:
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \\
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-7-video-api",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-video-api_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-08T12:06:52.606Z",
"updated_at": "2026-07-08 12:08:46",
"completed_at": "2026-07-08 12:08:46"
}output.media_url[0] is a direct, downloadable URL of the generated video (hosted on our CDN) — a plain GET with no auth headers.
Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Unique id of your request; use it to poll and as your idempotency key |
status | string | QUEUED | PROCESSING | COMPLETED | FAILED | ERROR |
model_id | string | Always wan-2-7-video-api |
error | string | null | Error description when status is ERROR/FAILED |
output.media_url | string[] | Download URL(s) of the generated video (mp4) |
output.media_type | string | video/mp4 |
created_at / completed_at | string | Request lifecycle timestamps |
polling_url | string | Convenience URL for status polling (submit response only) |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted; waiting for a worker |
PROCESSING | Video generation in progress |
COMPLETED | Done — output.media_url is ready |
FAILED / ERROR | Terminal failure — see error; not billed |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST the JSON body with your
prompt→ getrequest_id - Poll
GET /v2/requests/status/{request_id}every 10–15s (or use a webhook) - On
COMPLETED, downloadoutput.media_url[0]
Notes
- Billing — per second of generated video by resolution: $0.10/s at
720P, $0.15/s at1080P. Default request (1080P, 5s) = $0.75. Failed requests are not billed. - Audio — pass
audio_url(WAV/MP3, 2–30s, ≤ 15 MB, public URL) to add a soundtrack to the generated video. - Duration — integer seconds, 2–15. Longer durations cost proportionally more and take longer to render.
- Prompts — English and Chinese are supported;
prompt_extend(default on) rewrites short prompts for richer results.
Wan 2.7 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720P | $0.10/sec |
| 1080P | $0.15/sec |
Wan 2.7 Pro API Documentation
https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan 2.7 Pro Text to Image Request - Wan 2.7 Pro API
Request Code
POST https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequest
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequest"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
payload = {
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequest", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
},
body: JSON.stringify({
prompt: "A charming flower shop with beautiful window displays filled with colorful flowers"
})
});
const data = await response.json();
console.log(data);
curl -X POST "https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequest" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-d '{"prompt":"A charming flower shop with beautiful window displays filled with colorful flowers"}'
Output
{
"status": "QUEUED",
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"message": "Request accepted and queued for processing"
}
Webhook (Optional)
You can optionally provide a webhook_url in your request body. When the request completes (success or failure), a POST request will be sent to your webhook URL with the result payload.
Webhook Payload (Success)
{
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6/output.png"
}
],
"description": ""
}
}
Webhook Payload (Failure)
{
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Request Parameters - Wan 2.7 Pro Text to Image Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | 1-5000 characters | Text description of the image to generate. Chinese and English are supported; text beyond 5000 characters is truncated. |
| size | No | string | "2K" | "1K", "2K", "4K", or custom "width*height" | Output resolution. "1K" is about 1024x1024, "2K" about 2048x2048, "4K" about 4096x4096. "4K" is available for text-to-image only (and only when enable_sequential is false). Custom sizes accept 768x768 up to 4096x4096, aspect ratio 1:8 to 8:1. |
| n | No | integer | 1 | 1-4 (1-12 when enable_sequential is true) | Number of images to generate. Directly affects billing. In image-set mode (enable_sequential=true) the range is 1-12 and the default is 12. The model may return fewer images than requested, never more. |
| thinking_mode | No | boolean | true | true, false | Enables the model's reasoning pass for stronger prompt adherence; increases generation time. Applies to text-to-image only (ignored when enable_sequential is true). |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" label to the bottom-right corner of the output. |
| seed | No | integer | — | 0-2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce a similar result; leave it empty for a different output each time. |
| enable_sequential | No | boolean | false | true, false | Enables image-set (sequential) output mode. When true, n accepts 1-12 (default 12) and thinking_mode and color_palette do not apply. |
| color_palette | No | array | — | 3-10 color objects | Custom color theme; standard mode only (enable_sequential=false). Array of objects, each with hex (string, e.g. "#C2D1E6") and ratio (string with 2 decimals, e.g. "23.51%"). Ratios must add up to 100.00%. 8 colors recommended. |
| webhook_url | No | string | — | — | URL to receive a POST callback when the request completes. Must be a publicly accessible HTTPS endpoint. |
Minimum Request
{
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers"
}
Full Request (all options)
{
"prompt": "A charming flower shop with beautiful window displays filled with colorful flowers",
"size": "2K",
"n": 2,
"thinking_mode": true,
"watermark": false,
"seed": 12345
}
Response
{
"status": "QUEUED",
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"message": "Request accepted and queued for processing"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Wan 2.7 Pro Text to Image Request.
| Code | Meaning |
|---|---|
| 202 | Accepted - Request queued for processing |
| 400 | Bad Request - Invalid parameters or missing required fields |
| 401 | Unauthorized - Invalid or missing API key |
| 402 | Payment Required - Insufficient wallet balance |
| 403 | Forbidden - Access denied |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Internal Server Error |
Error Responses
Error responses from the queue system and status/webhook errors.
Queue System Errors
{
"error": "Invalid request: prompt is required",
"status": 400
}
{
"error": "Unauthorized: invalid or missing API key",
"status": 401
}
{
"error": "Insufficient balance. Please top up your wallet.",
"status": 402
}
{
"error": "Rate limit exceeded. Please retry after some time.",
"status": 429
}
Status / Webhook Errors
{
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
{
"error": "Request not found",
"status": 404
}
Retrieving Results
After submitting a request, use the request_id from the queued response to check the status and retrieve results.
GET /v2/requests/status/{request_id}
GET https://gateway.pixazo.ai/v2/requests/status/wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Response (Queued / Processing)
{
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"status": "PROCESSING",
"message": "Request is being processed"
}
Response (Completed)
{
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6/output.png"
}
],
"description": ""
}
}
Response (Failed)
{
"request_id": "wan-2-7-pro-api_019d4e4b-b2da-7a82-ecae-994db4acea2c6",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Response Fields - Wan 2.7 Pro Text to Image Request
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. Use this to poll for status. |
| status | string | Current status of the request (QUEUED, PROCESSING, COMPLETED, FAILED). |
| message | string | Human-readable status message. |
| result | object | The result payload (present when status is COMPLETED). |
| images | array | Array of generated image objects. |
| images[].file_name | string | Name of the output file. |
| images[].content_type | string | MIME type of the output file (image/png). |
| images[].url | string | A link to download the generated image. |
| description | string | Optional description returned with the response. |
| error | string | Error message (present when status is FAILED). |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request has been accepted and is waiting in the queue. |
| PROCESSING | Request is currently being processed by the AI model. |
| COMPLETED | Request finished successfully. Results are available. |
| FAILED | Request failed during processing. Check the error field for details. |
Status Flow
QUEUED --> PROCESSING --> COMPLETED
\--> FAILED
Typical Workflow
- Submit a POST request to
https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequestwith your parameters. - Receive a
202 Acceptedresponse with arequest_idand statusQUEUED. - Poll the status endpoint
GET /v2/requests/status/{request_id}periodically (e.g. every 5-10 seconds). - Retrieve the result once status is
COMPLETED. Theresultobject contains image URLs. - (Optional) Use a
webhook_urlto receive results automatically without polling.
Wan 2.7 Pro API Pricing
Wan 2.7 Pro API Documentation
https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan 2.7 Pro Edit Image Request - Wan 2.7 Pro API
Request Code
POST https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequest
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],
"prompt": "Transform the tree into a lush green tree with vibrant flowers"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequest"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
payload = {
"images": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],
"prompt": "Transform the tree into a lush green tree with vibrant flowers"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequest", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
},
body: JSON.stringify({
images: ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],
prompt: "Transform the tree into a lush green tree with vibrant flowers"
})
});
const data = await response.json();
console.log(data);
curl -X POST "https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequest" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-d '{"images":["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"],"prompt":"Transform the tree into a lush green tree with vibrant flowers"}'
Output
{
"status": "QUEUED",
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"message": "Request accepted and queued for processing"
}
Webhook (Optional)
You can optionally provide a webhook_url in your request body. When the request completes (success or failure), a POST request will be sent to your webhook URL with the result payload.
Webhook Payload (Success)
{
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13/output.png"
}
],
"description": ""
}
}
Webhook Payload (Failure)
{
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Request Parameters - Wan 2.7 Pro Edit Image Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| images | Yes | array | — | 1-9 image URLs | Array of images to edit, in order. Each item is a publicly accessible URL or a base64 data URI. Supported formats: JPEG, JPG, PNG (without alpha channel), BMP, WEBP. Max 20MB per image, 240-8000px per side, aspect ratio 1:8 to 8:1. |
| prompt | Yes | string | — | 1-5000 characters | Text description of the desired edit. Chinese and English are supported; text beyond 5000 characters is truncated. |
| size | No | string | "2K" | "1K", "2K", or custom "width*height" | Output resolution. The output keeps the input image aspect ratio, scaled to this resolution. "4K" is text-to-image only and cannot be used when editing. Custom sizes accept 768x768 up to 2048x2048, aspect ratio 1:8 to 8:1. |
| n | No | integer | 1 | 1-4 (1-12 when enable_sequential is true) | Number of images to generate. Directly affects billing. In image-set mode (enable_sequential=true) the range is 1-12 and the default is 12. The model may return fewer images than requested, never more. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" label to the bottom-right corner of the output. |
| seed | No | integer | — | 0-2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce a similar result; leave it empty for a different output each time. |
| bbox_list | No | array | — | Up to 2 boxes per image | Selected areas for interactive editing. One list per input image, in the same order as images; use an empty list for an image you do not want to box. Each box is [x1, y1, x2, y2] in absolute pixels from the top-left origin (0,0). |
| enable_sequential | No | boolean | false | true, false | Enables image-set (sequential) output mode. When true, n accepts 1-12 (default 12). |
| webhook_url | No | string | — | — | URL to receive a POST callback when the request completes. Must be a publicly accessible HTTPS endpoint. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | — | JPG, PNG, WEBP · < 20 MB | Image(s) to edit. |
Minimum Request
{
"images": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
],
"prompt": "Transform the tree into a lush green tree with vibrant flowers"
}
Full Request (all options)
{
"images": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
],
"prompt": "Transform the tree into a lush green tree with vibrant flowers",
"size": "2K",
"n": 1,
"watermark": false,
"seed": 42
}
Response
{
"status": "QUEUED",
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"message": "Request accepted and queued for processing"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for Wan 2.7 Pro Edit Image Request.
| Code | Meaning |
|---|---|
| 202 | Accepted - Request queued for processing |
| 400 | Bad Request - Invalid parameters or missing required fields |
| 401 | Unauthorized - Invalid or missing API key |
| 402 | Payment Required - Insufficient wallet balance |
| 403 | Forbidden - Access denied |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Internal Server Error |
Error Responses
Error responses from the queue system and status/webhook errors.
Queue System Errors
{
"error": "Invalid request: prompt is required",
"status": 400
}
{
"error": "Unauthorized: invalid or missing API key",
"status": 401
}
{
"error": "Insufficient balance. Please top up your wallet.",
"status": 402
}
{
"error": "Rate limit exceeded. Please retry after some time.",
"status": 429
}
Status / Webhook Errors
{
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
{
"error": "Request not found",
"status": 404
}
Retrieving Results
After submitting a request, use the request_id from the queued response to check the status and retrieve results.
GET /v2/requests/status/{request_id}
GET https://gateway.pixazo.ai/v2/requests/status/wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Response (Queued / Processing)
{
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"status": "PROCESSING",
"message": "Request is being processed"
}
Response (Completed)
{
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"status": "COMPLETED",
"result": {
"images": [
{
"file_name": "output.png",
"content_type": "image/png",
"url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13/output.png"
}
],
"description": ""
}
}
Response (Failed)
{
"request_id": "wan-2-7-pro-api_019d4e48-893e-7582-850a-9be6943bebe13",
"status": "FAILED",
"error": "Processing failed: upstream provider returned an error"
}
Response Fields - Wan 2.7 Pro Edit Image Request
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique identifier for the request. Use this to poll for status. |
| status | string | Current status of the request (QUEUED, PROCESSING, COMPLETED, FAILED). |
| message | string | Human-readable status message. |
| result | object | The result payload (present when status is COMPLETED). |
| images | array | Array of generated image objects. |
| images[].file_name | string | Name of the output file. |
| images[].content_type | string | MIME type of the output file (image/png). |
| images[].url | string | A link to download the generated image. |
| description | string | Optional description returned with the response. |
| error | string | Error message (present when status is FAILED). |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request has been accepted and is waiting in the queue. |
| PROCESSING | Request is currently being processed by the AI model. |
| COMPLETED | Request finished successfully. Results are available. |
| FAILED | Request failed during processing. Check the error field for details. |
Status Flow
QUEUED --> PROCESSING --> COMPLETED
\--> FAILED
Typical Workflow
- Submit a POST request to
https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequestwith your parameters. - Receive a
202 Acceptedresponse with arequest_idand statusQUEUED. - Poll the status endpoint
GET /v2/requests/status/{request_id}periodically (e.g. every 5-10 seconds). - Retrieve the result once status is
COMPLETED. Theresultobject contains image URLs. - (Optional) Use a
webhook_urlto receive results automatically without polling.
Wan 2.7 Pro API Pricing
Wan 2.6 API Documentation
https://gateway.pixazo.ai/wan-2-6-image-to-video-477/v1/wan-2-6-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 |
Wan 2.6 Image to Video generate request - Wan 2.6 Image to Video API
Request Code
POST https://gateway.pixazo.ai/wan-2-6-image-to-video-477/v1/wan-2-6-image-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A serene mountain lake at sunrise, with gently flowing water and birds flying overhead",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"enable_prompt_expansion": true,
"multi_shots": true,
"enable_safety_checker": true
}
import requests
url = "https://gateway.pixazo.ai/wan-2-6-image-to-video-477/v1/wan-2-6-image-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A serene mountain lake at sunrise, with gently flowing water and birds flying overhead",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"enable_prompt_expansion": True,
"multi_shots": True,
"enable_safety_checker": True
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-2-6-image-to-video-477/v1/wan-2-6-image-to-video-request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'A serene mountain lake at sunrise, with gently flowing water and birds flying overhead',
image_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png',
aspect_ratio: '16:9',
resolution: '1080p',
duration: '10',
enable_prompt_expansion: true,
multi_shots: true,
enable_safety_checker: 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/wan-2-6-image-to-video-477/v1/wan-2-6-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 serene mountain lake at sunrise, with gently flowing water and birds flying overhead",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"enable_prompt_expansion": true,
"multi_shots": true,
"enable_safety_checker": true
}'
Output
{
"request_id": "wan-2-6-image-to-video-477_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-6-image-to-video-477_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": "wan-2-6-image-to-video-477_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-6-image-to-video-477",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-6-image-to-video-477_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": "wan-2-6-image-to-video-477_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-6-image-to-video-477",
"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 - Wan 2.6 Image to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | The text prompt describing the desired video motion. Max 1500 characters. |
| image_url | Yes | string | — | — | URL of the image to use as the first frame of the video. Must be publicly accessible or a base64 data URI. Image dimensions must be between 240 and 7680 pixels. |
| aspect_ratio | No | string | — | "16:9", "9:16", "1:1", "4:3", "3:4" | Aspect ratio of the output video. Supported values: "16:9", "9:16", "1:1", "4:3", "3:4". |
| resolution | No | string | 1080p | "720p", "1080p" | Resolution of the output video. Supported values: "720p", "1080p". |
| duration | No | string | 5 | "5", "10", "15" | Duration of the generated video in seconds. Choose between 5, 10 or 15 seconds. |
| audio_url | No | string | — | — | URL of an audio file to use as background music. Must be publicly accessible. Format: WAV or MP3. Duration: 3-30 seconds. Max file size: 15 MB. If the audio is longer than the video duration, it is truncated to the first N seconds; if shorter than the video, the remaining video time is silent. |
| negative_prompt | No | string | "" | — | Negative prompt describing content to avoid in the generated video. Max 500 characters. |
| enable_prompt_expansion | No | boolean | true | true, false | Whether to enable prompt rewriting using an LLM. Automatically enriches short prompts with extra detail to improve results, at the cost of some extra processing time. |
| multi_shots | No | boolean | false | true, false | When true, enables intelligent multi-shot segmentation (multiple camera shots and transitions within the video). Only active when enable_prompt_expansion is true. Set to false for single-shot generation. |
| enable_safety_checker | No | boolean | true | true, false | If set to true, the safety checker is enabled and unsafe or explicit (NSFW) content is filtered. Leave enabled unless you have a specific reason to disable it. |
| seed | No | integer | — | — | Random seed for reproducibility. If omitted, a random seed is chosen. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | Input image. |
| audio | 1 | MP3, WAV · < 15 MB | Optional reference audio. |
Example Request
{
"prompt": "A serene mountain lake at sunrise, with gently flowing water and birds flying overhead",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"enable_prompt_expansion": true,
"multi_shots": true,
"enable_safety_checker": true
}
Response
{
"request_id": "wan-2-6-image-to-video-477_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-6-image-to-video-477_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. Required: $0.01"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'wan-2-6-image-to-video-477' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-6-image-to-video-477_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-6-image-to-video-477",
"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/wan-2-6-image-to-video-477_019d42ce-ae71-7999-24c9-5d76447ecafb4"
Response (Completed)
{
"request_id": "wan-2-6-image-to-video-477_019d42ce-ae71-7999-24c9-5d76447ecafb4",
"status": "COMPLETED",
"model_id": "wan-2-6-image-to-video-477",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-6-image-to-video-477_019d42ce-ae71-7999-24c9-5d76447ecafb4/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-03-31T07:32:03.749Z",
"updated_at": "2026-03-31T07:32:20.000Z",
"completed_at": "2026-03-31T07:32:20.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 (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.
Wan 2.6 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720p | $0.10/sec |
| 1080p | $0.15/sec |
Wan 2.6 API Documentation
https://gateway.pixazo.ai/wan-2-6-text-to-video-569/v1/wan-2-6-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 |
Wan 2.6 Text to Video generate request - Wan 2.6 Text to Video API
Request Code
POST https://gateway.pixazo.ai/wan-2-6-text-to-video-569/v1/wan-2-6-text-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Create a cinematic video with multiple scenes showing a fox director making a movie, transitioning between different environments.",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"negative_prompt": "low resolution, error, worst quality, low quality, defects",
"enable_prompt_expansion": true,
"multi_shots": true,
"enable_safety_checker": true
}
import requests
url = "https://gateway.pixazo.ai/wan-2-6-text-to-video-569/v1/wan-2-6-text-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Create a cinematic video with multiple scenes showing a fox director making a movie, transitioning between different environments.",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"negative_prompt": "low resolution, error, worst quality, low quality, defects",
"enable_prompt_expansion": True,
"multi_shots": True,
"enable_safety_checker": True
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-2-6-text-to-video-569/v1/wan-2-6-text-to-video-request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'Create a cinematic video with multiple scenes showing a fox director making a movie, transitioning between different environments.',
aspect_ratio: '16:9',
resolution: '1080p',
duration: '10',
negative_prompt: 'low resolution, error, worst quality, low quality, defects',
enable_prompt_expansion: true,
multi_shots: true,
enable_safety_checker: 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/wan-2-6-text-to-video-569/v1/wan-2-6-text-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Create a cinematic video with multiple scenes showing a fox director making a movie, transitioning between different environments.",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"negative_prompt": "low resolution, error, worst quality, low quality, defects",
"enable_prompt_expansion": true,
"multi_shots": true,
"enable_safety_checker": true
}'
Output
{
"request_id": "wan-2-6-text-to-video-569_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-6-text-to-video-569_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": "wan-2-6-text-to-video-569_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-6-text-to-video-569",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-6-text-to-video-569_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": "wan-2-6-text-to-video-569_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-6-text-to-video-569",
"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 - Wan 2.6 Text to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | The text prompt for video generation. Supports Chinese and English, max 1500 characters. For multi-shot videos use the format: "Overall description. First shot [0-3s] content. Second shot [3-5s] content." |
| aspect_ratio | No | string | 16:9 | "16:9", "9:16", "1:1", "4:3", "3:4" | The aspect ratio of the generated video. |
| resolution | No | string | 1080p | "720p", "1080p" | Resolution of the output video. Wan 2.6 text-to-video supports only "720p" and "1080p" (no 480p). |
| duration | No | string | 5 | "5", "10", "15" | Duration of the generated video in seconds. Choose between 5, 10 or 15 seconds. |
| audio_url | No | string | — | — | URL of an audio file to use as background music. Must be publicly accessible. Format: WAV or MP3. Duration: 3-30 seconds. Max file size: 15 MB. If the audio is longer than the video duration, it is truncated to the first N seconds; if shorter than the video, the remaining video time is silent. |
| negative_prompt | No | string | "" | — | Negative prompt describing content to avoid in the generated video. Max 500 characters. |
| enable_prompt_expansion | No | boolean | true | true, false | Whether to enable prompt rewriting using an LLM. Automatically enriches short prompts with extra detail to improve results, at the cost of some extra processing time. |
| multi_shots | No | boolean | true | true, false | When true, enables intelligent multi-shot segmentation for coherent narrative videos. Only active when enable_prompt_expansion is true. Set to false for single-shot generation. |
| enable_safety_checker | No | boolean | true | true, false | If set to true, the safety checker is enabled and unsafe or explicit (NSFW) content is filtered. Leave enabled unless you have a specific reason to disable it. |
| seed | No | integer | — | — | Random seed for reproducibility. If omitted, a random seed is chosen. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| audio | 1 | MP3, WAV · < 15 MB | Optional reference audio. |
Example Request
{
"prompt": "Create a cinematic video with multiple scenes showing a fox director making a movie, transitioning between different environments.",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": "10",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"negative_prompt": "low resolution, error, worst quality, low quality, defects",
"enable_prompt_expansion": true,
"multi_shots": true,
"enable_safety_checker": true
}
Response
{
"status": "IN_QUEUE",
"request_id": "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8",
"response_url": "[RESPONSE_URL]"
}
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 'wan-2-6-text-to-video-569' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-6-text-to-video-569_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-6-text-to-video-569",
"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/wan-2-6-text-to-video-569_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-2-6-text-to-video-569_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-6-text-to-video-569",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-6-text-to-video-569_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.
Wan 2.6 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720p | $0.10/sec |
| 1080p | $0.15/sec |
Wan 2.6 API Documentation
https://gateway.pixazo.ai/wan-2-6-image-to-video-flash-api-353/v1/wan-2-6-image-to-video-flash-api-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 |
Wan 2.6 Image-to-Video Flash API generate request - Wan 2.6 Image-to-Video Flash API
Request Code
POST https://gateway.pixazo.ai/wan-2-6-image-to-video-flash-api-353/v1/wan-2-6-image-to-video-flash-api-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A cinematic beach portrait that evolves into an energy-charged scene. Photorealistic, stable identity matching the reference image, natural lighting, smooth cinematic motion, no subtitles.\n\nShot 1 [0-4s] Continue from the first frame of the reference image. The man stands on a sunny beach wearing a black t-shirt with glowing blue flame graphics. Gentle ocean waves move behind him and wind lightly moves his hair and shirt. The blue flame design on the shirt begins to softly glow and flicker like living energy.\n\nShot 2 [4-8s] Slow cinematic push-in toward the subject. The glowing blue flames on the shirt animate and flow upward like magical energy. Subtle particles and light streaks appear around the flame pattern. The ocean sparkles in the sunlight while waves roll naturally in the background.\n\nShot 3 [8-12s] Hard cinematic cut to a slightly closer angle. The blue flames briefly expand outward as luminous energy patterns around the torso before settling back onto the shirt. The wind becomes slightly stronger, moving the shirt fabric and hair while the beach environment remains realistic.\n\nShot 4 [12-15s] Final cinematic close shot. The flames stabilize into a calm glowing pattern on the shirt while the subject stands confidently against the horizon. The camera slowly drifts sideways with warm sunlight reflecting off the ocean, ending in a clean photorealistic frame.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-6-image-to-video-flash-api-353/v1/wan-2-6-image-to-video-flash-api-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A cinematic beach portrait that evolves into an energy-charged scene. Photorealistic, stable identity matching the reference image, natural lighting, smooth cinematic motion, no subtitles.\n\nShot 1 [0-4s] Continue from the first frame of the reference image. The man stands on a sunny beach wearing a black t-shirt with glowing blue flame graphics. Gentle ocean waves move behind him and wind lightly moves his hair and shirt. The blue flame design on the shirt begins to softly glow and flicker like living energy.\n\nShot 2 [4-8s] Slow cinematic push-in toward the subject. The glowing blue flames on the shirt animate and flow upward like magical energy. Subtle particles and light streaks appear around the flame pattern. The ocean sparkles in the sunlight while waves roll naturally in the background.\n\nShot 3 [8-12s] Hard cinematic cut to a slightly closer angle. The blue flames briefly expand outward as luminous energy patterns around the torso before settling back onto the shirt. The wind becomes slightly stronger, moving the shirt fabric and hair while the beach environment remains realistic.\n\nShot 4 [12-15s] Final cinematic close shot. The flames stabilize into a calm glowing pattern on the shirt while the subject stands confidently against the horizon. The camera slowly drifts sideways with warm sunlight reflecting off the ocean, ending in a clean photorealistic frame.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-2-6-image-to-video-flash-api-353/v1/wan-2-6-image-to-video-flash-api-request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: "A cinematic beach portrait that evolves into an energy-charged scene. Photorealistic, stable identity matching the reference image, natural lighting, smooth cinematic motion, no subtitles.\n\nShot 1 [0-4s] Continue from the first frame of the reference image. The man stands on a sunny beach wearing a black t-shirt with glowing blue flame graphics. Gentle ocean waves move behind him and wind lightly moves his hair and shirt. The blue flame design on the shirt begins to softly glow and flicker like living energy.\n\nShot 2 [4-8s] Slow cinematic push-in toward the subject. The glowing blue flames on the shirt animate and flow upward like magical energy. Subtle particles and light streaks appear around the flame pattern. The ocean sparkles in the sunlight while waves roll naturally in the background.\n\nShot 3 [8-12s] Hard cinematic cut to a slightly closer angle. The blue flames briefly expand outward as luminous energy patterns around the torso before settling back onto the shirt. The wind becomes slightly stronger, moving the shirt fabric and hair while the beach environment remains realistic.\n\nShot 4 [12-15s] Final cinematic close shot. The flames stabilize into a calm glowing pattern on the shirt while the subject stands confidently against the horizon. The camera slowly drifts sideways with warm sunlight reflecting off the ocean, ending in a clean photorealistic frame.",
image_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.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/wan-2-6-image-to-video-flash-api-353/v1/wan-2-6-image-to-video-flash-api-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A cinematic beach portrait that evolves into an energy-charged scene. Photorealistic, stable identity matching the reference image, natural lighting, smooth cinematic motion, no subtitles.\\n\\nShot 1 [0-4s] Continue from the first frame of the reference image. The man stands on a sunny beach wearing a black t-shirt with glowing blue flame graphics. Gentle ocean waves move behind him and wind lightly moves his hair and shirt. The blue flame design on the shirt begins to softly glow and flicker like living energy.\\n\\nShot 2 [4-8s] Slow cinematic push-in toward the subject. The glowing blue flames on the shirt animate and flow upward like magical energy. Subtle particles and light streaks appear around the flame pattern. The ocean sparkles in the sunlight while waves roll naturally in the background.\\n\\nShot 3 [8-12s] Hard cinematic cut to a slightly closer angle. The blue flames briefly expand outward as luminous energy patterns around the torso before settling back onto the shirt. The wind becomes slightly stronger, moving the shirt fabric and hair while the beach environment remains realistic.\\n\\nShot 4 [12-15s] Final cinematic close shot. The flames stabilize into a calm glowing pattern on the shirt while the subject stands confidently against the horizon. The camera slowly drifts sideways with warm sunlight reflecting off the ocean, ending in a clean photorealistic frame.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}'
Output
{
"request_id": "wan-2-6-image-to-video-flash-api-353_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-6-image-to-video-flash-api-353_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": "wan-2-6-image-to-video-flash-api-353_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-6-image-to-video-flash-api-353",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-6-image-to-video-flash-api-353_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": "wan-2-6-image-to-video-flash-api-353_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-6-image-to-video-flash-api-353",
"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 - Wan 2.6 Image-to-Video Flash API generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | The text prompt describing the desired video motion. Max 1500 characters. |
| image_url | Yes | string | — | — | URL of the image to use as the first frame of the video. Must be publicly accessible or a base64 data URI. Image dimensions must be between 240 and 7680 pixels. |
| resolution | No | string | 1080p | "720p", "1080p" | Resolution of the output video. Supported values: "720p", "1080p". |
| duration | No | string | 5 | "5", "10", "15" | Duration of the generated video in seconds. Choose between 5, 10 or 15 seconds. |
| audio_url | No | string | — | — | URL of an audio file to use as background music. Must be publicly accessible. Format: WAV or MP3. Duration: 3-30 seconds. Max file size: 15 MB. If the audio is longer than the video duration, it is truncated to the first N seconds; if shorter than the video, the remaining video time is silent. |
| negative_prompt | No | string | "" | — | Negative prompt describing content to avoid in the generated video. Max 500 characters. |
| generate_audio | No | boolean | true | true, false | Whether the model generates native audio for the video. Set to false for silent video generation, which is cheaper (half the cost of a flash generation with audio). Independent of audio_url, which only provides a track to sync the video against. |
| enable_prompt_expansion | No | boolean | true | true, false | Whether to enable prompt rewriting using an LLM. Automatically enriches short prompts with extra detail to improve results, at the cost of some extra processing time. |
| multi_shots | No | boolean | false | true, false | When true, enables intelligent multi-shot segmentation (multiple camera shots and transitions within the video). Only active when enable_prompt_expansion is true. Set to false for single-shot generation. |
| enable_safety_checker | No | boolean | true | true, false | If set to true, the safety checker is enabled and unsafe or explicit (NSFW) content is filtered. Leave enabled unless you have a specific reason to disable it. |
| seed | No | integer | — | — | Random seed for reproducibility. If omitted, a random seed is chosen. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | Input image. |
| audio | 1 | MP3, WAV · < 15 MB | Optional reference audio. |
Minimum Request
{
"prompt": "A cinematic beach portrait that evolves into an energy-charged scene. Photorealistic, stable identity matching the reference image, natural lighting, smooth cinematic motion, no subtitles.\n\nShot 1 [0-4s] Continue from the first frame of the reference image. The man stands on a sunny beach wearing a black t-shirt with glowing blue flame graphics. Gentle ocean waves move behind him and wind lightly moves his hair and shirt. The blue flame design on the shirt begins to softly glow and flicker like living energy.\n\nShot 2 [4-8s] Slow cinematic push-in toward the subject. The glowing blue flames on the shirt animate and flow upward like magical energy. Subtle particles and light streaks appear around the flame pattern. The ocean sparkles in the sunlight while waves roll naturally in the background.\n\nShot 3 [8-12s] Hard cinematic cut to a slightly closer angle. The blue flames briefly expand outward as luminous energy patterns around the torso before settling back onto the shirt. The wind becomes slightly stronger, moving the shirt fabric and hair while the beach environment remains realistic.\n\nShot 4 [12-15s] Final cinematic close shot. The flames stabilize into a calm glowing pattern on the shirt while the subject stands confidently against the horizon. The camera slowly drifts sideways with warm sunlight reflecting off the ocean, ending in a clean photorealistic frame.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
Full Request (all options)
{
"prompt": "A cinematic beach portrait that evolves into an energy-charged scene. Photorealistic, stable identity matching the reference image, natural lighting, smooth cinematic motion, no subtitles.\n\nShot 1 [0-4s] Continue from the first frame of the reference image. The man stands on a sunny beach wearing a black t-shirt with glowing blue flame graphics. Gentle ocean waves move behind him and wind lightly moves his hair and shirt. The blue flame design on the shirt begins to softly glow and flicker like living energy.\n\nShot 2 [4-8s] Slow cinematic push-in toward the subject. The glowing blue flames on the shirt animate and flow upward like magical energy. Subtle particles and light streaks appear around the flame pattern. The ocean sparkles in the sunlight while waves roll naturally in the background.\n\nShot 3 [8-12s] Hard cinematic cut to a slightly closer angle. The blue flames briefly expand outward as luminous energy patterns around the torso before settling back onto the shirt. The wind becomes slightly stronger, moving the shirt fabric and hair while the beach environment remains realistic.\n\nShot 4 [12-15s] Final cinematic close shot. The flames stabilize into a calm glowing pattern on the shirt while the subject stands confidently against the horizon. The camera slowly drifts sideways with warm sunlight reflecting off the ocean, ending in a clean photorealistic frame.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png",
"resolution": "1080p",
"duration": "15",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/gemini-music/lyria-1771923124229-veu9ens.wav",
"negative_prompt": "low resolution, error, worst quality, low quality, defects, distorted face, extra limbs, flickering, unstable identity",
"enable_prompt_expansion": true,
"enable_safety_checker": true
}
Response
Wan 2.6 API Pricing — Per-Second Rates
| Resolution | Price (USD) |
|---|---|
| 720p | $0.10/sec |
| 1080p | $0.15/sec |
Wan 2.5 API Documentation
https://gateway.pixazo.ai/wan-image-2-5/v1/generateEditImage2-5Request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Generate Image to Image - Wan 2.5 Image Generation
Request Code
POST https://gateway.pixazo.ai/wan-image-2-5/v1/generateEditImage2-5Request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Replace the floral dress with a vintage-style lace gown that has delicate embroidery on the collar and cuffs",
"images": [
"https://example.com/images/woman-in-dress.jpg"
],
"size": "1280*1280"
}
import requests
import json
url = "https://gateway.pixazo.ai/wan-image-2-5/v1/generateEditImage2-5Request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Replace the floral dress with a vintage-style lace gown that has delicate embroidery on the collar and cuffs",
"images": ["https://example.com/images/woman-in-dress.jpg"],
"size": "1280*1280"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-image-2-5/v1/generateEditImage2-5Request';
const data = {
prompt: 'Replace the floral dress with a vintage-style lace gown that has delicate embroidery on the collar and cuffs',
images: ['https://example.com/images/woman-in-dress.jpg'],
size: '1280*1280'
};
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 -v -X POST "https://gateway.pixazo.ai/wan-image-2-5/v1/generateEditImage2-5Request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: XXXXXXXXXXXXXXXXXXXXXXX" \
--data-raw '{
"prompt": "Replace the floral dress with a vintage-style lace gown that has delicate embroidery on the collar and cuffs",
"images": [
"https://example.com/images/woman-in-dress.jpg"
],
"size": "1280*1280"
}'
Output
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-5-image-generation_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": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-5-image-generation",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.png"
],
"media_type": "image/png"
},
"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": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-5-image-generation",
"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 - Generate Image to Image
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Up to 2000 characters | Text description of the edit to perform. Supports English and Chinese; text beyond the limit is truncated. |
| images | Yes | array | — | 1 to 3 image URLs | Publicly accessible HTTPS URLs (or base64 data URIs) of the source images. A single image is edited; two or three are fused, and the order matters. JPEG, PNG (no alpha), BMP or WEBP; 384 to 5000 px per side; up to 10 MB each. |
| negative_prompt | No | string | null | Up to 500 characters | Elements to exclude from the edited image. |
| size | No | string | 1280*1280 | Total pixels from 768*768 to 1280*1280; aspect ratio from 1:4 to 4:1 | Output image dimensions in width*height format. |
| n | No | integer | 1 | 1 | Number of images to generate. This endpoint returns a single image per request. |
| prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the bottom-right corner of the image. |
| seed | No | integer | — | 0 to 2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | — | JPG, PNG, WEBP · < 20 MB | Reference image(s). |
Example Request
{
"prompt": "Replace the floral dress with a vintage-style lace gown that has delicate embroidery on the collar and cuffs",
"images": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/upscaler_019ed0c8-bb34-7854-afbc-b2a164758a15b/output.png"
],
"size": "1280*1280"
}
Response
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-5-image-generation_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 'wan-2-5-image-generation' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-5-image-generation",
"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/wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-5-image-generation",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-5-image-generation_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.
Wan 2.5 API Pricing
Wan 2.5 API Documentation
https://gateway.pixazo.ai/wan-image-2-5/v1/generateTextToImage2-5Request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Generate Text to Image - Wan 2.5 Image Generation
Request Code
POST https://gateway.pixazo.ai/wan-image-2-5/v1/generateTextToImage2-5Request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A beautiful flower shop with exquisite windows, a beautiful wooden door, and flowers on display",
"size": "1024*1024",
"prompt_extend": true,
"watermark": false
}
import requests
import json
url = "https://gateway.pixazo.ai/wan-image-2-5/v1/generateTextToImage2-5Request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A beautiful flower shop with exquisite windows, a beautiful wooden door, and flowers on display",
"size": "1024*1024",
"prompt_extend": True,
"watermark": False
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-image-2-5/v1/generateTextToImage2-5Request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'A beautiful flower shop with exquisite windows, a beautiful wooden door, and flowers on display',
size: '1024*1024',
prompt_extend: true,
watermark: 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 -v -X POST "https://gateway.pixazo.ai/wan-image-2-5/v1/generateTextToImage2-5Request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A beautiful flower shop with exquisite windows, a beautiful wooden door, and flowers on display",
"size": "1024*1024",
"prompt_extend": true,
"watermark": false
}'
Output
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-5-image-generation_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": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-5-image-generation",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.png"
],
"media_type": "image/png"
},
"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": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-5-image-generation",
"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 - Generate Text to Image
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Up to 2000 characters | Text description of the image to generate. Supports English and Chinese; text beyond the limit is truncated. |
| negative_prompt | No | string | null | Up to 500 characters | Elements to exclude from the image. |
| size | No | string | 1024*1024 | Total pixels from 768*768 to 1440*1440; aspect ratio from 1:4 to 4:1 | Image dimensions in width*height format. |
| n | No | integer | 1 | 1 | Number of images to generate. This endpoint returns a single image per request. |
| prompt_extend | No | boolean | false | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the bottom-right corner of the image. |
| seed | No | integer | — | 0 to 2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Example Request
{
"prompt": "A majestic mountain landscape at sunset, snow-capped peaks, golden light, photorealistic",
"size": "1440*960",
"prompt_extend": true,
"watermark": false
}
Response
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-5-image-generation_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 'wan-2-5-image-generation' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-5-image-generation",
"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/wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-2-5-image-generation_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-5-image-generation",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-5-image-generation_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.
Wan 2.5 API Pricing
Wan 2.5 API Documentation
https://gateway.pixazo.ai/wan-video-2-5/v1/generateImageToVideo2-5Request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Generate Image To Video - Wan 2.5 Video Generation API
Request Code
POST https://gateway.pixazo.ai/wan-video-2-5/v1/generateImageToVideo2-5Request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"img_url": "https://example.com/images/cat.png",
"prompt": "A cat running on the grass",
"resolution": "480P",
"duration": 5,
"audio": false,
"prompt_extend": true,
"watermark": false
}
import requests
url = "https://gateway.pixazo.ai/wan-video-2-5/v1/generateImageToVideo2-5Request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"img_url": "https://example.com/images/cat.png",
"prompt": "A cat running on the grass",
"resolution": "480P",
"duration": 5,
"audio": False,
"prompt_extend": True,
"watermark": False
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-video-2-5/v1/generateImageToVideo2-5Request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
img_url: 'https://example.com/images/cat.png',
prompt: 'A cat running on the grass',
resolution: '480P',
duration: 5,
audio: false,
prompt_extend: true,
watermark: 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 -v -X POST "https://gateway.pixazo.ai/wan-video-2-5/v1/generateImageToVideo2-5Request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"img_url": "https://example.com/images/cat.png",
"prompt": "A cat running on the grass",
"resolution": "480P",
"duration": 5,
"audio": false,
"prompt_extend": true,
"watermark": false
}'
Output
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-image-to-video-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Generate Image To Video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| img_url | Yes | string | — | JPEG, JPG, PNG, BMP or WEBP | Publicly accessible HTTPS URL (or base64 data URI) of the first-frame image; the video starts from this picture. 240 to 8000 px per side; up to 20 MB. |
| prompt | No | string | — | Up to 1500 characters | Text description of the video to generate. Supports English and Chinese. Include spoken dialogue here to have the model voice it with lip-sync. |
| negative_prompt | No | string | null | Up to 500 characters | Elements to exclude from the video. |
| audio_url | No | string | — | WAV or MP3; 3 to 30 seconds; up to 15 MB | Publicly accessible HTTPS URL of a custom audio track. If set, it is used instead of the model-generated audio. |
| resolution | No | string | 480P | 480P, 720P, 1080P | Output resolution tier. Determines the pixel count of the generated video. |
| duration | No | integer | 5 | 5, 10 | Video length in seconds. |
| audio | No | boolean | false | true, false | Whether the model generates an audio track for the video. false produces a silent video. |
| prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the bottom-right corner of the video. |
| seed | No | integer | — | 0 to 2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | Input image. |
| audio | 1 | MP3, WAV · < 15 MB | Optional reference audio. |
Example Request
{
"img_url": "https://example.com/images/battle-scene.png",
"prompt": "An epic battle scene with dramatic music and sound effects",
"negative_prompt": "blurry, low quality, distorted",
"resolution": "1080P",
"duration": 10,
"audio": true,
"prompt_extend": true,
"watermark": false,
"seed": 98765
}
Response
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'wan-image-to-video-2-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-image-to-video-2-5",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-image-to-video-2-5_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.
Wan 2.5 API Pricing — Per-Second Rates
Wan 2.5 API Documentation
https://gateway.pixazo.ai/wan-video-2-5/v1/generateTextToVideo2-5Request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Generate Text To Video Request - Wan 2.5 Video Generation API
Request Code
POST https://gateway.pixazo.ai/wan-video-2-5/v1/generateTextToVideo2-5Request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A beautiful sunset over a calm ocean with gentle waves",
"size": "832*480",
"duration": 5,
"audio": false,
"prompt_extend": true,
"watermark": false
}
import requests
url = "https://gateway.pixazo.ai/wan-video-2-5/v1/generateTextToVideo2-5Request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A beautiful sunset over a calm ocean with gentle waves",
"size": "832*480",
"duration": 5,
"audio": False,
"prompt_extend": True,
"watermark": False
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-video-2-5/v1/generateTextToVideo2-5Request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const body = {
prompt: 'A beautiful sunset over a calm ocean with gentle waves',
size: '832*480',
duration: 5,
audio: false,
prompt_extend: true,
watermark: false
};
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 -v -X POST "https://gateway.pixazo.ai/wan-video-2-5/v1/generateTextToVideo2-5Request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A beautiful sunset over a calm ocean with gentle waves",
"size": "832*480",
"duration": 5,
"audio": false,
"prompt_extend": true,
"watermark": false
}'
Output
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-image-to-video-2-5",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Generate Text To Video Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Up to 1500 characters | Text description of the video to generate. Supports English and Chinese. Include spoken dialogue here to have the model voice it with lip-sync. |
| negative_prompt | No | string | null | Up to 500 characters | Elements to exclude from the video. |
| audio_url | No | string | — | WAV or MP3; 3 to 30 seconds; up to 15 MB | Publicly accessible HTTPS URL of a custom audio track. If set, it is used instead of the model-generated audio. |
| size | No | string | 832*480 | 832*480, 1280*720, 1920*1080 (and the matching portrait or square sizes for each tier) | Video dimensions in width*height format. |
| duration | No | integer | 5 | 5, 10 | Video length in seconds. |
| audio | No | boolean | false | true, false | Whether the model generates an audio track for the video. false produces a silent video. |
| prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| watermark | No | boolean | false | true, false | Adds an "AI Generated" watermark to the bottom-right corner of the video. |
| seed | No | integer | — | 0 to 2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| audio | 1 | MP3, WAV · < 15 MB | Optional reference audio. |
Example Request
{
"prompt": "A beautiful sunset over a calm ocean with gentle waves",
"size": "832*480",
"duration": 5,
"audio": false,
"prompt_extend": true,
"watermark": false
}
Response
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'wan-image-to-video-2-5' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-image-to-video-2-5",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-image-to-video-2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video-2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-image-to-video-2-5_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.
Wan 2.5 API Pricing — Per-Second Rates
Wan 2.5 API Documentation
https://gateway.pixazo.ai/pixazo-wan-image-to-video-1763709522/v1/pixazo-wan-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 |
Generate Request - Pixazo Wan Image to Video API
Request Code
POST https://gateway.pixazo.ai/pixazo-wan-image-to-video-1763709522/v1/pixazo-wan-image-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A stylish man walks down a sea side",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
import requests
url = "https://gateway.pixazo.ai/pixazo-wan-image-to-video-1763709522/v1/pixazo-wan-image-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A stylish man walks down a sea side",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/pixazo-wan-image-to-video-1763709522/v1/pixazo-wan-image-to-video-request';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const body = {
prompt: 'A stylish man walks down a sea side',
image_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png'
};
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/pixazo-wan-image-to-video-1763709522/v1/pixazo-wan-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 stylish man walks down a sea side",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}'
Output
{
"request_id": "pixazo-wan-image-to-video-1763709522_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixazo-wan-image-to-video-1763709522_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": "pixazo-wan-image-to-video-1763709522_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "pixazo-wan-image-to-video-1763709522",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/pixazo-wan-image-to-video-1763709522_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": "pixazo-wan-image-to-video-1763709522_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "pixazo-wan-image-to-video-1763709522",
"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 - Generate Request
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | A detailed text description of the desired motion and scene context. The model uses this to animate the image. Up to 1500 characters. |
| image_url | string | Yes | — | Publicly accessible HTTPS URL (or base64 data URI) pointing to a static image (JPEG, PNG, WebP). The image is used as the first frame and animated according to the prompt. |
| negative_prompt | string | No | — | Elements to exclude from the generated video. Up to 500 characters. |
| resolution | string | No | 1080p | Output video resolution. Allowed values: 480p, 720p, 1080p. |
| duration | integer | No | 5 | Video length in seconds. Allowed values: 5, 10. |
| audio_url | string | No | — | Publicly accessible HTTPS URL of a custom audio track (WAV or MP3, 3 to 30 seconds, up to 15 MB). If omitted, the model generates its own audio. |
| enable_prompt_expansion | boolean | No | true | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Allowed values: true, false. |
| enable_safety_checker | boolean | No | true | Runs a safety filter over the generated video. Allowed values: true, false. |
| seed | integer | No | — | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Minimum Request
{
"prompt": "A stylish man walks down a sea side",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
Full Request (all options)
{
"prompt": "A stylish man walks down a sea side",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png"
}
Response
{
"request_id": "pixazo-wan-image-to-video-1763709522_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/pixazo-wan-image-to-video-1763709522_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 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 |
Response Fields - Check Status
| Field | Type | Description | |||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| video | object | Object containing video metadata and download URL | |||||||||||||||||||||||||||||||||||||||
| video.file_size | integer | Size of the video file in bytes | |||||||||||||||||||||||||||||||||||||||
| video.file_name | string | Name of the generated video file | |||||||||||||||||||||||||||||||||||||||
| video.content_type | string | MIME type of the video file | |||||||||||||||||||||||||||||||||||||||
| 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.
Wan 2.5 API Pricing
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan2.2-s2v/v1/generateSpeechToVideoRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Speech to Video Request - Wan 2.2 14B Speech to Video
Request Code
POST https://gateway.pixazo.ai/wan2.2-s2v/v1/generateSpeechToVideoRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Summer beach vacation style, a man wearing sunglasses Blue Tshirt.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_music.mp3"
}
import requests
import json
url = "https://gateway.pixazo.ai/wan2.2-s2v/v1/generateSpeechToVideoRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Summer beach vacation style, a man wearing sunglasses Blue Tshirt.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_music.mp3"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
const url = 'https://gateway.pixazo.ai/wan2.2-s2v/v1/generateSpeechToVideoRequest';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'Summer beach vacation style, a man wearing sunglasses Blue Tshirt.',
image_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png',
audio_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_music.mp3'
};
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/wan2.2-s2v/v1/generateSpeechToVideoRequest" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Summer beach vacation style, a man wearing sunglasses Blue Tshirt.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_music.mp3"
}'
Output
{
"request_id": "wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-2-14b-speech-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": "wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-2-14b-speech-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-2-14b-speech-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": "wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-2-14b-speech-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 - Speech to Video Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | The text prompt used for video generation. Describes the style and content of the generated video. |
| image_url | Yes | string | — | — | URL of the input image. If the input image does not match the chosen aspect ratio, it is resized and center cropped. |
| audio_url | Yes | string | — | — | URL of the audio file that drives the lip-sync and facial expressions in the generated video. |
| negative_prompt | No | string | "" | — | Describes what to avoid. Used to steer the generation away from unwanted features. Empty by default. |
| num_frames | No | integer | 80 | 40–120 (multiples of 4) | Number of frames to generate. Together with frames_per_second this determines the length of the video. |
| frames_per_second | No | integer | 16 | 4–60 | Frames per second of the generated video. Higher values give smoother motion. |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| resolution | No | string | 480p | 480p, 580p, 720p | Resolution of the generated video. |
| num_inference_steps | No | integer | 27 | — | Number of refinement steps the model runs while generating. Higher values refine detail and quality but increase processing time; lower values are faster. |
| enable_safety_checker | No | boolean | false | true, false | Checks the input for unsafe or explicit (NSFW) content before processing. |
| enable_output_safety_checker | No | boolean | false | true, false | Checks the generated video for unsafe or explicit (NSFW) content after generation. |
| guidance_scale | No | float | 3.5 | — | Controls how closely the output follows your prompt (classifier-free guidance). Higher values stick more strictly to the prompt; lower values allow more creative variation. |
| shift | No | float | 5 | 1.0–10.0 | An advanced sampling control that affects the balance of motion and detail in the video. The default works well for most cases. |
| video_quality | No | string | high | low, medium, high, maximum | Quality of the output video. Higher quality means better visual quality but a larger file size. |
| video_write_mode | No | string | balanced | fast, balanced, small | How the output video is written: "fast" (quicker, larger file), "balanced" (a compromise), "small" (slowest, smallest file). |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, BMP, WEBP · < 10 MB | Reference image. |
| audio | 1 | MP3, WAV | Reference audio (speech). |
Example Request
{
"prompt": "Summer beach vacation style, a man wearing sunglasses Blue Tshirt.",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_model.png",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/input_music.mp3"
}
Response
{
"request_id": "wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-2-2-14b-speech-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.
| 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 'wan-2-2-14b-speech-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-2-14b-speech-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/wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-2-2-14b-speech-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-2-14b-speech-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-2-14b-speech-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.
Wan 2.2 API Pricing
| Resolution | Price (USD) |
|---|---|
| Per second (720p) | $0.20 |
| Per second (580p) | $0.15 |
| Per second (480p) | $0.10 |
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan-2-2-animate-api-524/v1/wan-2-2-animate-api-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 |
Generate Request - Wan 2.2 Animate
Request Code
POST /wan-2-2-animate-api-request HTTP/1.1
Host: gateway.pixazo.ai
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://example.com/motion-source.mp4",
"image_url": "https://example.com/target-image.png"
}
import requests
url = "https://gateway.pixazo.ai/wan-2-2-animate-api-524/v1/wan-2-2-animate-api-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://example.com/motion-source.mp4",
"image_url": "https://example.com/target-image.png"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/wan-2-2-animate-api-524/v1/wan-2-2-animate-api-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
};
const data = {
video_url: "https://example.com/motion-source.mp4",
image_url: "https://example.com/target-image.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/wan-2-2-animate-api-524/v1/wan-2-2-animate-api-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"video_url": "https://example.com/motion-source.mp4",
"image_url": "https://example.com/target-image.png"
}'
Output
{
"request_id": "wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/wan-2-2-animate-api-524_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": "wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-2-animate-api-524",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-2-animate-api-524_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": "wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-2-animate-api-524",
"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 - Generate Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| video_url | Yes | string | — | — | URL of the source video. The motion and facial expressions in this video drive the animation. |
| image_url | Yes | string | — | — | URL of the image to animate. If the image does not match the chosen aspect ratio, it is resized and center cropped. |
| resolution | No | string | 480p | 480p, 580p, 720p | Resolution of the generated video. |
| num_inference_steps | No | integer | 20 | — | Number of refinement steps the model runs while generating. Higher values give better quality but take longer. |
| guidance_scale | No | float | 1 | — | Controls how closely the output follows the guidance (classifier-free guidance). Higher values adhere more strictly but may reduce quality. |
| shift | No | float | 5 | 1.0–10.0 | An advanced sampling control that affects the balance of motion and detail in the video. The default works well for most cases. |
| seed | No | integer | — | — | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| enable_safety_checker | No | boolean | false | true, false | Checks the input for unsafe or explicit (NSFW) content before processing. |
| enable_output_safety_checker | No | boolean | false | true, false | Checks the generated video for unsafe or explicit (NSFW) content after generation. |
| video_quality | No | string | high | low, medium, high, maximum | Quality of the output video. Higher quality means better visual quality but a larger file size. |
| video_write_mode | No | string | balanced | fast, balanced, small | How the output video is written: "fast" (quicker, larger file), "balanced" (a compromise), "small" (slowest, smallest file). |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| video | 1 | MP4, MOV | Reference video (motion). |
| image | 1 | JPG, PNG, WEBP · < 10 MB | Character image. |
Minimum Request
{
"video_url": "https://example.com/motion-source.mp4",
"image_url": "https://example.com/target-image.png"
}
Full Request (all options)
{
"video_url": "https://example.com/motion-source.mp4",
"image_url": "https://example.com/target-image.png"
}
Response
{
"request_id": "wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/wan-2-2-animate-api-524_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 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 |
Status Flow
Polling status values for async processing.
| Status | Description |
|---|---|
| IN_QUEUE | Request is queued and waiting to be processed |
| IN_PROGRESS | Request is currently being processed, animation rendering in progress |
| COMPLETED | Request completed successfully, animation output is ready |
| FAILED | Request failed due to invalid input, resource timeout, or system error |
Status Flow
IN_QUEUE → IN_PROGRESS → [COMPLETED or FAILED]
Typical Workflow
- Submit request to /wan-2-2-animate-api-request with video_url and image_url
- Receive response containing request_id
- Poll /wan-2-2-animate-api-request-result every 2-5 seconds using request_id
- When status is COMPLETED, extract animation URL from response
- Use the animation URL to display or download the generated video
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 'wan-2-2-animate-api-524' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-2-2-animate-api-524",
"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/wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-2-2-animate-api-524_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-2-2-animate-api-524",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-2-2-animate-api-524_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.
Wan 2.2 API Pricing
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan Image to Video First Frame - Wan Image to Video API
Request Code
POST https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"model": "wan2.2-i2v-plus",
"input": {
"prompt": "Banana dancing in a traditional dress",
"negative_prompt": "flowers, blur",
"img_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg"
},
"parameters": {
"resolution": "1080P",
"duration": 5,
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
import requests
url = "https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"model": "wan2.2-i2v-plus",
"input": {
"prompt": "Banana dancing in a traditional dress",
"negative_prompt": "flowers, blur",
"img_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg"
},
"parameters": {
"resolution": "1080P",
"duration": 5,
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoRequest';
const data = {
model: 'wan2.2-i2v-plus',
input: {
prompt: 'Banana dancing in a traditional dress',
negative_prompt: 'flowers, blur',
img_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg'
},
parameters: {
resolution: '1080P',
duration: 5,
prompt_extend: true,
watermark: false,
seed: 12345
}
};
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 -v -X POST "https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoRequest" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"model": "wan2.2-i2v-plus",
"input": {
"prompt": "Banana dancing in a traditional dress",
"negative_prompt": "flowers, blur",
"img_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg"
},
"parameters": {
"resolution": "1080P",
"duration": 5,
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}'
Output
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-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": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-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": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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 - Wan Image to Video First Frame
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | wan2.2-i2v-plus, wan2.2-i2v-flash, wan2.1-i2v-plus, wan2.1-i2v-turbo | Which model version to use. "wan2.2-i2v-plus" gives the highest quality; "wan2.2-i2v-flash" is faster and cheaper. |
| input.img_url | Yes | string | — | — | URL of the first frame image. Must be a publicly accessible HTTP/HTTPS URL. Formats: JPEG, JPG, PNG, BMP, WEBP. Max size: 10 MB. Width and height must each be between 240 and 8000 pixels. |
| input.prompt | No | string | — | Up to 800 characters | Text description that guides the video generation. Supports English and Chinese. |
| input.negative_prompt | No | string | — | Up to 500 characters | Elements to exclude from the generated video. |
| parameters.resolution | No | string | Varies by model | 480P, 720P, 1080P | Resolution tier of the output video. wan2.2-i2v-plus: 480P or 1080P (default 1080P). wan2.2-i2v-flash: 480P or 720P (default 720P). wan2.1-i2v-plus: 720P only. wan2.1-i2v-turbo: 480P or 720P (default 720P). |
| parameters.duration | No | integer | 5 | 3, 4, 5 | Video length in seconds. Only wan2.1-i2v-turbo accepts 3, 4 or 5; all other models are fixed at 5. |
| parameters.prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| parameters.watermark | No | boolean | false | true, false | When true, adds an "AI Generated" watermark in the lower-right corner. |
| parameters.seed | No | integer | — | 0–2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, BMP, WEBP · < 10 MB | First-frame image. |
Example Request
{
"model": "wan2.2-i2v-plus",
"input": {
"prompt": "Banana dancing in a traditional dress",
"negative_prompt": "flowers, blur",
"img_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/nano-banana.jpeg"
},
"parameters": {
"resolution": "1080p",
"duration": 5,
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
Response
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-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.
| 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 'wan-image-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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/wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-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.
Wan 2.2 API Pricing
| Resolution | Duration | Model | Price (USD) |
|---|---|---|---|
| 720P | 5s | wan2.1-kf2v-plus | $0.60 |
| 480P | - | wan2.2-i2v-flash | $0.085 |
| 720P | 5s | wan2.2-i2v-flash | $0.20 |
| 480P | - | wan2.2-i2v-plus | $0.125 |
| 1080P | - | wan2.2-i2v-plus | $0.75 |
| 480P | 5s | wan2.1-i2v-turbo | $0.20 |
| 720P | - | wan2.1-i2v-turbo | $0.20 |
| 720P | - | wan2.1-i2v-plus | $0.75 |
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoFrameRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Wan Keyframe to Video - Wan Image to Video API
Request Code
POST https://gateway.appypie.com/wan-i2v/v1/generateImageToVideoFrameRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"model": "wan2.1-kf2v-plus",
"input": {
"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-75d44f7d-a954-46b0-a603-10c09cb5df84-0.png",
"last_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-47c06b16-ce7f-4977-8f7c-a04384409934-0.png",
"prompt": "Realistic style. Aeroplane from takeoff to fly captured in camera",
"negative_prompt": "person, text"
},
"parameters": {
"resolution": "720P",
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
import requests
url = "https://gateway.appypie.com/wan-i2v/v1/generateImageToVideoFrameRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"model": "wan2.1-kf2v-plus",
"input": {
"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-75d44f7d-a954-46b0-a603-10c09cb5df84-0.png",
"last_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-47c06b16-ce7f-4977-8f7c-a04384409934-0.png",
"prompt": "Realistic style. Aeroplane from takeoff to fly captured in camera",
"negative_prompt": "person, text"
},
"parameters": {
"resolution": "720P",
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.appypie.com/wan-i2v/v1/generateImageToVideoFrameRequest';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
model: 'wan2.1-kf2v-plus',
input: {
first_frame_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-75d44f7d-a954-46b0-a603-10c09cb5df84-0.png',
last_frame_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-47c06b16-ce7f-4977-8f7c-a04384409934-0.png',
prompt: 'Realistic style. Aeroplane from takeoff to fly captured in camera',
negative_prompt: 'person, text'
},
parameters: {
resolution: '720P',
prompt_extend: true,
watermark: false,
seed: 12345
}
};
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.appypie.com/wan-i2v/v1/generateImageToVideoFrameRequest" -H "Content-Type: application/json" -H "Cache-Control: no-cache" -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" --data-raw '{
"model": "wan2.1-kf2v-plus",
"input": {
"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-75d44f7d-a954-46b0-a603-10c09cb5df84-0.png",
"last_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-47c06b16-ce7f-4977-8f7c-a04384409934-0.png",
"prompt": "Realistic style. Aeroplane from takeoff to fly captured in camera",
"negative_prompt": "person, text"
},
"parameters": {
"resolution": "720P",
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}'
Output
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-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": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-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": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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 - Wan Keyframe to Video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | wan2.1-kf2v-plus | Model to use (first-frame and last-frame to video). |
| input.first_frame_url | Yes | string | — | — | URL of the first frame image. Must be a publicly accessible HTTP/HTTPS URL. Formats: JPEG, JPG, PNG (no alpha channel), BMP, WEBP. Max size: 10 MB. Width and height must each be between 240 and 8000 pixels. The output aspect ratio follows this image. |
| input.last_frame_url | Yes | string | — | — | URL of the last frame image. Same formats and size limits as the first frame; its resolution and aspect ratio may differ from the first frame. |
| input.prompt | No | string | — | Up to 800 characters | Text description that guides the transition between the two frames. Supports English and Chinese. Useful for describing camera or subject movement. |
| input.negative_prompt | No | string | — | Up to 500 characters | Elements to exclude from the generated video. |
| parameters.resolution | No | string | 720P | 720P | Resolution tier of the output video. Only 720P is supported by this model. |
| parameters.duration | No | integer | 5 | 5 | Video length in seconds. Fixed at 5 and cannot be changed. |
| parameters.prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| parameters.watermark | No | boolean | false | true, false | When true, adds an "AI Generated" watermark in the lower-right corner. |
| parameters.seed | No | integer | — | 0–2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, BMP, WEBP · < 10 MB | First / last frame image. |
Example Request
{
"model": "wan2.1-kf2v-plus",
"input": {
"first_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-75d44f7d-a954-46b0-a603-10c09cb5df84-0.png",
"last_frame_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/wan-t2i/wan-t2i-47c06b16-ce7f-4977-8f7c-a04384409934-0.png",
"prompt": "Realistic style. Aeroplane from takeoff to fly captured in camera",
"negative_prompt": "person, text"
},
"parameters": {
"resolution": "720P",
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
Response
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-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.
| 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 'wan-image-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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/wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-image-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-image-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-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.
Wan 2.2 API Pricing
| Resolution | Duration | Model | Price (USD) |
|---|---|---|---|
| 720P | 5s | wan2.1-kf2v-plus | $0.60 |
| 480P | - | wan2.2-i2v-flash | $0.085 |
| 720P | 5s | wan2.2-i2v-flash | $0.20 |
| 480P | - | wan2.2-i2v-plus | $0.125 |
| 1080P | - | wan2.2-i2v-plus | $0.75 |
| 480P | 5s | wan2.1-i2v-turbo | $0.20 |
| 720P | - | wan2.1-i2v-turbo | $0.20 |
| 720P | - | wan2.1-i2v-plus | $0.75 |
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan-t2i/v1/generateEditImageRequest
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 Image Request - Wan Text to Image API
Request Code
POST https://gateway.pixazo.ai/wan-t2i/v1/generateEditImageRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"model": "wanx2.1-imageedit",
"input": {
"function": "stylization_all",
"prompt": "A dreamy watercolor style",
"base_image_url": "https://example.com/image.jpg"
},
"parameters": {
"n": 1
}
}
import requests
url = "https://gateway.pixazo.ai/wan-t2i/v1/generateEditImageRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"model": "wanx2.1-imageedit",
"input": {
"function": "stylization_all",
"prompt": "A dreamy watercolor style",
"base_image_url": "https://example.com/image.jpg"
},
"parameters": {
"n": 1
}
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
fetch('https://gateway.pixazo.ai/wan-t2i/v1/generateEditImageRequest', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
},
body: JSON.stringify({
model: 'wanx2.1-imageedit',
input: {
function: 'stylization_all',
prompt: 'A dreamy watercolor style',
base_image_url: 'https://example.com/image.jpg'
},
parameters: {
n: 1
}
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST \"https://gateway.pixazo.ai/wan-t2i/v1/generateEditImageRequest\" \\
-H \"Content-Type: application/json\" \\
-H \"Cache-Control: no-cache\" \\
-H \"Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY\" \\
--data-raw '{
\"model\": \"wanx2.1-imageedit\",
\"input\": {
\"function\": \"stylization_all\",
\"prompt\": \"A dreamy watercolor style\",
\"base_image_url\": \"https://example.com/image.jpg\"
},
\"parameters\": {
\"n\": 1
}
}'
Output
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-text-to-image_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": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-text-to-image",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.png"
],
"media_type": "image/png"
},
"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": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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 - Edit Image Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | wanx2.1-imageedit | Model to use. |
| input.function | Yes | string | — | stylization_all, stylization_local, description_edit, description_edit_with_mask, remove_watermark, expand, super_resolution, colorization, doodle, control_cartoon_feature | The editing operation to perform: stylization_all (restyle the whole image), stylization_local (restyle part of the image), description_edit (edit from an instruction, no mask), description_edit_with_mask (inpaint the masked area), remove_watermark (remove text or watermarks), expand (extend the image outwards), super_resolution (upscale and sharpen), colorization (colorize a black-and-white image), doodle (turn a sketch into an image), control_cartoon_feature (generate from a cartoon-character reference). |
| input.prompt | Yes | string | — | Up to 800 characters | Text prompt describing the desired edit. Supports English and Chinese. |
| input.base_image_url | Yes | string | — | — | URL of the image to edit. Must be a publicly accessible HTTP/HTTPS URL. Formats: JPG, JPEG, PNG, BMP, TIFF, WEBP. Width and height must each be between 512 and 4096 pixels. Max size: 10 MB. |
| input.mask_image_url | No | string | — | — | URL of the mask image. Required when input.function is "description_edit_with_mask". White areas (255,255,255) mark the region to edit and black areas (0,0,0) mark the region to keep. Same formats and size limits as input.base_image_url. |
| parameters.n | No | integer | 1 | 1–4 | Number of images to generate. Billing is based on the number of images generated. |
| parameters.seed | No | integer | — | 0–2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| parameters.strength | No | float | 0.5 | 0.0–1.0 | How strongly the image is modified. Lower values stay closer to the original; higher values allow bigger changes. |
| parameters.top_scale | No | float | 1.0 | 1.0–2.0 | How far to extend the image upwards. Used with input.function "expand". |
| parameters.bottom_scale | No | float | 1.0 | 1.0–2.0 | How far to extend the image downwards. Used with input.function "expand". |
| parameters.left_scale | No | float | 1.0 | 1.0–2.0 | How far to extend the image to the left. Used with input.function "expand". |
| parameters.right_scale | No | float | 1.0 | 1.0–2.0 | How far to extend the image to the right. Used with input.function "expand". |
| parameters.upscale_factor | No | integer | 1 | 1–4 | Magnification multiplier. Used with input.function "super_resolution". |
| parameters.is_sketch | No | boolean | false | true, false | Marks the input image as a hand-drawn sketch. Used with input.function "doodle". |
| parameters.watermark | No | boolean | false | true, false | When true, adds a "Generated by AI" watermark in the lower-right corner. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Image to edit. |
Example Request
{
"model": "wanx2.1-imageedit",
"input": {
"function": "stylization_all",
"prompt": "A dreamy watercolor style",
"base_image_url": "https://example.com/image.jpg"
},
"parameters": {
"n": 1
}
}
Response
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-text-to-image_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 'wan-text-to-image' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-text-to-image",
"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/wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-text-to-image",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-text-to-image_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.
Wan 2.2 API Pricing
Variants are quality tiers: Variant 1 = Standard, Variant 2 = High. Higher tier = more detail at higher cost.
| Resolution | Model | Price (USD) |
|---|---|---|
| 1080*1920 | wan2.2-t2v-plus | $0.60 |
| 1280*720 | wan2.1-t2v-turbo | $0.30 |
| 1280*720 | wan2.1-t2v-plus | $0.60 |
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan-t2i/v1/generateTextToImageRequest
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 Image Request - Wan Text to Image API
Request Code
POST https://gateway.pixazo.ai/wan-t2i/v1/generateTextToImageRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"model": "wan2.2-t2i-flash",
"input": {
"prompt": "A beautiful mountain landscape at sunset"
}
}
import requests
url = "https://gateway.pixazo.ai/wan-t2i/v1/generateTextToImageRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"model": "wan2.2-t2i-flash",
"input": {
"prompt": "A beautiful mountain landscape at sunset"
}
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-t2i/v1/generateTextToImageRequest';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
model: 'wan2.2-t2i-flash',
input: {
prompt: 'A beautiful mountain landscape at sunset'
}
};
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/wan-t2i/v1/generateTextToImageRequest" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"model": "wan2.2-t2i-flash",
"input": {
"prompt": "A beautiful mountain landscape at sunset"
}
}'
Output
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-text-to-image_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": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-text-to-image",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.png"
],
"media_type": "image/png"
},
"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": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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 - Text To Image Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | wan2.2-t2i-flash, wan2.2-t2i-plus, wanx2.1-t2i-turbo, wanx2.1-t2i-plus, wanx2.0-t2i-turbo | Which model version to use. "wan2.2-t2i-flash" is the fastest; "wan2.2-t2i-plus" gives the best quality. |
| input.prompt | Yes | string | — | Up to 500 characters | Positive prompt describing the image you want. Supports English and Chinese. (wanx2.0-t2i-turbo accepts up to 800 characters.) |
| input.negative_prompt | No | string | — | Up to 500 characters | Elements to exclude from the generated image. |
| parameters.size | No | string | 1024*1024 | Width and height 512–1440 each (max 1440*1440) | Output resolution in "width*height" format, for example "1024*1024" (1:1), "1280*720" (16:9) or "720*1280" (9:16). |
| parameters.n | No | integer | 4 | 1–4 | Number of images to generate. Billing is based on the number of images generated, so set this to 1 if you only need a single image. |
| parameters.seed | No | integer | — | 0–2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| parameters.prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results, especially for short prompts. |
| parameters.watermark | No | boolean | false | true, false | When true, adds an "AI Generated" watermark in the lower-right corner. |
Example Request
{
"model": "wan2.2-t2i-flash",
"input": {
"prompt": "A beautiful mountain landscape at sunset",
"negative_prompt": "people, buildings, text, watermark, signature"
},
"parameters": {
"size": "1024*1024",
"n": 1,
"seed": 42,
"prompt_extend": false,
"watermark": false
}
}
Response
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-text-to-image_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 'wan-text-to-image' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-text-to-image",
"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/wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-text-to-image_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-text-to-image",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-text-to-image_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.
Wan 2.2 API Pricing
Variants are quality tiers: Variant 1 = Standard, Variant 2 = High. Higher tier = more detail at higher cost.
| Resolution | Model | Price (USD) |
|---|---|---|
| 1080*1920 | wan2.2-t2v-plus | $0.60 |
| 1280*720 | wan2.1-t2v-turbo | $0.30 |
| 1280*720 | wan2.1-t2v-plus | $0.60 |
Wan 2.2 API Documentation
https://gateway.pixazo.ai/wan-video/v1/generateTextToVideoRequest
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Generate Text To Video Request - Wan Text to Video API
Request Code
POST https://gateway.pixazo.ai/wan-video/v1/generateTextToVideoRequest
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"model": "wan2.2-t2v-plus",
"input": {
"prompt": "A kitten running in the moonlight",
"negative_prompt": "flowers, people, text"
},
"parameters": {
"size": "1920*1080"
}
}
import requests
import json
url = "https://gateway.pixazo.ai/wan-video/v1/generateTextToVideoRequest"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"model": "wan2.2-t2v-plus",
"input": {
"prompt": "A kitten running in the moonlight",
"negative_prompt": "flowers, people, text"
},
"parameters": {
"size": "1920*1080"
}
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const url = 'https://gateway.pixazo.ai/wan-video/v1/generateTextToVideoRequest';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
model: 'wan2.2-t2v-plus',
input: {
prompt: 'A kitten running in the moonlight',
negative_prompt: 'flowers, people, text'
},
parameters: {
size: '1920*1080'
}
};
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/wan-video/v1/generateTextToVideoRequest" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"model": "wan2.2-t2v-plus",
"input": {
"prompt": "A kitten running in the moonlight",
"negative_prompt": "flowers, people, text"
},
"parameters": {
"size": "1920*1080"
}
}'
Output
{
"request_id": "wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-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": "wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-text-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-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": "wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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 - Generate Text To Video Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| model | Yes | string | — | wan2.2-t2v-plus, wan2.1-t2v-plus, wan2.1-t2v-turbo | Which model version to use. "wan2.2-t2v-plus" is recommended; the other versions trade off speed and quality. |
| input.prompt | Yes | string | — | Up to 800 characters | Text description of the video to generate. Supports English and Chinese. |
| input.negative_prompt | No | string | — | Up to 500 characters | Elements to exclude from the generated video. |
| parameters.size | No | string | 1920*1080 | 480p: 832*480, 480*832, 624*624 · 1080p: 1920*1080, 1080*1920, 1440*1440, 1632*1248, 1248*1632 | Output resolution in "width*height" format (values listed are for wan2.2-t2v-plus, whose default is "1920*1080"). Resolution affects the cost of the request. |
| parameters.duration | No | integer | 5 | 5 | Video length in seconds. Fixed at 5 for the wan2.2 and wan2.1 models. |
| parameters.prompt_extend | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency. |
| parameters.seed | No | integer | — | 0–2147483647 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
| parameters.watermark | No | boolean | false | true, false | When true, adds an "AI Generated" watermark in the lower-right corner. |
| parameters.n | No | integer | 1 | 1 | Number of videos to generate. Only 1 is supported. |
Example Request
{
"model": "wan2.2-t2v-plus",
"input": {
"prompt": "A kitten running in the moonlight",
"negative_prompt": "flowers, people, text"
},
"parameters": {
"size": "1920*1080"
}
}
Response
{
"request_id": "wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/wan-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_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 'wan-text-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "wan-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/wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "wan-text-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "wan-text-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/wan-text-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.
Wan 2.2 API Pricing
| Resolution | Duration | Model | Price (USD) |
|---|---|---|---|
| 1080*1920 | 5s | wan2.2-t2v-plus | $0.60 |
| 1280*720 | 5s | wan2.1-t2v-turbo | $0.30 |
| 1280*720 | 5s | wan2.1-t2v-plus | $0.60 |
