Veo API Documentation

Buy credits, generate a key, and call Veo through a simple endpoint. If you've used the OpenAI API before, you already know this one.

veoapi.io is an independent proxy and reseller for Veo. Endpoints below point at our proxy; responses originate from Veo models.

Introduction

The Veo API exposes a REST interface modeled on the OpenAI specification. You authenticate with a bearer token and receive standard JSON responses, so the official OpenAI SDKs and most HTTP clients work with minimal changes.

Base URL

BASEhttps://api.veoapi.io/v1

Authentication

The API uses bearer token authentication. Create a key from your dashboard after topping up credits, then pass it on every request:

# HTTP headers
Authorization: Bearer sk-veo-your-key
Content-Type: application/json

Keep keys secret. Treat API keys like passwords — never embed them in client-side code or commit them to a repository. Rotate or revoke a leaked key instantly from your dashboard.

Quickstart

Python

import time, requests

BASE = "https://api.veoapi.io/v1"
H = {"Authorization": "Bearer sk-veo-your-key"}

# 1. create a generation task
task = requests.post(f"{BASE}/video/generations", headers=H, json={
    "model": "veo-3",
    "prompt": "a drone shot over a misty forest at sunrise",
    "duration": 5,
    "aspect_ratio": "16:9",
}).json()

# 2. poll until the video is ready
while True:
    res = requests.get(f"{BASE}/video/generations/{task['id']}", headers=H).json()
    if res["status"] in ("succeeded", "failed"):
        break
    time.sleep(5)

print(res["video_url"])

cURL

curl https://api.veoapi.io/v1/video/generations \
  -H "Authorization: Bearer sk-veo-your-key" \
  -H "Content-Type: application/json" \
  -d '{"model": "veo-3", "prompt": "ocean waves at golden hour", "duration": 5}'

Create a video

POST/v1/video/generations

Submits an asynchronous generation task and returns a task id immediately.

  • modelveo-3 or veo-2. Required.
  • prompt — text description. image — optional URL for image-to-video.
  • duration — clip length in seconds. aspect_ratio — e.g. 16:9.
{ "id": "gen_abc123", "status": "queued" }

Poll the task

GET/v1/video/generations/{id}

Poll until status is succeeded (or supply a webhook_url when creating the task to be notified instead).

{ "id": "gen_abc123", "status": "succeeded", "video_url": "https://cdn.veoapi.io/v/abc.mp4" }

Models

GET/v1/models
Model IDName
veo-3Veo 3
veo-2Veo 2

Errors

Conventional HTTP status codes are used, with an OpenAI-style error body: { "error": { "message", "type", "code" } }.

CodeMeaning
400Malformed request
401Invalid or missing API key
402Insufficient credits — top up your balance
429Rate limit exceeded
500 / 503Upstream or proxy error — retry with backoff

Rate limits

Rate limits scale with your plan and balance. When you exceed a limit you'll receive a 429 with a Retry-After header — back off and retry. Need a custom limit? Contact us.

Ready to build? Get your API key and make your first call in minutes.