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.

Get API Key
Wan AI API
View in Playground

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

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

Claim Your $5 →

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

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring≤ 5000 charactersText description of the image to generate. Supports Chinese and English.
sizeNostring"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.
nNointeger11-4 (standard), up to 12 when enable_sequential is trueNumber of images to generate. Each image generated is billed separately.
thinking_modeNobooleantruetrue, falseRuns the model’s thinking pass for higher-quality output; increases generation time. Applies only to text-to-image in standard (non-sequential) mode.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the bottom-right corner of the image.
seedNointeger0-2147483647Random 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_sequentialNobooleanfalsetrue, falseEnables image-set (sequential) output mode, in which the model returns a themed set of related images and n may go up to 12.
color_paletteNoarray3-10 colorsCustom 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_urlNostringURL 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
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
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_idstringUnique identifier for the request. Use this to poll for status.
statusstringCurrent status of the request (QUEUED, PROCESSING, COMPLETED, FAILED).
messagestringHuman-readable status message.
resultobjectThe result payload (present when status is COMPLETED).
imagesarrayArray of generated image objects.
images[].file_namestringName of the output file.
images[].content_typestringMIME type of the output file (image/png).
images[].urlstringA link to download the generated image.
descriptionstringOptional description returned with the response.
errorstringError message (present when status is FAILED).

Status Values

Status Description
Request has been accepted and is waiting in the queue.
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

  1. Submit a POST request to https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27TextToImageRequest with your parameters.
  2. Receive a 202 Accepted response with a request_id and status QUEUED.
  3. Poll the status endpoint GET /v2/requests/status/{request_id} periodically (e.g. every 5-10 seconds).
  4. Retrieve the result once status is COMPLETED. The result object contains image URLs.
  5. (Optional) Use a webhook_url to receive results automatically without polling.

Wan 2.7 API Pricing

Your request will cost $0.03 per image.
Image to Image (Image Editing)

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

