← All docs

Endpoints

Generate a video

POST/v1/videos/generations

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[].key value from GET /v1/models verbatim
userstringNo
End-user identifier
extra_body.googleobjectNo
negativePrompt (≤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 / routeSupported values and combinations
Veo 3 / 3.1duration supports 4, 6, or 8 seconds, defaulting to 8 when omitted. 1080p and 4k require 8 seconds
Veo 3.1 LiteSupports 4, 6, or 8 seconds; 4k is unsupported
Veo 2Supports 5, 6, 7, or 8 seconds, defaulting to 8 when omitted
Veo 3 via Gemini Developer APIAudio-off variants are unsupported. Vertex support can differ; use only publicly listed variants
OmniOmit 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.

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.

Current model options

Loading…