Vidu API: Pricing, Documentation

by Vidu

Vidu API, developers can create videos that follow reference images or styles, ensuring brand consistency and creative control. The API's Q2 Pro model delivers high-quality output suitable for commercial video production and content creation workflows.

Get API Key
Vidu Video API

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

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

Claim Your $5 →

Vidu Q3 Pro API Documentation

https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Text to Video - Vidu Q3 Pro

Request Code

POST https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "prompt": "A golden retriever running through a sunlit meadow in slow motion"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "prompt": "A golden retriever running through a sunlit meadow in slow motion"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  prompt: 'A golden retriever running through a sunlit meadow in slow motion'
};

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/vidu-q3-pro/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A golden retriever running through a sunlit meadow in slow motion"
  }'

Output

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-pro_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": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-pro",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-pro_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": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-pro",
  "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

Parameter Required Type Default Allowed values / range Description
promptYesstringnon-empty; ≤ 5000 charsText description of the video to generate.
durationNointeger51–16 (seconds)Video length in seconds. Billed per second.
resolutionNostring"720p""540p", "720p", "1080p"Output resolution. Billed per second by resolution.
aspect_ratioNostring"16:9""16:9", "9:16", "3:4", "4:3", "1:1"Output aspect ratio (text-to-video only).
audioNobooleantruetrue, falseEnable audio-video sync. false outputs a silent video.

Example Request

{
  "prompt": "A golden retriever running through a sunlit meadow in slow motion",
  "duration": 5,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "audio": true
}

Response

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-pro_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 'vidu-q3-pro' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-pro",
  "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/vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-pro",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-pro_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

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.

Examples

Common ways to call POST /vidu-q3-pro/v1/text-to-video. Each submit returns a request_id — poll GET /v2/requests/status/{request_id} until COMPLETED.

Portrait Aspect Ratio — Vertical video for social media.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    prompt: "A busy street in Tokyo at night with neon signs reflecting on wet pavement, rain falling",
    aspect_ratio: "9:16",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A busy street in Tokyo at night with neon signs reflecting on wet pavement, rain falling",
    "aspect_ratio": "9:16",
    "duration": 5,
    "resolution": "720p"
  }'
Silent Video — Generate video without audio.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    audio: false,
    prompt: "Abstract paint swirls slowly mixing in water, vivid blues and golds",
    duration: 8,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "audio": false,
    "prompt": "Abstract paint swirls slowly mixing in water, vivid blues and golds",
    "duration": 8,
    "resolution": "720p"
  }'
Square Format — Square video for product demos or social posts.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    prompt: "A sleek wireless headphone rotating on a pedestal with soft studio lighting and a white background",
    aspect_ratio: "1:1",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A sleek wireless headphone rotating on a pedestal with soft studio lighting and a white background",
    "aspect_ratio": "1:1",
    "duration": 5,
    "resolution": "720p"
  }'

Vidu Q3 Pro API Pricing

ResolutionPrice (USD)
540p (per second of video)$0.05
720p (per second of video)$0.125
1080p (per second of video)$0.15
Image to Video

Vidu Q3 Pro API Documentation

https://gateway.pixazo.ai/vidu-q3-pro/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 - Vidu Q3 Pro

Request Code

POST https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "prompt": "the subject turns toward the camera, gentle natural motion"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "the subject turns toward the camera, gentle natural motion"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  start_image: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png',
  prompt: 'the subject turns toward the camera, gentle natural motion'
};

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/vidu-q3-pro/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "the subject turns toward the camera, gentle natural motion"
  }'

Output

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-pro_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": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-pro",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-pro_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": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-pro",
  "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

Parameter Required Type Default Allowed values / range Description
start_imageYesstringpublic URL or data:image/...;base64,…Starting frame to animate.
promptNostring≤ 5000 charsOptional text guiding the motion / scene.
durationNointeger51–16 (seconds)Video length in seconds. Billed per second.
resolutionNostring"720p""540p", "720p", "1080p"Output resolution. Billed per second by resolution.
audioNobooleantruetrue, falseEnable audio-video sync. false outputs a silent video.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 50 MBStart image.

