MODELLIX editorial cover reading VEO 2 API over ENDPOINTS & MIGRATION, with a fractured glass API gateway feeding brighter successor panels

If your Veo 2 API integration stopped working this summer, your code is not the problem. Google shut veo-2.0-generate-001 down on June 30, 2026, and the endpoint is gone. What has not gone away is the noise around it: of the nineteen organic results on page one for “veo 2 api” on September 10, 2026, eight were third-party listings or reseller pages, several of which still advertise the model today, and the highest-ranking third-party tutorial hands out a base URL that Google’s own documentation never contained.

This page is the API-side record, verified against first-party sources on September 10, 2026: the real base URL and model ID, the complete parameter list, runnable code for the request shape that used to work, what a call returns now, and the exact edit that moves a Veo 2 pipeline onto Veo 3.1. For the price history and the full shutdown narrative, our Veo 2 price breakdown owns that angle; this article owns the integration surface — the endpoints, the parameters, the code, and the migration edit. One disclosure: Modellix operates this blog and routes media models behind one API key, so we have a commercial interest in the aggregator half of what follows. Every number below carries its source and read date.

Is the Veo 2 API still available? The verified answer

No. The Veo 2 API is gone. Google shut veo-2.0-generate-001, the only Veo 2 model ID on the Gemini API, down on June 30, 2026, and Google’s own deprecations page names veo-3.1-generate-preview as the replacement. The documentation phrase is unambiguous: once a model is shut down, “it is completely turned off, and the endpoint is no longer available.” There is no flag to re-enable, no legacy tier, and no free allowance — Veo 2 never had a free tier at all.

One disambiguation, because the bare string “veo” still maps to camera hardware in Google’s own related searches: this page is about Google DeepMind’s Veo 2 video-generation model, not the Veo sports camera. The word “api” is what separates the two.

Five first-party surfaces, all read on September 10, 2026, tell the same story:

Surface What it says today Read
Gemini API deprecations Veo table: veo-2.0-generate-001, released April 9, 2025, shutdown June 30, 2026, recommended replacement veo-3.1-generate-preview. The same table retires veo-3.0-generate-001 and veo-3.0-fast-generate-001 on the same date 2026-09-10
Veo 2.0 model card A banner: “This model was shut down on June 30, 2026; migrate to Veo 3.1 Preview or the GA models available through the Gemini Enterprise Agent Platform to avoid service interruptions” 2026-09-10
Gemini API pricing Veo 2 has been deleted from the page. The Veo section now contains only the Veo 3.1 tiers 2026-09-10
Video generation overview “The Gemini API offers two models for generating video, Gemini Omni Flash and Veo” — with Gemini Omni Flash positioned as the default and Veo 3.1 kept for scene extension, last-frame control, and legacy pipelines 2026-09-10
Vertex AI / Agent Platform model directory The old Veo 2 model-card URL now resolves to Google’s general model directory, whose Veo section lists Veo 3 Generate, Veo 3 Fast, Veo 3.1 Generate, Veo 3.1 Fast, plus Veo 3.1 Lite in preview. Veo 2 is not among them 2026-09-10

Two details are worth pinning down, because they are exactly the kind of thing that keeps a dead model looking alive. First, the model card still carries its pre-shutdown sales copy — “Our robust and reliable stable video generation model… Veo 2.0 is best for standard 1080p content creation” — directly beneath the shutdown banner, and that 1080p claim never matched the API, which capped out at 720p. Second, the pricing page’s Veo 2 row, which was still visible on August 20, 2026, has since been removed; if you are quoting a per-second price for Veo 2 from any page that has not been updated since early 2026, you are quoting a discontinued line item.

What the Veo 2 API actually was: base URL, model ID, and call shape

Strip away the reseller markup and the Veo 2 API was one POST and one polling GET. Google’s archived Veo guide from June 10, 2025 — the version that shipped while Veo 2 was live — documents that call shape, and it is worth reading precisely because the pages ranking today do not reproduce it. Google no longer publishes a Veo 2 reference, so the table below separates what the archived page actually shows from the two values only the current Veo 3.1 guide states outright:

