Home › Guides › Gen-4.5 API guide

Calling Runway Gen-4.5 from code

Updated 2026-10-02

Runway Gen-4.5 is reachable through VideoRouter's standard video endpoint under the model id runway/gen-4.5. You do not need a Runway developer account; a VideoRouter key is enough. This guide covers the request shapes, what to expect from the hosts that serve it, and how to evaluate it against other models using identical code.

Text-to-video

Video generation is an asynchronous job. You create it with POST /videos, then poll GET /videos/{id} through queued, in_progress and finally completed or failed. Polling is free.

import requests, time

BASE = "https://videorouter.sh/api/v1"
H = {"Authorization": "Bearer llmr_sk_live_...", "Content-Type": "application/json"}

job = requests.post(f"{BASE}/videos", headers=H, json={
    "model": "runway/gen-4.5",
    "prompt": "a lighthouse in a storm, waves breaking over the rocks, slow aerial orbit",
    "duration_secs": 5,
    "aspect_ratio": "16:9",
}).json()

while True:
    j = requests.get(f"{BASE}/videos/{job['id']}", headers=H).json()
    if j["status"] in ("completed", "failed"):
        break
    time.sleep(5)
print(j)

Image-to-video

Add start_image_url, either a public https:// URL or an inline data:image/...;base64,... URI. The rest of the request is unchanged:

job = requests.post(f"{BASE}/videos", headers=H, json={
    "model": "runway/gen-4.5",
    "prompt": "the camera pushes in slowly as the character turns toward us",
    "start_image_url": "https://example.com/frame.jpg",
    "duration_secs": 5,
}).json()

For image-to-video, keep the prompt about motion and camera, not about re-describing the image. The same advice applies to every model on the platform.

Duration: expect snapping

duration_secs is snapped to the nearest value the model actually supports. The host that serves a given request can restrict this further; VideoRouter's documentation shows the Replicate-hosted row as taking 5 or 10 seconds, so a request for 7 snaps to one of those. Billing happens once at creation from the snapped duration, so look at what the job returns before you assume what you will be charged for. Do not re-submit a slow job: polling is free, a second submission is a second charge. A job that fails upstream is not billed.

Hosts, pinning and failover

Gen-4.5 is hosted by only a small number of providers, far fewer than models like Seedance or Kling. That has two consequences:

No matching models in the live catalog right now.

To pin a host, append its slug to the id as runway/gen-4.5/<host>. Look up the host slugs on the model page. The platform also adds a 2% fee on image and video usage.

Pitfalls

Comparing Gen-4.5 with other models using identical code

Because everything goes through the same endpoint, a comparison is a loop over model ids on the same prompt set:

for model in ["runway/gen-4.5", "bytedance/seedance-2.0-fast", "google/veo-3.1-fast"]:
    r = requests.post(f"{BASE}/videos", headers=H, json={
        "model": model, "prompt": PROMPT, "duration_secs": 5,
    })
    print(model, r.json().get("id"))

Do this honestly: use the same duration and aspect ratio, keep every output, and judge against criteria you wrote down before you looked. Check each model's page first; supported durations and resolutions differ, and a model that snaps your 5 seconds to something else is not billed the same. The decision framework walks through the selection criteria.

Prompt and input tips for Gen-4.5

Start simple. A single subject, a single action and one camera instruction give you a baseline you can reason about; add detail one element at a time. For image-to-video, the frame you supply dominates the result, so choose a sharp, well-composed image at the aspect ratio you plan to request. If the output does not match the ratio you asked for, remember that an unsupported combination is ignored rather than rejected. Keep a log of the request body next to each job id, because reproducing a good result later depends on knowing exactly what you sent.

For production use, wrap the create and poll calls in a function with a timeout, store the job id before you start polling, and resume polling after a restart instead of creating a new job. Since billing happens at creation, a crash-and-retry loop that re-submits is the most expensive bug you can ship here.

Next steps

Read the quickstart for the basic request, or create a key and run the snippets above. See the pricing page for the Runway rows in the live catalog.

Frequently asked questions

What is the model id for Runway Gen-4.5?

It is runway/gen-4.5. Append a host slug to pin it, for example runway/gen-4.5/<host>; the model page lists the hosts.

Does Gen-4.5 support image-to-video?

Yes. Add start_image_url with a public URL or a base64 data URI to the same request you use for text-to-video.

Do I need a Runway account to call it?

No. A VideoRouter API key is enough, and usage draws from a single prepaid balance.

Why is there little price difference between hosts for Gen-4.5?

Only a small number of providers host it, so there is less room for spread than on models sold by many hosts. The live table shows the current gap.

Keep reading

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 →