Methodology

What the numbers on this site mean, where they come from, and what they do not claim.

The unit

Every price is in US dollars per one million tokens. Providers quote input and output tokens separately, and many also quote cached-input, batch and regional rates. We store all of them. The single number shown by default is the blended price:

Blended price = (3 × input price + 1 × output price) ÷ 4, per million tokens. It approximates a typical chat or agent workload, where prompts are about three times longer than completions.

A model whose provider bills on input only (embeddings, rerankers) has no blended price rather than a half-computed one. Batch tiers and regional prices are kept as separate series and shown separately; the headline “cheapest” is always the non-batch, non-regional listing.

Canonical models

The same model is sold as llama-3.3-70b-instruct, Llama 3.3 70B and meta-llama/Llama-3.3-70B-Instruct-Turbo. A registry of canonical models with an alias table maps every provider’s spelling to one slug, which is what makes a cross-provider comparison possible at all. Names the registry cannot resolve are held back, not guessed. Where a provider lists several variants of one model (quantisations, context tiers), the cheapest is the one that counts and the number of variants folded is recorded.

Live collection

A scraper runs every day. Its first tier is OpenRouter’s public endpoints API, which lists per-provider pricing for hundreds of models in one call; direct adapters then cover the providers OpenRouter does not carry, including the frontier labs’ own rate cards and the major Chinese platforms. Every observation is validated before it is published: plausibility floors and ceilings by model class, a check that one number has not been applied to every model (the signature of a parse failure), input-versus-output ordering, and the size of the move against yesterday. Observations that fail are quarantined and never shown. A provider that does not report on a given day keeps yesterday’s price, labelled with its age.

What “current” means

Prices are stored as change points: a new row is written when a price moves, and a daily confirmation is written for providers the live scraper covers. A model’s current price at a provider is the newest row for that series. For a live-scraped provider that row is from today. For a provider known only from the historical backfill it can be older, and the provider table shows the date it was last confirmed instead of “Today”. A series whose newest row is a withdrawal is not shown at all.

Three years of history

History before the live scraper began was reconstructed from three archival sources: a widely used open-source price file with daily snapshots, a continuous-integration archive of OpenRouter’s own API, and Internet Archive captures of the same endpoint. Each source was collapsed to its change points independently, then cross-checked: for closed-weights labs the two main sources agree on roughly 95% of daily comparisons. They are deliberately not merged on open-weights models, where a rate card and a served price are different things.

Every backfilled change point carries its source, a one-sided date uncertainty (a third-party source records a change on or after the day it happened, never before) and a confidence grade. High is a daily, complete, API-derived capture. Medium is a sparse archive, a handover between sources, or a vendor rate card for a live model. Low is a rate card nothing else corroborates, a series whose start is not observed, or a suspected blip. Low does not mean probably wrong; it means do not assert the exact date without opening the source. A price that went A → B → A within a short window is flagged as a suspected blip and kept, because a correction and a short promotion look identical from outside.

What the history shows, and why we split it by source

The most-quoted finding from the backfill is that only a minority of (provider, model) pairs ever change price. That turns out to depend heavily on what the source measures. Series built from daily API captures of served prices repriced about four times as often as series built from published rate cards. Posted list prices really do sit still; the price you are actually charged by an inference host moves far more. Charts on this site say which they are drawing.

The price-move feed

A move is a change in the blended price of a (provider, model) series. Aggregators are excluded from the feed by default: OpenRouter’s listed price is the cheapest of whichever endpoints are routed that day, so most of its day-to-day changes are routing, not repricing. A day on which one provider lands four or more models on the identical new price is also hidden, because that is the signature of a rate-card parse error rather than a market event.

What this site does not do

It does not measure quality, latency or throughput, so it cannot tell you the cost of a useful token. It does not account for volume discounts, enterprise contracts or free tiers. It does not convert prices quoted in currencies other than dollars unless the source itself did. Prices are what a provider publishes; the only authority on what you will be charged is the provider.

Corrections

If a price here is wrong, tell us at info@tokendynamo.com with a link to the source. We would rather show nothing than show a placeholder, and we would rather fix a number than defend it.