tokidx

Token price index · reference implementation

Anyone can average prices. A benchmark decides which goods have one.

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.

Daily fixing

loading…
reading the tape…

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 is being measured

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

Which goods can carry an index, and which cannot

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

Rank inputs by what they prove

tierwhat it iswhat it provesweight
1 · listPublished API rate cardTransactable today by anyone with a card1.00
2 · aggregatedSeen through a routerA price, but possibly with the router's margin in it0.60
3 · curatedAdministrator's sourced entrySomeone checked it by hand on a date0.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

Everything is expressed as the standard contract, or discarded

servingfactorwhy
standard1.00the benchmark good
batch2.00published at 50% off by every major seller
cached10.00cache reads run near a tenth of standard input
priority0.50published 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

What the estimator does, and why

One good per index

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.

One seller, one vote

Each provider collapses to a single median first. Serving forty models buys no more influence than serving one.

Screen robustly

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.

Where MAD goes to zero

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.

A stated precision

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.

Withholding is an outcome

A gap in a series is a fact about the market. An interpolated value is a fiction about it.

6 · gates

Every one must hold

gatethresholdand the objection to it
indexable goodrequiredA property of the good. Not arguable, which is why it is first.
min providers3The load-bearing one. A compute benchmark uses four. At four, nothing here prints at all.
min observations3Follows from the provider floor in a market where each seller lists once.
max dispersion0.60Looser than a compute benchmark's 0.45 — and currently idle. Both published fixings sit at 0.185 and 0.312.
max seller weight50%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

How a listing becomes a fixing

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.

01

Admit the good

  • Proprietary weights: one seller, so no market to measure→ refused by construction
  • Open weights: 1 venue, 37 sellers, produce a raw observation
  • Written first to a dated, immutable snapshot
02

Admit the quote

  • Matches no contract→ discarded, with a reason
  • Wrong direction or region→ discarded, with a reason
03

Restate

  • Restate to standard serving: batch 2.00, cached 10.00, priority 0.50
  • Over 5× cumulative adjustment: the schedule would be talking, not the seller→ discarded
  • Normalised quote
04

Aggregate

  • Collapse to seller medians
  • Outside 3 robust sigma of the panel→ screened, and recorded
  • Tier weights, any one seller capped at 50%
05

Estimate

  • Weighted mean, rounded to 4 dp
  • A majority of sellers quoting one identical price: a seller count overstates independence→ flagged
06

Gate

  • Every gate holds→ published
  • Any gate fails→ withheld, failing gate recorded
  • Both outcomes go to the bitemporal store, append-only: revision, as-of, snapshot
stays on the main line thrown away, reason recorded held or flagged, still on the record

The same journey in types. Each box is a frozen dataclass and each label under it is the function that produces the next one.

  1. Observationwhat a seller listed
  2. dated snapshotwritten before anything is computednormalize
  3. Quoterestated onto the benchmark goodestimator
  4. Rejectionand why it did not count
  5. ProviderPointone vote per seller, weight + screen verdict
  6. Fixingvalue, every GateResult, every Flag; then the append-only tape

7 · stated plainly

What this cannot do

A methodology that only lists strengths is a marketing document.

A short tape

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.

No transaction data

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.

No quality adjustment, and this is the deep one

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.

Model identity is assumed

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.

One venue

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.

Thresholds are judgement

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.