Skip to main content
If you work at a model or inference provider, this is the highest-value thing you can do for the developers costing out your API. Today your prices reach tools like this one by someone reading your pricing page. That is slow, it breaks every time you restyle the page, and when it breaks the wrong number gets published under your name. A small JSON file fixes it permanently.
Nothing here is a new standard. OpenRouter and LiteLLM already publish per-token rates in this shape, and this project already pulls from both. The only addition is the two meters voice needs: characters of text and seconds of audio.

The file

That is a complete, valid feed. If you publish nothing else, publish that.

The one rule

Quote every rate per one base unit: one character, one second, one token, one request. Never per thousand or per million. Per-unit pricing is where public pricing data goes wrong most often, because $30 is a plausible price per million characters and a catastrophic one per thousand. If the number is small and the unit is singular, there is nothing to misread. Publish amounts as strings for the same reason: 0.0000003 as a JSON number does not survive a round trip through every language’s float parser.

Fields

Top level

Per model

Per rate

A rate with no plan, from_quantity, or voice_class is your headline rate. Publish at least one of those per meter, or there is nothing to compare against.

Supported meter and unit pairs

Every combination below maps to exactly one field in this catalog. Anything not listed is rejected rather than guessed at, because a wrong unit and a wrong price look identical once stored.

Get the model id right

This is the field most often wrong and the only one that makes a feed machine-usable. id must be the literal string a caller passes to your API. Not the marketing name, not the docs slug, not the pricing-page row label.
Every downstream tool has a fuzzy matching layer purely because providers publish the second form. Getting this right deletes that layer.

Serving it

  • A stable URL that does not change. /.well-known/pricing.json on your API host is a good convention.
  • No authentication, so client-side cost calculators can read it.
  • Access-Control-Allow-Origin: *.
  • An ETag or Last-Modified header, so pollers are cheap for you.
Hand-maintaining the file is fine and is much better than nothing. Generating it from whatever your billing system treats as the source of truth is the version that never drifts.

Check it

This validates the file, converts every rate, and diffs it against what this catalog currently publishes about you. It works on a local path too, so you can check the file before you ship it:
It exits non-zero when something drifts or cannot be mapped, so it works as a CI check on your side: fail the build when your published feed stops agreeing with what the public catalog says you charge. Note that make prints its own Error 1 line on a non-zero exit, which means findings, not a crash. In CI, call the module directly to avoid the noise:
feed-check never writes to the catalog. A drift report is a prompt for a human to review and update the rate by hand. No bot in this project is allowed to mark a price as verified. How Fresh? explains why.

If you cannot host a file

Two smaller asks that still help:
  1. Give your pricing page stable id anchors on each price row, and do not render the numbers only in client-side JavaScript. Extraction becomes reliable instead of best-effort.
  2. Tell us where to watch for changes: a changelog feed, a mailing list, or a person to ping. Being told beats finding out.
Either way, open an issue and we will wire it up.