Veo 3.1 in its Quality tier is what you pick when the clip is the final one. Google released it in October 2025, and it trades speed for the best picture the Veo 3.1 line can give. Every shot in Kadraris is 8 seconds, in horizontal or vertical format, up to 4K.
What you can make
- The finished version of a TV spot or a brand film.
- Moody, film-like shots for a trailer or a band's video.
- 4K footage meant for big screens and events.
- A still image or a storyboard frame turned into a moving shot.
Settings that matter
- Length: 8 seconds per clip. Longer stories need several shots, each with one clear action.
- Resolution: 720p, 1080p or 4K.
- Aspect ratio: 16:9 or 9:16.
- Images: up to 3 in
image_urls, used as frames. Let the image set the look and use the prompt for motion. - Camera language: be specific, for example "slow crane up from ground level, 50mm, soft backlight".
- Not exposed yet: shorter 4 or 6 second lengths, dedicated start/end frame inputs, a sound toggle, and extending a clip.
Starter prompt
Slow push-in on a violinist alone on a rooftop at blue hour, city lights flickering behind her, 85mm lens, shallow depth of field, she plays a single long note, wind softly audibleKeep the lens and the push-in and change the performer and location for your own shot.
Questions
What does a Veo 3.1 Quality clip cost?
from $2.53 per video, taken from your top-up; there is no monthly plan. A failed clip is not billed.
Quality, Fast or Lite?
Formats and resolutions match across tiers. Quality aims for the best picture, Veo 3.1 Fast delivers sooner, and Veo 3.1 Lite is the cheapest, text only. A common workflow is drafts on Fast and the final here.
Where can I compare Veo 3.1 with other video models?
See Kling 3.0 vs Veo 3.1, Veo 3.1 vs Seedance 2.5 and the Veo 3.1 pricing guide.
Veo 3.1 (Quality) 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",
"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",
"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",
"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 |
duration | integer | 8 | 8 |
image_urls | array | max 3 |
Fetch this list as JSON with GET /v1/models/veo-3.1.























