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; Gemini Omni 1.1 takes 3–10)
imagestringNo- First frame (image-to-video). JPEG/PNG/WebP data URL or base64; request body up to 5 MiB (Veo: JPEG/PNG only). Only models listing
imageinparameter_constraintsaccept it (Veo, Omni, managed GPU node models); others return 400 last_imagestringNo- Last frame, same format as
image; both images together must fit the 5 MiB request body. Withimageit conditions first→last frames; alone it fixes only the last frame (Veo and Omni requireimage). Only models listinglast_imageinparameter_constraintsaccept it pricingVariantstringNo- Resolution/audio variant key. Use the
pricing.variants[].keyvalue fromGET /v1/modelsverbatim userstringNo- End-user identifier
extra_body.googleobjectNoaspectRatio(16:9/9:16, Veo and Omni) · Veo-onlynegativePrompt(≤4000 characters) ·seed·enhancePromptextra_body.gpunodeobjectNo- Managed GPU node video models only:
size(WxH, one of the model's published sizes) ·seed·num_inference_steps
Model options
Check the table above for the values the selected model supports (in the API: capabilities, limits, and parameter_constraints in GET /v1/models). Whether an unsupported value is adjusted or rejected with 400 is described under parameter policy in model selection and access.
Check limits.supported_durations and pricing.variants. Omit them to use model defaults. Duration and resolution must form a supported combination.
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.