REST async · one key · updated 2026-10-02

Runway API

Runway Gen-4.5 for generation and Aleph 2 for editing existing footage — reachable through the same endpoint as every other video model.

API at a glance

EndpointPOST https://videorouter.sh/api/v1/videos
AuthenticationAuthorization: Bearer llmr_sk_live_...
LifecycleAsync job: queued → in_progress → completed | failed. Polling is free.
Model idsrunway/gen-4.5
BillingPer requested second, charged once at job creation; failed-upstream jobs are not billed. Flat 2% platform fee.
Provider choiceUnpinned requests route to the cheapest healthy host and fail over; append /<host> to prefer one.

Models

Provider comparison — gen-4.5

HostPrice
Replicate$0.12

USD per second, before the 2% platform fee. Bold = cheapest at that tier.

Examples

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.

Notes

Generation: Gen-4.5
Text- and image-to-video with Runway's Gen-4.5 model.
Editing: Aleph 2
Send an existing clip as input_video_url plus an edit prompt — restyle, add or remove elements, change the scene.
One balance
No separate Runway developer account or credit packs; usage draws from one prepaid VideoRouter balance.
Compare with the field
Switch the model string to Kling, Veo or Seedance to compare output and price on the same prompt.

FAQ

What is Aleph 2?

Runway's video-to-video model: instead of generating from scratch, it modifies a clip you provide according to a text instruction.

How long can the input video be for Aleph 2?

The input is capped at 30 seconds. Cost scales with the input duration; see the model page for the exact rate.

Is Runway cheaper than other video models?

It is usually priced at the premium end. Use the live table to compare against Kling, Veo and Seedance before committing.

Do I need a Runway API key?

No — a VideoRouter key is enough.

Guides

Using Runway is one part of the job.

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 →