Google VEO 3.1 Video Generation API
Google's video model: fixed 8-second clips, audio generated with the picture, first-frame or first-and-last-frame reference images. Three models behind one endpoint — the standard tier veo-3.1 at true 1080p for $1.00 a clip (69% below Google's $3.20), and the Fast tiers at $0.08 (720p) and $0.088 (1080p). All of them use the same create-then-poll async flow; you only change the model field.
Models
| Model / model value | Resolution | Price / 8s clip | Notes |
|---|---|---|---|
VEO 3.1 (Standard) veo-3.1 | 1080p | $1.00 | Google's standard tier — the highest-quality VEO here; better detail, motion and prompt adherence than Fast. Google charges $3.20 for the same clip. |
VEO 3.1 Fast Full HD veo-3.1-fast-fhd | 1080p | $0.088 | Fast tier, the default for drafts and volume; start-end transitions run here too. v3.1-fast-start-end is its alias with a backup channel, $0.20. |
VEO 3.1 Fast HD veo-3.1-fast-hd | 720p | $0.08 | Fast tier at 720p — only when 720p is enough and you want the quickest turnaround. |
How to choose: draft and batch in veo-3.1-fast-fhd — it takes the same prompt and images as the standard tier — and switch model to veo-3.1 for the finish. No tier outputs 4K. The older names veo3.1-4k, veo-3.1-components, veo_3_1-4K and friends still work; they are all aliases of veo-3.1-fast-fhd and are billed at $0.088.
Create a task
POST /api/v1/video/generations — async: create, then poll the same endpoint for the result.
# Step 1: Create task (standard tier; add "images" for a first frame or first + last frame)
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1",
"prompt": "Aerial drone shot of a coastal sunset, waves crashing on rocks",
"aspect_ratio": "16:9",
"images": ["https://example.com/first-frame.jpg"]
}'
# Step 2: Poll status
curl "https://api.apimodels.app/v1/video/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"Request parameters
| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | veo-3.1 (standard) / veo-3.1-fast-fhd / veo-3.1-fast-hd; v3.1-fast-start-end is an alias of fast-fhd |
| prompt | Yes | string | Text description of the video to generate |
| aspect_ratio | No | string | "16:9" (default) or "9:16" |
| images | No | array | Reference image URLs: [first frame] or [first frame, last frame]. Omit for plain text-to-video |
| callback_url | No | string | Webhook URL called when task completes |
There is no duration or size parameter: every clip is 8 seconds and resolution is fixed by the model (720p on fast-hd, 1080p on the others). If you send them they are ignored.
First and last frame
Position in the images array is the meaning: pass 1 image for the first frame, 2 images for first + last frame. For a "go from this shot to that shot" transition, put the opening frame at [0] and the closing frame at [1]. All three models support it at their normal price.
For batch start-end jobs where success rate matters most, use v3.1-fast-start-end: an alias of veo-3.1-fast-fhd at $0.20 a clip that retries on a backup channel when the primary fails.
Duration, resolution and audio
- Every clip is 8 seconds, on all three models.
- Resolution is fixed by the model: veo-3.1 and veo-3.1-fast-fhd output 1080p (1920×1080 or 1080×1920), veo-3.1-fast-hd outputs 720p. There is no 4K.
- Audio is generated with the picture; the MP4 you download already carries the track, no extra parameter needed.
- aspect_ratio defaults to "16:9" and also accepts "9:16".
Response and polling
Creating a task returns a taskId, with state starting at pending:
{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"state": "pending"
}
}Poll GET /api/v1/video/generations?task_id= until state is completed, then read resultUrls[0]:
{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"state": "completed",
"resultUrls": ["https://cdn.example.com/video.mp4"],
"createTime": 1705123450000,
"completeTime": 1705123500000
}
}- On failure state is "failed" and the reason is in data.failMsg, for example "Content policy violation". Failed tasks are not billed.
- Poll every 5-10 seconds; in production prefer callback_url — we POST to it once the task reaches a terminal state.
- Video files are kept for 30 days and then deleted automatically — download or re-host anything you need to keep.
Related
FAQ
How much does the Google VEO 3.1 API cost?
Three models on one endpoint at apimodels.app: veo-3.1, the standard tier at true 1080p, is $1.00 per 8-second clip — Google charges $0.40 per second, $3.20 for the same clip. veo-3.1-fast-hd (720p) is $0.08 and veo-3.1-fast-fhd (1080p) is $0.088 per clip. You switch by changing the model field, and you are charged only when a generation succeeds.
How do I generate a VEO video from a first and last frame?
Position in the images array is the meaning: one URL is the first frame, two URLs are the first frame [0] and the last frame [1]. POST them with the prompt to /api/v1/video/generations; both veo-3.1 and veo-3.1-fast-fhd render the 8-second transition at their normal price. v3.1-fast-start-end is an alias of the Fast 1080p model at $0.20 with a backup channel behind it, for batch jobs where success rate matters most.
Does VEO 3.1 generate audio with the video?
Yes. VEO 3.1 generates the audio track together with the picture on every tier here, and the MP4 you download already carries it. There is no separate parameter and no second request.
What clip lengths and resolutions does VEO 3.1 support?
Every clip is 8 seconds. Resolution is fixed per model — 720p on veo-3.1-fast-hd, 1080p on veo-3.1-fast-fhd and veo-3.1 — so there is no size parameter; aspect_ratio is 16:9 or 9:16. None of the models outputs 4K: the older veo3.1-4k and veo-3.1-components names still work as aliases of veo-3.1-fast-fhd and are billed at $0.088.
How do I call the VEO API — is it synchronous?
It is asynchronous. POST /api/v1/video/generations with an Authorization: Bearer key, a model and a prompt; the response carries data.taskId with state "pending". Then poll GET /api/v1/video/generations?task_id=... every 5-10 seconds until state is "completed" and read data.resultUrls[0]; on "failed" the reason is in data.failMsg. For production, pass callback_url and we POST to you when the task reaches a terminal state. Result videos are kept for 30 days.
Which VEO model should I pick?
Draft in veo-3.1-fast-fhd: 1080p for $0.088, fast to render, and it takes the same prompt and images as the standard tier. Finish in veo-3.1 when detail, motion and prompt adherence matter — it is Google's standard tier at $1.00, still 69% below going direct. Use veo-3.1-fast-hd only when 720p is enough and you want the quickest turnaround.