Runway Gen-4 Turbo
Runway Gen-4 Turbo: fast 5-second 720p clips from text or a frame.
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": "runway-gen-4-turbo",
"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: "runway-gen-4-turbo", 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": "runway-gen-4-turbo",
"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.
Runway Gen-4 Turbo against its price neighbours
| Model | Price | Unit | Discount | |
|---|---|---|---|---|
| Seedance 1.0 Pro FastByteDance | $0.10 | clip | — | Open |
| Seedance 1.5 ProByteDance | $0.023 | second | — | Open |
| Hailuo 2.3MiniMax | $0.037 | second | −20% | Open |
| Kling 2.1 StandardKling | $0.037 | second | −25% | Open |
| Runway Gen-4 Turbothis pageRunway | $0.19 | clip | −25% |
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: 5 s. $0.19 per clip regardless of its length.
There is no subscription: every successful request is billed at the price above, and a failed one is not billed at all. That price is already 25% below the vendor's official one — the official price is shown struck through next to it so it can be checked. No Runway 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 Runway Gen-4 Turbo, and when a neighbour
The cheaper neighbour is Seedance 1.5 Pro: $0.023 per second of video against $0.19 for Runway Gen-4 Turbo. On the same volume the bill comes out 8.2× 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 Hailuo 2.3: $0.037 per second of video. On catalog parameters it offers the same capabilities and the same order of context, so the premium is only justified if Runway Gen-4 Turbo 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.