Example Request

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "prompt": "the subject turns toward the camera, gentle natural motion",
  "duration": 5,
  "resolution": "720p",
  "audio": true
}

Response

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-pro_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 'vidu-q3-pro' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-pro",
  "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/vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-pro",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-pro_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

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.

Examples

Common ways to call POST /vidu-q3-pro/v1/image-to-video. Each submit returns a request_id — poll GET /v2/requests/status/{request_id} until COMPLETED.

Animate a Still Image — Bring a single image to life with a motion prompt.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    prompt: "the camera slowly pushes in as gentle wind moves through the scene",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "the camera slowly pushes in as gentle wind moves through the scene",
    "duration": 5,
    "resolution": "720p"
  }'
Silent Animation — Animate an image without audio.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    audio: false,
    prompt: "subtle parallax motion, leaves drifting in the breeze",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "audio": false,
    "prompt": "subtle parallax motion, leaves drifting in the breeze",
    "duration": 5,
    "resolution": "720p"
  }'
1080p, 8-Second Clip — Higher resolution and a longer duration.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    prompt: "slow cinematic dolly across the scene at golden hour",
    duration: 8,
    resolution: "1080p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "slow cinematic dolly across the scene at golden hour",
    "duration": 8,
    "resolution": "1080p"
  }'

Vidu Q3 Pro API Pricing

ResolutionPrice (USD)
540p (per second of video)$0.05
720p (per second of video)$0.125
1080p (per second of video)$0.15
Start / End Frame to Video

Vidu Q3 Pro API Documentation

https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Start / End Frame to Video - Vidu Q3 Pro

Request Code

POST https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  start_image: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png',
  end_image: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png'
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"
  }'

Output

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-pro_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": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-pro",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-pro_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": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-pro",
  "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 - Start / End Frame to Video

Parameter Required Type Default Allowed values / range Description
start_imageYesstringpublic URL or data:image/...;base64,…First frame of the video.
end_imageYesstringpublic URL or data:image/...;base64,…Last frame. Must be used together with start_image.
promptNostring≤ 5000 charsOptional text guiding the motion / scene.
durationNointeger51–16 (seconds)Video length in seconds. Billed per second.
resolutionNostring"720p""540p", "720p", "1080p"Output resolution. Billed per second by resolution.
audioNobooleantruetrue, falseEnable audio-video sync. false outputs a silent video.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 50 MBStart / end frame image.

Example Request

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
  "prompt": "a smooth, natural transition between the two frames",
  "duration": 5,
  "resolution": "720p",
  "audio": true
}

Response

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-pro_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 'vidu-q3-pro' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-pro",
  "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/vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q3-pro_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-pro",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-pro_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

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.

Examples

Common ways to call POST /vidu-q3-pro/v1/start-end-to-video. Each submit returns a request_id — poll GET /v2/requests/status/{request_id} until COMPLETED.

Frame-to-Frame Transition — Generate a video that morphs from a start frame to an end frame.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    end_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    prompt: "a smooth, natural transition between the two frames",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    "prompt": "a smooth, natural transition between the two frames",
    "duration": 5,
    "resolution": "720p"
  }'
Silent Transition — Frame-to-frame transition without audio.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    end_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    audio: false,
    prompt: "seamless dissolve from the first scene to the last",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    "audio": false,
    "prompt": "seamless dissolve from the first scene to the last",
    "duration": 5,
    "resolution": "720p"
  }'
1080p, 8-Second Transition — Higher resolution and a longer transition.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    end_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    prompt: "cinematic morph with dynamic camera movement",
    duration: 8,
    resolution: "1080p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-pro/v1/start-end-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    "prompt": "cinematic morph with dynamic camera movement",
    "duration": 8,
    "resolution": "1080p"
  }'

Vidu Q3 Pro API Pricing

ResolutionPrice (USD)
540p (per second of video)$0.05
720p (per second of video)$0.125
1080p (per second of video)$0.15
2. Vidu Q3 Turbo

Vidu Q3 Turbo API Documentation

https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Text to Video - Vidu Q3 Turbo

Request Code

