Methodology
Rack Rates is a dated record of the published list prices of compute: VPS plans, GPU instances, LLM tokens, inference hosts and media models. For every priced item it keeps the raw source, the price read from it, the time it was last verified and every change since the ledger started watching. Nothing here is ranked, filtered or coloured by a commercial relationship.
List prices, not transacted prices
List prices, not transacted prices: every number is what a provider publishes on its own price page or API, excluding discounts, credits, negotiated contracts and spot deals. It is a dated record of the asking price, not of what anyone paid. Discounts, committed-use and reserved pricing, credits, enterprise contracts and marketplace or spot deals are not in any list-price series; where a provider's page shows a commitment or promo price, the SKU says so. Treat every series as the published price level, not as a traded or settlement price.
The ten rules
- The provider is the truth. A price comes from the provider's own page or API. Community datasets (LiteLLM, OpenRouter, models.dev, gpuhunt) are cross-checks and are labelled as such wherever they appear. When they disagree with the provider, or with each other, the page shows both numbers and the difference instead of quietly choosing.
- Raw first, and immutable. Every observation starts as an unmodified, content-addressed copy of the source (URL, time, HTTP status, hash). Fields are derived from it and can be recomputed; the history is never rewritten. A correction is a new, dated fact.
- Gaps are shown. If a source fails, is blocked or looks wrong, its items say "not verified since <date>" and show no price. Nothing is interpolated. A change counts only once it is seen between two good runs. Copies from Wayback or Common Crawl are never treated as an observation of today.
- Nothing is for sale in the ranking. No affiliate links, no sponsored rows, no paid placement that touches order. Lists are sorted by provider and plan; "cheapest" queries sort by price alone and nothing else enters the sort key. If sponsorship ever exists it will be labelled, separate, and outside every table.
- Marketplaces are their own series. Asking prices and spot prices (for example Vast.ai) are not list prices and are never mixed into list-price series or indices.
- No language model in the measurement chain. Fetching, parsing, validation, diffing and index calculation are deterministic code. AI tools are used to repair parsers and add sources, but a model never produces a number that is published.
- Every number carries its evidence. Each price shows when it was last verified and links to its source. Each index value lists its constituents, each with its own verification time and source link.
- Free for today, paid for the past. Current prices and 90 days of history are free under CC BY 4.0. The full archive, alerts and bulk export are planned as a paid tier. That is the business model; it never touches the order of any table.
- Methodology is public, including what we do not know (next sections).
- Errors are corrected in the open. A contact address is published here when the public domain is live; until then use the contact in the project repository with the SKU or series, the value you expect and a link to the provider's page. A correction is a new dated entry; the original snapshot and record stay visible.
How a price gets here
- A scheduler fetches each source once a day and archives the body unchanged before anything is parsed.
- A deterministic normalizer reads the archived fields into SKUs (
category/provider/plan) with a primary price, secondary prices (output tokens, hourly rate, batch, cache) and spec. Units are converted in code (MB to GB, per-token to per 1M tokens, micro-cents to EUR). - Quality gates mark an unreadable, empty or suspiciously jumping snapshot as suspect. A suspect snapshot does not verify anything and its changes wait for the next good run.
- The price history stores one row per change point. Each change is dated "between the previous good snapshot and the one that showed it". The first snapshot of a source is a baseline: it creates SKUs but no change events.
- Index series are computed from the SKU state at the end of each UTC day; today's value is recomputed until the day ends and past days are frozen.
What "verified" means
The last verified time of a price is the time of the last good snapshot in which that SKU was present. A SKU is shown as not verified since (with no price) when its source's latest fetch failed, or when no good snapshot has verified it within 72 hours. A SKU that disappears from its source is marked delisted and keeps its history. The price history on each SKU page keeps the dated observations of earlier periods.
Sources and disagreement
The table is generated from the live source list, so it is always what the ledger reads today.
| Source | Kind | Status | SKUs |
|---|---|---|---|
anthropic-pricing | first-party | ok | 7 |
assemblyai-pricing | first-party | ok | 7 |
aws-bedrock-offers-us-east-1 | first-party | ok | 134 |
aws-bedrock-pricelist | first-party | ok | 0 |
azure-retail-openai | first-party | ok | 125 |
azure-retail-vm-westeurope | first-party | ok | 3565 |
baseten-pricing | first-party | ok | 15 |
cerebras-models | first-party | ok | 2 |
coreweave-pricing | first-party | ok | 9 |
crusoe-cloud-pricing | first-party | verdacht:ok | 6 |
datacrunch-instances | first-party | ok | 52 |
deepgram-pricing | first-party | ok | 20 |
deepinfra-models | first-party | ok | 101 |
deepseek-pricing | first-party | ok | 2 |
digitalocean-droplets | first-party | ok | 10 |
digitalocean-gpu-droplets | first-party | ok | 16 |
elevenlabs-pricing | first-party | verdacht:ok | 3 |
exoscale-opencompute | first-party | ok | 26 |
fal-pricing | first-party | verdacht:ok | 21 |
fireworks-pricing | first-party | ok | 5 |
google-pricing | first-party | ok | 8 |
groq-models | first-party | ok | 10 |
hf-inference-providers | community cross-check | ok | 175 |
hostinger-vps | first-party | ok | 4 |
hostwinds-vps | first-party | ok | 7 |
hyperstack-gpu-pricing | first-party | ok | 13 |
ionos-cloud-prices | first-party | ok | 9 |
ionos-vps | first-party | ok | 5 |
kamatera-pricing | first-party | ok | 3 |
kling-pricing | first-party | ok | 33 |
lambda-instances | first-party | ok | 14 |
leaseweb-public-cloud | first-party | ok | 10 |
leaseweb-vps | first-party | ok | 6 |
linode | first-party | ok | 45 |
litellm | community cross-check | ok | 3253 |
luma-pricing | first-party | ok | 73 |
mistral-pricing | first-party | ok | 1 |
modelsdev | community cross-check | ok | 8488 |
nebius-prices | first-party | ok | 7 |
netcup-vps | first-party | ok | 5 |
oci-pricelist | first-party | ok | 12 |
openai-pricing | first-party | ok | 3 |
openrouter | community cross-check | ok | 469 |
openrouter-endpoints | community cross-check | ok | 1143 |
ovh-catalog-cloud | first-party | ok | 72 |
ovh-catalog-vps | first-party | ok | 44 |
paperspace-pricing | first-party | ok | 13 |
replicate-pricing | first-party | ok | 17 |
runpod-gpu-types | first-party | ok | 47 |
runpod-pricing | first-party | ok | 19 |
runway-pricing | first-party | ok | 4 |
sambanova-models | first-party | ok | 6 |
scaleway-gpu | first-party | ok | 11 |
scaleway-instances | first-party | ok | 124 |
scaleway-instances-nl-ams-1 | first-party | ok | 115 |
scaleway-instances-pl-waw-1 | first-party | ok | 40 |
stability-pricing | first-party | ok | 6 |
together-gpu-clusters | first-party | ok | 7 |
together-pricing | first-party | ok | 16 |
transip-vps | first-party | ok | 5 |
upcloud-pricing | first-party | ok | 9 |
vast-asks | marketplace asks, not list prices | ok | 9 |
vultr | first-party | ok | 139 |
vultr-metal | first-party | ok | 23 |
xai-models | first-party | ok | 1 |
When two sources list the same model, the SKU page shows both side by side with "agrees" or "differs" and the percentage difference. The provider's own listing is first-party; a community source is labelled as a cross-check even when it is the only source for an item. OpenRouter rows are the price OpenRouter charges, which is a cross-check of the model vendor's list price rather than the vendor's own price.
Normalisation
- VPS: primary unit per month, hourly price secondary. GPU: primary unit per hour per instance; index series divide by the GPU count. LLM: price per 1M tokens, input primary; output, cached input, cache write and batch are secondary.
- Prices exclude VAT unless marked. A price the source states including VAT (netcup: 19%) is shown as stated with that rate, and its ex-VAT figure is derived from it; the index series skip VAT-inclusive prices. EUR prices that exclude VAT are also shown incl. 21% Dutch VAT.
- Currency stays native (USD or EUR). USD and EUR equivalents use the ECB reference rate of the observation day (via Frankfurter), stored with the observation so history is reproducible. Weekends use the last published rate.
- EU means the plan can be deployed in an EU data centre of that provider. Plans are reported for one region of a provider where its API prices regions differently (for example Scaleway fr-par-1, OVHcloud's Dutch order catalog).
- Index series: a floor is the minimum and a median the median over the SKUs meeting the stated spec at the end of the UTC day. Definitions are code; a change is a visible commit. The frontier token series use a fixed, hand-reviewed list of flagship models shown on the series page. See Index.
What we do not have
- Coverage is bounded by structured sources. Some providers' price pages (HTML, JavaScript-rendered or text only) are archived and diffed as text, but no deterministic parser reads a price from them yet. Until one exists they carry no price here, and index series that say "across tracked providers" cover only the providers on the sources list above. In particular a "cheapest" or "floor" figure is the lowest among providers the ledger reads, not the lowest in the market.
- Most LLM rows are still community cross-checks. By count, most LLM rows come from LiteLLM, models.dev and OpenRouter. First-party pages are read for the main model vendors, Azure OpenAI and AWS Bedrock; wherever only a community row exists it can lag the vendor and is labelled as a cross-check on every page where it appears. The Hugging Face inference-provider router is a community cross-check as well, never a first-party price.
- Blocked and unreadable sources are gaps. Contabo blocks datacentre IP addresses, so it appears nowhere. Hetzner Cloud fills its prices in client-side after the page loads, and its API source is archived only until a read token is configured. We record these as gaps and do not substitute archive copies. Sources that are archived without a normalizer are listed in
docs/SOURCES.mdin the repository. - Credit-priced media is converted at a named reference plan. Runway, Luma and ElevenLabs sell generation in credits. We convert at the monthly list price of one plan divided by its included credits: Runway Standard, Luma Plus, ElevenLabs Starter. Stability states a credit price on its page, and that is used. Each such SKU shows the plan and the USD-per-credit figure it was converted at. Buying credits another way, on a larger plan or as top-ups, gives a different price per credit, and so a different price here.
- Some floors can read "thin coverage". The A100 80GB and RTX 4090 GPU series, the US VPS floors and the media floors need a minimum number of verified providers (shown on each series page). Below that they say "not computed" and give the reason instead of a number.
- Some VPS providers are only partly comparable. The Exoscale price feed carries no vCPU or RAM, so its plans appear in the lists but are excluded from every spec-based floor. Kamatera's page shows three example server cards; the real price depends on a configurator, so these are examples, not a price list. The EU flag is strict: it is set only for plans the provider's page places in an EU location.
- The 1 vCPU / 1 GB EU floor is an entry plan. It is set by Scaleway Stardust at EUR 0.438 per month. That is the listed price of an entry plan; whether stock is available is not visible in the price data.
- AWS Bedrock prices are the US regional profile. The headline price is the US East on-demand regional price, about 1.1 times the global cross-region price; the global-profile price is kept as a secondary price on the SKU.
- Paperspace shows mostly commitment prices for its large GPUs. The page prints the A100-80G only at a 3-year commitment price, and the H100 at a 3-year commitment price plus, in a footnote, an on-demand price under a "special promo price". Both are shown as the page states them, with commitment and promo noted on the SKU; commitment prices are never used in the index series.
- New models need a recipe edit. Groq and Baseten model tables are read by a fixed recipe: a model added to those pages is not picked up until the recipe is extended.
- Marketplace feeds are partial. The Vast.ai feed is limited to 64 offers per query, so any statistic from it describes those offers and not the whole marketplace. Marketplace data is kept apart from list prices (rule 5).
- History starts when we started watching. The first observation of each source is the earliest point; nothing earlier is claimed. If community backfill is added later it will be labelled as such and not presented as first-party.
- No transacted prices, benchmarks or performance data. Sources we may not copy (for example GetDeploying, Ornn, Silicon Data) are cited at most, never reproduced.
- Region detail is shallow. Where an API prices regions differently, only the base price is shown, with the data-centre codes listed.
Independence
No affiliate links, no sponsored rows, no paid placement, no accounts, no paywall on current data. Outbound links go to the provider's own page and nowhere else.
Licence
Today's snapshot and 90 days of history are published under CC BY 4.0 at /data. Attribute "Rack Rates" with a link. Code is MIT.
Charter last reviewed 20 October 2026.