Guides / openrouter bill spike
Why an OpenRouter bill spikes when your code didn't change
An OpenRouter bill spike on flat traffic usually means a different upstream provider served your calls. The same model lists against several providers whose rates differ by about 10%, and routing follows availability rather than your intent. Culpa, a local-first LLM cost, margin, and forecast ledger, prices each call by the route that served it, so a rate change shows up as a named cause.
Why this happens
This one has a signature that separates it from every other cost increase, and the signature is the ratio. A prompt change moves tokens per call. A model upgrade moves the rate and usually the tokens too. An upstream route change moves the rate alone, by the exact percentage that separates two listed providers, while tokens per call stay identical to the decimal. So the question isn't how much the bill rose. It's whether the tokens moved with it, and if they didn't, the route is the only remaining explanation.
What this usually looks like
- Cost per call rose by a clean single-digit percentage with tokens per call unchanged.
- No deploy went out anywhere near the day the step happened.
- The increase applies across every feature using the routed model at once, rather than to one of them.
- Nobody can name which upstream provider is serving your traffic, before or after.
Free, no card, no account
Run the free Cost Leak Scan
It shows your most expensive conversation before you install anything.
Mistakes that cost the most
| Mistake | Why it hurts | Do instead |
|---|---|---|
| Hunting for a prompt change when tokens per call never moved. | You spend days bisecting deploys for a cause that was never in your repository. | Check tokens per call first. Flat tokens with a higher rate rules the prompt out immediately. |
| Recording only the model on a routed call. | The model is identical either side of the change, so your own records can't tell the two apart. | Record the upstream provider alongside the model. Without it this incident has no evidence. |
| Accepting the new rate because the difference looks small. | A few percent on your highest-volume path compounds every month it goes unexamined. | Pin the provider you priced against, and treat an unpinned route as a floating cost you accepted. |
Run this check tonight
- Chart cost per call and tokens per call on the same axis for 60 days. Look for one moving alone.
- Divide the new cost per call by the old one. A clean ratio near a listed premium names the cause.
- Check your call records for an upstream provider field. If it doesn't exist, add it before the next incident.
- List every provider serving your routed model and note the spread between cheapest and dearest.
- Decide whether to pin, then reprice the month at the provider you pinned to confirm the fix landed.
Two months, identical traffic, one changed ratio
Illustrative example
300,000 calls a month on Claude Opus 4.7 through OpenRouter, each sending a 5,000-token repeated prompt at an 80% cache hit rate and returning 400 tokens. OpenRouter lists this model at $5.00, $25.00 and $0.50 on most upstream providers and at $5.50, $27.50 and $0.55 on others. Volumes are modelled.
A clean 1.10 against flat tokens is a fingerprint, not a coincidence. It points at the upstream provider and rules out every change your team could have shipped.
Every number, with its confidence and source
| Figure | What it means | Confidence | Source |
|---|---|---|---|
| $0.0170 to $0.0187 | modelled cost per call before and after an upstream route change, on identical traffic | estimated | Both endpoints from the teardown arithmetic at rates read from OpenRouter's Claude Opus 4.7 page on 2026-08-01. A range because call volume and cache hit rate are modelled. |
| 10% | listed premium between upstream providers serving Claude Opus 4.7 on OpenRouter | calculated | $5.50 against $5.00 input and $27.50 against $25.00 output, read from OpenRouter's Claude Opus 4.7 model page on 2026-08-01. |
What a generic answer can’t know
The aggregator knows which upstream served each call and reports you a total. Joining that to your own tokens per call, per feature, across the day the step happened is what turns a bill into a cause. Culpa holds both on your infrastructure, keeps your prompts and responses there, and counts the calls to run your plan.
Questions founders ask next
Why did my OpenRouter bill rise with no code change?
Most often because a different upstream provider served your calls. The same model lists against several providers whose rates differ by about 10%, and routing follows availability unless you pin one explicitly.
How do I tell a route change from a prompt change?
Look at tokens per call. A prompt change moves them. A route change leaves them identical and moves only the rate, so the ratio between your old and new cost per call lands on a clean number matching the listed premium.
Does OpenRouter drop the cached rate?
No, and an earlier version of this page said otherwise. The Anthropic re-listings pass the cached read through at the direct rate, $0.50 per million on Opus 4.7, read from OpenRouter's own model page on 2026-08-01. Culpa's price book records no cached rate for those rows, which is a gap in the book rather than a fact about the platform.
On your infrastructure
Culpa runs on your infrastructure. Your prompts and responses never leave it. Culpa counts calls to run your plan, and it fails open, so if it ever breaks your app keeps running.
How Culpa works
Find the culprit. Not just the total.
Your dashboard shows what you spent. It stops short of who spent it. Culpa shows the conversation, the user and the feature behind it.
Your prompts stay local.
Culpa runs on your own infrastructure. What you send to a model reaches us at no point.
Every dollar has a name.
Follow any charge to the conversation, the user, the feature and the customer behind it.
See the bill before it lands.
Cost your next feature before you ship it. You get the likely bill and the worst case, at best, median, p90 and p99.
Three steps to your first answer.
Change one base URL.
Or drop in the Python or TypeScript library.
Find your most expensive conversation.
In the first session, not the first week.
Cost your next feature before you ship it.
Why the bill went up
Example dashboardCalls traced
418,209
across 3 projects
Spend this week
$378.41
+ $182 vs last week
Failed calls
312
74% retried, and you paid for all of them
+ $182 this week traced to one culprit
Spend over 14 days
Most expensive users
Next week forecast
Graded against reality. Accuracy shown as results land.
Free, no card, no account
Run the free Cost Leak Scan
It shows your most expensive conversation before you install anything.
Keep reading
Sources: OpenRouter models, Anthropic pricing. Last reviewed 2026-08-01. Plain text version.