Piece Value Where it is documented
Model ID veo-2.0-generate-001 Archived Veo guide (June 2025), and the Veo 2.0 model card
Submit call POST {BASE_URL}/models/veo-2.0-generate-001:predictLongRunning Archived Veo guide — note that it writes the host as a ${BASE_URL} variable rather than spelling it out
Poll call GET {BASE_URL}/{operation.name} until done is true Archived Veo guide
Auth API key as a ?key= query parameter Archived Veo guide; the current guide prefers an x-goog-api-key header
Request envelope instances[] for inputs, parameters{} for options Archived Veo guide
SDK entry point client.models.generate_videos(model=..., prompt=..., config=types.GenerateVideosConfig(...)) Archived Veo guide
Base URL https://generativelanguage.googleapis.com/v1beta Current Veo guide — this is the literal host the archived page leaves as a variable
Final video URI .response.generateVideoResponse.generatedSamples[].video.uri Current Veo guide. The archived page’s own SDK example consumes the same value as operation.response.generated_videos[].video.uri, which is the SDK’s spelling of that field

Three properties define the shape, and all three survive into Veo 3.1. It is asynchronous: the submit call returns an operation handle immediately and you poll it. It is envelope-based: inputs go inside an instances array and options inside a parameters object, rather than as flat top-level JSON. And the value you pull out at the end is the same one in both eras — the current guide’s generateVideoResponse.generatedSamples[].video.uri is what the archived page’s SDK example read as generated_videos[].video.uri. That last point is the good news in this article, and the migration section leans on it.

Compare that with the request shape the top-ranking third-party tutorial currently teaches — a synchronous call to api.gemini.google.com/v1/video/generate with a Bearer token and a ready-made video_url in the response. No such host appears in Google’s Gemini API documentation, in either era, and the synchronous response shape is inconsistent with a model that takes between 11 seconds and six minutes to render a clip. If you copied that tutorial, you were never calling Veo 2.

The complete Veo 2 parameter list and output specs

Veo 2’s reputation rested on physical realism in motion — the model was marketed on believable physics rather than on stylistic range. The integration surface around that capability was much narrower, and it consisted of eight request fields. Here is the full set as Google documented it while the model was live — the naming differs by language (camelCase in JSON, snake_case in Python), which is the first thing to check when porting old code.

Field Type Accepted values Notes
prompt string free text Optional if you supply an input image
image image first frame Optional if you supply a prompt; this is the image-to-video mode. The model card accepts any resolution and aspect ratio up to a 20MB file size
negativePrompt string free text What to discourage
aspectRatio string 16:9, 9:16 Defaults to 16:9
personGeneration string text-to-video: dont_allow, allow_adult, allow_all; image-to-video: dont_allow, allow_adult allow_all is not available in EU, UK, CH, and MENA locations
numberOfVideos integer 1 or 2 The model card records “Output video: Up to 2”
durationSeconds integer 5 to 8 Variable length output
enhancePrompt boolean on by default Google’s prompt rewriter

The output envelope was narrow by today’s standards, and it is the main reason a Veo 2 pipeline cannot simply be re-pointed at a newer tier without decisions:

  • 720p at 24 fps. No 1080p, no 4K. The API never offered them.
  • 5 to 8 seconds, 16:9 or 9:16.
  • No audio. Veo 2 generated video only; native audio arrived with Veo 3.
  • English input for text-to-video.
  • 11 seconds to 6 minutes of latency per request, longer at peak.
  • Every output watermarked with SynthID and passed through safety filters and memorization checks.
  • Rendered videos were retained on Google’s servers for two days. If you generated clips before the shutdown and never downloaded them, there is nothing left to fetch.

Working code: submit, poll, and download the shape that used to work

Start with REST, because it shows the wire format without SDK abstractions in the way. This is the request that worked while veo-2.0-generate-001 was live — kept here verbatim as a migration reference, not as something you can run today.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Veo 2, as documented in June 2025. The model was shut down on 2026-06-30.
BASE_URL="https://generativelanguage.googleapis.com/v1beta"

op_name=$(curl -s "${BASE_URL}/models/veo-2.0-generate-001:predictLongRunning?key=${GOOGLE_API_KEY}" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"instances": [{ "prompt": "Panning wide shot of a calico kitten sleeping in the sunshine" }],
"parameters": { "aspectRatio": "16:9", "personGeneration": "dont_allow" }
}' | jq -r .name)

