Pricing evidence: why zero isn't zero
A user pointed at our model list: Kimi K3 is not free. They were right, and the reason is a data-modelling mistake that's easy to make and dangerous to keep.
Where the "free" came from
Kimi Code — Moonshot's coding subscription — publishes its model catalogue with cost: { input: 0, output: 0 }. That's not a price; it's the absence of one, because usage is covered by the plan. Meanwhile a provider that simply hasn't published pricing yet also parses as zero, and a genuinely free promotional tier (…:free on a gateway) is zero as well. Three completely different situations, one number.
Our pipeline treated any zero price as free, and then computed a "blended net cost" of $0.04/1M so the free row had something to sort by. So K3 appeared at the top of the value sort, tagged FREE, cheaper than models that actually cost money. Every downstream comparison — top picks, cost-per-token, "cheapest frontier model" — inherited the lie.
The fix: evidence, not inference
- Free requires explicit evidence. Local models (Ollama) are free. A listing whose name or id says
freeis free. Nothing else is, merely because its price parses as zero. - "Plan-covered" is its own state. When a model is available through a subscription (Copilot, Kimi Code, GLM Coding Plan, MiniMax Token Plan, OpenCode Zen, …), the row links to that plan, shows
—instead of a per-token price, and carries aPLANbadge. - "Unpriced" is a third state. Video generators, embedding models and brand-new releases often have no public price yet. They show
—and sort last in both price directions — they are not "cheapest". - Plans get a real view. A dedicated tab (and
/models?tab=plans) renders each plan's usage tiers: prices, quota windows, included models, and a link to the provider's own docs — hand-curated, with the date we verified it.
What changed in the numbers
On the day we fixed it, "free" rows dropped from 543 to 75 — every remaining one has explicit evidence. 446 listings moved to "priced unknown" and stopped pretending to be $0.00/1M. And 186 rows now link to the subscription plan that actually covers them.
The lesson generalises: in observability, the dangerous number is never the missing one — it's the default. A zero that means "unknown" will quietly win every sort, every comparison, and every recommendation built on top of it. Evidence first, defaults never.
You can explore the result at token-horizon.dev/models, and ask an agent the same questions through our MCP tools (search_models, get_plans).
— The Token Horizon team