POST https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "prompt": "A cat lazily stretching on a sunlit windowsill"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "prompt": "A cat lazily stretching on a sunlit windowsill"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  prompt: 'A cat lazily stretching on a sunlit windowsill'
};

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/vidu-q3-turbo/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A cat lazily stretching on a sunlit windowsill"
  }'

Output

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-turbo_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": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-turbo",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-turbo_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": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-turbo",
  "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

Parameter Required Type Default Allowed values / range Description
promptYesstringnon-empty; ≤ 5000 charsText description of the video to generate.
durationNointeger51–16 (seconds)Video length in seconds. Billed per second.
resolutionNostring"720p""540p", "720p", "1080p"Output resolution. Billed per second by resolution.
aspect_ratioNostring"16:9""16:9", "9:16", "3:4", "4:3", "1:1"Output aspect ratio (text-to-video only).
audioNobooleantruetrue, falseEnable audio-video sync. false outputs a silent video.

Example Request

{
  "prompt": "A cat lazily stretching on a sunlit windowsill",
  "duration": 5,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "audio": true
}

Response

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-turbo_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 'vidu-q3-turbo' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-turbo",
  "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/vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-turbo",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-turbo_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

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.

Examples

Common ways to call POST /vidu-q3-turbo/v1/text-to-video. Each submit returns a request_id — poll GET /v2/requests/status/{request_id} until COMPLETED.

Portrait Aspect Ratio — Vertical video for social media.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    prompt: "A busy street in Tokyo at night with neon signs reflecting on wet pavement, rain falling",
    aspect_ratio: "9:16",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A busy street in Tokyo at night with neon signs reflecting on wet pavement, rain falling",
    "aspect_ratio": "9:16",
    "duration": 5,
    "resolution": "720p"
  }'
Silent Video — Generate video without audio.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    audio: false,
    prompt: "Abstract paint swirls slowly mixing in water, vivid blues and golds",
    duration: 8,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "audio": false,
    "prompt": "Abstract paint swirls slowly mixing in water, vivid blues and golds",
    "duration": 8,
    "resolution": "720p"
  }'
Square Format — Square video for product demos or social posts.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    prompt: "A sleek wireless headphone rotating on a pedestal with soft studio lighting and a white background",
    aspect_ratio: "1:1",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/text-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A sleek wireless headphone rotating on a pedestal with soft studio lighting and a white background",
    "aspect_ratio": "1:1",
    "duration": 5,
    "resolution": "720p"
  }'

Vidu Q3 Turbo API Pricing

ResolutionPrice (USD)
540p (per second of video)$0.04
720p (per second of video)$0.06
1080p (per second of video)$0.07
Image to Video

Vidu Q3 Turbo API Documentation

https://gateway.pixazo.ai/vidu-q3-turbo/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 - Vidu Q3 Turbo

Request Code

POST https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "prompt": "the subject turns toward the camera, gentle natural motion"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "the subject turns toward the camera, gentle natural motion"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  start_image: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png',
  prompt: 'the subject turns toward the camera, gentle natural motion'
};

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/vidu-q3-turbo/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "the subject turns toward the camera, gentle natural motion"
  }'

Output

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-turbo_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": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-turbo",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-turbo_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": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-turbo",
  "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

Parameter Required Type Default Allowed values / range Description
start_imageYesstringpublic URL or data:image/...;base64,…Starting frame to animate.
promptNostring≤ 5000 charsOptional text guiding the motion / scene.
durationNointeger51–16 (seconds)Video length in seconds. Billed per second.
resolutionNostring"720p""540p", "720p", "1080p"Output resolution. Billed per second by resolution.
audioNobooleantruetrue, falseEnable audio-video sync. false outputs a silent video.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 50 MBStart image.

Example Request

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "prompt": "the subject turns toward the camera, gentle natural motion",
  "duration": 5,
  "resolution": "720p",
  "audio": true
}

Response

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-turbo_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 'vidu-q3-turbo' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-turbo",
  "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/vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-turbo",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-turbo_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

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.

Examples

Common ways to call POST /vidu-q3-turbo/v1/image-to-video. Each submit returns a request_id — poll GET /v2/requests/status/{request_id} until COMPLETED.

