Google Veo
This connector reaches Google's Gemini API at https://generativelanguage.googleapis.com/v1beta and exposes Veo video generation to an agent. An agent can start a generation, poll the long-running operation until it finishes, and inspect the models and files the API holds. It's useful when you want an agent to produce video on request without ever handing it your Gemini API key, and without letting it burn credit unattended: the generation call is approval-gated, so a run only starts once you say so on your device.
Veo is also available through Vertex AI. This connector deliberately targets the Gemini API instead, because the Gemini API authenticates with a plain API key in a header. Vertex AI needs a region-specific host and a service-account JWT, which the gateway can't mint today.
What you need
A Gemini API key.
- Sign in to Google AI Studio with the Google account that should be billed.
- Open Get API key and create a key in the project you want the usage charged to.
- Copy the key. It's the whole credential; there are no scopes to select.
Video generation is a paid feature, so the key must belong to a project on a paid tier. Treat the key as project-wide: anything the Gemini API permits, that key permits. The connector narrows that down to the endpoints listed below, and the gateway refuses any other host or path.
Add the connection
In the console, open Access → Connections → Add connection, pick Google Veo from the catalog, and paste the API key once. It's sealed on your gateway immediately and can't be read back — you can rotate or replace it later, but not display it.
Adding the connection makes the actions possible, not permitted. An agent still can't call anything until a grant allows it.
What the agent can do
| Action | What it does | On by default |
|---|---|---|
videos.generate | Starts a Veo generation and returns a long-running operation | No — approval required |
operations.read | Polls a generation operation until done is true | Yes |
generated_files.list | Lists the videos Veo has generated for the project, with their state | Yes |
models.list | Lists the models available to your key | Yes |
models.read | Reads one model's metadata | Yes |
files.list | Lists the files the API is holding | Yes |
files.read | Reads one file's metadata | Yes |
files.delete | Deletes a file | No — approval required |
videos.generate takes the model as a path value (for example veo-3.1-generate-preview, veo-3.1-fast-generate-preview or veo-3.1-lite-generate-preview) plus the API's own instances and parameters objects. instances carries prompt and, depending on the model, image, lastFrame, referenceImages or video; parameters carries aspectRatio, resolution, durationSeconds, personGeneration, numberOfVideos and seed. Nothing else is forwarded upstream — including the API's webhookConfig field, which is deliberately left out so an agent can't point generation callbacks at a host of its choosing.
operations.read takes the model and the operation id — the two halves of the operation name the generation call returned, models/<model>/operations/<id>.
A typical run is three steps:
- The agent calls
videos.generate. Because the action is approval-gated, the call returns awaiting approval and prompts you on your device. Nothing is spent until you approve. - Once approved, the call goes upstream and comes back with an operation name.
- The agent calls
operations.readin a loop, splitting that name into its model and id, untildoneis true. Google quotes a latency of eleven seconds at best and six minutes at worst, so poll on a timer rather than tightly.
Good to know
- Generation costs money. A Veo call is billed per generated second, from five cents a second on Veo 3.1 Lite to sixty on Veo 3.1 at 4k. That's why
videos.generateis off until you enable it and gated on approval even then: an agent in a retry loop is an expensive agent. Leave the approval requirement on. - The finished video isn't returned by the connector. When the operation completes, its response carries a URI for the generated video. Downloading those bytes is a separate fetch against an opaque URI, so it isn't one of the pinned capabilities here — hand the URI to whatever does the download, or fetch it yourself.
generated_files.listis the consolation prize: it tells the agent which videos exist and whether they finished, but not their contents. - Model ids move. Veo models on the Gemini API carry
-previewsuffixes and are replaced fairly often. Because the model is a path value rather than something baked into the connector, you don't need a new connector when Google ships the next one — but do checkmodels.listif a generation starts failing. - Pass bare ids, not resource names. Path values are escaped before they reach Google, so a slash in one won't create a new path segment. Give
files.readthe idabc123, not the full namefiles/abc123, and split an operation name the same way. - Videos and files expire. Both uploaded files and generated videos are dropped after about two days, so
files.listandgenerated_files.listare a short window, not an archive. - Rate limits are per project and per tier. Free-tier keys can't generate video at all; paid tiers still cap requests per minute. A burst of agent calls will hit 429 before it hits your bill.
- Region and content restrictions apply. Veo enforces its own content policy and some options, such as generating people, are restricted by region. A refusal comes back as a completed operation with a filter reason, not as an error.