OpenRouter alternative: when a gateway is cheaper
OpenRouter is the default answer for "one key, many models". It is good at breadth. It is not always the cheapest per token, and the difference compounds if you push real volume.
What each is optimised for
| OpenRouter | Pay-as-you-go gateway | |
|---|---|---|
| Model breadth | Very large | Large, incl. Chinese models |
| Pricing model | Provider price + platform fee | Flat volume rate |
| Frontier model cost | Close to list | 50% of list for Claude (verified) |
| Minimum top-up | Low | $1 |
| Failover routing | Built in | Varies |
Where the gap shows up
Take Claude Sonnet 5 at 200M input and 20M output a month:
- At list price: $400 + $200 = $600 / month
- At the volume rate: $200 + $100 = $300 / month
That is $3,600 a year on one model. Run your own volume through the calculator.
The same comparison on other models
| Model | Gateway rate in / out per 1M tokens | Official list in / out per 1M tokens | Diff |
|---|---|---|---|
| claude-sonnet-5 | $1 / $5 | $2 / $10 | 50% |
| gpt-5.6-terra | $1 / $6 | $2 / $12 | 50% |
| deepseek-v4-pro | $0.66 / $1.98 | — / — | — |
| kimi-k3 | $1.5 / $7.5 | — / — | — |
Rates checked 2026-11-02. Gateway rates move with upstream promotions, verify the current number in your dashboard before committing to a budget.
The saving is largest on US frontier models. For models that are already cheap at list (most of the Chinese labs) the reason to route through a gateway is consolidated billing and access rather than a discount. Do not assume one number applies to your whole stack.
Can you use both?
Yes, and many teams should. Keep OpenRouter for breadth and fallback, route your high-volume frontier traffic through the cheaper endpoint. Both are just a base_url away — see the SDK guide.
When this is the wrong move
Choosing on price alone is the mistake here. These are the cases where breadth beats rate.
| Situation | Why it breaks | Do this instead |
|---|---|---|
| You need a long-tail model nobody else carries | Breadth is the entire value of a router. A narrower route cannot substitute for coverage you actually use. | Keep the router for the tail and move only your high-volume models. |
| You need one integration across many providers | A single gateway is one upstream relationship, not a marketplace of them. | Use the router as the abstraction layer and the cheaper route for the models that dominate spend. |
| You want per-provider failover without writing it | Automatic routing across hosts is a router feature; a single endpoint has nowhere to fall back to. | Keep the router, or implement the fallback yourself against two routes. |
| You are comparing headline rates across the whole catalogue | Coverage and rate are different products; a global 'cheaper' claim is meaningless per model. | Compare on the specific model IDs that dominate your bill. |
What actually goes over the wire
Every OpenAI-compatible call is an HTTP POST to a base URL plus a resource path, with two things that decide everything else: the path, and the bearer token.
POST /v1/chat/completions HTTP/1.1
Host: aicomp.ai
Authorization: Bearer sk-...
Content-Type: application/json
{"model": "gpt-5.6-luna",
"messages": [{"role": "user", "content": "..."}],
"stream": true}
Read that literally, because three separate failure modes hide in it. The
Host comes from your base URL, if the request arrives somewhere unexpected, this
is the line that was wrong. The Authorization header is the only thing identifying
you, so a shared key means indistinguishable spend. And the model value inside the
body is not validated against anything client-side: send an ID the server does not serve and you
get a server-side error, not a client-side warning.
Nothing else in the request is provider-specific. The message array, the tool schemas, the
stream flag and the response shape are the wire format, and they are what makes one
base URL substitutable for another. This is also the reason the change is reversible: you are not
recompiling anything, you are editing one string.
FAQ
Is there a cheaper alternative to OpenRouter?
For high-volume frontier traffic, usually yes — a volume-rate gateway charges a flat per-token rate instead of provider price plus a platform fee. For breadth across niche providers, OpenRouter remains hard to beat. Many teams run both.
How much can I actually save?
It depends entirely on which models you use. The gap is largest on US frontier models and small or nonexistent on models already priced at list. Compare the specific models you call rather than trusting a single headline percentage.
Do I have to choose one?
No. Both are OpenAI-compatible, so pointing part of your traffic at each is a base URL decision you can make per service or even per request class. That is the lowest-risk way to test the difference on real traffic.
What do I give up by leaving OpenRouter?
Mainly automatic failover across providers and the breadth of its catalogue. If you depend on either, keep OpenRouter as your fallback and route only your high-volume models through the cheaper endpoint.
How do I test this without migrating everything?
Send a sample of real production prompts through both and compare cost per completed task, not cost per token. A model that needs fewer tokens to finish the same job can be cheaper even at a higher rate.
What is the difference between OpenRouter and a single-vendor gateway?
Breadth versus rate. OpenRouter's value is catalogue size (one integration reaching hundreds of models across dozens of hosts), which matters if you need a long tail you cannot get elsewhere. A single gateway negotiating one upstream route can quote a lower per-token rate on the models it does carry, because it is not splitting margin with a host in the middle. The practical split: keep the broad router for coverage, route your high-volume models through whichever quotes the better rate on those specific models.
Is OpenRouter cheaper than going direct to the vendor?
Sometimes, and the answer is per-model rather than global. OpenRouter charges the underlying host's rate, occasionally with a small platform fee, so on some models it is at or below list and on others it is above. Direct is the baseline you should compare against, check the specific model you actually use rather than assuming either direction.