Video generation is an async job. POST returns a job id immediately, and you poll
GET /v1/videos/generations/{id} for the result.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | A VIDEO category model ID (e.g. everyais/veo-3-1-generate-001) |
prompt | string | Yes | 1–4000 characters |
duration | integer | No | Output length in seconds, 1–120, default 8. The range a given model actually supports may be narrower |
pricingVariant | string | No | Resolution/audio variant key. Use the pricing.variants[].key value from GET /v1/models verbatim |
user | string | No | End-user identifier |
extra_body.google | object | No | negativePrompt (≤4000 characters) · seed · enhancePrompt |
Request
{
"model": "everyais/veo-3-1-generate-001",
"prompt": "a timelapse of a blooming flower",
"duration": 8,
"pricingVariant": "1080p-with-audio"
}Response (submitted)
{
"id": "cm...",
"object": "video.generation.job",
"created": 1709884800,
"model": "everyais/veo-3-1-generate-001",
"status": "processing"
}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.