while true; do
status=$(curl -s "${BASE_URL}/${op_name}?key=${GOOGLE_API_KEY}")
if [ "$(echo "$status" | jq .done)" = "true" ]; then
echo "$status" | jq -r '.response.generateVideoResponse.generatedSamples[0].video.uri'
break
fi
sleep 5
done

The Python SDK is the same transaction in four lines, plus the polling loop you should always write rather than a fixed sleep:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time
from google import genai
from google.genai import types

client = genai.Client() # reads GEMINI_API_KEY / GOOGLE_API_KEY

operation = client.models.generate_videos(
model="veo-2.0-generate-001", # shut down 2026-06-30
prompt="Panning wide shot of a calico kitten sleeping in the sunshine",
config=types.GenerateVideosConfig(
person_generation="dont_allow",
aspect_ratio="16:9",
),
)

while not operation.done:
time.sleep(20)
operation = client.operations.get(operation)

for n, generated_video in enumerate(operation.response.generated_videos):
client.files.download(file=generated_video.video)
generated_video.video.save(f"video{n}.mp4")
Veo 2 API request lifecycle: submit a predictLongRunning operation, wait on the returned operation handle, then retrieve the finished video

The Veo 2 call pattern: submit, wait on the operation handle, then download — and download inside the two-day retention window, because rendered clips were not kept.

Note the time.sleep inside the loop. Sampling the operation on a fixed interval is the documented pattern, and it is also the right one: a clip can take minutes at peak, so a single sleep long enough to cover the worst case wastes a minute on every successful call.

Media API Reference

See the async task format, polling endpoint, and result retrieval for image and video models.

View Docs

What you get if you call it today: the real failure modes

There are two ways a Veo 2 call can fail now, and they look nothing alike.

A direct call to Google fails cleanly. The model is off, so there is no operation to poll and no video to download — the request never reaches a renderer. That is the good failure: unambiguous, immediate, and impossible to mistake for a transient error. If you are seeing intermittent success, you are not calling Veo 2; you are calling something an aggregator has decided to give you instead.

A call to a reseller alias fails quietly, or does not fail at all. This is the one that costs money. A model listing that says veo2, or google/veo-2.0, or veo-2 is a vendor’s private alias, not a Google model code — and an alias is free to point at whatever upstream inventory the vendor still has. That can mean a standing Veo 2 route through leftover capacity. It can equally mean the alias now resolves to a different model, at a different price, producing video that does not match what you thought you bought. The failure mode is not an error message; it is output that is subtly wrong.

Three checks are worth running before you build anything on a legacy listing:

  • The free-tier question. Veo 2 had no API free tier, and neither does Veo 3.1 — Google’s pricing page lists “Not available” for every tier. A listing advertising free Veo 2 access is either a trial credit or a different model.
  • The retention question. If a page tells you to fetch a specific video you generated months ago, the answer is no: outputs lived on Google’s servers for two days. Anything older exists only where you saved it.
  • The billing unit. Google bills Veo per second of output. If a listing quotes a flat per-video price, you are looking at a markup wrapper, which is legitimate but is not the underlying rate.

Migrating from veo-2.0-generate-001 to veo-3.1-generate-preview

The migration is smaller than the redesign it sounds like, because Veo 3.1 kept Veo 2’s request architecture. Google’s current Veo guide still posts to :predictLongRunning, still returns an operation you poll, and still hands you the finished clip at .response.generateVideoResponse.generatedSamples[0].video.uri. What changes is the model ID and the options you can pass.

Aspect Veo 2 Veo 3.1 What you do
Model ID veo-2.0-generate-001 veo-3.1-generate-preview, veo-3.1-fast-generate-preview, veo-3.1-lite-generate-preview Pick a tier — the choice drives cost more than anything else
Submit endpoint …:predictLongRunning …:predictLongRunning No change
Polling GET {operation.name}, watch done Same No change
Response path generateVideoResponse.generatedSamples[].video.uri (the value the archived SDK example read as generated_videos[].video.uri) The same field — the current guide still tells you to parse .response.generateVideoResponse.generatedSamples[0].video.uri No change to your parser
Audio None Generated in the same pass, always on Your output now has sound; budget for it
Resolution 720p only 720p, 1080p, 4K on Standard and Fast; Lite caps below 4K 1080p and 4K only run at the 8-second duration
Duration 5–8 seconds, variable Fixed duration values (4, 6, or 8 on the current API surface; Google’s guide describes the model as generating 8-second video) Replace durationSeconds with the new duration field
Aspect ratio 16:9, 9:16 16:9, 9:16 No change
Inputs Text prompt, or one starting image Text prompt, up to 3 reference images, first-and-last-frame pairs, and video extension Capabilities you did not have; see our Veo 3.1 API guide for the full request surface

