Pixazo APIModelsVeo 3.1
Pixazo APIModelsVeo 3.1

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.

Get API Key
Veo Video API
View in Playground

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

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

Claim Your $5 →

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.

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

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": "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 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 - 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
promptYesstringText prompt describing the desired video content, motion, mood, or style.
imageNostringHTTP(S) URLInput 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_frameNostringHTTP(S) URLEnding 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.
durationNointeger84, 6, 8 (seconds)Length of the generated video.
aspect_ratioNostring"16:9""16:9", "9:16"Output aspect ratio.
resolutionNostring"1080p""720p", "1080p"Output resolution. 1080p requires duration = 8.
negative_promptNostringElements to avoid (e.g. "blurry, low quality, distorted, artifacts, text, watermark").
generate_audioNobooleantruetrue, falseGenerate synchronized audio alongside the video.
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.

Content Item Types & Limits

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

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

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.

AudioPrice (USD)
On$0.15/sec
Off$0.10/sec
Reference to Video (Reference Images to Video)

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.

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

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": "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 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 - Veo 3.1 Fast Reference to Video generate request

Parameter Required Type Default Allowed values / range Description
promptYesstringText description of the video to generate. Must be detailed and specific for optimal results.
image_urlsYesstring[]1–3 HTTP/HTTPS image URLsArray 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_ratioNostring"16:9""16:9", "9:16"Aspect ratio of the output video.
durationNostring"8s""8s"Length of the generated video. Currently only "8s" is supported.
resolutionNostring"720p""720p", "1080p", "4k"Output resolution of the video.
generate_audioNobooleantruetrue, falseWhether to generate synchronized audio for the video.
auto_fixNobooleanfalsetrue, falseWhether 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_toleranceNostring"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

TypeMaxFormat / SizeDescription
image3JPG, PNG, WEBPReference 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_API_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 '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

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_atstringWhen 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.

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.

AudioPrice (USD)
Off$0.10/sec
On$0.15/sec
2. Veo v3.1

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.

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

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": "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 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 - Video Generation Request

Parameter Required Type Default Allowed values / range Description
promptYesstringText description of the video to generate.
aspect_ratioNostring"16:9""16:9", "9:16"Output aspect ratio.
durationNointeger84, 6, 8 (seconds)Video duration in seconds. Must be 8 when resolution is "1080p" or when reference_images are supplied.
resolutionNostring"720p""720p", "1080p"Output resolution. 1080p requires duration = 8.
generate_audioNobooleantruetrue, falseGenerate synchronized audio with the video.
negative_promptNostringElements to exclude from the generated video.
imageNostringHTTP(S) URLStarting 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_frameNostringHTTP(S) URLEnding frame for interpolation. When supplied together with image, the model generates a transition between the two frames. Ignored if reference_images is provided.
reference_imagesNoarray1–3 HTTP(S) URLsReference 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.
seedNointegerInteger ≥ 0Random 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.
webhookNostringHTTPS URLWebhook URL for completion notifications.
webhook_events_filterNoarray["start", "completed"]Event types to receive on the webhook.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBPStarting 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-Typeapplication/json
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 '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

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.

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.

ResolutionDurationAudioPrice (USD)
720p4sOn$1.80
720p6sOn$2.70
720p8sOn$3.60
1080p4sOn$2.40
1080p6sOn$3.60
1080p8sOn$4.80
720p4sOff$0.90
720p6sOff$1.35
720p8sOff$1.80
1080p4sOff$1.20
1080p6sOff$1.80
1080p8sOff$2.40
3. Veo 3.1

Veo 3.1 API Documentation

https://gateway.pixazo.ai/veo/v1/text-to-video

Authentication

All requests require an API key passed via header.

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

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": "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 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 - Veo 3.1 Text to Video

Parameter Required Type Default Allowed values / range Description
promptYesstringnon-empty; ≤ 1,024 tokensText 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.
resolutionNostring"720p""720p", "1080p", "4k"Output resolution. 1080p and 4k always render at 8 seconds. Any other value falls back to 720p.
aspect_ratioNostring"16:9""16:9", "9:16"Output aspect ratio (landscape or portrait). Any other value falls back to 16:9.
durationNointeger84, 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_promptNostringContent to keep out of the video (e.g. "blurry, low quality, distorted, artifacts, text, watermark").
person_generationNostring"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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

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.

ResolutionDurationPrice (USD)
720p4s$1.60
720p6s$2.40
720p8s$3.20
1080p8s$4.80
4k8s$9.60
Image to Video

Veo 3.1 API Documentation

https://gateway.pixazo.ai/veo/v1/image-to-video

Authentication

All requests require an API key passed via header.

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

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": "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 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 - Veo 3.1 Image to Video

Parameter Required Type Default Allowed values / range Description
image_urlYesstringHTTP(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.
promptYesstringnon-empty; ≤ 1,024 tokensDescribes 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.
resolutionNostring"720p""720p", "1080p", "4k"Output resolution. 1080p and 4k always render at 8 seconds. Any other value falls back to 720p.
aspect_ratioNostring"16:9""16:9", "9:16"Output aspect ratio (landscape or portrait). Any other value falls back to 16:9.
durationNointeger84, 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_promptNostringContent to keep out of the video (e.g. "blurry, low quality, distorted, artifacts, text, watermark").
person_generationNostring"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

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

Response Handling

Common status codes.

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

Error Responses

Queue system errors and model validation errors.

Queue System Errors

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

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

Status Values

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

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

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

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

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.

ResolutionDurationPrice (USD)
720p4s$1.60
720p6s$2.40
720p8s$3.20
1080p8s$4.80
4k8s$9.60