ParameterRequiredTypeDefaultAllowed values / rangeDescription
imagesYesarray1-9 image URLsArray 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.
promptYesstring≤ 5000 charactersText description of the desired edit. Supports Chinese and English.
sizeNostring"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.
nNointeger11-4 (standard), up to 12 when enable_sequential is trueNumber of images to generate. Each image generated is billed separately.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the bottom-right corner of the image.
seedNointeger0-2147483647Random 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_listNoarrayUp to 2 boxes per imageSelected 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_sequentialNobooleanfalsetrue, falseEnables image-set (sequential) output mode, in which the model returns a themed set of related images and n may go up to 12.
webhook_urlNostringURL to receive a POST callback when the request completes. Must be a publicly accessible HTTPS endpoint.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
imageJPG, PNG, WEBP · < 20 MBImage(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
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
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_idstringUnique identifier for the request. Use this to poll for status.
statusstringCurrent status of the request (QUEUED, PROCESSING, COMPLETED, FAILED).
messagestringHuman-readable status message.
resultobjectThe result payload (present when status is COMPLETED).
imagesarrayArray of generated image objects.
images[].file_namestringName of the output file.
images[].content_typestringMIME type of the output file (image/png).
images[].urlstringA link to download the generated image.
descriptionstringOptional description returned with the response.
errorstringError message (present when status is FAILED).

Status Values

Status Description
Request has been accepted and is waiting in the queue.
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

  1. Submit a POST request to https://gateway.pixazo.ai/wan-2-7-api/v1/generateWan27EditImageRequest with your parameters.
  2. Receive a 202 Accepted response with a request_id and status QUEUED.
  3. Poll the status endpoint GET /v2/requests/status/{request_id} periodically (e.g. every 5-10 seconds).
  4. Retrieve the result once status is COMPLETED. The result object contains image URLs.
  5. (Optional) Use a webhook_url to receive results automatically without polling.

Wan 2.7 API Pricing

Your request will cost $0.03 per image.
Video to Video (Video Editing)

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan 2.7 Video Style Transfer Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstringURL 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_imagesNoarray0-4 image URLsOptional 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.
promptYesstring≤ 5000 charactersText instruction describing the edit you want. Supports Chinese and English.
negative_promptNostring≤ 500 charactersDescribes content you do not want in the video.
resolutionNostring1080P720P, 1080PResolution tier of the output video. Also selects the per-second price tier.
ratioNostringMatches the input video16:9, 9:16, 1:1, 4:3, 3:4Aspect ratio of the output video. If omitted, the output follows the aspect ratio of the input video.
durationNointeger0 (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_settingNostringautoauto, originAudio track of the output. "auto" lets the model decide from the prompt; "origin" keeps the original audio of the source video.
prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the lower-right corner of the video.
seedNointeger0-2147483647Random 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

TypeMaxFormat / SizeDescription
video1MP4, MOV · < 100 MBSource 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance. 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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.7 API Pricing — Per-Second Rates

ResolutionPrice (USD)
720P$0.10/sec
1080P$0.15/sec
Reference to Video (Ref Image + Ref Video to Video)

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan 2.7 Video Edit By Reference Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstringURL 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_imagesYesarray1-4 image URLsReference 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.
promptYesstring≤ 5000 charactersText instruction describing the edit you want. Supports Chinese and English.
negative_promptNostring≤ 500 charactersDescribes content you do not want in the video.
resolutionNostring1080P720P, 1080PResolution tier of the output video. Also selects the per-second price tier.
ratioNostringMatches the input video16:9, 9:16, 1:1, 4:3, 3:4Aspect ratio of the output video. If omitted, the output follows the aspect ratio of the input video.
durationNointeger0 (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_settingNostringautoauto, originAudio track of the output. "auto" lets the model decide from the prompt; "origin" keeps the original audio of the source video.
prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the lower-right corner of the video.
seedNointeger0-2147483647Random 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

TypeMaxFormat / SizeDescription
video1MP4, MOV · < 100 MBSource 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance. 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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.7 API Pricing — Per-Second Rates

ResolutionPrice (USD)
720P$0.10/sec
1080P$0.15/sec
Text to Video

Wan 2.7 API Documentation

POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/generateWan27t2vRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Text to Video

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring≤ 5000 characters (English or Chinese)Text description of the video to generate.
negative_promptNostring≤ 500 charactersWhat to avoid in the generation (e.g. blurry, watermark, text).
audio_urlNostring (URL)WAV/MP3, 2–30s, ≤ 15 MBOptional audio track for the generated video, passed as a publicly fetchable URL.
resolutionNostring1080P720P, 1080POutput resolution. Also selects the per-second price tier.
ratioNostring16:916:9, 9:16, 1:1, 4:3, 3:4Output aspect ratio.
durationNointeger52–15 (seconds)Length of the generated video in seconds. Billing scales with this value.
prompt_extendNobooleantruetrue, falseIntelligent prompt rewriting for richer results.
watermarkNobooleanfalsetrue, falseAdd a provider watermark to the output.
seedNointeger0–2147483647Fix 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

HeaderRequiredValue
Ocp-Apim-Subscription-KeyYesYour API subscription key
Content-TypeYesapplication/json
X-Webhook-URLNoHTTPS callback URL (see Webhook section)
X-Webhook-ModeNoterminal (default) or sync

Response Handling

Status CodeMeaningAction
202Request accepted and queuedPoll polling_url (or wait for your webhook)
400Invalid parameters (missing prompt, bad resolution, …)Fix the request body and retry
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header
402Insufficient wallet balanceTop up your account balance
403Key not authorized for this APIVerify your subscription/product access
429Rate limit exceededBack off and retry after a delay
500Internal errorRetry; 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

FieldTypeDescription
request_idstringUnique id of your request; use it to poll and as your idempotency key
statusstringQUEUED | PROCESSING | COMPLETED | FAILED | ERROR
model_idstringAlways wan-2-7-video-api
errorstring | nullError description when status is ERROR/FAILED
output.media_urlstring[]Download URL(s) of the generated video (mp4)
output.media_typestringvideo/mp4
created_at / completed_atstringRequest lifecycle timestamps
polling_urlstringConvenience URL for status polling (submit response only)

Status Values

StatusMeaning
QUEUEDAccepted; waiting for a worker
PROCESSINGVideo generation in progress
COMPLETEDDone — output.media_url is ready
FAILED / ERRORTerminal failure — see error; not billed

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     \-> FAILED / ERROR

Typical Workflow

  1. POST the JSON body with your prompt → get request_id
  2. Poll GET /v2/requests/status/{request_id} every 10–15s (or use a webhook)
  3. On COMPLETED, download output.media_url[0]

Notes

  • Billing — per second of generated video by resolution: $0.10/s at 720P, $0.15/s at 1080P. 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

ResolutionPrice (USD)
720P$0.10/sec
1080P$0.15/sec
Image to Video

Wan 2.7 API Documentation

POST https://gateway.pixazo.ai/wan-2-7-video-api/v1/image-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Image to Video

ParameterRequiredTypeDefaultAllowed values / rangeDescription
first_frame_urlYesstring (URL)JPG/PNG, at least 240×240 px, publicly fetchableThe input image used as the video's first frame. The generated video animates from this image.
promptNostring≤ 5000 characters (English or Chinese)Optional text guidance for the motion and scene.
negative_promptNostring≤ 500 charactersWhat to avoid in the generation (e.g. blurry, watermark, text).
audio_urlNostring (URL)WAV/MP3, 2–30s, ≤ 15 MBOptional driving audio track for the generated video, passed as a publicly fetchable URL.
resolutionNostring1080P720P, 1080POutput resolution. Also selects the per-second price tier.
durationNointeger52–15 (seconds)Length of the generated video in seconds. Billing scales with this value.
prompt_extendNobooleantruetrue, falseIntelligent prompt rewriting for richer results.
watermarkNobooleanfalsetrue, falseAdd a provider watermark to the output.
seedNointeger0–2147483647Fix 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

HeaderRequiredValue
Ocp-Apim-Subscription-KeyYesYour API subscription key
Content-TypeYesapplication/json
X-Webhook-URLNoHTTPS callback URL (see Webhook section)
X-Webhook-ModeNoterminal (default) or sync

Response Handling

Status CodeMeaningAction
202Request accepted and queuedPoll polling_url (or wait for your webhook)
400Invalid parameters (missing prompt, bad resolution, …)Fix the request body and retry
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header
402Insufficient wallet balanceTop up your account balance
403Key not authorized for this APIVerify your subscription/product access
429Rate limit exceededBack off and retry after a delay
500Internal errorRetry; 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

FieldTypeDescription
request_idstringUnique id of your request; use it to poll and as your idempotency key
statusstringQUEUED | PROCESSING | COMPLETED | FAILED | ERROR
model_idstringAlways wan-2-7-video-api
errorstring | nullError description when status is ERROR/FAILED
output.media_urlstring[]Download URL(s) of the generated video (mp4)
output.media_typestringvideo/mp4
created_at / completed_atstringRequest lifecycle timestamps
polling_urlstringConvenience URL for status polling (submit response only)

Status Values

StatusMeaning
QUEUEDAccepted; waiting for a worker
PROCESSINGVideo generation in progress
COMPLETEDDone — output.media_url is ready
FAILED / ERRORTerminal failure — see error; not billed

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     \-> FAILED / ERROR

Typical Workflow

  1. POST the JSON body with your prompt → get request_id
  2. Poll GET /v2/requests/status/{request_id} every 10–15s (or use a webhook)
  3. On COMPLETED, download output.media_url[0]

Notes

  • Billing — per second of generated video by resolution: $0.10/s at 720P, $0.15/s at 1080P. 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

ResolutionPrice (USD)
720P$0.10/sec
1080P$0.15/sec
2. Wan 2.7 Pro

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

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring1-5000 charactersText description of the image to generate. Chinese and English are supported; text beyond 5000 characters is truncated.
sizeNostring"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.
nNointeger11-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_modeNobooleantruetrue, falseEnables the model's reasoning pass for stronger prompt adherence; increases generation time. Applies to text-to-image only (ignored when enable_sequential is true).
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" label to the bottom-right corner of the output.
seedNointeger0-2147483647Random 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_sequentialNobooleanfalsetrue, falseEnables image-set (sequential) output mode. When true, n accepts 1-12 (default 12) and thinking_mode and color_palette do not apply.
color_paletteNoarray3-10 color objectsCustom 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_urlNostringURL 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
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
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_idstringUnique identifier for the request. Use this to poll for status.
statusstringCurrent status of the request (QUEUED, PROCESSING, COMPLETED, FAILED).
messagestringHuman-readable status message.
resultobjectThe result payload (present when status is COMPLETED).
imagesarrayArray of generated image objects.
images[].file_namestringName of the output file.
images[].content_typestringMIME type of the output file (image/png).
images[].urlstringA link to download the generated image.
descriptionstringOptional description returned with the response.
errorstringError message (present when status is FAILED).

Status Values

Status Description
Request has been accepted and is waiting in the queue.
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

  1. Submit a POST request to https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProTextToImageRequest with your parameters.
  2. Receive a 202 Accepted response with a request_id and status QUEUED.
  3. Poll the status endpoint GET /v2/requests/status/{request_id} periodically (e.g. every 5-10 seconds).
  4. Retrieve the result once status is COMPLETED. The result object contains image URLs.
  5. (Optional) Use a webhook_url to receive results automatically without polling.

Wan 2.7 Pro API Pricing

Your request will cost $0.075 per image.
Image to Image (Image Editing)

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

ParameterRequiredTypeDefaultAllowed values / rangeDescription
imagesYesarray1-9 image URLsArray 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.
promptYesstring1-5000 charactersText description of the desired edit. Chinese and English are supported; text beyond 5000 characters is truncated.
sizeNostring"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.
nNointeger11-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.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" label to the bottom-right corner of the output.
seedNointeger0-2147483647Random 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_listNoarrayUp to 2 boxes per imageSelected 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_sequentialNobooleanfalsetrue, falseEnables image-set (sequential) output mode. When true, n accepts 1-12 (default 12).
webhook_urlNostringURL to receive a POST callback when the request completes. Must be a publicly accessible HTTPS endpoint.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
imageJPG, PNG, WEBP · < 20 MBImage(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
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
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_idstringUnique identifier for the request. Use this to poll for status.
statusstringCurrent status of the request (QUEUED, PROCESSING, COMPLETED, FAILED).
messagestringHuman-readable status message.
resultobjectThe result payload (present when status is COMPLETED).
imagesarrayArray of generated image objects.
images[].file_namestringName of the output file.
images[].content_typestringMIME type of the output file (image/png).
images[].urlstringA link to download the generated image.
descriptionstringOptional description returned with the response.
errorstringError message (present when status is FAILED).

Status Values

Status Description
Request has been accepted and is waiting in the queue.
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

  1. Submit a POST request to https://gateway.pixazo.ai/wan-2-7-pro-api/v1/generateWan27ProEditImageRequest with your parameters.
  2. Receive a 202 Accepted response with a request_id and status QUEUED.
  3. Poll the status endpoint GET /v2/requests/status/{request_id} periodically (e.g. every 5-10 seconds).
  4. Retrieve the result once status is COMPLETED. The result object contains image URLs.
  5. (Optional) Use a webhook_url to receive results automatically without polling.

Wan 2.7 Pro API Pricing

Your request will cost $0.075 per image.
3. Wan 2.6

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan 2.6 Image to Video generate request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringThe text prompt describing the desired video motion. Max 1500 characters.
image_urlYesstringURL 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_ratioNostring"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".
resolutionNostring1080p"720p", "1080p"Resolution of the output video. Supported values: "720p", "1080p".
durationNostring5"5", "10", "15"Duration of the generated video in seconds. Choose between 5, 10 or 15 seconds.
audio_urlNostringURL 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_promptNostring""Negative prompt describing content to avoid in the generated video. Max 500 characters.
enable_prompt_expansionNobooleantruetrue, falseWhether 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_shotsNobooleanfalsetrue, falseWhen 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_checkerNobooleantruetrue, falseIf 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.
seedNointegerRandom seed for reproducibility. If omitted, a random seed is chosen.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 20 MBInput image.
audio1MP3, WAV · < 15 MBOptional 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance. 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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.6 API Pricing — Per-Second Rates

ResolutionPrice (USD)
720p$0.10/sec
1080p$0.15/sec
Text to Video

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan 2.6 Text to Video generate request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringThe 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_ratioNostring16:9"16:9", "9:16", "1:1", "4:3", "3:4"The aspect ratio of the generated video.
resolutionNostring1080p"720p", "1080p"Resolution of the output video. Wan 2.6 text-to-video supports only "720p" and "1080p" (no 480p).
durationNostring5"5", "10", "15"Duration of the generated video in seconds. Choose between 5, 10 or 15 seconds.
audio_urlNostringURL 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_promptNostring""Negative prompt describing content to avoid in the generated video. Max 500 characters.
enable_prompt_expansionNobooleantruetrue, falseWhether 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_shotsNobooleantruetrue, falseWhen 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_checkerNobooleantruetrue, falseIf 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.
seedNointegerRandom seed for reproducibility. If omitted, a random seed is chosen.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
audio1MP3, WAV · < 15 MBOptional 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.6 API Pricing — Per-Second Rates

ResolutionPrice (USD)
720p$0.10/sec
1080p$0.15/sec
Image to Video (Flash)

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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan 2.6 Image-to-Video Flash API generate request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringThe text prompt describing the desired video motion. Max 1500 characters.
image_urlYesstringURL 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.
resolutionNostring1080p"720p", "1080p"Resolution of the output video. Supported values: "720p", "1080p".
durationNostring5"5", "10", "15"Duration of the generated video in seconds. Choose between 5, 10 or 15 seconds.
audio_urlNostringURL 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_promptNostring""Negative prompt describing content to avoid in the generated video. Max 500 characters.
generate_audioNobooleantruetrue, falseWhether 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_expansionNobooleantruetrue, falseWhether 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_shotsNobooleanfalsetrue, falseWhen 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_checkerNobooleantruetrue, falseIf 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.
seedNointegerRandom seed for reproducibility. If omitted, a random seed is chosen.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 20 MBInput image.
audio1MP3, WAV · < 15 MBOptional 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

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-image-to-video-flash-api-353' not found or is disabled"
}

Error via Status/Webhook

{
  "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
}

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-flash-api-353_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "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/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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Request Headers

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

Wan 2.6 API Pricing — Per-Second Rates

ResolutionPrice (USD)
720p$0.10/sec
1080p$0.15/sec
4. Wan 2.5

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Generate Image to Image

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringUp to 2000 charactersText description of the edit to perform. Supports English and Chinese; text beyond the limit is truncated.
imagesYesarray1 to 3 image URLsPublicly 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_promptNostringnullUp to 500 charactersElements to exclude from the edited image.
sizeNostring1280*1280Total pixels from 768*768 to 1280*1280; aspect ratio from 1:4 to 4:1Output image dimensions in width*height format.
nNointeger11Number of images to generate. This endpoint returns a single image per request.
prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the bottom-right corner of the image.
seedNointeger0 to 2147483647Random 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

TypeMaxFormat / SizeDescription
imageJPG, PNG, WEBP · < 20 MBReference 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.5 API Pricing

Your request will cost $0.05 per image generation.
Text to Image

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Generate Text to Image

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringUp to 2000 charactersText description of the image to generate. Supports English and Chinese; text beyond the limit is truncated.
negative_promptNostringnullUp to 500 charactersElements to exclude from the image.
sizeNostring1024*1024Total pixels from 768*768 to 1440*1440; aspect ratio from 1:4 to 4:1Image dimensions in width*height format.
nNointeger11Number of images to generate. This endpoint returns a single image per request.
prompt_extendNobooleanfalsetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the bottom-right corner of the image.
seedNointeger0 to 2147483647Random 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.5 API Pricing

Your request will cost $0.05 per image generation.
Image to Video

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Generate Image To Video

ParameterRequiredTypeDefaultAllowed values / rangeDescription
img_urlYesstringJPEG, JPG, PNG, BMP or WEBPPublicly 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.
promptNostringUp to 1500 charactersText description of the video to generate. Supports English and Chinese. Include spoken dialogue here to have the model voice it with lip-sync.
negative_promptNostringnullUp to 500 charactersElements to exclude from the video.
audio_urlNostringWAV or MP3; 3 to 30 seconds; up to 15 MBPublicly accessible HTTPS URL of a custom audio track. If set, it is used instead of the model-generated audio.
resolutionNostring480P480P, 720P, 1080POutput resolution tier. Determines the pixel count of the generated video.
durationNointeger55, 10Video length in seconds.
audioNobooleanfalsetrue, falseWhether the model generates an audio track for the video. false produces a silent video.
prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the bottom-right corner of the video.
seedNointeger0 to 2147483647Random 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

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 20 MBInput image.
audio1MP3, WAV · < 15 MBOptional 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.5 API Pricing — Per-Second Rates

Your request will cost $0.10 per second.
e.g. $0.50 for a 5-second clip, $1.00 for a 10-second clip
Text to Video

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Generate Text To Video Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringUp to 1500 charactersText description of the video to generate. Supports English and Chinese. Include spoken dialogue here to have the model voice it with lip-sync.
negative_promptNostringnullUp to 500 charactersElements to exclude from the video.
audio_urlNostringWAV or MP3; 3 to 30 seconds; up to 15 MBPublicly accessible HTTPS URL of a custom audio track. If set, it is used instead of the model-generated audio.
sizeNostring832*480832*480, 1280*720, 1920*1080 (and the matching portrait or square sizes for each tier)Video dimensions in width*height format.
durationNointeger55, 10Video length in seconds.
audioNobooleanfalsetrue, falseWhether the model generates an audio track for the video. false produces a silent video.
prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
watermarkNobooleanfalsetrue, falseAdds an "AI Generated" watermark to the bottom-right corner of the video.
seedNointeger0 to 2147483647Random 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

TypeMaxFormat / SizeDescription
audio1MP3, WAV · < 15 MBOptional 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.5 API Pricing — Per-Second Rates

Your request will cost $0.10 per second.
e.g. $0.50 for a 5-second clip, $1.00 for a 10-second clip
Image to Video (Pixazo)

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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - 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
Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
Too Many Requests
500 Internal Server Error

Response Fields - Check Status

<

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 'pixazo-wan-image-to-video-1763709522' not found or is disabled"
}

Error via Status/Webhook

{
  "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
}

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/pixazo-wan-image-to-video-1763709522_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.5 API Pricing

Your request will cost $0.05 per second.
5. Wan 2.2

Wan 2.2 API Documentation

https://gateway.pixazo.ai/wan2.2-s2v/v1/generateSpeechToVideoRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Speech to Video Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringThe text prompt used for video generation. Describes the style and content of the generated video.
image_urlYesstringURL of the input image. If the input image does not match the chosen aspect ratio, it is resized and center cropped.
audio_urlYesstringURL of the audio file that drives the lip-sync and facial expressions in the generated video.
negative_promptNostring""Describes what to avoid. Used to steer the generation away from unwanted features. Empty by default.
num_framesNointeger8040–120 (multiples of 4)Number of frames to generate. Together with frames_per_second this determines the length of the video.
frames_per_secondNointeger164–60Frames per second of the generated video. Higher values give smoother motion.
seedNointegerRandom 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.
resolutionNostring480p480p, 580p, 720pResolution of the generated video.
num_inference_stepsNointeger27Number of refinement steps the model runs while generating. Higher values refine detail and quality but increase processing time; lower values are faster.
enable_safety_checkerNobooleanfalsetrue, falseChecks the input for unsafe or explicit (NSFW) content before processing.
enable_output_safety_checkerNobooleanfalsetrue, falseChecks the generated video for unsafe or explicit (NSFW) content after generation.
guidance_scaleNofloat3.5Controls how closely the output follows your prompt (classifier-free guidance). Higher values stick more strictly to the prompt; lower values allow more creative variation.
shiftNofloat51.0–10.0An advanced sampling control that affects the balance of motion and detail in the video. The default works well for most cases.
video_qualityNostringhighlow, medium, high, maximumQuality of the output video. Higher quality means better visual quality but a larger file size.
video_write_modeNostringbalancedfast, balanced, smallHow the output video is written: "fast" (quicker, larger file), "balanced" (a compromise), "small" (slowest, smallest file).

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, BMP, WEBP · < 10 MBReference image.
audio1MP3, WAVReference 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

ResolutionPrice (USD)
Per second (720p)$0.20
Per second (580p)$0.15
Per second (480p)$0.10
Audio to Video (Ref Image + Ref Audio to Video — Animate)

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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Generate Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstringURL of the source video. The motion and facial expressions in this video drive the animation.
image_urlYesstringURL of the image to animate. If the image does not match the chosen aspect ratio, it is resized and center cropped.
resolutionNostring480p480p, 580p, 720pResolution of the generated video.
num_inference_stepsNointeger20Number of refinement steps the model runs while generating. Higher values give better quality but take longer.
guidance_scaleNofloat1Controls how closely the output follows the guidance (classifier-free guidance). Higher values adhere more strictly but may reduce quality.
shiftNofloat51.0–10.0An advanced sampling control that affects the balance of motion and detail in the video. The default works well for most cases.
seedNointegerRandom 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_checkerNobooleanfalsetrue, falseChecks the input for unsafe or explicit (NSFW) content before processing.
enable_output_safety_checkerNobooleanfalsetrue, falseChecks the generated video for unsafe or explicit (NSFW) content after generation.
video_qualityNostringhighlow, medium, high, maximumQuality of the output video. Higher quality means better visual quality but a larger file size.
video_write_modeNostringbalancedfast, balanced, smallHow the output video is written: "fast" (quicker, larger file), "balanced" (a compromise), "small" (slowest, smallest file).

Content Item Types & Limits

TypeMaxFormat / SizeDescription
video1MP4, MOVReference video (motion).
image1JPG, PNG, WEBP · < 10 MBCharacter 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
Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
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

  1. Submit request to /wan-2-2-animate-api-request with video_url and image_url
  2. Receive response containing request_id
  3. Poll /wan-2-2-animate-api-request-result every 2-5 seconds using request_id
  4. When status is COMPLETED, extract animation URL from response
  5. 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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

Your request will cost $0.40 per second.
Image to Video (First Frame to Video)

Wan 2.2 API Documentation

https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan Image to Video First Frame

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringwan2.2-i2v-plus, wan2.2-i2v-flash, wan2.1-i2v-plus, wan2.1-i2v-turboWhich model version to use. "wan2.2-i2v-plus" gives the highest quality; "wan2.2-i2v-flash" is faster and cheaper.
input.img_urlYesstringURL 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.promptNostringUp to 800 charactersText description that guides the video generation. Supports English and Chinese.
input.negative_promptNostringUp to 500 charactersElements to exclude from the generated video.
parameters.resolutionNostringVaries by model480P, 720P, 1080PResolution 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.durationNointeger53, 4, 5Video length in seconds. Only wan2.1-i2v-turbo accepts 3, 4 or 5; all other models are fixed at 5.
parameters.prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
parameters.watermarkNobooleanfalsetrue, falseWhen true, adds an "AI Generated" watermark in the lower-right corner.
parameters.seedNointeger0–2147483647Random 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

TypeMaxFormat / SizeDescription
image1JPG, PNG, BMP, WEBP · < 10 MBFirst-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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

ResolutionDurationModelPrice (USD)
720P5swan2.1-kf2v-plus$0.60
480P-wan2.2-i2v-flash$0.085
720P5swan2.2-i2v-flash$0.20
480P-wan2.2-i2v-plus$0.125
1080P-wan2.2-i2v-plus$0.75
480P5swan2.1-i2v-turbo$0.20
720P-wan2.1-i2v-turbo$0.20
720P-wan2.1-i2v-plus$0.75
Image to Video (Keyframe to Video)

Wan 2.2 API Documentation

https://gateway.pixazo.ai/wan-i2v/v1/generateImageToVideoFrameRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Wan Keyframe to Video

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringwan2.1-kf2v-plusModel to use (first-frame and last-frame to video).
input.first_frame_urlYesstringURL 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_urlYesstringURL 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.promptNostringUp to 800 charactersText description that guides the transition between the two frames. Supports English and Chinese. Useful for describing camera or subject movement.
input.negative_promptNostringUp to 500 charactersElements to exclude from the generated video.
parameters.resolutionNostring720P720PResolution tier of the output video. Only 720P is supported by this model.
parameters.durationNointeger55Video length in seconds. Fixed at 5 and cannot be changed.
parameters.prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
parameters.watermarkNobooleanfalsetrue, falseWhen true, adds an "AI Generated" watermark in the lower-right corner.
parameters.seedNointeger0–2147483647Random 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

TypeMaxFormat / SizeDescription
image1JPG, PNG, BMP, WEBP · < 10 MBFirst / 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

ResolutionDurationModelPrice (USD)
720P5swan2.1-kf2v-plus$0.60
480P-wan2.2-i2v-flash$0.085
720P5swan2.2-i2v-flash$0.20
480P-wan2.2-i2v-plus$0.125
1080P-wan2.2-i2v-plus$0.75
480P5swan2.1-i2v-turbo$0.20
720P-wan2.1-i2v-turbo$0.20
720P-wan2.1-i2v-plus$0.75
Image to Image (Image Editing)

Wan 2.2 API Documentation

https://gateway.pixazo.ai/wan-t2i/v1/generateEditImageRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Edit Image Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringwanx2.1-imageeditModel to use.
input.functionYesstringstylization_all, stylization_local, description_edit, description_edit_with_mask, remove_watermark, expand, super_resolution, colorization, doodle, control_cartoon_featureThe 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.promptYesstringUp to 800 charactersText prompt describing the desired edit. Supports English and Chinese.
input.base_image_urlYesstringURL 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_urlNostringURL 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.nNointeger11–4Number of images to generate. Billing is based on the number of images generated.
parameters.seedNointeger0–2147483647Random 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.strengthNofloat0.50.0–1.0How strongly the image is modified. Lower values stay closer to the original; higher values allow bigger changes.
parameters.top_scaleNofloat1.01.0–2.0How far to extend the image upwards. Used with input.function "expand".
parameters.bottom_scaleNofloat1.01.0–2.0How far to extend the image downwards. Used with input.function "expand".
parameters.left_scaleNofloat1.01.0–2.0How far to extend the image to the left. Used with input.function "expand".
parameters.right_scaleNofloat1.01.0–2.0How far to extend the image to the right. Used with input.function "expand".
parameters.upscale_factorNointeger11–4Magnification multiplier. Used with input.function "super_resolution".
parameters.is_sketchNobooleanfalsetrue, falseMarks the input image as a hand-drawn sketch. Used with input.function "doodle".
parameters.watermarkNobooleanfalsetrue, falseWhen true, adds a "Generated by AI" watermark in the lower-right corner.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBPImage 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

Variants are quality tiers: Variant 1 = Standard, Variant 2 = High. Higher tier = more detail at higher cost.

ResolutionModelPrice (USD)
1080*1920wan2.2-t2v-plus$0.60
1280*720wan2.1-t2v-turbo$0.30
1280*720wan2.1-t2v-plus$0.60
Text to Image

Wan 2.2 API Documentation

https://gateway.pixazo.ai/wan-t2i/v1/generateTextToImageRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Text To Image Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringwan2.2-t2i-flash, wan2.2-t2i-plus, wanx2.1-t2i-turbo, wanx2.1-t2i-plus, wanx2.0-t2i-turboWhich model version to use. "wan2.2-t2i-flash" is the fastest; "wan2.2-t2i-plus" gives the best quality.
input.promptYesstringUp to 500 charactersPositive prompt describing the image you want. Supports English and Chinese. (wanx2.0-t2i-turbo accepts up to 800 characters.)
input.negative_promptNostringUp to 500 charactersElements to exclude from the generated image.
parameters.sizeNostring1024*1024Width 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.nNointeger41–4Number 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.seedNointeger0–2147483647Random 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_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results, especially for short prompts.
parameters.watermarkNobooleanfalsetrue, falseWhen 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

Variants are quality tiers: Variant 1 = Standard, Variant 2 = High. Higher tier = more detail at higher cost.

ResolutionModelPrice (USD)
1080*1920wan2.2-t2v-plus$0.60
1280*720wan2.1-t2v-turbo$0.30
1280*720wan2.1-t2v-plus$0.60
Text to Video

Wan 2.2 API Documentation

https://gateway.pixazo.ai/wan-video/v1/generateTextToVideoRequest

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

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

Example: enable webhook

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

Callback Payload

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

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

Request Parameters - Generate Text To Video Request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
modelYesstringwan2.2-t2v-plus, wan2.1-t2v-plus, wan2.1-t2v-turboWhich model version to use. "wan2.2-t2v-plus" is recommended; the other versions trade off speed and quality.
input.promptYesstringUp to 800 charactersText description of the video to generate. Supports English and Chinese.
input.negative_promptNostringUp to 500 charactersElements to exclude from the generated video.
parameters.sizeNostring1920*1080480p: 832*480, 480*832, 624*624 · 1080p: 1920*1080, 1080*1920, 1440*1440, 1632*1248, 1248*1632Output 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.durationNointeger55Video length in seconds. Fixed at 5 for the wan2.2 and wan2.1 models.
parameters.prompt_extendNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Adds some latency.
parameters.seedNointeger0–2147483647Random 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.watermarkNobooleanfalsetrue, falseWhen true, adds an "AI Generated" watermark in the lower-right corner.
parameters.nNointeger11Number 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model '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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

Wan 2.2 API Pricing

ResolutionDurationModelPrice (USD)
1080*19205swan2.2-t2v-plus$0.60
1280*7205swan2.1-t2v-turbo$0.30
1280*7205swan2.1-t2v-plus$0.60