In practice, the poll-and-download half of your client needs no edit at all:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import time
from google import genai

client = genai.Client()

# Before: model="veo-2.0-generate-001"
# After:
operation = client.models.generate_videos(
model="veo-3.1-generate-preview",
prompt="Panning wide shot of a calico kitten sleeping in the sunshine",
)

while not operation.done:
time.sleep(10)
operation = client.operations.get(operation)

generated_video = operation.response.generated_videos[0]
client.files.download(file=generated_video.video, destination="clip.mp4")

Two behavioural changes matter more than the code diff. Audio is generated whether or not you wanted it, which changes both the deliverable and the bill — on the Gemini API, Veo 3.1 pricing is quoted with audio as the default. And resolution is now duration-coupled: 1080p and 4K are only available on 8-second output, so a pipeline designed around short 720p clips cannot simply request higher quality without also changing clip length. If you are also moving where the key comes from, our Veo 3.1 API key guide covers that path separately.

Veo 2 to Veo 3.1 migration: a darkened legacy panel on the left connected by a bright amber path to a row of three successor panels of increasing height

The migration is a re-point, not a rewrite: one model ID changes, and the tier you choose determines both resolution and cost.

What the migration costs: Veo 3.1 prices read September 10, 2026

Veo 3.1 is billed per second of output, with audio included, and there is no free tier. These are Google’s own rates from the Gemini API pricing page, read on September 10, 2026. The matrix is repeated here only because the migration decision needs it in view — the tier-by-tier analysis lives in our price breakdown.

Tier (per second, with audio) 720p 1080p 4K
Veo 3.1 Standard $0.40 $0.40 $0.60
Veo 3.1 Fast $0.10 $0.12 $0.30
Veo 3.1 Lite $0.05 $0.08 Not supported

An 8-second clip is therefore $3.20 on Standard at 1080p, $0.96 on Fast, and $0.40 on Lite at 720p. That arithmetic is the whole cost conversation: the tier choice moves the price by roughly an order of magnitude, and nothing else does.

If you would rather not run a per-vendor Google Cloud project on top of your existing stack, an aggregator is the alternative, and Modellix is the one we operate — so read the next column with that in mind. Modellix exposes the same Veo 3.1 family under google/veo-3.1-* model IDs on one key, priced per second of output, and it publishes parameter-level rates rather than a single headline number. Its Veo 3.1 T2V route, for example, is the Veo 3.1 T2V route and its per-second rates — $0.36/sec for 720p and 1080p and $0.54/sec for 4K as of September 10, 2026; the full Veo 3.1 series page shows the six routes across tiers at the same date. Those are comparable to Google’s list rates tier for tier, and the difference you are buying is one bill, one key, and no separate cloud project.

Two honest caveats. Modellix does not list a Veo 2 route any more — its Veo 2 model pages and series page are gone, so nothing on that page will resurrect your old integration. And aggregator rates move independently of Google’s; for the complete Veo 3.1 price matrix and how the tiers compare, our Veo 3.1 price breakdown carries that analysis rather than repeating it here.

Compare Veo 3.1 Tiers

Log in to check current per-second rates and move a Veo 2 pipeline onto one key.

Login

How to tell whether a listing is the real model

