Gemini Omni 1.1
Google's Gemini Omni 1.1: video with audio from text or a frame, 720p to 4K, 4–10 second clips.
First request
import time, requests
BASE, KEY = "https://api.altrouter.ai/v1", "ar-..."
h = {"Authorization": f"Bearer {KEY}"}
# 1. запускаем рендер - ответ приходит сразу, со статусом queued
job = requests.post(f"{BASE}/videos", headers=h, json={
"model": "gemini-omni-1.1",
"prompt": "a drone shot over a coastline",
}).json()
# 2. опрашиваем, пока не готово (рендер занимает минуты)
while job["status"] in ("queued", "in_progress"):
time.sleep(10)
job = requests.get(f"{BASE}/videos/{job['id']}", headers=h).json()
print(job["url"])// Видео асинхронное: создать рендер, затем опрашивать статус.
const BASE = "https://api.altrouter.ai/v1";
const h = { Authorization: `Bearer ${process.env.ALTROUTER_API_KEY}`, "Content-Type": "application/json" };
let job = await fetch(`${BASE}/videos`, {
method: "POST",
headers: h,
body: JSON.stringify({ model: "gemini-omni-1.1", prompt: "a drone shot over a coastline" }),
}).then((r) => r.json());
while (job.status === "queued" || job.status === "in_progress") {
await new Promise((r) => setTimeout(r, 10_000));
job = await fetch(`${BASE}/videos/${job.id}`, { headers: h }).then((r) => r.json());
}
console.log(job.url);curl https://api.altrouter.ai/v1/videos \
-H "Authorization: Bearer ar-..." \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-omni-1.1",
"prompt": "a drone shot over a coastline"
}'
# → { "id": "vid_...", "status": "queued" } - готовность опрашивается
# через GET https://api.altrouter.ai/v1/videos/{id}The interface is OpenAI-compatible: in existing code only the base_url, the key and the model id change — nothing else.
Gemini Omni 1.1 against its price neighbours
| Model | Price | Unit | Discount | |
|---|---|---|---|---|
| Kling 3.0Kling | $0.087 | second | — | Open |
| Kling 3.0 TurboKling | $0.099 | second | −12% | Open |
| Gemini Omni 1.1this pageGoogle | $0.100 | second | — | |
| MiniMax H3MiniMax | $0.10 | second | — | Open |
| Wan 3.0 VideoAlibaba | $0.10 | second | −50% | Open |
Prices and parameters come from the same catalog as the price above; this is not a benchmark, it is comparable billing terms.
Limits
Rendering is asynchronous: POST /v1/videos returns immediately in queued and you poll GET /v1/videos/{id}. Funds are held when the job is created and captured only for a completed render — a failed one is not charged. Clip length: 4, 6, 8, 10 s. At $0.100 per second, length multiplies the bill directly.
There is no subscription: every successful request is billed at the price above, and a failed one is not billed at all. There is no markup over the vendor's official price. No Google account of your own is needed, and no VPN: requests go to api.altrouter.ai and we make the upstream call.
Rate limiting is shared across models and counted per key: 600 requests per minute by default, and a 429 with retry-after: 60 above it. An individual key can get its own limit and a spending cap per day, week, month or lifetime in the dashboard.
When to pick Gemini Omni 1.1, and when a neighbour
The cheaper neighbour is Kling 3.0 Turbo: $0.099 per second of video against $0.100 for Gemini Omni 1.1. On the same volume the bill comes out 1× smaller. It is the sensible pick where the task is repetitive and high-volume — labelling, classification, short templated answers — the kind of work where quality is bounded by the prompt rather than the model.
The dearer neighbour is MiniMax H3: $0.10 per second of video, or 1× the price. On catalog parameters it offers the same capabilities and the same order of context, so the premium is only justified if Gemini Omni 1.1 falls short on your own task.
Guessing is more expensive than checking: the table above is prices and parameters, not a benchmark, and it cannot tell you which model does better on your own prompt. Switching costs one line — the model id in the request changes, the base_url and the key stay — so running both on your own data takes minutes.
An asynchronous endpoint: the call returns immediately in queued, and you poll GET /v1/videos/{id} for the result. The finished mp4 is re-hosted on our CDN, and only a completed render is charged.
/v1/videosThe same object comes back from GET /v1/videos/{id}; the finished file is also served directly from GET /v1/videos/{id}/content.