{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/openrouter-census","json_url":"https://ejfox.com/projects/openrouter-census.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<p class=\"\">A full census of every model on OpenRouter, dumped into immutable JSONL/Parquet snapshots and rendered as an Observable Plot dashboard</p>\n<p class=\"\">OpenRouter is the marketplace where you can hit basically any language model through one API, and the roster changes constantly — models appear, prices drift, a provider quietly bumps a context window. I wanted a way to take a dated snapshot of the whole thing and actually look at it, so I built a scraper that pulls all 316 models across 54 providers in about a second and hands me analysis-ready data I can chart.</p>\n<p class=\"\">The interesting part is what falls out once you have every model in one table. Median context length is 128K tokens but the average is 171K, dragged up by outliers like OpenAI's million-plus-token windows. 70% of the catalog is still text-only; the other 30% takes images. And the capability spread is uneven in ways the marketing never tells you — <code class=\"md-inline-code\">max_tokens</code> is table stakes at 99.7%, but tool calling only shows up on about half the models, structured outputs on 45%, and reasoning tokens on 29%. That's the kind of thing you want to know before you pick a model to build on.</p>\n<p class=\"\">I care about provenance more than a leaderboard, so every run writes a dated <code class=\"md-inline-code\">artifacts/</code> directory: raw unmodified API payloads next to the normalized tables, JSON Schemas, SHA-256 checksums, fetch metadata, and a <code class=\"md-inline-code\">CITATION.cff</code> — so a snapshot is something you can actually cite and reproduce, not a screenshot that rots. There's an interactive TUI for browsing and filtering, and the dashboard is seven Observable Plot charts over the processed data.</p>\n<figure role=\"figure\" aria-label=\"OpenRouter Model Census — the dashboard: pricing distribution + the context-price paradox\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/openrouter-census/dashboard.png\" alt=\"OpenRouter Model Census — the dashboard: pricing distribution + the context-price paradox\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/openrouter-census/dashboard.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/openrouter-census/dashboard.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/openrouter-census/dashboard.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/openrouter-census/dashboard.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"OpenRouter Model Census — the dashboard: pricing distribution + the context-price paradox\" width=\"1440\" height=\"2150\" style=\"--splay-rot:-1.29deg;\" data-dimensions=\"1440×2150\" class=\"img-full my-8 rounded-sm img-splay aspect-[3/4] w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">OpenRouter Model Census — the dashboard: pricing distribution + the context-price paradox</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"The companion interactive CLI\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/openrouter-census/tui.png\" alt=\"The companion interactive CLI\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/openrouter-census/tui.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/openrouter-census/tui.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/openrouter-census/tui.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/openrouter-census/tui.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The companion interactive CLI\" width=\"1400\" height=\"880\" style=\"--splay-rot:1.11deg;\" data-dimensions=\"1400×880\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The companion interactive CLI</figcaption>\n</figure>","title":"OpenRouter Census","metadata":{"title":"OpenRouter Census","date":"2025-08-21T05:00:00.000Z","category":"Tools","featured":false,"url":"https://github.com/ejfox/openrouter-census","tech":["JavaScript"],"state":"deployed","ai-involvement":"ai-assisted","tags":["tools"],"words":285,"images":2,"imageDetails":{"total":2,"cloudinary":2,"withDimensions":0},"links":0,"codeBlocks":0,"headers":{},"toc":[],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/openrouter-census.json","html":"https://ejfox.com/projects/openrouter-census","index":"/projects.json"}}