Every page still selling Veo 2 fails the same test: it names a model the vendor can no longer reach at the source. That does not automatically make the listing dishonest — leftover inventory is a real thing — but it does mean you should verify before you integrate. Five checks settle it.

  1. Does the page use Google’s model code format? Google’s codes are specific and dated: veo-2.0-generate-001, veo-3.1-generate-preview. Strings like veo2, google/veo-2.0, or veo-2 are vendor aliases. The Replicate listing, the Segmind docs, and the VideoGenAPI landing page all resolve today, and all of them predate the shutdown.
  2. Does the listing cross-reference Google’s deprecations page? The deprecations table is the single authority for whether a model answers. A page that discusses Veo 2 availability without mentioning June 30, 2026 was written before the fact and not updated.
  3. Do the claimed specs match the model card? Veo 2 was 720p, 5–8 seconds, no audio. A listing advertising 1080p, 10-second clips, or audio generation under the Veo 2 name is describing a different model.
  4. Can you test one call before committing? Run the smallest possible request against a nominal balance and inspect the output. If the response shape lacks predictLongRunning and a pollable operation, you are not on Google’s API.
  5. Does it date its own prices? Per-second rates for preview models change. An undated rate is a rate you cannot audit.

For comparison, here is what a listing looks like when the underlying model is actually current: Modellix’s Google model catalogue today carries the six Veo 3.1 routes plus the Gemini Omni family — the Veo 2 entries are gone from it entirely, which is what a correctly maintained catalogue looks like after a shutdown.

Checking whether a model listing is genuine: one precision chrome card beside unbranded glass cards, one fractured and unlit

A real listing names a documented model code and dates its rates; an alias points at whatever inventory the vendor happens to have.

FAQ

Can I still use the Veo 2 API?
Not through Google. veo-2.0-generate-001 was shut down on June 30, 2026, and Google’s deprecations page states that a shut-down model has its endpoint removed entirely. Some third-party listings still advertise a Veo 2 route; test one call before you rely on it, and treat any such route as removable without notice.

Was the Veo 2 API free?
No. Google’s pricing page listed the Veo 2 free tier as “Not available” throughout the model’s life, and the paid tier was billed per second of output. Google’s Veo 3.1 tiers have no free tier either.

How much did Veo 2 cost per second?
It launched at $0.50 per second and was later reduced to $0.35 per second on the Gemini API. Those figures are historical — Google has since removed the Veo 2 section from its pricing page — and our Veo 2 price breakdown documents the timeline with dates.

What should I migrate to?
veo-3.1-generate-preview is Google’s stated replacement, with veo-3.1-fast-generate-preview and veo-3.1-lite-generate-preview as cheaper tiers of the same family. Google’s video generation overview now positions Gemini Omni Flash as the default video model and keeps Veo 3.1 for scene extension, last-frame control, and legacy pipeline work.

Which model ID do I put in my code?
veo-3.1-generate-preview for the standard tier on the Gemini API, or the -fast- and -lite- variants. The old string veo-2.0-generate-001 no longer resolves.

Did Veo 2 generate audio?
No. It produced silent video at up to 720p. Native audio generation began with Veo 3 and is always on in Veo 3.1, which is why current per-second prices are quoted with audio as the default.

Why do so many pages still sell Veo 2?
Because a model listing is cheap to leave up and expensive to audit. On September 10, 2026, eight of the nineteen organic results on page one for this query were third-party listings or reseller pages, and none of the ones we checked disclosed the June 30, 2026 shutdown.

Do I need a new API key to migrate?
No. Veo 2 and Veo 3.1 both run on the Gemini API with the same key and the same base URL — you are changing a model ID, not a platform.

The real lesson: model endpoints have a shelf life

Veo 2 went from general availability to a dead endpoint in about fourteen months. That is not an unusually short life for a preview-stage media model, and it is the strongest argument against hard-coding a single model ID into a product. The pipelines that survived June 30, 2026 were the ones where the model ID was a configuration value — and the ones that had somewhere else to point it.

Two habits are worth more than any migration guide. Keep the model ID out of your application logic, so a shutdown is a config change rather than a release. And keep a second route available for the same capability, so that when the first one turns off you are validating output quality instead of rewriting a client — if you are deciding where that second route should point between two of the biggest video families, how Kling and Veo 3 compare is a reasonable place to start.

If the next Veo generation follows the same pattern, the call shape will barely change — the Veo 3 versus Sora comparison and our image-to-video API guide are the places to look next when you are choosing a target.


Sources retrieved September 10, 2026: Gemini API deprecations, Veo 2.0 model card, Gemini API pricing, video generation overview, Veo 3.1 guide, archived Veo guide, June 2025, Veo 2 GA announcement. Google and Modellix can change pricing and model availability without notice; this is a dated guide, not a quote. Modellix operates this blog and routes media models behind one API key.