The hidden tax on reasoning models: why your o3 bill is 5x the sticker price
The pricing page said $2 per million input tokens, $8 per million output tokens — cheap, competitive, a good deal versus last year. Then the invoice landed at five times what that math predicted. Nothing was wrong with the pricing page. It just never showed you the tokens you were about to pay for.
The tokens you never see
Reasoning models — OpenAI's o-series, Anthropic's extended thinking mode, and their peers — generate an internal chain of thought before producing the answer you actually read. That internal reasoning is real model output. It consumes compute, it consumes tokens, and every provider bills it as output tokens at the standard output rate. The difference is that it's invisible in the response you see: you get the polished final answer, not the scratch work that produced it.
This is by design, and often for good reason — showing raw chain-of-thought to end users is rarely useful and sometimes actively confusing. But it means the token count in your response object systematically understates what you were billed for, and most teams don't discover the gap until they reconcile the invoice against their own request logs.
The math that catches teams off guard
A representative coding task: 1,000 input tokens describing the problem, 5,000 hidden reasoning tokens the model uses to work through the logic, and a 500-token visible answer. Total billed output: 5,500 tokens — eleven times the length of what you actually read. Run the same task through a non-reasoning model and you might get a 500-token answer with no hidden layer at all. Same visible result, roughly 4-5x difference in real cost, entirely explained by tokens neither the user nor, often, the developer ever inspects directly.
As a budgeting rule of thumb, plan on a 3-5x multiplier over the visible-output token count for typical reasoning tasks — and treat that as a floor, not a ceiling. More reasoning-intensive tasks, or models configured for higher "thinking effort," have been reported at 5-30x depending on task complexity and the specific reasoning budget configured.
Why this breaks your existing cost model
Most cost dashboards built for non-reasoning models estimate spend from prompt length and expected response length — a reasonable approximation when output tokens map roughly to what the user sees. Reasoning models break that mapping entirely. Two requests with identical prompts and identical visible answers can differ in cost by an order of magnitude, purely based on how much internal deliberation the model decided the task warranted on that particular call.
This also means reasoning-token spend is much harder to predict per request than it is to observe after the fact. The model, not your code, decides how much it reasons — which is exactly why after-the-fact, per-call cost tracking matters more for reasoning models than for almost any other model category.
Not every task needs to think this hard
The other side of the coin: a large share of production traffic routed to reasoning models doesn't actually need the reasoning. Classification, short extraction, templated responses, and simple lookups rarely benefit from an extended internal deliberation step — they benefit from a fast, cheap, non-reasoning model doing the same job for a fraction of the cost and the latency. The teams paying the highest reasoning-token tax are frequently the ones who adopted a reasoning model as the new default for everything, rather than reserving it for tasks that measurably need multi-step logical work: complex debugging, multi-constraint planning, nuanced analysis.
How to keep reasoning costs in check
- Classify before you route. Send a task to a reasoning model only when the task genuinely benefits from extended deliberation. Everything else goes to a standard model at a fraction of the cost.
- Track the reasoning-to-visible-output ratio explicitly. Most provider APIs expose a reasoning token count separately from the visible output count. Monitor that ratio per feature — a rising ratio on stable tasks is a signal something changed upstream, not just a cost to absorb.
- Set a reasoning effort ceiling where the API allows it. Several reasoning APIs let you cap how much internal deliberation budget a call can use. Set it deliberately per use case rather than leaving it at a provider default tuned for maximum capability.
- Budget in multiples, not per-token rates. When estimating a new reasoning-model feature, multiply your expected visible-output cost by 3-5x before presenting a number to finance. It will be closer to the real invoice than the sticker-price math.
- Alert on per-call cost outliers, not just daily totals. A single call that reasoned far longer than its peers for a similar task is the cheapest place to catch a cost problem — before it repeats a thousand times.
The bottom line
Reasoning models are genuinely more capable for the tasks that need multi-step logical work, and the per-token price cuts of the last year are real. But "per-token" was never the right unit to budget in for this model category — "per-task, including what you can't see" is. Until you can measure that number directly, every estimate you give finance is a guess with a 3-10x error bar built in.
See the tokens your reasoning models actually bill
AIntOps separates visible output from hidden reasoning cost, per feature — so your estimates match your invoice.
Request Early Access →