Skip to content
Rapid Router
Switch from OpenRouter

Switch from OpenRouter in one line.

Change the base URL and the key. Your model ids, tools and streaming code stay as they are.
Token prices are the provider list price, the same as on OpenRouter. Read the docs
app.pythe URL and the key
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
base_url="https://rapidrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
api_key=os.environ["RAPIDROUTER_API_KEY"],
)
# everything else stays as it is
Every SDK

One URL and a key. The rest stays.

In every client the change is the same: the base URL, and the key it sends. Pick yours.
  • Base URL https://rapidrouter.ai/api/v1
  • A Rapid Router key, read from RAPIDROUTER_API_KEY
  • Model ids, messages, tools, streaming and the provider object unchanged
  • The Anthropic SDK takes https://rapidrouter.ai/api, without /v1

Run your test suite before you move production traffic: the response is the OpenAI shape on both sides, so a difference shows up there, not in front of a customer.

# pip install openai   (the HTTP client package; every request goes to Rapid Router)
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://rapidrouter.ai/api/v1",   # was https://openrouter.ai/api/v1
    api_key=os.environ["RAPIDROUTER_API_KEY"],  # was OPENROUTER_API_KEY
)
r = client.chat.completions.create(
    model="openai/gpt-5",
    messages=[{"role": "user", "content": "Hello"}],
)
print(r.choices[0].message.content)
Carries over

What maps 1:1. As you send it today.

Each of these is read by the gateway as an OpenRouter request writes it. The docs link on each row has the details.
Model ids
vendor/model

Most OpenRouter ids work as sent. A Claude id written with a dot is read as ours: anthropic/claude-sonnet-4.5 runs as anthropic/claude-sonnet-4-5. A short list of other OpenRouter names map to the same release here, such as deepseek/deepseek-chat to deepseek-ai/deepseek-v3.

Model catalog →
Provider routing
provider

All seven fields are read: order, only, ignore, allow_fallbacks, sort (price, throughput or latency, as a string or { by }), max_price (prompt and completion, in dollars per million tokens) and require_parameters.

Failover and routing →
Model suffixes
:free :floor :nitro :online

:floor sorts routes by price, :nitro by throughput, :online runs a web search first, and :free uses the free tier on models that offer it.

Failover and routing →
Streaming
stream: true

Server-sent events in the OpenAI chunk shape. The last chunk carries usage with its cost, without asking for it through stream_options.

Streaming →
Tool calling
tools tool_choice parallel_tool_calls

Passed to OpenAI-compatible providers as sent, and translated to Anthropic's tool format on Claude routes.

Tool calling →
JSON mode
response_format

json_object and json_schema. On Claude routes it runs as a forced tool call, so JSON mode works there too. The response-healing plugin repairs JSON that fails to parse.

Structured output →
PDF input
{ type: "file" }

The file content part, with file_data or file_url, on every chat model: Google and Anthropic models read the PDF itself, the others get its extracted text.

PDF, audio and video input →
Transforms and web search
transforms: ["middle-out"] plugins: [{ id: "web" }]

Middle-out drops messages from the middle of an over-long conversation so it fits the context window. The web plugin runs a search before the model answers; each search is billed.

Message transforms →
App attribution
HTTP-Referer X-Title

Recorded with every request. An app that sends both from a public domain, with at least 10 requests in 30 days, is listed on our Apps page.

App attribution →
Cost per request
usage.cost GET /generation?id=

Every chat completion names the provider that served it and carries usage.cost in dollars./generation returns total_cost and the token counts of a past request.

Model list
GET /models

pricing.prompt and pricing.completion as dollars per token, and context_length, next to our own per-million fields.

Models →
Works differently

What differs. Read this before you switch.

The honest list: fields we do not read, a smaller catalog, and where our rules are our own.
Fallback models
models route

Not read: send one model per request and drop both fields. When a provider fails, the request already moves to the next provider serving the same model. A preset can name backup models; the first one with a working route is used.

Presets →
Other provider fields
data_collection zdr quantizations

Dropped without effect. Zero data retention, and whether providers that may train on prompts can serve you, are account settings here, under Settings, Data & privacy, and apply to every request.

Provider names
order only ignore

