← All docs

Endpoints

Generate a video

POST/v1/videos/generations

Loading models…

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 image in parameter_constraints accept 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. With image it conditions first→last frames; alone it fixes only the last frame (Veo and Omni require image). Only models listing last_image in parameter_constraints accept it
pricingVariantstringNo
Resolution/audio variant key. Use the pricing.variants[].key value from GET /v1/models verbatim
userstringNo
End-user identifier
extra_body.googleobjectNo
aspectRatio (16:9/9:16, Veo and Omni) · Veo-only negativePrompt (≤4000 characters) · seed · enhancePrompt
extra_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.

statusMeaning
processingSubmission, provider processing, or settlement in progress
completedDone — includes durationSeconds and data
failedFailed or timed out — includes error
cancelledCancelled
json
{
  "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.

Contact support