Token price index · reference implementation
A daily index over LLM inference pricing, built to the standard a cash-settled contract would demand: reproducible years later, defensible to a counterparty who lost money on it, and honest about the goods it cannot measure at all.
A withheld row is one the estimator could have produced and the gates refused. Open the dashboard to see every seller behind a number.
1 · the question
What did a million tokens of this model cost, from anyone who would sell them, today? Not what a buyer negotiated, and not what the market spent in aggregate — the price of one good, from the sellers offering that same good.
2 · the central decision
A benchmark measures price discovery, and discovery requires more than one seller of an identical good. Open-weight models qualify: the same weights are served by many independent providers competing on price. Proprietary frontier models do not, because each has exactly one.
This is a property of the good, not of the data: it is decided by the contract
and cannot be changed by collecting more prices. TIX-FRONTIER-OUT
is refused by a gate rather than by a shortage of inputs.
Its prices are still collected and kept. Every snapshot holds what GPT-6 Astra costs, and the tape carries a withheld row for it on every date, naming the gate that stopped it. Filtering it out at collection would be the easier design and a worse one: the refusal could then only be asserted. Keeping the inputs is what lets the dashboard show two sellers of one company's model, and lets anyone re-run the decision against the same prices.
3 · the waterfall
| tier | what it is | what it proves | weight |
|---|---|---|---|
| 1 · list | Published API rate card | Transactable today by anyone with a card | 1.00 |
| 2 · aggregated | Seen through a router | A price, but possibly with the router's margin in it | 0.60 |
| 3 · curated | Administrator's sourced entry | Someone checked it by hand on a date | 0.25 |
Note the difference from a compute-rental benchmark. There, a published rate card proves only that somebody published a number. Here the top tier is genuinely populated, because a token rate card is executable.
4 · restatement
| serving | factor | why |
|---|---|---|
| standard | 1.00 | the benchmark good |
| batch | 2.00 | published at 50% off by every major seller |
| cached | 10.00 | cache reads run near a tenth of standard input |
| priority | 0.50 | published at 2× by at least one seller |
Two of these are close to observable, which is unusual for an adjustment schedule. Anthropic publishes batch at 50% and cache reads at roughly a tenth of standard input; OpenAI publishes the same two ratios. A ratio published identically by two independent sellers is a market convention. A ratio applied identically across every SKU of one seller is that seller's discount policy and carries no information.
Cumulative adjustment is capped at 5.0×, which binds on the cache factor. Restating a cache read to standard multiplies by ten, so nine tenths of the resulting number would come from this schedule rather than from the seller. That is not an observation about standard pricing; it is the schedule talking, and it is discarded. Batch at 2× survives, because half the number is still the seller's.
An earlier draft set that ceiling at 10.5×, which no combination of factors could reach — serving is a single enum, and the context factor that then existed only reduced. A ceiling nothing can touch is not a control. A test caught it.
Context is a fitness test, not a factor. The window a seller quotes is what its one flat rate covers, not a premium tier; a 128k request is served at that rate, so nothing is restated. A window short of the contract cannot serve the request at all — a different good, not a cheaper one — and is discarded. An earlier draft multiplied every quote by 0.80 or 0.65 by window size, and every published value came out a third below what any seller charged. The sensitivity measure below found it on its first run.
5 · estimation
Input and output never blend. They are priced differently by every seller and consumed in different ratios, so any blend depends on a ratio nobody can observe.
Each provider collapses to a single median first. Serving forty models buys no more influence than serving one.
Median absolute deviation × 1.4826, which has a 50% breakdown point — not standard deviation, which has none, because the outlier inflates the very yardstick measuring it.
If every honest seller agrees exactly there is no scale left, so the screen falls back to a symmetric ratio band. A percentage test caps at 100% on the downside and could never catch a near-zero price.
Published to four decimal places, summed in a fixed order. Floating-point addition is not associative, so an unrounded mean can differ in its last bit between two runs over the same market. A property test found it.
A gap in a series is a fact about the market. An interpolated value is a fiction about it.
6 · gates
| gate | threshold | and the objection to it |
|---|---|---|
| indexable good | required | A property of the good. Not arguable, which is why it is first. |
| min providers | 3 | The load-bearing one. A compute benchmark uses four. At four, nothing here prints at all. |
| min observations | 3 | Follows from the provider floor in a market where each seller lists once. |
| max dispersion | 0.60 | Looser than a compute benchmark's 0.45 — and currently idle. Both published fixings sit at 0.185 and 0.312. |
| max seller weight | 50% | Also idle. Three equal-tier sellers is 33% each. |
Two of the five gates are doing nothing today, and one is doing everything. That is worth stating rather than hiding: the only reason this index prints at all is a provider floor of three, and three is roughly the maximum this market currently offers. The index is waiting for the market, not the other way round.
end to end
Every step that leaves the main line is a place an input is thrown away. Most of the work in a benchmark is deciding what does not count, and every decision below is recorded, so any published value can be recomputed from the snapshot it names.
The same journey in types. Each box is a frozen dataclass and each label under it is the function that produces the next one.
7 · stated plainly
A methodology that only lists strengths is a marketing document.
The series is days long, not months. Each date is priced from its own snapshot and the line breaks on a withheld day rather than bridging it — but no time-dependent check has enough history to judge against yet, so staleness, dropout and level-shift all report not_evaluable rather than passing on nothing.
Every input is a published rate card. Nobody here observes what anyone paid, and enterprise inference is negotiated and invisible. This measures the retail tail.
Price per token falls while capability rises. A token is treated as a token, so a falling series cannot distinguish cheaper inference from better models. That is the hedonic problem official statisticians solve for computer prices — and here it may be the dominant term.
Two sellers listing the same model may serve different quantisations, context limits or throughput. The contract pins the weights; it does not pin what you actually get.
Collection is live, but every observation arrives through OpenRouter. Thirty-seven sellers behind one source is thirty-seven sellers and one point of failure: if it changed schema or went away, the seller count would keep reporting thirty-seven right up until it reported none. That is why collected prices sit at the aggregated tier rather than the list tier.
Unlike the compute benchmark's contributor-shift check — measured from 403 observations — nothing here is calibrated, because a tape a few days long supports no calibration. The checks exist and report not_evaluable rather than passing quietly.