Index methodology
Tokenando Indices
Version 1.2.2. Everything below — formulas, constants, source weights, exclusion rules, throughput citations — renders from the same versioned configuration the settlement job computes with. If a value changes, the version changes, the changelog records it, and already-settled history stays frozen.
Principles
Raw-first: every collector stores the untouched upstream payload before any parsing; settlement reads only stored raw data, never live sources.
Deterministic and idempotent: re-running a settled day must reproduce every value exactly, or the run fails loudly. Settled values are immutable at the database level.
Drop, don’t fudge: a lab or GPU with insufficient coverage is omitted for the day with a recorded reason. Nothing is interpolated, carried forward, or estimated.
Everything disclosed: offered prices are labeled offered; volume proxies are named with their bias; every methodology change is versioned and logged.
TTPI — Token Price Index
blended(model) = input_price × 0.75 + output_price × 0.25 TTPI(lab, day) = Σ blended(model) × volume_share(model) over the lab’s covered models
Prices come from the OpenRouter models API, captured at 23:45 UTC as the day’s close; prices are converted to USD per million tokens, and per-model price overrides shadow base prices where present. Free variants and zero-priced listings are excluded — TTPI is a paid-token index.
Volume weights come from the OpenRouter rankings snapshot captured the following morning (05:10/05:40 UTC), restricted to rows upstream attributes to the settled day, variants standard and thinking only (free and batch are excluded). This weight source reflects routed traffic, not any lab’s total global volume — direct enterprise API traffic is invisible to every public index. That bias is the honest cost of an open methodology, and it is disclosed here rather than hidden.
A lab publishes only when it has at least 2 models carrying both a price and volume, and when the priced models cover at least 90% of the lab’s included-variant volume. Below either floor, the lab drops for the day with a recorded reason.
| Lab | Slug | OpenRouter prefixes | Closed-weight |
|---|---|---|---|
| Anthropic | anthropic | anthropic | yes — Frontier Premium numerator |
| OpenAI | openai | openai | yes — Frontier Premium numerator |
| yes — Frontier Premium numerator | |||
| xAI | xai | x-ai | yes — Frontier Premium numerator |
| DeepSeek | deepseek | deepseek | no |
| Meta | meta | meta-llama | no |
| Mistral | mistral | mistralai | no |
| Qwen | qwen | qwen | no |
| Moonshot AI | moonshot | moonshotai | no |
| Z.ai (Zhipu) | zhipu | z-ai | no |
| MiniMax | minimax | minimax | no |
| Tencent | tencent | tencent | no |
TCPI — Compute Price Index
provider_price(gpu) = median of that provider’s per-GPU offers across the day’s captures TCPI(gpu, day) = weighted median of provider_price over all providers (cleared 2.0 · posted 1.0)
GPU offers are captured four times daily (05:30, 11:30, 17:30, 23:30 UTC) from three disclosed sources: the Vast.ai public ask book (one query per GPU, price-ascending so any truncation at the venue’s 64-offer cap is stable and bites the expensive tail), RunPod’s public GPU pricing (secure and community cloud as two distinct providers), and the Shadeform catalog, which carries posted rates for 19 underlying clouds — each counted as its own provider, only regions with live availability.
All prices are normalised to USD per single GPU-hour (node prices divided by GPU count; Shadeform’s cent-denominated prices divided by 100 — cross-verified against posted dollar rates). Offers outside a per-GPU plausibility band are discarded and counted. Every current source posts asked/on-demand rates, so v1 is honestly an OFFERED-price index; the cleared-source weight is declared now so adding a transaction-based source later is a source addition, not a formula change.
A GPU publishes only with offers from at least 3 distinct providers. Interruptible/spot prices are excluded from the headline and published as a separate companion series. The per-provider median-of-offers followed by a cross-provider weighted median means neither a flood of listings from one venue nor a single outlier provider can move the index.
| GPU key | Plausibility band $/GPU-hr | Vast names | RunPod names | Shadeform type |
|---|---|---|---|---|
| H100 SXM | 0.5 – 15 | H100 SXM | H100 SXM | H100 (sxm) |
| H100 PCIe | 0.5 – 12 | H100 PCIE | H100 PCIe | H100 (pcie) |
| H200 | 0.8 – 20 | H200 | H200 SXM | H200 |
| B200 | 1 – 30 | B200 | B200 | B200 |
| A100 SXM4 | 0.2 – 10 | A100 SXM4 | A100 SXM | A100_80G (sxm) |
| RTX 4090 | 0.05 – 5 | RTX 4090 | RTX 4090 | RTX4090 |
| RTX 5090 | 0.08 – 8 | RTX 5090 | RTX 5090 | RTX5090 |
TIS — Inference Spread & Frontier Premium
implied_self_host($/MTok) = TCPI(gpu) ÷ throughput(open_model, gpu, profile) TIS(lab, open_model, gpu, profile) = TTPI(lab) − implied_self_host Frontier Premium(profile) = min closed-lab TTPI ÷ min verified implied_self_host
Throughput constants come from published, citable serving benchmarks, converted as tokens/sec/GPU × 3600 ÷ 10⁶. Each row carries its citation, its serving configuration, and the per-user interactivity it delivers.
TIS publishes only from rows a human has verified against the citation — an unverified row produces no number, ever. Both indices feeding a spread must have settled the same day; a missing input is a drop, never a substitution.
The implied self-hosting cost is a floor, not a forecast: it assumes the rented GPU is busy serving at the cited throughput for every hour you pay for. Real deployments carry idle capacity, failed requests, model loading, and the salary of whoever keeps it running — none of which this index estimates, because none of them are observable market prices. Read the self-hosted side as the best case that disciplined engineering could reach.
Coverage
TIS currently covers 5 open-weight models across 9 model-and-GPU combinations, each at 3 serving speeds. Model, GPU and speed are all reader-selectable, because each of them moves the cost per million tokens by more than the gap between two labs — fixing any of them silently would amount to choosing the conclusion.
Coverage is bounded by what is publicly benchmarked, not by what we would like to show: a combination appears only when a citable published measurement exists for it, and a GPU appears only when TCPI also prices it that day. Everything else is dropped and logged.
| Open model | GPUs covered | Serves its own API? | In Frontier Premium? |
|---|---|---|---|
| DeepSeek V4 Pro 1.6T | B200 | yes — deepseek (like-for-like available) | yes |
| DeepSeek R1 0528 671B | H100 SXM, H200 | yes — deepseek (like-for-like available) | yes |
| Kimi K2.5/K2.6/K2.7-Code 1T | B200, H200 | yes — moonshot (like-for-like available) | yes |
| MiniMax M3 428B | H100 SXM, H200 | yes — minimax (like-for-like available) | yes |
| gpt-oss 120B | B200, H100 SXM | no — substitution only | no — not frontier-scale |
What each pairing compares
Two different questions hide inside the phrase "cost of serving a token", and blending them would be misleading, so the index reports them separately.
A LIKE-FOR-LIKE pairing puts a lab’s own API against self-hosting that lab’s own open-weight model. The weights are identical and so is the output quality; the only variable is who operates the hardware. That makes the spread a clean measurement of the hosting margin — what you pay for someone else to run the GPUs.
A SUBSTITUTION pairing puts a closed lab’s API against self-hosting a different, open-weight model. Claude, GPT and Gemini weights are not released at any price, so no like-for-like self-hosted comparison for them can exist — that structural asymmetry is precisely what makes the frontier interesting to measure. The spread here bundles a price gap with a capability gap and must be read as a procurement question ("is open-weight good enough for this workload?"), never as a like-for-like saving. The Frontier Premium is a substitution measure by construction.
A third combination — an open-weight lab’s API against self-hosting some other open model — is not published at all: anyone willing to self-host would run the model they already use, so the number would answer nothing.
The Frontier Premium uses only frontier-class open models as its denominator. A small, fast model can produce tokens far more cheaply than a frontier-scale one, so admitting it would make the headline ratio a measure of model size rather than of hosting economics. Models excluded on that basis remain fully available everywhere else in TIS.
Serving operating points
A serving stack can be tuned to push many tokens through each GPU, with every user seeing slower output, or few tokens per GPU with every user seeing fast output. Published results for one model on one GPU span roughly 11× across that curve — a wider gap than the one between two different labs — so the operating point you assume decides the answer more than the market data does.
That makes a single silent choice the least defensible act available to this index. So every operating point settles as its own daily series, the dashboard lets you switch between them, and the "Balanced" point is the published default used for citation, the API's default response, and the daily brief. The sensitivity is the finding; hiding it would be the error.
| Profile | Per-user speed | What it represents |
|---|---|---|
| Tuned for volume | 61 tok/s | Batch and offline serving: the most tokens per GPU-hour, with each user seeing slower output. Flatters self-hosting relative to interactive API pricing. |
| Balanced headline | 116 tok/s | Interactive serving at roughly the responsiveness a commercial API delivers — the closest like-for-like comparison, and the published headline. |
| Tuned for speed | 171 tok/s | Latency-critical serving: the fastest per-user output, at the fewest tokens per GPU-hour. The most conservative view of self-hosting economics. |
Throughput table
| Open model | GPU | Profile | tok/s/GPU | MTok / GPU-hr | Configuration | Citation | Status |
|---|---|---|---|---|---|---|---|
| deepseek-v4-pro | B200 | volume | 7051 | 25.3836 | FP4, 8k/1k seq, 61 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek V4 Pro 1.6T, B200 vs H200 (2026-08-16) | verified |
| deepseek-v4-pro | B200 | balanced | 1687 | 6.0732 | FP4, 8k/1k seq, 116 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek V4 Pro 1.6T, B200 vs H200 (2026-08-16) | verified |
| deepseek-v4-pro | B200 | latency | 608 | 2.1888 | FP4, 8k/1k seq, 171 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek V4 Pro 1.6T, B200 vs H200 (2026-08-16) | verified |
| deepseek-r1 | H100 SXM | volume | 739 | 2.6604 | FP8, 8k/1k seq, 45 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek R1 0528 671B, H100 vs H200 (2026-08-16) | verified |
| deepseek-r1 | H100 SXM | balanced | 281 | 1.0116 | FP8, 8k/1k seq, 71 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek R1 0528 671B, H100 vs H200 (2026-08-16) | verified |
| deepseek-r1 | H100 SXM | latency | 154 | 0.5544 | FP8, 8k/1k seq, 97 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek R1 0528 671B, H100 vs H200 (2026-08-16) | verified |
| deepseek-r1 | H200 | volume | 1773 | 6.3828 | FP8, 8k/1k seq, 45 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek R1 0528 671B, H100 vs H200 (2026-08-16) | verified |
| deepseek-r1 | H200 | balanced | 907 | 3.2652 | FP8, 8k/1k seq, 71 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek R1 0528 671B, H100 vs H200 (2026-08-16) | verified |
| deepseek-r1 | H200 | latency | 500 | 1.8 | FP8, 8k/1k seq, 97 tok/s/user | InferenceX (SemiAnalysis) — DeepSeek R1 0528 671B, H100 vs H200 (2026-08-16) | verified |
| kimi-k2.6 | B200 | volume | 353 | 1.2708 | FP4, 1k/1k seq, 54 tok/s/user | InferenceX (SemiAnalysis) — Kimi K2.6 1T, B200 vs H200 (2026-08-16) | verified |
| kimi-k2.6 | B200 | balanced | 236 | 0.8496 | FP4, 1k/1k seq, 71 tok/s/user | InferenceX (SemiAnalysis) — Kimi K2.6 1T, B200 vs H200 (2026-08-16) | verified |
| kimi-k2.6 | B200 | latency | 168 | 0.6048 | FP4, 1k/1k seq, 88 tok/s/user | InferenceX (SemiAnalysis) — Kimi K2.6 1T, B200 vs H200 (2026-08-16) | verified |
| kimi-k2.6 | H200 | volume | 294 | 1.0584 | FP4, 1k/1k seq, 54 tok/s/user | InferenceX (SemiAnalysis) — Kimi K2.6 1T, B200 vs H200 (2026-08-16) | verified |
| kimi-k2.6 | H200 | balanced | 221 | 0.7956 | FP4, 1k/1k seq, 71 tok/s/user | InferenceX (SemiAnalysis) — Kimi K2.6 1T, B200 vs H200 (2026-08-16) | verified |
| kimi-k2.6 | H200 | latency | 158 | 0.5688 | FP4, 1k/1k seq, 88 tok/s/user | InferenceX (SemiAnalysis) — Kimi K2.6 1T, B200 vs H200 (2026-08-16) | verified |
| gpt-oss-120b | B200 | volume | 16602 | 59.7672 | FP4, 1k/1k seq, 117 tok/s/user | InferenceX (SemiAnalysis) — gpt-oss 120B, B200 vs H100 (2026-08-16) | verified |
| gpt-oss-120b | B200 | balanced | 9191 | 33.0876 | FP4, 1k/1k seq, 166 tok/s/user | InferenceX (SemiAnalysis) — gpt-oss 120B, B200 vs H100 (2026-08-16) | verified |
| gpt-oss-120b | B200 | latency | 5730 | 20.628 | FP4, 1k/1k seq, 216 tok/s/user | InferenceX (SemiAnalysis) — gpt-oss 120B, B200 vs H100 (2026-08-16) | verified |
| gpt-oss-120b | H100 SXM | volume | 2622 | 9.4392 | FP4, 1k/1k seq, 117 tok/s/user | InferenceX (SemiAnalysis) — gpt-oss 120B, B200 vs H100 (2026-08-16) | verified |
| gpt-oss-120b | H100 SXM | balanced | 1379 | 4.9644 | FP4, 1k/1k seq, 166 tok/s/user | InferenceX (SemiAnalysis) — gpt-oss 120B, B200 vs H100 (2026-08-16) | verified |
| gpt-oss-120b | H100 SXM | latency | 740 | 2.664 | FP4, 1k/1k seq, 216 tok/s/user | InferenceX (SemiAnalysis) — gpt-oss 120B, B200 vs H100 (2026-08-16) | verified |
| minimax-m3 | H100 SXM | volume | 537 | 1.9332 | FP8, 1k/1k seq, 76 tok/s/user | InferenceX (SemiAnalysis) — MiniMax M3 428B, H100 vs H200 (2026-08-16) | verified |
| minimax-m3 | H100 SXM | balanced | 237 | 0.8532 | FP8, 1k/1k seq, 138 tok/s/user | InferenceX (SemiAnalysis) — MiniMax M3 428B, H100 vs H200 (2026-08-16) | verified |
| minimax-m3 | H100 SXM | latency | 157 | 0.5652 | FP8, 1k/1k seq, 199 tok/s/user | InferenceX (SemiAnalysis) — MiniMax M3 428B, H100 vs H200 (2026-08-16) | verified |
| minimax-m3 | H200 | volume | 699 | 2.5164 | FP8, 1k/1k seq, 76 tok/s/user | InferenceX (SemiAnalysis) — MiniMax M3 428B, H100 vs H200 (2026-08-16) | verified |
| minimax-m3 | H200 | balanced | 360 | 1.296 | FP8, 1k/1k seq, 138 tok/s/user | InferenceX (SemiAnalysis) — MiniMax M3 428B, H100 vs H200 (2026-08-16) | verified |
| minimax-m3 | H200 | latency | 223 | 0.8028 | FP8, 1k/1k seq, 199 tok/s/user | InferenceX (SemiAnalysis) — MiniMax M3 428B, H100 vs H200 (2026-08-16) | verified |
Operating points are read off InferenceX’s published throughput-vs-latency curve; SemiAnalysis interpolates between measured runs, which we disclose rather than present as discrete measurements.
Verified throughput citations are re-checked weekly. A citation older than 90 days, or whose source URL stops resolving, raises an alert rather than ageing silently into the index — but a constant is only ever updated by a reviewed commit with a changelog entry, never automatically.
Day attribution & settlement
All days are UTC. For settled day D: GPU offers are captured four times during D; token prices are captured at 23:45 UTC on D; volume weights are captured at ~05:10 UTC on D+1 (the rankings snapshot upstream attributes to D); settlement runs at 06:00 UTC on D+1. Settled values are frozen the moment they are written.
The published record begins at index inception, 2026-08-15. Settlement refuses to produce a value for any earlier day, so the start of the series is a deliberate, enforced boundary rather than wherever data happened to begin. Values computed before inception, while the methodology was still being written, were removed rather than published; the raw observations behind them were kept.
Sources
| Source | Type | Feeds | Notes |
|---|---|---|---|
| OpenRouter models API | posted prices | TTPI prices | official public API; per-model USD-per-token |
| OpenRouter rankings | venue-reported volume | TTPI weights | public endpoint; routed-traffic bias disclosed above |
| Vast.ai ask book | posted (marketplace asks) | TCPI | public search API; ask book only — no utilization signal |
| RunPod pricing | posted | TCPI | public GraphQL; secure + community as two providers; bids → spot series |
| Shadeform catalog | posted (19 clouds) | TCPI | public API; per-region availability gating; cents→USD verified |
| InferenceX + engine reports | published benchmarks | TIS throughput | cited per row; human-verified before publication |
Free JSON API
The headline series are free, keyless, and CORS-open. Responses carry the methodology version and coverage metadata on every value.
| Endpoint | Returns |
|---|---|
| /api/v1/catalog | Indices, entities, date ranges, version, disclaimer |
| /api/v1/ttpi?lab=&from=&to= | Token price index, per lab per day ($/MTok) |
| /api/v1/tcpi?gpu=&series=headline|spot | Compute price index, per GPU per day ($/GPU-hr) |
| /api/v1/tis?lab=&model=&gpu= | Inference spread, per verified pair ($/MTok) |
| /api/v1/frontier-premium | The headline ratio series |
| /api/v1/labs · /api/v1/gpus | Registries (config-derived) |
Changelog
| Version | Date | Changes |
|---|---|---|
| 1.2.2 | 2026-08-16 | Correction to the 1.2.1 note below: it said the two construction days had token prices captured "roughly a day late". That was accurate for 2026-08-14 (22h57m late) but overstated for 2026-08-15, whose prices were 7h25m late. Posted token prices change on announcement, roughly monthly, so a seven-hour offset does not move the index materially. Index inception accordingly moved from 2026-08-17 to 2026-08-15, and that day settled. It is the first day with a complete input set: GPU offers captured within the day itself, and volume weights captured the following morning exactly as designed. The late price capture is disclosed on the snapshot record rather than smoothed over. 2026-08-14 remains excluded permanently: its prices were nearly a full day late and no GPU offers were collected at all, so two of the three indices could never settle for it. |
| 1.2.1 | 2026-08-16 | Index inception set to 2026-08-17: settlement now refuses any earlier day outright, so the published record has a defined and enforced start. Values settled during construction on 2026-08-14 and 2026-08-15 were removed (migration 0008). Their token prices were captured roughly a day late — the end-of-day collector did not exist when those days closed, so the snapshots held the following day’s prices — and the methodology changed three times across them, leaving values the current configuration cannot reproduce. Publishing two days that fail our own reproducibility test, at the exact point a reader looks hardest, was not worth two days of history. Every raw snapshot from those days was kept, immutable and untouched, including volume observations that can never be re-fetched from upstream. Nothing irreplaceable was discarded, and the settle-run log of what happened during construction was kept as an audit trail. |
| 1.2.0 | 2026-08-16 | TIS expanded from one open model on one GPU to five models across nine model-and-GPU combinations — DeepSeek V4 Pro and R1, Kimi K2.6, MiniMax M3 and gpt-oss 120B on H100 SXM, H200 and B200 — each at three serving speeds, all sourced from InferenceX comparison pages with per-pairing citations. Readers choose the combination rather than inheriting ours. Frontier Premium is now restricted to frontier-class open models. gpt-oss 120B is excluded from it: at roughly 60M tokens per GPU-hour it would set the cheapest self-hosted cost by being small and fast, turning the headline ratio into a statement about model size rather than hosting economics. It remains fully available in TIS. Pairings that answer no real question are no longer settled: an open-weight lab’s API against somebody else’s open model. Only like-for-like (the lab that serves this exact model) and substitution (closed labs, which cannot be self-hosted at all) are published. Reproducibility checks are now scoped to the methodology version that produced a value. A value settled under an earlier version is frozen history — it cannot be re-derived from today’s constants and is never overwritten or reported as a mismatch. Without this, the first constant change would have made every historical day fail to re-settle, contradicting the purpose of versioning. |
| 1.1.1 | 2026-08-16 | Throughput rows now record which lab publishes the open weights, so the index can distinguish a like-for-like pairing (a lab’s own API vs self-hosting its own model — a clean hosting-margin measurement) from a substitution pairing (a closed lab’s API vs switching to a different, open model, which trades away model quality too). The two answer different questions and are now reported separately instead of in one undifferentiated list. Documented that the implied self-hosting cost assumes full utilisation of the rented GPU and excludes idle capacity, failed requests and operations overhead — it is a floor, not a forecast. Labelling and presentation only: no computed value changes, and no settled value was altered. |
| 1.1.0 | 2026-08-16 | TIS now settles three serving operating points per (model, GPU) — volume, balanced, latency — instead of one. Published benchmark curves span roughly 11x between the batch and low-latency ends, which moves the Frontier Premium by more than the difference between any two labs; picking one point silently was indefensible, so all three publish and the reader can switch. The "balanced" point (interactive serving, ~116 tokens/sec per user) is the documented headline: the API default, the citable figure, and the number in the daily summary. Throughput table reseeded from InferenceX (SemiAnalysis) for DeepSeek V4 Pro 1.6T on B200 at FP4, replacing the unverified DeepSeek V3 / H200 placeholder — InferenceX reports H200 as unmeasured for this model. Operating points are read from an interpolated published curve, disclosed as such. Weekly staleness check added: verified throughput citations older than 90 days, or whose source URL stops resolving, raise an alert rather than ageing silently. |
| 1.0.0 | 2026-08-16 | Initial methodology: TTPI (volume-weighted blended $/MTok per lab, 0.75/0.25 input/output share), TCPI (weighted median $/GPU-hr per GPU from disclosed posted sources), TIS and Frontier Premium (verified-throughput rows only). Sources: OpenRouter models API (prices), OpenRouter rankings snapshot (volume weights; disclosed with bias), Vast.ai ask book, RunPod GraphQL, Shadeform catalog (19 clouds). Drop rules: labs below 90% volume coverage or under 2 priced models drop for the day; GPUs under 3 distinct providers drop for the day. Missing data is never interpolated or carried forward. |
How prices for individual models are sourced and verified for the Tokenando pricing index is documented separately on the About page.
Tokenando indices are informational reference data, not financial products, price quotes, or investment advice. Offered prices are labeled offered; sources, weights, and exclusion rules are fully disclosed in the methodology. Settled values are immutable; corrections ship as new methodology versions, never as silent edits.