How it works

One API for every AI video model

If you know OpenRouter for language models, Revana is the same idea for video and image generation: one API key, one request format and one prepaid balance for Seedance, Veo, Kling, Wan, Nano Banana Pro, GPT Image 2 and the rest of the catalogue, with automatic fallback when an upstream route fails.

The problem with calling each model directly

Every model maker runs its own API, with its own account, keys, request format, job status flow and billing. Building against three of them means three integrations to maintain, three balances to top up and three sets of error codes to handle. Some models are offered by several platforms at different prices, with different limits, and capacity that comes and goes.

The cost shows up when you want to try a new model, which in 2026 happens every few months. Each new model means another integration before you can even see whether it suits your product.

How Revana works

  1. One key. Sign up and create an API key in the dashboard. It works for every model in the catalogue.
  2. One request. Send POST /v1/generations with a model id and an input object. The field names are the same for every model: prompt, image_url, end_image_url, image_urls, resolution, duration, aspect_ratio and audio.
  3. A price before anything runs. The job's price comes from the catalogue and is held from your prepaid balance. A field or value the model does not support is rejected with a 422 before anything is charged. You can also set max_cost_usd as a ceiling.
  4. Routing. The router sends the job to the cheapest route for that model. If the route fails or times out, the job moves to the next one.
  5. One result format. Poll GET /v1/generations/{id}. When the status is succeeded, the files are in output.urls and the charge is in cost_usd. If the job fails, the hold is released.

Jobs are asynchronous: images usually take seconds, and video takes from under a minute to several minutes. The docs have the full field reference and error codes.

The same request on three models

Because the request format is shared, comparing models is a loop. This script sends one prompt to Seedance 2.0, Veo 3.1 Fast and Wan 3.0, then prints each result and its cost. Each model keeps its own options, so pick values all three accept; here that is 720p, 8 seconds and 16:9.

Python
import os
import time

import requests

API = "https://api.revana.si/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['REVANA_API_KEY']}"}

PROMPT = (
    "A paper boat sails down a rain-soaked street gutter at dusk, "
    "neon signs reflected in the water. Rain, distant traffic."
)
MODELS = ["seedance-2.0", "veo-3.1-fast", "wan-3.0"]

# Submit the same job to every model; each call returns 202 with an id.
jobs = {}
for model in MODELS:
    resp = requests.post(f"{API}/generations", headers=HEADERS, json={
        "model": model,
        "input": {
            "prompt": PROMPT,
            "resolution": "720p",
            "duration": 8,
            "aspect_ratio": "16:9",
            "audio": True,
        },
        "max_cost_usd": 1.5,
    })
    resp.raise_for_status()
    jobs[model] = resp.json()["id"]

# Poll each job until it finishes.
for model, job_id in jobs.items():
    while True:
        job = requests.get(f"{API}/generations/{job_id}", headers=HEADERS).json()
        if job["status"] in ("succeeded", "failed"):
            break
        time.sleep(5)
    if job["status"] == "succeeded":
        print(model, job["output"]["urls"][0], job["cost_usd"])
    else:
        print(model, "failed:", job["error"])

At October 2026 catalogue prices, the three jobs cost:

Price of the same request on three models
ModelRequestPrice
Seedance 2.0720p, 8 s, sound included in the rate$1.20
Veo 3.1 Fast720p, 8 s, with sound (priced separately)$0.80
Wan 3.0720p, 8 s, sound included in the rate$0.72

The max_cost_usd of 1.5 covers all three. A job that would cost more than its ceiling does not run.

Fallback across routes

A route is one source of upstream capacity for a model. Many models on Revana have more than one, and the router uses them in order:

  • Cheapest first. Each job goes to the lowest-cost route that accepts its options.
  • Next on failure. If that route fails or times out, the job moves to the next route automatically. The attempts field shows how many were tried.
  • Same model, same price. Every route serves the model you asked for, at the listed price. The router never swaps in a different model.
  • One charge. Only the route that succeeds is charged. If every route fails, the job ends as failed and costs nothing.
Route counts for some popular models
ModelKindRoutes
Seedance 2.5videofive routes
Seedance 2.0videothree routes
Kling 3.0videotwo routes
Veo 3.1 Fastvideotwo routes
Veo 3.1videoone route
Wan 3.0videothree routes
Nano Banana Proimageone route
GPT Image 2imageone route

A model with one route cannot fall back. Fallback raises the chance that a job completes, but it is not an uptime guarantee: handle failed jobs in your code, for example by retrying later or by switching to another model yourself.

Pricing and credits

Revana is pay as you go. There is no subscription, no seats and no monthly minimum: you buy prepaid credit in packs of $10, $50, $100, $500, $1,000 or $5,000 and spend it on any model at its listed price.

  • Most video models are priced per second of output, by resolution and, on some models, by whether sound is on.
  • Image models are priced per image, by size.
  • The price is held when you submit, charged when the job succeeds and released when it fails.

The pricing page lists every model's prices. Our guides show what common jobs cost on Seedance 2.0, Veo 3.1 and Kling 3.0.

Read the catalogue in code

The full catalogue is a public JSON file at https://revana.si/data/models.json. The main fields for each model:

Fields in models.json
FieldWhat it holds
idthe string to send as model
name, makerdisplay name and the company that makes the model
kindvideo or image
taskswhat the model accepts, such as text_to_video or image_to_video
optionsresolutions, aspect ratios, durations, sound and the input image limit
pricethe unit (per second, per image or per job) and the price for each option
routeshow many routes serve the model

For example, to list every model that can make a video from text:

Shell
# Every model that can make a video from a text prompt
curl -s https://revana.si/data/models.json \
  | jq -r '.models[] | select(any(.tasks[]; . == "text_to_video")) | .id'

Use it to build a model picker, check options before you submit, or estimate a job's price in your own interface. The same data drives the models page.

What to know before you switch

  • Options differ by model. The field names are shared, but each model accepts its own values. Kling 3.0, for example, lists no aspect ratio option. Check the model page before you change the model string.
  • Output links expire. Download finished files and keep them in your own storage.
  • The model is your choice. Routing changes where a job runs, never what model runs it. Falling back to a different model is a decision for your code.
  • Prices can change. The catalogue always shows current prices, and each job's price is fixed when you submit it.

Ready to try it? Get an API key, browse the models, or start with the quickstart.

Frequently asked questions

Is there one API for all AI video models?

Revana gives you one API key, one request format and one prepaid balance for the major video and image models, including Seedance, Veo, Kling, Wan, Hailuo, Grok Imagine, Nano Banana and GPT Image. Each model keeps its own options and price.

How is Revana like OpenRouter?

OpenRouter gives developers one API for many language models. Revana does the same for video and image generation models: one key, one balance, and routing across several sources of capacity for the same model.

What happens when an upstream route fails?

If the model has more than one route, the router moves the job to the next route at the same listed price. If every route fails, the job ends as failed and the held amount is released.

Will Revana switch to a different model if mine is unavailable?

No. The router changes the route, never the model. If you want to fall back to another model, do it in your code by sending a new request with a different model id.

How does billing work?

You buy prepaid credit in packs from $10 to $5,000, with no subscription. Each job is priced from the catalogue, held when you submit, and charged only if it succeeds.

How do I get the list of models and prices in code?

Fetch https://revana.si/data/models.json. It lists every model with its id, maker, tasks, options, prices and route count.

One key for the whole catalogue

Create a key, add prepaid credit and call any video or image model with the same request.