Data product
A keyless JSON API and a CLI
Everything this archive derives is served as flat JSON from the same GitHub Pages deployment as the site. No key, no signup, no rate limit, no server. Every record carries the permalink of the raw artifact it was derived from, at the full sha of the commit that changed it, so any number here can be checked against the bytes it came from without asking us anything.
Start here
index.json is a machine-readable directory of every other file, including the literal list of which micro-categories and which labs exist. That list is what lets a client tell "this lab has nothing in the archive" from "the deploy is broken", which are otherwise the same 404.
The endpoints
A model's {slug} is the same slug its thread page uses, and every row of models.json carries it along with the absolute URL of its own endpoint, so nothing has to be constructed by hand.
Examples that run as written
Every model whose listed prompt price changed, newest first:
The catalog context_length beside the top_provider value on the same two sides, which is the pair that shows routing churn without anybody asserting a cause:
Everything the archive holds on one model, with the artifact behind each row:
The leaks desk, confirmed-artifact tier only:
The accuracy ledger's single number:
The CLI
One file, no dependencies, nothing to install. It reads the same static files the examples above do.
Every command takes --json to print the records instead of a table, and --api <base> to read from a local mirror of the API instead of the network. llmcat help lists the rest.
The query this exists for
Which of the models I depend on have a retirement floor inside my planning horizon, and what the provider's own document recommends instead. One command:
The names are the provider's own API model names, because that is the namespace the retirement dates are published in. They are not OpenRouter catalog ids and this archive does not join the two: anthropic/claude-opus-4.1 and claude-opus-4-1-20250805 are different strings issued by different parties, and deciding they name the same model is a judgement nothing here makes on a reader's behalf. Pass a catalog id and the command says so rather than guessing.
What is unique, what is merely accessible, and what is a commodity
- UniqueThe arena codename map, the upstream pull-request leak feed, the documentation differ across nine providers, and the join of all of them to catalog and lifecycle state in one surface. Published by nobody else, in this form, that we could find.
- Better because it is reachablePrice history, lifecycle events and catalog history. These exist elsewhere and the incumbents are good. The claim here is shape, not accuracy and not price, and it is narrower than it used to be: an earlier version of this sentence said one of them had "no API at all", which was wrong. pricepertoken.com serves a keyless
/_payload.jsoncarrying its pricing data and model changelog, so price history there is reachable, just undocumented and shaped for its own front end. llmstatus.ai redirects/rss.xmlto a sign-in page. models.dev publishes current state, with its history existing solely as a diff over thousands of sync commits. What is different here is that every value is addressed by commit and linked to the bytes it came from. - Free commodityThe current model list, current prices, current context windows and current deprecation status. Several people serve this and it costs nothing to serve. It is the front door, not the product, and it is deliberately narrow: this archive tracks one catalogue and a handful of vendor documentation indexes, so its model list is a few hundred rows where models.dev publishes several thousand across two hundred providers. If a current list of everything is what you want, that is the better source and it is free.
Rules a consumer should know before parsing
A timestamp is an object, never a bare string: {"value": "...", "field": "origin_date"} or "field": "observed_at". origin_date is when the provider generated the bytes, observed_at is when this collector saw them. They are not interchangeable and neither is silently substituted for the other.
precision_seconds is the measured worst-case first-seen error for that source, taken from the largest gap between consecutive accepted captures of it. It is null when unbounded, meaning the archive holds fewer than two captures. Null is not zero error.
first_seen_in_catalog_at is a day or it is null, and it is null wherever precision_seconds is wider than a day. Under the values this archive measures today that is every source, so the field publishes null rather than a date it has not earned. That is the rule working, not the API failing.
Every sentence names an artifact as its subject. No record here says why a value changed, and none should be re-published as if it did.
Terms
Free. No key, no signup, no rate limit imposed by this project, and GitHub Pages sends access-control-allow-origin: * so it works from a browser. Mirror it if you depend on it: wget -r over the directory in index.json takes the whole thing.