Video generation is an async job. POST returns a job id immediately, and you poll
GET /v1/videos/generations/{id} for the result.
Body
modelstringYes- A VIDEO category model ID (e.g.
everyais/veo-3-1-generate-001) promptstringYes- 1–4000 characters
durationintegerNo- Shared input range: 1–120 seconds. Supported lengths and omission defaults depend on the model (see below)
pricingVariantstringNo- Resolution/audio variant key. Use the
pricing.variants[].keyvalue fromGET /v1/modelsverbatim userstringNo- End-user identifier
extra_body.googleobjectNonegativePrompt(≤4000 characters) ·seed·enhancePrompt
Model-specific duration and resolution
Check capabilities.video_generation, limits.supported_durations, and pricing.variants[].key in GET /v1/models. Omitted fields mean unverified support. Unsupported values and combinations return 400, without silently replacing requested values.
| Model / route | Supported values and combinations |
|---|---|
| Veo 3 / 3.1 | duration supports 4, 6, or 8 seconds, defaulting to 8 when omitted. 1080p and 4k require 8 seconds |
| Veo 3.1 Lite | Supports 4, 6, or 8 seconds; 4k is unsupported |
| Veo 2 | Supports 5, 6, 7, or 8 seconds, defaulting to 8 when omitted |
| Veo 3 via Gemini Developer API | Audio-off variants are unsupported. Vertex support can differ; use only publicly listed variants |
| Omni | Omit duration; explicit values return 400. The provider determines the actual length, reported as durationSeconds on completion. Only 720p and audio-on variants are currently supported |
Omni rejects extra_body.google options negativePrompt, seed, and enhancePrompt with 400. Omni pricingVariant supports only 16:9 and 9:16 aspect ratios.
GET /v1/videos/generations/{id}
Poll job status and results. Put the id from the POST response in this path.
⚠️ You cannot look the job up through
/v1/outputs/{requestId}. Video job ids and request ids live in separate spaces, so polling there always returns 404.
While a job is in progress the response carries a Retry-After: 5 header — poll at 5-second intervals.
There are four status values.
| status | Meaning |
|---|---|
processing | Submission, provider processing, or settlement in progress |
completed | Done — includes durationSeconds and data |
failed | Failed or timed out — includes error |
cancelled | Cancelled |
{
"id": "cm...",
"object": "video.generation.job",
"created": 1709884800,
"model": "everyais/veo-3-1-generate-001",
"status": "completed",
"durationSeconds": 8,
"data": [{ "url": "https://..." }]
}In rare cases where the outcome of the provider call could not be confirmed, processing comes back together with
outcome_unknown: true, plus requires_manual_review: true when an operator needs to check it.
If the job does not exist, has expired (24 hours), or belongs to a different API key, you get a 404 job_not_found.
Billing
total cost = durationSeconds × per-second price. If you specify pricingVariant, that variant's unit price takes precedence.
For example, everyais/veo-3-1-generate-001 offers the 720p-with-audio · 1080p-with-audio · 4k-with-audio
variants. Check the exact keys and unit prices in the pricing field of the GET /v1/models response.