Runway Gen-4.5 for generation and Aleph 2 for editing existing footage — reachable through the same endpoint as every other video model.
| Endpoint | POST https://videorouter.sh/api/v1/videos |
| Authentication | Authorization: Bearer llmr_sk_live_... |
| Lifecycle | Async job: queued → in_progress → completed | failed. Polling is free. |
| Model ids | runway/gen-4.5 |
| Billing | Per requested second, charged once at job creation; failed-upstream jobs are not billed. Flat 2% platform fee. |
| Provider choice | Unpinned requests route to the cheapest healthy host and fail over; append /<host> to prefer one. |
| Host | Price |
|---|---|
| Replicate | $0.12 |
USD per second, before the 2% platform fee. Bold = cheapest at that tier.
curl https://videorouter.sh/api/v1/videos \
-H "Authorization: Bearer $VIDEOROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "runway/gen-4.5", "prompt": "a paper airplane gliding over a city", "duration_secs": 5}'
# -> {"id": "video_...", "status": "queued"}
curl https://videorouter.sh/api/v1/videos/$ID -H "Authorization: Bearer $VIDEOROUTER_API_KEY"import time, requests
H = {"Authorization": "Bearer llmr_sk_live_..."}
job = requests.post("https://videorouter.sh/api/v1/videos", headers=H, json={
"model": "runway/gen-4.5", "prompt": "a paper airplane gliding over a city", "duration_secs": 5}).json()
while job["status"] not in ("completed", "failed"):
time.sleep(5)
job = requests.get(f"https://videorouter.sh/api/v1/videos/{job['id']}", headers=H).json()
print(job["data"][0]["url"] if job["status"] == "completed" else job["error"])const H = { Authorization: "Bearer llmr_sk_live_...", "Content-Type": "application/json" };
let job = await (await fetch("https://videorouter.sh/api/v1/videos", { method: "POST", headers: H,
body: JSON.stringify({ model: "runway/gen-4.5", prompt: "a paper airplane gliding over a city", duration_secs: 5 }) })).json();
while (!["completed", "failed"].includes(job.status)) {
await new Promise(r => setTimeout(r, 5000));
job = await (await fetch(`https://videorouter.sh/api/v1/videos/${job.id}`, { headers: H })).json();
}
console.log(job.data?.[0]?.url ?? job.error);Model id used: runway/gen-4.5. More in examples.
input_video_url plus an edit prompt — restyle, add or remove elements, change the scene.model string to Kling, Veo or Seedance to compare output and price on the same prompt.Runway's video-to-video model: instead of generating from scratch, it modifies a clip you provide according to a text instruction.
The input is capped at 30 seconds. Cost scales with the input duration; see the model page for the exact rate.
It is usually priced at the premium end. Use the live table to compare against Kling, Veo and Seedance before committing.
No — a VideoRouter key is enough.
VideoRouter puts it next to dozens of other video and image models behind one API key, so you can compare providers, prices and fail over automatically. Compare providers on VideoRouter →