Animate a Still Image — Bring a single image to life with a motion prompt.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    prompt: "the camera slowly pushes in as gentle wind moves through the scene",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "the camera slowly pushes in as gentle wind moves through the scene",
    "duration": 5,
    "resolution": "720p"
  }'
Silent Animation — Animate an image without audio.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    audio: false,
    prompt: "subtle parallax motion, leaves drifting in the breeze",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "audio": false,
    "prompt": "subtle parallax motion, leaves drifting in the breeze",
    "duration": 5,
    "resolution": "720p"
  }'
1080p, 8-Second Clip — Higher resolution and a longer duration.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    prompt: "slow cinematic dolly across the scene at golden hour",
    duration: 8,
    resolution: "1080p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/image-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "prompt": "slow cinematic dolly across the scene at golden hour",
    "duration": 8,
    "resolution": "1080p"
  }'

Vidu Q3 Turbo API Pricing

ResolutionPrice (USD)
540p (per second of video)$0.04
720p (per second of video)$0.06
1080p (per second of video)$0.07
Reference to Video

Vidu Q3 Turbo API Documentation

https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Reference to Video - Vidu Q3 Turbo

Request Code

POST https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video';
const headers = {
  'Content-Type': 'application/json',
  'Cache-Control': 'no-cache',
  'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
  start_image: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png',
  end_image: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png'
};

fetch(url, {
  method: 'POST',
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png"
  }'

Output

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-turbo_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": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-turbo",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-turbo_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": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-turbo",
  "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 - Reference to Video

Parameter Required Type Default Allowed values / range Description
start_imageYesstringpublic URL or data:image/...;base64,…First frame of the video.
end_imageYesstringpublic URL or data:image/...;base64,…Last frame. Must be used together with start_image.
promptNostring≤ 5000 charsOptional text guiding the motion / scene.
durationNointeger51–16 (seconds)Video length in seconds. Billed per second.
resolutionNostring"720p""540p", "720p", "1080p"Output resolution. Billed per second by resolution.
audioNobooleantruetrue, falseEnable audio-video sync. false outputs a silent video.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 50 MBStart / end frame image.

Example Request

{
  "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
  "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
  "prompt": "a smooth, natural transition between the two frames",
  "duration": 5,
  "resolution": "720p",
  "audio": true
}

Response

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q3-turbo_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 'vidu-q3-turbo' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q3-turbo",
  "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/vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q3-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q3-turbo",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q3-turbo_019dxxxx-xxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-04-07T10:00:00.000Z",
  "updated_at": "2026-04-07T10:02:30.000Z",
  "completed_at": "2026-04-07T10:02:30.000Z"
}

Response Fields

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.

Examples

Common ways to call POST /vidu-q3-turbo/v1/reference-to-video. Each submit returns a request_id — poll GET /v2/requests/status/{request_id} until COMPLETED.

Frame-to-Frame Transition — Generate a video that morphs from a start frame to an end frame.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    end_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    prompt: "a smooth, natural transition between the two frames",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    "prompt": "a smooth, natural transition between the two frames",
    "duration": 5,
    "resolution": "720p"
  }'
Silent Transition — Frame-to-frame transition without audio.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    end_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    audio: false,
    prompt: "seamless dissolve from the first scene to the last",
    duration: 5,
    resolution: "720p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    "audio": false,
    "prompt": "seamless dissolve from the first scene to the last",
    "duration": 5,
    "resolution": "720p"
  }'
1080p, 8-Second Transition — Higher resolution and a longer transition.
const res = await fetch("https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
  },
  body: JSON.stringify({
    start_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    end_image: "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    prompt: "cinematic morph with dynamic camera movement",
    duration: 8,
    resolution: "1080p",
  }),
});

const { request_id } = await res.json() as { request_id: string };
// Poll GET /v2/requests/status/{request_id} until status === "COMPLETED"
curl -X POST "https://gateway.pixazo.ai/vidu-q3-turbo/v1/reference-to-video" \
  -H "Content-Type: application/json" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "start_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
    "end_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.png",
    "prompt": "cinematic morph with dynamic camera movement",
    "duration": 8,
    "resolution": "1080p"
  }'

Vidu Q3 Turbo API Pricing

