Products we run

AI Rating API

Which model should this workload use today? Three public sources — a catalog, a quality index, and a human-preference arena — reconciled every morning into ranked, price-tiered lists, served as a versioned JSON API and a dashboard.

The AI Model Rankings dashboard: text models ranked by capability score within price tiers, updated daily.

The itch

Every project that calls a model embeds a stale opinion about which model is best.

We kept hardcoding model choices into our own systems, and the choices kept going stale — the model landscape turns over monthly, opinions about it turn over slower. So we made the opinion data: rebuilt daily, reconciled from sources that measure different things, and served behind a stable API our own projects can ask instead of hardcode. Model identifiers in the responses are OpenRouter-compatible, so the answer can be routed with directly.

What we built

One question in, one defensible answer out.

A single endpoint answers the real question: the best text or vision models in my price range, today. Ask for a category and a tier and you get the top ten, each with its capability score, prices, context window, and which sources vouched for it. A health endpoint states exactly how fresh the data is and which sources succeeded; the contract is versioned under /v1 and published as an OpenAPI spec. The dashboard is the same data made readable — server-rendered, no framework, fast.

The AI model rankings dashboard on a phone: text models ranked within price tiers.
the dashboard, readable on a phone

How it works

Three sources, three axes: what exists and costs what, how capable it is, and what humans prefer.

OpenRouter the catalog: models, prices, identities Artificial Analysis the quality signal (intelligence index) LM Arena human preference — tiebreaks only The daily rebuild one run, every morning at 06:00 UTC Match one model, three different names Score capability only, on a fixed scale Tier by blended price; top 10 per tier Versioned snapshot written whole, then one pointer flips — atomic JSON API a versioned /v1 contract Dashboard the same data, readable
Each source covers a different axis, so none can be dropped and none is trusted for everything. If a required source fails, the API keeps serving yesterday’s snapshot and reports itself degraded — it never publishes empty rankings.

Every morning one run fetches all three sources in parallel — with timeouts, retries, and backoff — then matches, scores, and tiers the field. The result is written as a complete versioned snapshot before a single pointer flips to publish it: readers see the old rankings or the new ones, never a half-written run. If a required source is down, the pointer simply doesn’t flip — the API serves yesterday’s data and says so in its health endpoint.

The hard part: three names for every model

Each source names models its own way, and one of them splits models into effort variants.

Reconciling catalogs is where ranking projects quietly go wrong: match too loosely and a small model inherits a big model’s score; match too strictly and half the field disappears. Our matcher allows a match only when one name is a prefix of the other and the leftover is provably metadata — a date, a version tag, “preview” — or a known effort marker like “thinking”. When a source lists several effort variants of one model, the strongest is kept and labelled as such.

acme-large-2026-01-07 the catalog’s name Acme Large (reasoning) the quality index’s name acme-large-preview the arena’s name Suffix grammar lowercase, strip separators; the leftover must be metadata or a known effort marker One model best variant kept acme-large-mini looks close, is not close rejected: “mini” is a different model, not metadata
Three catalogs, three naming schemes, one model. One allowlist generates the matching rule, so “what counts as metadata” cannot disagree with itself — and near-miss names stay separate models instead of polluting the rankings. Names shown are illustrative.

Decisions worth noting

  • Price is a tier, not a score. The tiers already segment by cost; scoring price too would double-count cheapness and let a weak-but-cheap model outrank a strong one. The score measures capability alone.
  • A fixed scale, so scores mean something over time. Scores are scaled against a fixed reference band rather than each day’s field — a 71 this month is comparable to a 71 last month.
  • Arena ratings break ties; they never rank. Every frontier model saturates the top of the preference scale, so it cannot separate leaders — it only orders near-equals.
  • The expensive tier is gated by recency. Models that are costly merely because they are old do not belong beside current flagships, so the top tier requires a recent release date.
  • No provider allowlist. A new provider appears in the rankings the first morning it has cross-source data — nothing to maintain, nothing to forget.

Built with

  • Cloudflare Workers
  • KV
  • Hono

This is how we run our own products

The same standards go into client work — cloud, network, and security engagements with a fixed scope and a fixed price, delivered as code you own.