Take the provider names on our Providers page. A name we do not route to matches nothing, so an only list made of those leaves no route and the request answers 503.

Catalog

600+ models, fewer than OpenRouter lists at the time of writing. An id with no same-version model here answers 404 model_not_found; we never swap in a neighbouring version. A model we do not carry can be asked for through support.

Model catalog →
Free tier
:free

Models that cost us nothing upstream are free to you: 50 requests a day per account, 1,000 a day once your paid usage reaches $10. Everything else, including older ids that end in :free, is billed at the provider price. :free on a model with no free route answers 400 model_not_free.

Free tier →
Fee

Tokens are billed at the provider list price, the same price per token as on OpenRouter. Our platform fee of 5% is charged once, when you buy credits, plus a 4% currency margin when you pay in rupees.

Pricing →
Your own provider keys

Work here too: add them in your dashboard. A request served on your key is billed 5% of what it would have cost on ours.

Bring your own keys →
Presets
@preset/slug preset

Read the same way, but a preset belongs to an account: create yours here before you switch.

Presets →
Balance
GET /credits

Answers in our own shape, balance_usd and the latest transactions, so a script that reads your balance needs its field names changed.

Errors

The body carries { "error": { "code", "message" } } with a word for the code, such as model_not_found, and the number on the HTTP status. The OpenAI SDKs raise them as usual.

Errors →
Plugins
plugins

web and response-healing only; any other plugin id answers 400.

Web search →

Where this page mentions OpenRouter, it reflects their public documentation at the time of writing; their product moves too, so check their site for the current state.

Why switch

Same tokens, same price. Paid in rupees.

Token prices here are the provider list prices, as they are on OpenRouter. What changes is how an Indian company pays for them.
Pay in rupees

Top up in rupees with UPI or a card.

A GST invoice on every top-up

Your GSTIN goes on the invoice, so a GST-registered company can claim the GST as input tax credit.

Prices in rupees

The catalog shows every model in rupees, so finance reads one currency.

A human in IST

Support from a person, in your timezone.

Change the URL, then run your tests.

Create a key, point one service at https://rapidrouter.ai/api/v1, and compare the answers. Every new account starts with a free daily allowance on eligible models, so the first requests cost nothing.

Questions

Common questions.

How do I switch from OpenRouter to Rapid Router?
Change the base URL from https://openrouter.ai/api/v1 to https://rapidrouter.ai/api/v1 and use a Rapid Router API key. The rest of the request stays as it is: vendor/model ids, messages, tools, streaming, JSON mode and the provider routing object are read here too.
Will my OpenRouter model ids work?
Most do, as sent. A Claude id written with a dot, such as anthropic/claude-sonnet-4.5, is read as ours (anthropic/claude-sonnet-4-5), and a short list of other OpenRouter names map to the same release here. An id with no same-version model here answers 404 model_not_found instead of running a different version, so look up each id you use in the catalog before you move production traffic.
Is Rapid Router cheaper than OpenRouter?
Not per token. Both charge the provider list price for tokens, so the model price is the same. Our platform fee of 5% is charged once, when you buy credits, not per request. For an Indian company the difference is paying in rupees with a GST invoice it can claim, not a lower token price. The side-by-side comparison has the fee arithmetic.
Can I pay in rupees?
Yes, every top-up is in rupees. Pay with UPI or a card, get a GST invoice on every recharge, and see prices in rupees across the catalog.
Does Rapid Router have a free tier?
Yes. A model whose provider charges us nothing for it is free to you too: 50 requests a day per account at no cost, raised to 1,000 a day once your paid usage reaches $10. We do not sponsor tokens, so every other model, including older ids that end in :free, is billed at the provider price shown in the catalog.
Can I move one service at a time?
Yes. The base URL and the key are set per client, so you can point one service or one environment at Rapid Router and leave the rest on OpenRouter until your tests pass.
Does the Anthropic SDK work?
Yes. Rapid Router also serves /v1/messages in the Anthropic format. Give the Anthropic SDK the base URL https://rapidrouter.ai/api, without /v1 because the SDK adds /v1/messages itself, and a Rapid Router key.

Row by row, with the fees: Rapid Router vs OpenRouter.

Every endpoint and field: the docs.