What the OTPI value means
indexPerMtok is the blended USD price per million tokens for a lab on a given day. It is a volume-weighted blend across the lab’s paid production models, so higher-volume models and providers influence the value more.
For example, an anthropic OTPI of 1.00 means $1.00 per million tokens averaged across paid Anthropic inference for that day.
The OTPI uses paid inference activity and provider-weighted posted pricing, not a simple unweighted list price. Treat
indexPerMtok as a market-blended cost of serving a lab’s mix of paid models on a given day.How it’s computed
For each lab, on each settlement day, the index is a volume-weighted blend of posted per-token prices across that lab’s paid production models — effectively the price of the average paid token served for that lab that day. Free tiers and open-weight self-hosting are excluded, and models served in higher volume move the index more than thinly-used ones.The exact weighting scheme and provider-sampling methodology are maintained by the OTPI team and refined over time. This page describes the current published behavior; if you need the precise formula or a methodology version for research use, contact the team rather than inferring it from values.
Tracked labs
The index is published for these labs:anthropic · openai · google · deepseek · minimax · xiaomi · qwen · moonshotai · z-ai · mistralai · meta-llama
Fetch this list programmatically from GET /api/token-types, or the free-tier subset from GET /api/token-types-free.
Open-weight models (for example gpt-oss, gemma) and free tiers are excluded. Models without enough pricing coverage on the settlement day are also excluded, so a lab having a light-coverage day is dropped rather than published with a partial blend.
Update frequency and settlement
OTPI values are settled daily, a short time after the day they cover. The lag is deliberate: it lets the day’s activity finish landing before the day is blended and frozen. Once a day is settled itsindexPerMtok is stable.
Each row includes:
indexPerMtok is returned at full floating-point precision (for example 1.234567), not pre-rounded. Round in your own presentation layer to whatever precision you display.Parameters
The OTPI is served from a single endpoint,GET /api/otpi. Without a key, the free tier covers the four public labs — anthropic, openai, google, deepseek — for the trailing 1 month; the other labs and older history require an API key. See Authentication.
Notes on combining parameters:
- Latest vs. specific vs. range. With no date parameters you get the latest settled day. Pass
datefor one historical day, orstartDate+endDatefor a window. Do not combinedatewithstartDate/endDate— the API returns400if both are present. labis optional everywhere. Omit it to get every lab you have access to (the free-4 without a key, or all tracked labs with one) for the selected day(s); include it to get one lab’s series.
Reading the latest values
Omitdate to get the latest settled day across the labs you have access to (the free-4 without a key, or all tracked labs with one):
lab to get just one lab’s latest value:
date to pull one historical day:
Pulling a historical range
To chart the index over time, passstartDate and endDate (both inclusive, YYYY-MM-DD) instead of date. Combine with lab to limit the response to a single lab. Anonymous callers are clamped to the trailing 1 month; pass an API key to reach further back. Compute dates when you make the request so a no-key example stays inside the moving window:
startDate/endDate (not date), and data holds one row per settled day for the selected lab, oldest first.
A single-day query (date, or no date at all) instead echoes back a top-level date. The top-level startDate/endDate echo the window you requested, while the data rows begin at the first day the lab actually has coverage in that window, so the earliest row can be later than the startDate you asked for.
Loading into pandas
The OTPI range response drops straight into a DataFrame for charting or analysis:Coverage and caveats
- New labs backfill from their first settlement. Newly added labs return rows only after their first public settlement. Historical ranges that start before that date will include only the labs already published then, so a range’s per-day
countcan grow over time. - Light-coverage days are omitted, not zeroed. A lab with insufficient same-day pricing coverage is dropped from that day rather than published with a partial or misleading value.
- Settled values are stable; the latest day can shift. Because settlement lands a short time after the covered day, the “latest” day advances daily. Pin to a specific
dateif you need a fixed value.

