
Veo API — ruble pricing and a 5-minute setup
Veo API (Google) with ruble billing: Veo 3 and 3.1 Fast / Quality / Lite through one Zerocoder key. Per-clip pricing, native audio, samples, limits, refunds.
What Veo is and where it's strong
Veo is Google's video generation family: you send a text prompt (and, for some clips, a reference frame) and get back a short video clip. The family covers several tiers, from a lightweight fast option to a quality-first tier, plus an extend mode for lengthening an existing clip. Pick a tier based on how much detail and camera complexity your scene needs — see GET /v1/models for the full list and current prices.
Good fits
- Short marketing and social clips built from a text brief
- Turning a single reference image into a moving scene
- Extending or continuing a clip that's already been generated
What Zerocoder adds
One API key and one ruble wallet cover every Veo model listed above — no separate accounts per model. Top up the wallet with a Russian card or a company invoice directly in the cabinet; no VPN or foreign card is needed. Docs, examples and your keys live in the Zerocoder cabinet, and the HTTP contract is close enough to the usual video-generation pattern that existing SDK/HTTP client code needs only small changes to point at the new endpoint.
How a request and response work
You call POST /v1/videos with the model id, your prompt, the clip length in seconds, an aspect or size, and optionally a reference image URL for image-to-video. The call returns a task id with status queued and the charge already deducted from your balance. You then poll GET /v1/videos with that id every few seconds: status moves to processing and then to completed with a video URL, or to failed, in which case the charge is refunded automatically.
Available models and prices
Built from the live GET /v1/models price list: prices include our margin, in rubles and in dollars at the internal rate. Anything missing is temporarily not served by the gateway.
| Model | Unit | ₽ | $ | Cost examples | Endpoint |
|---|---|---|---|---|---|
veo-3.1-fastrecommended | per clip | 42 ₽ | $0.467 | 1 generation: 42 ₽ · $0.467 10 generations: 420 ₽ · $4.67 | /v1/videos |
veo-3.1-qualityrecommended | per clip | 78 ₽ | $0.867 | 1 generation: 78 ₽ · $0.867 10 generations: 780 ₽ · $8.67 | /v1/videos |
veo-3.1-literecommended | per clip | 24 ₽ | $0.267 | 1 generation: 24 ₽ · $0.267 10 generations: 240 ₽ · $2.67 | /v1/videos |
veo-3-fastrecommendedalso: gemini-video-std | per clip | 42 ₽ | $0.467 | 1 generation: 42 ₽ · $0.467 10 generations: 420 ₽ · $4.67 | /v1/videos |
veo-3-qualityrecommended | per clip | 78 ₽ | $0.867 | 1 generation: 78 ₽ · $0.867 10 generations: 780 ₽ · $8.67 | /v1/videos |
veo-extendrecommended | per clip | 42 ₽ | $0.467 | 1 generation: 42 ₽ · $0.467 10 generations: 420 ₽ · $4.67 | /v1/videos |
Cost calculator
Pick a model and a volume — the calculator uses the same formulas as API billing.
Prices from GET /v1/models, internal exchange rate. Failed generations are not charged.
First request
One zc-sk-… key, the x-api-key header (or Authorization: Bearer), base URL https://zerocoder.com/api/v1. Samples are generated from the real route contracts.
Create a key
Account → API: top up the balance in rubles and create a zc-sk-… key
Send a request
Copy the sample below — the model id is already taken from the price list.
Check the charge
GET /v1/balance shows the balance; the call price comes back in the response.
# 1) start the render — price_rub is charged up front, refunded if the render fails
curl https://zerocoder.com/api/v1/videos \
-H "x-api-key: zc-sk-…" -H "content-type: application/json" \
-d '{"model": "veo-3.1-fast", "prompt": "A drone shot over a foggy pine forest at sunrise, slow dolly in", "seconds": 5, "aspect": "16:9"}'
# → {"id":"vid_…","object":"video","model":"veo-3.1-fast","status":"queued","seconds":5,"price_rub":…,"balance_rub":…,"poll":"/api/v1/videos?id=vid_…"}
# 2) poll until status is "completed" (url) or "failed" (refunded: true)
curl "https://zerocoder.com/api/v1/videos?id=vid_…" -H "x-api-key: zc-sk-…"
# image-to-video: add "image": "https://…/frame.jpg" to the bodyimport time, requests
API = "https://zerocoder.com/api/v1"
H = {"x-api-key": "zc-sk-…"}
job = requests.post(f"{API}/videos", headers=H, json={
"model": "veo-3.1-fast",
"prompt": "A drone shot over a foggy pine forest at sunrise, slow dolly in",
"seconds": 5, # 4–10
"aspect": "16:9", # or 9:16 / 1:1; "image": "https://…" for image-to-video
}).json()
print("charged", job["price_rub"], "RUB, balance", job["balance_rub"])
while True:
st = requests.get(f"{API}/videos", headers=H, params={"id": job["id"]}).json()
if st["status"] == "completed":
print(st["url"]); break
if st["status"] == "failed":
print("failed, refunded:", st.get("refunded")); break
time.sleep(4)const API = "https://zerocoder.com/api/v1";
const H = { "x-api-key": "zc-sk-…", "content-type": "application/json" };
const job = await fetch(`${API}/videos`, {
method: "POST", headers: H,
body: JSON.stringify({ model: "veo-3.1-fast", prompt: "A drone shot over a foggy pine forest at sunrise, slow dolly in", seconds: 5, aspect: "16:9" }),
}).then((r) => r.json());
console.log("charged", job.price_rub, "RUB");
for (;;) {
const st = await fetch(`${API}/videos?id=${job.id}`, { headers: H }).then((r) => r.json());
if (st.status === "completed") { console.log(st.url); break; }
if (st.status === "failed") { console.log("failed, refunded:", st.refunded); break; }
await new Promise((r) => setTimeout(r, 4000));
}Inputs, limits and refunds
- Text → video and image → video (image: public https URL)
- Duration seconds: 4–10 (default 5)
- aspect 16:9 / 9:16 / 1:1 or an explicit size
- Charged up front by price_rub, refunded if the render fails (refunded: true)
- A job stuck in the queue over 30 minutes is refunded automatically
- 30 requests per minute per key (all endpoints combined)
Error responses and refunds
# 401 {"type":"error","error":{"type":"authentication_error","message":"Invalid or revoked API key."}}
# 402 {"type":"error","error":{"type":"billing_error","message":"Not enough API balance: …"}}
# 429 {"type":"error","error":{"type":"rate_limit_error","message":"…"}} ← 30 requests/min per key
# 400 {"type":"error","error":{"type":"invalid_request_error","message":"Unknown model \"…\". See GET /v1/models."}}
# 502 {"type":"error","error":{"type":"api_error","message":"… Charge refunded."}} ← start failed → money back
# GET ?id → {"id":"vid_…","status":"failed","refunded":true} ← render failed → money backUse cases
Social media agency auto-generates short product teaser clips from campaign briefs
Indie hacker builds a text-to-video feature inside a content creation SaaS
E-commerce team turns product photos into short moving showcase clips via image-to-video
Internal marketing tool extends an existing brand clip into a longer cut
Chatbot or Telegram bot that generates a video clip on request and sends back the link
Pipeline that batch-generates background video loops for a landing page builder
Prompting tips
- State the shot type and camera move explicitly: wide static shot, slow dolly-in, handheld pan — vague prompts give generic motion
- Describe the light and time of day (soft morning light, harsh noon sun, neon night) to anchor mood and color
- Break the prompt into what happens at the start, middle and end of the clip so the motion has a clear arc across the seconds
- For image-to-video, describe the reference frame itself (subject, pose, framing) so motion stays consistent with it
- Match aspect and seconds to the target platform, and avoid on-screen text, dense crowds and close-up hands in the scene
FAQ
Does the Veo API generate sound and speech?
Yes. Veo produces a synchronised soundtrack: speech from the quoted lines in your prompt, ambience and music. Audio is not billed separately.
Why is Veo priced per clip instead of per second?
That is how the provider prices it: a fixed-length clip costs a fixed amount. The table marks it as “per clip”; the POST /v1/videos response states the price in price_rub before generation starts.
How do I get a Veo API key?
Sign up at Zerocoder, open the API section of your account and create a zc-sk-… key. The same key unlocks Veo and every other model in the catalogue — no separate Veo key needed.
How is Veo API billed?
Top up the API balance in rubles (Russian bank card or invoice for companies). Usage is charged per second or per clip of Veo video at the price returned by GET /v1/models; Veo prices already include our margin, there are no hidden fees.
What if Veo fails to generate the clip?
If the provider fails a Veo generation, the charge is refunded automatically and the response carries refunded: true. You only pay for a finished clip.
What are the Veo API rate limits?
A shared limit of 30 requests per minute per key across all generation endpoints, Veo included. Above that you get 429 rate_limit_error; for higher Veo volumes contact us and we raise it individually.
Do I need a VPN or a foreign card for Veo API?
No. Veo requests go to zerocoder.com, payment is in rubles, and accounting documents are available on request.
Can I try Veo without code?
Yes: Veo is available in the Zerocoder studio and in the free tools catalogue — check the quality by hand, then wire up the Veo API.

AI API for your product
70% cheaper than the official APIs — one key for GPT, Claude, Gemini, images and video