Veo 3.1 (Quality) is the quality tier of Google's Veo 3.1, released in October 2025. It generates video in 16:9 or 9:16 at 720p, 1080p or 4K, and every clip on Jantaris is 8 seconds long. It supports text-to-video and image-to-video with up to 3 images used as frames. Google also offers 4 and 6 second clips, explicit first and last frame fields, an audio switch and clip extension, but Jantaris does not expose those options yet. Choose this tier over Fast for final renders where image quality counts more than speed.
Best for
- Final renders of commercials and brand films
- Cinematic shots for music videos and trailers
- 4K footage for large screens
- Animating a still or a storyboard frame into a shot
Prompting tips
- Describe camera work precisely: "handheld tracking shot at waist height, 35mm, shallow depth of field".
- Give each 8-second shot one clear action and split longer stories into several shots.
- With an image attached, describe the motion and let the image define the look.
- Test prompts on Veo 3.1 Fast first to save budget.
FAQ
How much does Veo 3.1 cost via API?
The quality tier costs from $2.53 per video. Jantaris bills from a prepaid balance with no subscription, and failed generations are not charged.
What is the difference between Veo 3.1 and Veo 3.1 Fast?
They share formats and resolutions. The quality tier targets the best output and Fast returns results sooner, while Veo 3.1 Lite is the lowest-cost, text-only option.
Can Veo 3.1 animate my image?
Yes. Send up to 3 images in image_urls; they are used as frames, and the prompt describes the motion.
How to call Veo 3.1 (Quality) via API
curl https://jantaris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $JANTARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"aspect_ratio": "16:9",
"resolution": "720p"
}
}'import os, time, requests
API = "https://jantaris.com/v1"
H = {"Authorization": f"Bearer {os.environ['JANTARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "veo-3.1",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"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://jantaris.com/v1";
const headers = { Authorization: `Bearer ${process.env.JANTARIS_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": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"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));
Parameters
| 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 |
The same schema is available from GET /v1/models/veo-3.1.









