OpenRouter has no history, so I keep one
The catalog is a now-machine. Prices move, endpoints vanish, and last Tuesday is gone. ORCA is the ledger I built because I got tired of refreshing.
The catalog at OpenRouter is a now-machine. Prices move. Endpoints appear, then don't. A model you picked last Tuesday is served this morning by a different provider, with a different context window and a data policy you didn't agree to. None of that is a feed. You hit /api/v1/models and the previous hour is gone.
I got tired of that, in the usual way: I built a ledger.
ORCA — OpenRouter Capability Analysis, yes I know — crawls the catalog on a schedule, archives each result, and derives a field-level change history from the diffs. The point is not a prettier table. The point is time.

The grid. Dense on purpose. If you work with OpenRouter professionally you already think in this shape.
What it actually is
Four surfaces, one archive:
| Surface | What you see | Why it exists |
|---|---|---|
| Endpoints grid | The live catalog, one row per endpoint | Models are a grouping. The thing that serves your request is the endpoint. |
| Monitor | Field-level diffs between crawls | So a 57% price drop isn't something you notice in a screenshot three days later. |
| Discord alerts | The same feed, filtered to the model ids you care about | For people who live in a channel, not a tab. |
| API preview | JSON of the curated view | For scripts. Not a photocopy of upstream. |
There's a pricing-history chart too, currently behind a flag, because I haven't decided whether a spaghetti plot of thirty providers is a product or a cry for help.

Monitor, mid-afternoon, catching GLM 5.2 falling over at Novita. This is the sort of thing that happens while you're in a meeting.
Who it's for
The person who already knows what a reasoning token is, and will paste moonshotai/kimi-k2.7-code into a config without asking what the marketing name is. I didn't simplify anything. The grid has a UUID column. I'm not sorry.
A few things the public OpenRouter API doesn't hand you, which we do:
- long-context pricing tiers
- data retention / training / publish flags, per endpoint
- hidden usage limits
- completions vs chat-completions support
- provider ids with their variant tags (
novita/fp8,xai/zdr) - reasoning, caching, and web-search configuration
That's the whole pitch, really. Compare endpoints, not slideshows of models.

OpenRouter later moved their display labels from "Prompt" to "Input" after we had already done that. Commonly understood terms keep moving. Align on what users say now, not on a frozen upstream label.
That's from my own pricing notes — a document that exists because Discord embeds are about 300 pixels wide and text_cache_read does not fit in 300 pixels. Naming is the work. The crawl is the easy bit.
Live at orca.orb.town. The preview API is:
GET https://orca.orb.town/api/preview/v2/models
The schema will move. That's the deal with a preview. If you want the thing that doesn't move, that's the archive — and how the diffs get made.