ResolutionPrice (USD)
540p (per second of video)$0.04
720p (per second of video)$0.06
1080p (per second of video)$0.07
3. Vidu Q3

Vidu Q3 API Documentation

https://gateway.pixazo.ai/vidu/v1/vidu-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

Vidu generate request - Vidu

Request Code

POST https://gateway.pixazo.ai/vidu/v1/vidu-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "prompt": "A slow-motion capture of a hummingbird hovering beside a vibrant red hibiscus flower, iridescent feathers catching sunlight, shallow depth of field, garden background",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "720p",
  "audio": true
}
import requests

url = "https://gateway.pixazo.ai/vidu/v1/vidu-request"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "prompt": "A slow-motion capture of a hummingbird hovering beside a vibrant red hibiscus flower, iridescent feathers catching sunlight, shallow depth of field, garden background",
    "duration": 5,
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "audio": True
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu/v1/vidu-request';

const data = {
  prompt: 'A slow-motion capture of a hummingbird hovering beside a vibrant red hibiscus flower, iridescent feathers catching sunlight, shallow depth of field, garden background',
  duration: 5,
  aspect_ratio: '16:9',
  resolution: '720p',
  audio: true
};

fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Cache-Control': 'no-cache',
    'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
  },
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/vidu/v1/vidu-request" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "A slow-motion capture of a hummingbird hovering beside a vibrant red hibiscus flower, iridescent feathers catching sunlight, shallow depth of field, garden background",
    "duration": 5,
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "audio": true
}'

Output

{
  "request_id": "vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu_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": "vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu_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": "vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu",
  "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 - Vidu generate request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstringnon-empty; ≤ 2000 charsText prompt describing the video to generate.
durationNointeger51–16 (seconds)Length of the generated video in seconds.
seedNointegerany integerRandom seed for reproducible results. Omit for a random seed.
aspect_ratioNostring"16:9""16:9", "9:16", "4:3", "3:4", "1:1"Aspect ratio of the output video.
resolutionNostring"720p""360p", "540p", "720p", "1080p"Output resolution of the generated video.
audioNobooleantruetrue, falseWhether to generate synchronized audio with the video. false outputs a silent video.

Minimum Request

{
  "prompt": "A slow-motion capture of a hummingbird hovering beside a vibrant red hibiscus flower, iridescent feathers catching sunlight, shallow depth of field, garden background",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "720p",
  "audio": true
}

Full Request (all options)

{
  "prompt": "A slow-motion capture of a hummingbird hovering beside a vibrant red hibiscus flower, iridescent feathers catching sunlight, shallow depth of field, garden background",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "720p",
  "audio": true
}

Response

{
  "request_id": "vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu_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 Vidu generate request.

Code Meaning
202 Accepted — Request queued
Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
Too Many Requests
500 Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'vidu' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu",
  "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/vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu_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.

Vidu Q3 API Pricing

ResolutionPrice (USD)
360p / per second$0.07
540p / per second$0.07
720p / per second$0.154
1080p / per second$0.154
4. Vidu Q2

Vidu Q2 API Documentation

https://gateway.pixazo.ai/vidu-q2-reference-to-video-pro-api-454/v1/vidu-q2-reference-to-video-pro-api-request

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Vidu Q2 Reference to Video Pro API generate request - Vidu Q2 Reference to Video Pro API

Request Code

POST https://gateway.pixazo.ai/vidu-q2-reference-to-video-pro-api-454/v1/vidu-q2-reference-to-video-pro-api-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY

{
  "prompt": "@Figure 1 Character Reference@Refer to the special effects, movements, and camera work of Video 1.",
  "reference_image_urls": [
    "https://example.com/model_tests/video_models/vidu-image-3123041388101890.png"
  ],
  "reference_video_urls": [
    "https://example.com/model_tests/video_models/vidu-video-3123002003131623.mp4"
  ],
  "duration": 4,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "movement_amplitude": "auto"
}
import requests

url = "https://gateway.pixazo.ai/vidu-q2-reference-to-video-pro-api-454/v1/vidu-q2-reference-to-video-pro-api-request"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
    "prompt": "@Figure 1 Character Reference@Refer to the special effects, movements, and camera work of Video 1.",
    "reference_image_urls": [
        "https://example.com/model_tests/video_models/vidu-image-3123041388101890.png"
    ],
    "reference_video_urls": [
        "https://example.com/model_tests/video_models/vidu-video-3123002003131623.mp4"
    ],
    "duration": 4,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "movement_amplitude": "auto"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/vidu-q2-reference-to-video-pro-api-454/v1/vidu-q2-reference-to-video-pro-api-request';

const data = {
  prompt: '@Figure 1 Character Reference@Refer to the special effects, movements, and camera work of Video 1.',
  reference_image_urls: [
    'https://example.com/model_tests/video_models/vidu-image-3123041388101890.png'
  ],
  reference_video_urls: [
    'https://example.com/model_tests/video_models/vidu-video-3123002003131623.mp4'
  ],
  duration: 4,
  resolution: '720p',
  aspect_ratio: '16:9',
  movement_amplitude: 'auto'
};

fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Cache-Control': 'no-cache',
    'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
  },
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/vidu-q2-reference-to-video-pro-api-454/v1/vidu-q2-reference-to-video-pro-api-request" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
  --data-raw '{
    "prompt": "@Figure 1 Character Reference@Refer to the special effects, movements, and camera work of Video 1.",
    "reference_image_urls": [
      "https://example.com/model_tests/video_models/vidu-image-3123041388101890.png"
    ],
    "reference_video_urls": [
      "https://example.com/model_tests/video_models/vidu-video-3123002003131623.mp4"
    ],
    "duration": 4,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "movement_amplitude": "auto"
  }'

