This is not 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 that voice needs: characters of text and seconds of audio.
What we need
A single HTTPSGET that returns your current rates as JSON.
The two requirements that make it worth doing
Generate it from whatever your billing system treats as the source of truth. This is the whole point. An endpoint a human edits by hand is a pricing page with extra steps: it will drift, and because we poll it, that drift becomes visible rather than staying quietly wrong. If the number you serve is the number you bill, the endpoint is correct permanently and you never think about it again. Quote every rate per one base unit: one character, one second, one token, one request. Never per thousand or per million. This 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.
Serving it
It does not need to be fast or highly available. We poll once a day and treat a timeout as a transient failure, never as a price change.
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 an endpoint 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.