Veo 3.1 Fast API Veo 3.1 API: Pricing, Documentation
by Google
Veo 3.1 Fast API Veo 3.1 API, developers can access Veo 3.1 for generating videos that accurately depict motion, lighting, and real-world physics. The API leverages Google's DeepMind research to produce videos with remarkable realism, suitable for professional video production and creative applications.
Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Veo v3.1 Fast API Documentation
https://gateway.pixazo.ai/veo31f/v1/veo-3.1-fast/generate
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Veo 3.1 Fast Video Generation Request - Veo 3.1 Fast API
Request Code
POST https://gateway.pixazo.ai/veo31f/v1/veo-3.1-fast/generate HTTP/1.1
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A snow-covered tree gradually transforms as winter melts away, snow dripping from branches as green leaves emerge and colorful flowers bloom around the base, transitioning from a cold white landscape to a vibrant lush green meadow full of life",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark",
"generate_audio": true,
"seed": 42
}
import requests
url = "https://gateway.pixazo.ai/veo31f/v1/veo-3.1-fast/generate"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A snow-covered tree gradually transforms as winter melts away, snow dripping from branches as green leaves emerge and colorful flowers bloom around the base, transitioning from a cold white landscape to a vibrant lush green meadow full of life",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark",
"generate_audio": True,
"seed": 42
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/veo31f/v1/veo-3.1-fast/generate';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'A snow-covered tree gradually transforms as winter melts away, snow dripping from branches as green leaves emerge and colorful flowers bloom around the base, transitioning from a cold white landscape to a vibrant lush green meadow full of life',
duration: 8,
aspect_ratio: '16:9',
resolution: '1080p',
negative_prompt: 'blurry, low quality, distorted, artifacts, text, watermark',
generate_audio: true,
seed: 42
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/veo31f/v1/veo-3.1-fast/generate" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A snow-covered tree gradually transforms as winter melts away, snow dripping from branches as green leaves emerge and colorful flowers bloom around the base, transitioning from a cold white landscape to a vibrant lush green meadow full of life",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark",
"generate_audio": true,
"seed": 42
}'
Output
{
"request_id": "veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1-fast",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-fast",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Veo 3.1 Fast Video Generation
This single endpoint covers three modes depending on which images you send: prompt only → text-to-video; + image → image-to-video (image is the starting frame); + image and last_frame → first→last-frame transition (both frames must share the same dimensions and aspect ratio).
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | — | Text prompt describing the desired video content, motion, mood, or style. |
image | No | string | — | HTTP(S) URL | Input image to start generating from (used as the first frame). Ideal images are 16:9 or 9:16 at 1280×720 or 720×1280, matching the aspect_ratio you choose. |
last_frame | No | string | — | HTTP(S) URL | Ending image for interpolation. When provided together with image, the model creates a transition from the first frame to this last frame. Requires image; for best results use the same dimensions and aspect ratio as image. |
duration | No | integer | 8 | 4, 6, 8 (seconds) | Length of the generated video. |
aspect_ratio | No | string | "16:9" | "16:9", "9:16" | Output aspect ratio. |
resolution | No | string | "1080p" | "720p", "1080p" | Output resolution. 1080p requires duration = 8. |
negative_prompt | No | string | — | — | Elements to avoid (e.g. "blurry, low quality, distorted, artifacts, text, watermark"). |
generate_audio | No | boolean | true | true, false | Generate synchronized audio alongside the video. |
seed | No | integer | — | — | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; leave it empty for a different output each time. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Starting or ending frame image. |
First→last frame transition (optional): to interpolate between two key images, send image (start frame) and last_frame (end frame). Both images must have the same dimensions and aspect ratio, must match the requested aspect_ratio, and should use a standard size (1280×720 for 720p, 1920×1080 for 1080p). Supported formats: JPEG, PNG, WebP. Mismatched or oversized frames cause the generation to fail.
Output: MP4, 24 fps, with an embedded Google SynthID watermark. 1080p output requires duration = 8.
Example Request
{
"prompt": "A snow-covered tree gradually transforms as winter melts away, snow dripping from branches as green leaves emerge and colorful flowers bloom around the base, transitioning from a cold white landscape to a vibrant lush green meadow full of life",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "1080p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark",
"generate_audio": true,
"seed": 42
}
Response
{
"request_id": "veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance. Required: $0.01"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'veo-3-1-fast' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "veo-3-1-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-fast",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/veo-3-1-fast_019d42ce-ae71-7999-24c9-5d76447ecafb4"
Response (Completed)
{
"request_id": "veo-3-1-fast_019d42ce-ae71-7999-24c9-5d76447ecafb4",
"status": "COMPLETED",
"model_id": "veo-3-1-fast",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-fast_019d42ce-ae71-7999-24c9-5d76447ecafb4/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-04-01T07:32:03.749Z",
"updated_at": "2026-04-01T07:32:20.000Z",
"completed_at": "2026-04-01T07:32:20.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type (video/mp4) |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Veo v3.1 Fast API Pricing — Per-Second Rates
Per-second pricing for 720p / 1080p — audio off: $0.10/sec, audio on: $0.15/sec (audio adds ~50%). Example: a 5-second clip ≈ $0.50 (audio off) or $0.75 (audio on). 4K available — pricing rolling out soon.
| Audio | Price (USD) |
|---|---|
| On | $0.15/sec |
| Off | $0.10/sec |
Veo v3.1 Fast API Documentation
https://gateway.pixazo.ai/veo-3-1-fast-reference-to-video/v1/veo-3-1-fast-reference-to-video-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Veo 3.1 Fast Reference to Video generate request
Request Code
POST https://gateway.pixazo.ai/veo-3-1-fast-reference-to-video/v1/veo-3-1-fast-reference-to-video-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "A chimpanzee wearing overalls frolics in the grassy field, gently playing with butterflies. In the background, a circus tent and carousel beckon.",
"image_urls": [
"https://example.com/example_inputs/veo31-r2v-input-1.png",
"https://example.com/example_inputs/veo31-r2v-input-2.png",
"https://example.com/example_inputs/veo31-r2v-input-3.png"
],
"aspect_ratio": "16:9",
"duration": "8s",
"resolution": "720p",
"generate_audio": true,
"safety_tolerance": "4"
}
import requests
url = "https://gateway.pixazo.ai/veo-3-1-fast-reference-to-video/v1/veo-3-1-fast-reference-to-video-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "A chimpanzee wearing overalls frolics in the grassy field, gently playing with butterflies. In the background, a circus tent and carousel beckon.",
"image_urls": [
"https://example.com/example_inputs/veo31-r2v-input-1.png",
"https://example.com/example_inputs/veo31-r2v-input-2.png",
"https://example.com/example_inputs/veo31-r2v-input-3.png"
],
"aspect_ratio": "16:9",
"duration": "8s",
"resolution": "720p",
"generate_audio": true,
"safety_tolerance": "4"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/veo-3-1-fast-reference-to-video/v1/veo-3-1-fast-reference-to-video-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "A chimpanzee wearing overalls frolics in the grassy field, gently playing with butterflies. In the background, a circus tent and carousel beckon.",
"image_urls": [
"https://example.com/example_inputs/veo31-r2v-input-1.png",
"https://example.com/example_inputs/veo31-r2v-input-2.png",
"https://example.com/example_inputs/veo31-r2v-input-3.png"
],
"aspect_ratio": "16:9",
"duration": "8s",
"resolution": "720p",
"generate_audio": true,
"safety_tolerance": "4"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/veo-3-1-fast-reference-to-video/v1/veo-3-1-fast-reference-to-video-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "A chimpanzee wearing overalls frolics in the grassy field, gently playing with butterflies. In the background, a circus tent and carousel beckon.",
"image_urls": [
"https://example.com/example_inputs/veo31-r2v-input-1.png",
"https://example.com/example_inputs/veo31-r2v-input-2.png",
"https://example.com/example_inputs/veo31-r2v-input-3.png"
],
"aspect_ratio": "16:9",
"duration": "8s",
"resolution": "720p",
"generate_audio": true,
"safety_tolerance": "4"
}'
Output
{
"request_id": "veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1-fast-reference-to-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-fast-reference-to-video",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Veo 3.1 Fast Reference to Video generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text description of the video to generate. Must be detailed and specific for optimal results. |
| image_urls | Yes | string[] | — | 1–3 HTTP/HTTPS image URLs | Array of HTTP/HTTPS URLs pointing to reference images that anchor subject appearance for consistency. At least one image is required; Veo supports up to 3 reference images. |
| aspect_ratio | No | string | "16:9" | "16:9", "9:16" | Aspect ratio of the output video. |
| duration | No | string | "8s" | "8s" | Length of the generated video. Currently only "8s" is supported. |
| resolution | No | string | "720p" | "720p", "1080p", "4k" | Output resolution of the video. |
| generate_audio | No | boolean | true | true, false | Whether to generate synchronized audio for the video. |
| auto_fix | No | boolean | false | true, false | Whether to automatically attempt to fix prompts that fail content policy or other validation checks by rewriting them. When false, a policy violation causes the request to fail. |
| safety_tolerance | No | string | "4" | "1", "2", "3", "4", "5", "6" | Content-moderation strictness. "1" is the most strict (blocks most content) and "6" is the least strict. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 3 | JPG, PNG, WEBP | Reference image (1–3). |
Example Request
{
"prompt": "A chimpanzee wearing overalls frolics in the grassy field, gently playing with butterflies. In the background, a circus tent and carousel beckon.",
"image_urls": [
"https://example.com/example_inputs/veo31-r2v-input-1.png",
"https://example.com/example_inputs/veo31-r2v-input-2.png",
"https://example.com/example_inputs/veo31-r2v-input-3.png"
],
"aspect_ratio": "16:9",
"duration": "8s",
"resolution": "720p",
"generate_audio": true,
"safety_tolerance": "4"
}
Response
{
"request_id": "veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'veo-3-1-fast-reference-to-video' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-fast-reference-to-video",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "veo-3-1-fast-reference-to-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1-fast-reference-to-video",
"error": null,
"output": { "media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-fast-reference-to-video_019dxxxx/output.mp4"], "media_type": "video/mp4" },
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Veo v3.1 Fast API Pricing — Per-Second Rates
Per-second pricing for 720p / 1080p — audio off: $0.10/sec, audio on: $0.15/sec (audio adds ~50%). Example: a 5-second clip ≈ $0.50 (audio off) or $0.75 (audio on). 4K available — pricing rolling out soon.
| Audio | Price (USD) |
|---|---|
| Off | $0.10/sec |
| On | $0.15/sec |
Veo v3.1 API Documentation
https://gateway.pixazo.ai/veo/v1/veo-3.1/generate
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Video Generation Request - Veo 3.1 API
Request Code
POST https://gateway.pixazo.ai/veo/v1/veo-3.1/generate
Content-Type: application/json
Ocp-Apim-Subscription-Key: your-subscription-key
{
"prompt": "A serene lake with mountains in the background at sunset",
"aspect_ratio": "16:9",
"duration": 8,
"resolution": "1080p",
"generate_audio": true,
"negative_prompt": "blur, distortion, low quality",
"webhook": "https://your-server.com/webhook"
}
import requests
url = "https://gateway.pixazo.ai/veo/v1/veo-3.1/generate"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "your-subscription-key"
}
data = {
"prompt": "A serene lake with mountains in the background at sunset",
"aspect_ratio": "16:9",
"duration": 8,
"resolution": "1080p",
"generate_audio": True,
"negative_prompt": "blur, distortion, low quality",
"webhook": "https://your-server.com/webhook"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
// Node.js example
const response = await fetch('https://gateway.pixazo.ai/veo/v1/veo-3.1/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Ocp-Apim-Subscription-Key': 'your-subscription-key'
},
body: JSON.stringify({
prompt: 'A serene lake with mountains in the background at sunset',
aspect_ratio: '16:9',
duration: 8,
resolution: '1080p',
generate_audio: true,
negative_prompt: 'blur, distortion, low quality',
webhook: 'https://your-server.com/webhook'
})
});
const data = await response.json();
console.log('Video ID:', data.id);
console.log('Status:', data.status);
curl -X POST https://gateway.pixazo.ai/veo/v1/veo-3.1/generate \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: your-subscription-key" \
-d '{
"prompt": "A serene lake with mountains in the background at sunset",
"aspect_ratio": "16:9",
"duration": 8,
"resolution": "1080p",
"generate_audio": true,
"negative_prompt": "blur, distortion, low quality",
"webhook": "https://your-server.com/webhook"
}'
Output
{
"request_id": "veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1_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": "veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Video Generation Request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | — | Text description of the video to generate. |
aspect_ratio | No | string | "16:9" | "16:9", "9:16" | Output aspect ratio. |
duration | No | integer | 8 | 4, 6, 8 (seconds) | Video duration in seconds. Must be 8 when resolution is "1080p" or when reference_images are supplied. |
resolution | No | string | "720p" | "720p", "1080p" | Output resolution. 1080p requires duration = 8. |
generate_audio | No | boolean | true | true, false | Generate synchronized audio with the video. |
negative_prompt | No | string | — | — | Elements to exclude from the generated video. |
image | No | string | — | HTTP(S) URL | Starting frame for image-to-video. Ideal images are 16:9 or 9:16 at 1280×720 or 720×1280, matching the aspect_ratio you choose. |
last_frame | No | string | — | HTTP(S) URL | Ending frame for interpolation. When supplied together with image, the model generates a transition between the two frames. Ignored if reference_images is provided. |
reference_images | No | array | — | 1–3 HTTP(S) URLs | Reference images for subject-consistent generation (reference-to-video, or R2V). Only works with aspect_ratio = "16:9" and duration = 8; when supplied, last_frame is ignored. |
seed | No | integer | — | Integer ≥ 0 | Random seed that controls the generation's randomness. Reuse the same seed with identical settings to reproduce the same result; omit it for a different output each time. |
webhook | No | string | — | HTTPS URL | Webhook URL for completion notifications. |
webhook_events_filter | No | array | — | ["start", "completed"] | Event types to receive on the webhook. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Starting or ending frame image. |
First→last frame transition (optional): to interpolate between two key images, send image (start frame) and last_frame (end frame). Both images must have the same dimensions and aspect ratio, must match the requested aspect_ratio, and should use a standard size (1280×720 for 720p, 1920×1080 for 1080p). Supported formats: JPEG, PNG, WebP. Mismatched or oversized frames cause the generation to fail.
Output: MP4, 24 fps, with an embedded Google SynthID watermark. 1080p output requires duration = 8.
Example Request
{
"prompt": "A serene lake with mountains in the background at sunset",
"aspect_ratio": "16:9",
"duration": 8,
"resolution": "1080p",
"generate_audio": true,
"negative_prompt": "blur, distortion, low quality",
"webhook": "https://your-server.com/webhook"
}
Response
{
"request_id": "veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Ocp-Apim-Subscription-Key | Your subscription key |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'veo-3-1' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1",
"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/veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "veo-3-1_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Veo v3.1 API Pricing
Per-second rates: 720p = $0.225/sec (audio off) or $0.45/sec (audio on). 1080p = $0.30/sec (audio off) or $0.60/sec (audio on). The table below shows totals for 4–8s clips. 4K available — pricing rolling out soon. For an even cheaper per-second rate ($0.10–$0.15/sec), use Veo v3.1 Fast above.
| Resolution | Duration | Audio | Price (USD) |
|---|---|---|---|
| 720p | 4s | On | $1.80 |
| 720p | 6s | On | $2.70 |
| 720p | 8s | On | $3.60 |
| 1080p | 4s | On | $2.40 |
| 1080p | 6s | On | $3.60 |
| 1080p | 8s | On | $4.80 |
| 720p | 4s | Off | $0.90 |
| 720p | 6s | Off | $1.35 |
| 720p | 8s | Off | $1.80 |
| 1080p | 4s | Off | $1.20 |
| 1080p | 6s | Off | $1.80 |
| 1080p | 8s | Off | $2.40 |
Veo 3.1 API Documentation
https://gateway.pixazo.ai/veo/v1/text-to-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Veo 3.1 Text to Video Request - Veo 3.1 API
Request Code
POST https://gateway.pixazo.ai/veo/v1/text-to-video HTTP/1.1
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}
import requests
url = "https://gateway.pixazo.ai/veo/v1/text-to-video"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/veo/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 slow serene time-lapse of clouds over a mountain lake at golden hour',
duration: 8,
aspect_ratio: '16:9',
resolution: '720p',
negative_prompt: 'blurry, low quality, distorted, artifacts, text, watermark'
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/veo/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 slow serene time-lapse of clouds over a mountain lake at golden hour",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}'
Output
{
"request_id": "veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1-google",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-google_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": "veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-google",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Veo 3.1 Text to Video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | non-empty; ≤ 1,024 tokens | Text prompt describing the desired video content, motion, mood, or style. Veo 3.1 generates native audio, so the prompt can also describe dialogue, sound effects and ambience. |
resolution | No | string | "720p" | "720p", "1080p", "4k" | Output resolution. 1080p and 4k always render at 8 seconds. Any other value falls back to 720p. |
aspect_ratio | No | string | "16:9" | "16:9", "9:16" | Output aspect ratio (landscape or portrait). Any other value falls back to 16:9. |
duration | No | integer | 8 | 4, 6, 8 (seconds) | Length of the generated video in seconds. Billed per second. Values other than 4, 6 or 8 are coerced to 8, and 1080p/4k always render at 8. |
negative_prompt | No | string | — | — | Content to keep out of the video (e.g. "blurry, low quality, distorted, artifacts, text, watermark"). |
person_generation | No | string | — | "allow_all", "allow_adult" | Safety setting for generating people and faces. Omit to use the model default. In the EU, UK, Switzerland and MENA, Veo 3.1 supports "allow_adult" only. |
Output: MP4, 24 fps, with an embedded Google SynthID watermark. 1080p output requires duration = 8.
Example Request
{
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}
Response
{
"request_id": "veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance. Required: $0.01"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'veo-3-1-google' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "veo-3-1-google_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-google",
"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/veo-3-1-google_019d42ce-ae71-7999-24c9-5d76447ecafb4"
Response (Completed)
{
"request_id": "veo-3-1-google_019d42ce-ae71-7999-24c9-5d76447ecafb4",
"status": "COMPLETED",
"model_id": "veo-3-1-google",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-google_019d42ce-ae71-7999-24c9-5d76447ecafb4/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-04-01T07:32:03.749Z",
"updated_at": "2026-04-01T07:32:20.000Z",
"completed_at": "2026-04-01T07:32:20.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type (video/mp4) |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Veo 3.1 API Pricing
Per-second pricing by resolution: 720p = $0.40/sec, 1080p = $0.60/sec, 4K = $1.20/sec. Audio is included. Example: an 8-second 720p clip = $3.20; a 6-second 1080p clip = $3.60. Note: 1080p and 4K always render at 8 seconds.
| Resolution | Duration | Price (USD) |
|---|---|---|
| 720p | 4s | $1.60 |
| 720p | 6s | $2.40 |
| 720p | 8s | $3.20 |
| 1080p | 8s | $4.80 |
| 4k | 8s | $9.60 |
Veo 3.1 API Documentation
https://gateway.pixazo.ai/veo/v1/image-to-video
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Veo 3.1 Image to Video Request - Veo 3.1 API
Request Code
POST https://gateway.pixazo.ai/veo/v1/image-to-video HTTP/1.1
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}
import requests
url = "https://gateway.pixazo.ai/veo/v1/image-to-video"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/veo/v1/image-to-video';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'a slow serene time-lapse of clouds over a mountain lake at golden hour',
image_url: 'https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png',
duration: 8,
aspect_ratio: '16:9',
resolution: '720p',
negative_prompt: 'blurry, low quality, distorted, artifacts, text, watermark'
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/veo/v1/image-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}'
Output
{
"request_id": "veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "veo-3-1-google-i2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-google-i2v",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - Veo 3.1 Image to Video
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
image_url | Yes | string | — | HTTP(S) URL (.jpg, .jpeg, .png) | Source image to animate, used as the starting frame. The gateway downloads it and sends it to Veo inline; image_urls[0] is accepted as an alternative. |
prompt | Yes | string | — | non-empty; ≤ 1,024 tokens | Describes the motion / how the source image should animate. Veo 3.1 generates native audio, so the prompt can also describe dialogue, sound effects and ambience. |
resolution | No | string | "720p" | "720p", "1080p", "4k" | Output resolution. 1080p and 4k always render at 8 seconds. Any other value falls back to 720p. |
aspect_ratio | No | string | "16:9" | "16:9", "9:16" | Output aspect ratio (landscape or portrait). Any other value falls back to 16:9. |
duration | No | integer | 8 | 4, 6, 8 (seconds) | Length of the generated video in seconds. Billed per second. Values other than 4, 6 or 8 are coerced to 8, and 1080p/4k always render at 8. |
negative_prompt | No | string | — | — | Content to keep out of the video (e.g. "blurry, low quality, distorted, artifacts, text, watermark"). |
person_generation | No | string | — | "allow_adult" | Safety setting for generating people and faces. Image-to-video supports "allow_adult" (adults only); omit to use the model default. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP | Input image to animate. |
Output: MP4, 24 fps, with an embedded Google SynthID watermark. 1080p output requires duration = 8.
Example Request
{
"prompt": "a slow serene time-lapse of clouds over a mountain lake at golden hour",
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "720p",
"negative_prompt": "blurry, low quality, distorted, artifacts, text, watermark"
}
Response
{
"request_id": "veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance. Required: $0.01"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'veo-3-1-google-i2v' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "veo-3-1-google-i2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "veo-3-1-google-i2v",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/veo-3-1-google-i2v_019d42ce-ae71-7999-24c9-5d76447ecafb4"
Response (Completed)
{
"request_id": "veo-3-1-google-i2v_019d42ce-ae71-7999-24c9-5d76447ecafb4",
"status": "COMPLETED",
"model_id": "veo-3-1-google-i2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/veo-3-1-google-i2v_019d42ce-ae71-7999-24c9-5d76447ecafb4/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-04-01T07:32:03.749Z",
"updated_at": "2026-04-01T07:32:20.000Z",
"completed_at": "2026-04-01T07:32:20.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type (video/mp4) |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
Veo 3.1 API Pricing
Per-second pricing by resolution: 720p = $0.40/sec, 1080p = $0.60/sec, 4K = $1.20/sec. Audio is included. Example: an 8-second 720p clip = $3.20; a 6-second 1080p clip = $3.60. Note: 1080p and 4K always render at 8 seconds.
| Resolution | Duration | Price (USD) |
|---|---|---|
| 720p | 4s | $1.60 |
| 720p | 6s | $2.40 |
| 720p | 8s | $3.20 |
| 1080p | 8s | $4.80 |
| 4k | 8s | $9.60 |