Output

{
  "request_id": "vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q2-reference-to-video-pro-api-454_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": "vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q2-reference-to-video-pro-api-454",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q2-reference-to-video-pro-api-454_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": "vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q2-reference-to-video-pro-api-454",
  "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 - Vidu Q2 Reference to Video Pro API generate request

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring≤ 2000 charactersText prompt for video generation (maximum 2000 characters).
reference_image_urlsNoarray of strings[]up to 7 (or 4 if reference videos are provided)HTTPS URLs of reference images for subject appearance. Up to 4 images when reference videos are also provided; otherwise up to 7.
reference_video_urlsNoarray of strings[]up to 2HTTPS URLs of reference videos for video editing or motion reference. Supports up to 2 videos (MP4).
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.
durationNointeger40 (automatic), or 1–8Duration of the output video in seconds. Accepts 1–8 seconds, or 0 to let the model choose the duration automatically.
resolutionNostring720p"540p", "720p", "1080p"Output video resolution. Supported values: "540p", "720p", "1080p".
aspect_ratioNostring16:9"auto", "16:9", "9:16", "1:1", or any W:HAspect ratio of the output video.
movement_amplitudeNostringauto"auto", "small", "medium", "large"The movement amplitude of objects in the frame.
bgmNobooleanfalsetrue, falseWhether to add background music to the generated video.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
reference_image_urls4JPG, PNG, WEBP · < 50 MBReference image(s), up to 4.
reference_video_urls2MP4 · < 100 MBReference video(s), up to 2.

Example Request

{
  "prompt": "@Figure 1 Character Reference@Refer to the special effects, movements, and camera work of Video 1.",
  "reference_image_urls": [
    "https://example.com/model_tests/video_models/vidu-image-3123041388101890.png"
  ],
  "reference_video_urls": [
    "https://example.com/model_tests/video_models/vidu-video-3123002003131623.mp4"
  ],
  "duration": 4,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "movement_amplitude": "auto"
}

Response

{
  "request_id": "vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/vidu-q2-reference-to-video-pro-api-454_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 'vidu-q2-reference-to-video-pro-api-454' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "vidu-q2-reference-to-video-pro-api-454",
  "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/vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "vidu-q2-reference-to-video-pro-api-454_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "vidu-q2-reference-to-video-pro-api-454",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/vidu-q2-reference-to-video-pro-api-454_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.

Vidu Q2 API Pricing

ResolutionPrice (USD)
360p (per video)$0.10
540p (per video)$0.20
720p (per video)$0.30
1080p ($0.20 + $0.10 / sec)$0.20