Veo 3.1 Lite, released by Google in March 2026, strips Veo 3.1 down to the basics. There is only one way in, a written prompt, and only one length out, 8 seconds. In return it is the cheapest route to Veo footage, still available up to 4K. If you do not need to start from a photo, it is often all you need.
What you can make
- Generic B-roll: city streets, nature, office scenes, establishing shots.
- Cheap first tests of Veo prompt ideas.
- Automated pipelines that turn text into short clips.
- 4K background loops for landing pages.
Settings that matter
- Input: text only. Image inputs are rejected.
- Length: always 8 seconds, so plan an action that fills the whole shot.
- Resolution: 720p, 1080p or 4K.
- Aspect ratio: 16:9 by default,
9:16for vertical feeds. - Prompt: up to 4,000 characters. With no image to lean on, spell out the look: palette, era, lens, time of day.
- Billing basis: one flat price per generation.
Starter prompt
Aerial drone shot over a misty pine forest at sunrise, slow forward glide, soft golden light on the treetops, muted green and orange palette, birds calling in the distanceChange the place and time of day; the slow camera move keeps the shot calm enough for a background loop.
Questions
How much is a Veo 3.1 Lite clip?
from $0.177 per video per generation, whatever you write. Failed clips cost nothing.
I want to animate a product photo. Will Lite do it?
No, it refuses images. Use Veo 3.1 Fast, which accepts up to three. The Lite vs Fast comparison shows what else differs.
Can I ask for a 4 or 15 second clip?
No. Lite always returns 8 seconds. For longer pieces, generate several shots and cut them together.
Veo 3.1 Lite in your code
curl https://kadraris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1-lite",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "16:9",
"resolution": "720p"
}
}'import os, time, requests
API = "https://kadraris.com/v1"
H = {"Authorization": f"Bearer {os.environ['KADRARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "veo-3.1-lite",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "16:9",
"resolution": "720p"
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://kadraris.com/v1";
const headers = { Authorization: `Bearer ${process.env.KADRARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "veo-3.1-lite",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "16:9",
"resolution": "720p"
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Input fields
| Parameter | Type | Allowed | Default |
|---|---|---|---|
prompt * | string | ≤ 4000 chars | |
aspect_ratio | string | 16:9 9:16 | 16:9 |
resolution | string | 720p 1080p 4k | 720p |
Fetch this list as JSON with GET /v1/models/veo-3.1-lite.























