GPU EconomyCloud GPU prices, read every hour
Latest read 114 providers tracked27,830 prices read in 24 h
H100 index$3.3936 providersWidestV100 32GB20.2×Mover, 7dRTX A4000+32.9%

The public dataset

What is in it right now, counted from the files themselves.
Current rental quotes1269one per provider, GPU, price type and region, each with its source URL and the time it was read
GPU models81specs, coverage, retail median where three or more sellers carry the card
Providers116 scraped, 122 listedhyperscalers, specialist clouds and 4 marketplaces
Weekly history102 weeks8 from our own scrape, 94 reconstructed from a public price catalog, kept apart
Per-model series20 models1695 weekly points with the cheapest listed rate and who listed it
Files127 JSON, 4 CSV, 1 Atom feed — no key, no rate limit
Updatedhourlyrental prices every hour when a price moved, retail weekly, history weekly
LicenseCC BY 4.0attribution to “GPU Economy” with a link to the page or file used
Archived10.5281/zenodo.22706541the Price Index as dated snapshots on Zenodo (the DOI resolves to the latest) and on Hugging Face

Everything on this site is also a file. 12 files, built with the site from the same data the pages show, so a number here is the number on the page. All of them are published under CC BY 4.0: use, copy and redistribute with attribution to “GPU Economy” and a link to the page or file you used. Cite the linked source for a price itself, and cite us for the normalization, the index and the comparisons. No key, no rate limit.

Files

FileWhat it holdsSize now, updated
/prices.json JSON
fields ↓
Every current rental quote: one row per provider, GPU, price type and region, normalized to USD per GPU per hour, with the listed price it came from and its source URL.1269 quotes, 116 providers, 81 GPUs · Hourly, when a price moved.
/price-index.json JSON
fields ↓
The Cloud GPU Price Index: current value with its constituents (each linked), the weekly series with vintage and the base-100 index, and the reconstructed historical series.8 weeks of our own series from September 7, 2026, 94 reconstructed weeks from January 6, 2025 · Hourly; the running week is provisional, closed weeks are final.
/price-index.csv CSV
fields ↓
The weekly Cloud GPU Price Index from our own hourly scrape only, one row per published ISO week - no reconstructed history.8 weeks · Hourly.
/price-index-hourly.csv CSV
fields ↓
The same Cloud GPU Price Index at every hourly scrape, one row per point, as the database computed and stored it when the scrape came in; never rewritten.1257 points · Hourly.
/price-index-monthly.csv CSV
fields ↓
The monthly average of the hourly index over a fixed monthly panel: closed months as the database froze them (never revised), the running month provisional.2 months · Hourly for the running month; a closed month never changes.
/price-index-history.csv CSV
fields ↓
The reconstructed H100 series from a public price catalog (named in the methodology), kept in its own file.94 weeks · Weekly, the Monday after a week closes.
/history.json JSON
fields ↓
Weekly history for every model with enough weeks: median and cheapest listed on-demand rate per week, who listed the cheapest and where, from both sources, labelled.20 models, 1695 weekly points · Hourly for our own series; weekly for the reconstructed one.
/token-cost.json JSON
fields ↓
The inputs of the one modelled figure on this site, cost per million output tokens: NVIDIA’s published inference throughput per card, each run with its model, framework, precision, sequence, concurrency and date.6 cards, 20 runs · When the snapshot of NVIDIA’s figures is refreshed; the file is rebuilt with the site.
/changelog.json JSON
fields ↓
Every observed move in a listed rental price, newest first - the list /changelog shows, as data.12779 moves: 30 days for every provider, the last 24 hours for the marketplace (Vast.ai) · Hourly, when a price moved.
/changelog.xml Atom
fields ↓
Providers’ own rate changes as an Atom feed, to follow in a feed reader: the newest 100 moves from changelog.json with the marketplace floor (Vast.ai) left out, since it moves almost every hour.up to 100 entries · Hourly, when a price moved.
/providers.json JSON
fields ↓
Every provider tracked or listed: type, how its prices are read, what its region label means, and its current contribution.122 providers, 116 scraped · With every site build.
/gpus.json JSON
fields ↓
Every GPU model tracked: specs, current coverage, the 3+-seller retail median, and the manufacturer list price where the vendor publishes one.81 models · With every site build.

Settling a contract on the index: reference price · fetching more often than hourly: how often to fetch · from an AI agent: MCP server.

From a script, send a User-Agent header. Any value works: curl, requests, Node and Go clients are served as they are. The hosting platform, though, refuses Python’s built-in urllib when it sends its default agent (Python-urllib/3.x): HTTP 403, “error code: 1010”. That check sits above the settings we control, so with the standard library, name your client:

import json, urllib.request
req = urllib.request.Request('https://gpueconomy.com/prices.json', headers={'User-Agent': 'my-analysis/1.0'})
prices = json.load(urllib.request.urlopen(req))
print(prices['count'], 'quotes, data updated', prices['data_updated_at'])

Two sources are labelled wherever they appear: gpueconomy is our own hourly scrape (from the week of September 7, 2026); skypilot-catalog is a second-hand history reconstructed from a public price catalog (named in the methodology), with a commit permalink per row. They are never merged. How the numbers are made: methodology.

Slices

The price file also ships narrowed, so a reader who wants one card or one provider does not fetch all 1269 rows. Same fields, fewer rows, same license:

URLContainsFiles
/gpu/{gpu_id}/prices.jsonevery current rate for one card, across providers — e.g. /gpu/h100-sxm/prices.json81
/providers/{provider_id}/prices.jsonevery current rate at one provider, across cards — e.g. /providers/runpod/prices.json122

The ids are the ones in gpus.json and providers.json, and they are the same ids in the page URLs — so a slice URL can be derived from a page URL without a lookup. There is no query API and no key: the site is static files on a CDN, and a filter parameter would need a runtime that can be down while the pages are up.

MCP server

Since September 28, 2026 the same data answers AI agents directly: https://gpueconomy.com/mcp is a read-only Model Context Protocol server (Streamable HTTP, no key, no account). How to connect it, with every tool: /mcp.

It reads the files on this page and nothing else, so it carries their rules: live quotes only, every price with the time it was read and a link to our page for it, where the price stands beside the page it was read from, CC BY 4.0. It is an experiment with an end date: if too few agents use it, it is taken down and this section says so. What it counts, for that verdict: the time, the tool, the GPU or provider asked about and the name the client gives itself - no IP address, no user agent.

How often to fetch

Prices are read every hour, at about 37 minutes past, and these files change only when the build after a read publishes a price that moved — so at most about once an hour, and some hours not at all. Fetching a file every few minutes returns the same bytes. Every file carries an ETag: send it back as If-None-Match and an unchanged file answers 304 Not Modified with no body. The time the data was read is data_updated_at at the top of each JSON file.

Please fetch each file at most every 15 minutes. Once an hour, at about 50 minutes past, gets every change as soon as it is published; nothing is gained by asking more often, since the next change cannot come sooner than the next hourly read. A client that fetches the same files every few minutes around the clock costs this free service bandwidth for no new data, and conditional requests (If-None-Match) are the polite way to poll. The data stays free under CC BY 4.0 whatever the cadence.

Building something on this data? It is free under CC BY 4.0 with the attribution above, and you do not need to ask. Tell us who you are and we will warn you before anything changes: write to data@gpueconomy.com with the files and fields you use, and you hear from us before a field, a file address, a unit or the set of slices changes. There is no key and no limit either way; the same offer is in each JSON file as change_notices. If you need something the files do not give — history per quote, a feed pushed to you, guarantees on freshness — write to data@gpueconomy.com and say what you are building.

What the licence covers

CC BY 4.0 covers what we made: the compilation — which quotes are read and how, their normalization to US dollars per GPU-hour, the Price Index and its receipts, the comparisons — and our own text. It does not cover what belongs to the providers: their names, trademarks and logos, and their own price pages. A provider’s figure is the provider’s: every row links the provider’s own page for it (and, for a figure read through the provider’s API, names the endpoint beside it), and that is what to cite for the figure itself. When you republish a row, keep that link — to the page the figure stands on, not the provider’s home page — as we do (link policy).

Receipts for the Price Index

Every published week of the Price Index has a receipt: one CSV row per quote that entered that week’s value — provider, region, usd_per_gpu_hour, scope, source URL, read time — and one per quote read for the week and kept out of it, with included=false and the rule in excluded_by, at /price-index/receipts/{YYYY-Www}.csv, for example /price-index/receipts/2026-W44.csv (provisional). A closed week’s receipt never changes. How to turn one back into the published number, with the command: reproduce the index. Each week in price-index.json carries its receipt URL.

/prices.json JSON

Every current rental quote: one row per provider, GPU, price type and region, normalized to USD per GPU per hour, with the listed price it came from and its source URL. The same rows and fields as CSV: /prices.csv.

Updated: Hourly, when a price moved. · Size now: 1269 quotes, 116 providers, 81 GPUs.

FieldMeaning
provider, provider_id, gpu, gpu_idnames and slugs; provider_page and gpu_page link back here
price_typeon_demand | spot | reserved
marketwhich market the quote is from: on_demand | spot | community (other people’s machines: RunPod Community Cloud, the Vast.ai floor) | shared (a card other tenants use too, since 2026-09-27: packet.ai Dynamic) | serverless (billed by the second, no instance to rent) | reserved | reserved_1y | reserved_3y. Read from the source, never inferred from the price
price_scopeinstance | gpu_only | marketplace_floor | advertised_from - what the figure covers
risklow | medium | high - whether the capacity can be taken back mid-run, read off market alone: on-demand and every reserved market low, serverless and shared medium, spot and community high. The tag the rate tables print; not a rating of the provider, and not the cost of a commitment paid for idle hours (see /methodology)
regionthe provider’s own partition label (a geography, a data center, or a tier); null = global
instancewhat the provider calls the thing that was priced: instance type, SKU, machine family, marketplace offer id (p5.48xlarge, HGX B200, offer 48635744). Null where the source publishes no name - it is read, never derived
usd_per_gpu_hourthe normalized, comparable figure
listed_price_usd_hour, listed_unit, gpu_countthe quote as listed (per_gpu or per_node) and the divisor
listed_currency, listed_price_hour, fx_rate, fx_datefor a listing in another currency (EUR, RUB, JPY, ...): the listed figure and the official rate and its date behind the USD one - the ECB reference rate, or the Bank of Russia rate for RUB and VND
source_url, scraped_atwhere and when the price was read
listed_since, listed_since_first_readsince when the provider has listed this exact figure (in the listed currency, same GPU count), from our own hourly reads; listed_since_first_read = true when it has not changed since our first read, so the real age may be longer
methodology_versionsemver of the rules behind these figures; the dated log is /methodology/changelog
change_noticesat the top of prices.json and of every per-GPU and per-provider slice: tell us who you are and what you use, at the address under How often to fetch, and you are told before a field, a file address, a unit or the set of slices changes (since 2026-09-28)
last_confirmed_at, statuswhen the price was last read successfully, and live | unconfirmed | stopped: live = within 48 h of data_updated_at, unconfirmed = 48 h to 7 days, or from the read in which the provider’s own page for the card answered “not found” (since 2026-10-09), stopped = older, thin_market = the newest read withheld a marketplace floor as too thin (the row keeps the last published floor). The site computes its figures from live rows only
withheld_at, withheld_reasonon thin_market rows only: when the newest read withheld the marketplace floor, and why (for example "1 verified offer(s), a floor needs 3"); null otherwise
listed_7d_ago, read_7d_ago_at, change_7d_pctthe listed figure per GPU (listed currency) the same quote carried 7 days before data_updated_at - its last read at or before that moment, within 48 hours of it - when that read was, and the change in percent; null until the quote has been read for a week

/price-index.json JSON

The Cloud GPU Price Index: current value with its constituents (each linked), the weekly series with vintage and the base-100 index, and the reconstructed historical series.

Updated: Hourly; the running week is provisional, closed weeks are final. · Size now: 8 weeks of our own series from September 7, 2026, 94 reconstructed weeks from January 6, 2025.

FieldMeaning
current.usd_per_gpu_hour, quotes, providers, constituents[]this week’s median and every quote in it, with source_url
observations.count, since, providers, gpu_models, hourly_runs, what_one_ishow much reading is behind the figures: every listed rate ever read and the day the first was. One observation is one read of one listed rate - the same rate read every hour counts every hour - not a transaction and not availability; nothing published is computed from the count
page_delivery.client_javascript, statement, detailsfalse: the site serves no JavaScript, and every price in every table is in the HTML the server sends; the only script elements are JSON-LD (/methodology#no-javascript)
current.p25_usd_per_gpu_hour, current.p75_usd_per_gpu_hourthe 25th and 75th percentile of the same constituents the median is taken over, by the same interpolation as percentile_cont - the middle half of this week’s quotes, not a second index
current.status, current.withheld_reasonpublished | withheld. When withheld, usd_per_gpu_hour is null and withheld_reason says why: cause (too_few_providers | not_confirmed_48h), the sentence the page prints, providers_confirmed and providers_required, and each provider not confirmed within 48 h with last_confirmed_at
series[].week_start, usd_per_gpu_hour, quotes, providers, vintage, index_base100one row per published ISO week; vintage = provisional | final
series[].p25_usd_per_gpu_hour, series[].p75_usd_per_gpu_hourthe middle half of each published week: the 25th and 75th percentile of the quotes in that week’s receipt, the same quotes its median was taken over, by the same interpolation as percentile_cont. Added on 2026-09-19 for every published week, closed weeks included, computed from the receipts they already published; no published median changed
series[].by_operator_class.hyperscaler | specialist | marketplacethe same median over the same quotes, split by providers.operator_class: usd_per_gpu_hour, quotes, providers per class, or null; marketplace is always null because floors never enter the index. operator_classes describes the classes
current.weighting_check, series[].weighting_checka check on the weighting rule, not a second index: median_of_provider_medians (the same quotes as the median of each provider’s own median) and difference_usd against the published value, quotes, providers, largest_provider_id and largest_provider_quotes, and hhi (quote shares by provider, 0-10000). weighting states the rule: one quote per (provider, region), so a provider listing several regions enters once per region, and a quote count counts rate cards, not GPUs available to book
withheld[].week_start, vintage, providers_confirmed, providers_requiredweeks since the series began that the coverage guard suppressed; they have no row in series or in price-index.csv
exclusion_ruleswhy a quote is left out of the index, by code: not_confirmed_48h, marketplace_floor, eur_listing
markets_includedone sentence: community-cloud and serverless list prices enter the index (a fixed hourly rate for one H100, not a marketplace floor), unlike the card median - and by how much it would move without them
market_discounts.terms[].market, status, median_pct, min_pct, max_pct, pairs, providers, provider_ids, withheld_reasonthe typical discount on /price-index#discounts: spot, reserved_1y and reserved_3y against the same provider’s on-demand rate for the same card, region and scope, median across every card; a term is published only with min_providers (3) or more providers, else its figures are null and withheld_reason says why. Not part of the index
market_discounts.terms[].rate_pairs[]every pair behind a term, withheld ones too: provider_id, gpu_id, region, price_scope, min_commitment, usd_per_gpu_hour, on_demand_usd_per_gpu_hour, difference_usd, difference_pct, source_url, scraped_at
archived_snapshots.doi, zenodo, hugging_facethe concept DOI of the dated snapshots of the index on Zenodo (it resolves to the latest version), its doi.org link, and the Hugging Face mirror
historical_series.points[]same shape, reconstructed from a public price catalog (named in the methodology); a separate panel, never merged
method, index_base100_method, min_providersthe rules, in words
methodology_version, methodology_changelogsemver of the rules behind these figures and the dated log of their changes (/methodology/changelog); also a column in every CSV and in each receipt, since a copied row keeps it

/price-index.csv CSV

The weekly Cloud GPU Price Index from our own hourly scrape only, one row per published ISO week - no reconstructed history.

Updated: Hourly. · Size now: 8 weeks.

FieldMeaning
week_start, usd_per_gpu_hour, quotes, providers, vintage, index_base100one row per published ISO week. A week with no row was withheld by the coverage guard, not lost: price-index.json lists it under withheld[] with its provider count
hyperscaler_usd_per_gpu_hour, hyperscaler_providers, specialist_usd_per_gpu_hour, specialist_providersthe same week cut by operator class, as by_operator_class in price-index.json; empty when a class has no quote that week
p25_usd_per_gpu_hour, p75_usd_per_gpu_hourthe middle half of the week’s receipt, as series[].p25/p75 in price-index.json; the last two columns, after methodology_version, so a reader that reads by position keeps every earlier column

/price-index-hourly.csv CSV

The same Cloud GPU Price Index at every hourly scrape, one row per point, as the database computed and stored it when the scrape came in; never rewritten. Receipts: /price-index/hourly/{YYYY-Www}.csv, every quote of every point with its read time and source.

Updated: Hourly. · Size now: 1257 points.

FieldMeaning
scraped_at, usd_per_gpu_hour, quotes, providers, statusstatus withheld means fewer than 8 providers and no value
iso_week, receipt, rule_versionthe week and the receipt file the point's quotes are in

/price-index-monthly.csv CSV

The monthly average of the hourly index over a fixed monthly panel: closed months as the database froze them (never revised), the running month provisional. Panels: /price-index/panel/{YYYY-MM}.csv.

Updated: Hourly for the running month; a closed month never changes. · Size now: 2 months.

FieldMeaning
month, usd_per_gpu_hour, status, vintagewithheld when averaged hours cover less than 75% of the month
points, hours, coveragehours averaged, hours in the month (so far), their ratio
panel, panel_pairs, panel_file, frozen_at, rule_versionopen for a month before the panel rule (September 2026); fixed with its panel file after

/price-index-history.csv CSV

The reconstructed H100 series from a public price catalog (named in the methodology), kept in its own file.

Updated: Weekly, the Monday after a week closes. · Size now: 94 weeks.

FieldMeaning
week_start, usd_per_gpu_hour, quotes, providers, index_base100, sourcesource is always skypilot-catalog

/history.json JSON

Weekly history for every model with enough weeks: median and cheapest listed on-demand rate per week, who listed the cheapest and where, from both sources, labelled.

Updated: Hourly for our own series; weekly for the reconstructed one. · Size now: 20 models, 1695 weekly points.

FieldMeaning
index, historical_indexthe two index series, as in price-index.json
models[].gpu_id, series[].sourcesource = gpueconomy | skypilot-catalog
series[].weeks[].week_start, providers, median_usd_per_gpu_hour, min_usd_per_gpu_hourper ISO week; median of each provider’s cheapest region
min_provider, min_region, min_source_urlwho listed the cheapest rate that week, and where to verify it

/token-cost.json JSON

The inputs of the one modelled figure on this site, cost per million output tokens: NVIDIA’s published inference throughput per card, each run with its model, framework, precision, sequence, concurrency and date. Cards are not comparable on it - NVIDIA runs each card in its own configuration.

Updated: When the snapshot of NVIDIA’s figures is refreshed; the file is rebuilt with the site. · Size now: 6 cards, 20 runs.

FieldMeaning
cards[].gpu_id, runs[].model, output_tokens_per_second_per_gputhroughput as NVIDIA published it, per GPU
framework, precision, sequence, concurrency, gpus, date, configthe run that produced it
formula, source_pagehow a rate becomes a cost per million tokens, and where the throughput is published

/changelog.json JSON

Every observed move in a listed rental price, newest first - the list /changelog shows, as data. The same rows and fields as CSV: /changelog.csv.

Updated: Hourly, when a price moved. · Size now: 12779 moves: 30 days for every provider, the last 24 hours for the marketplace (Vast.ai).

FieldMeaning
changed_atthe read at which the new figure was first seen
provider, provider_id, gpu, gpu_id, price_type, regionthe quote that moved; provider_page and gpu_page link back here
listed_currency, was_listed_per_gpu_hour, now_listed_per_gpu_hour, change_pctthe pair in the currency the provider lists, as the move was detected - a EUR quote does not move with the exchange rate
was_usd_per_gpu_hour, now_usd_per_gpu_hourthe same pair in USD per GPU-hour
source_urlthe quote’s current source page; null once the quote is no longer listed

/changelog.xml Atom

Providers’ own rate changes as an Atom feed, to follow in a feed reader: the newest 100 moves from changelog.json with the marketplace floor (Vast.ai) left out, since it moves almost every hour. One entry per move, its id stable, linked to the card page and to the source.

Updated: Hourly, when a price moved. · Size now: up to 100 entries.

FieldMeaning
entry: id, title, updateda stable id per move (provider, GPU, price type, region, read time); the title states the pair and the step, e.g. "Verda NVIDIA B200 (on-demand): $6.29 → $6.36 per GPU-hour, +1.0%"; updated is the read
entry: link alternate / related, category, summarythe card page and the quote’s source page; provider and GPU as categories; the move in a sentence, with the USD pair for a EUR quote

/providers.json JSON

Every provider tracked or listed: type, how its prices are read, what its region label means, and its current contribution.

Updated: With every site build. · Size now: 122 providers, 116 scraped.

FieldMeaning
id, name, typetype = hyperscaler | specialist | marketplace
website, pricing_page, source_kindsource_kind = api | html | js_rendered | console_only | quote_only
summarywhat the provider’s rates cover, in words: markets, region, what the rate leaves out - the first line of its page
regions, scraped, models_tracked, current_quotes, notes, pagenotes = how the source is read (registry detail)
referral_urlour referral link to the provider, where we joined its programme; null elsewhere. The same labelled link as on the provider page: it changes no price, order or inclusion (/methodology#link-policy), and price links stay direct (since 2026-09-28)

/gpus.json JSON

Every GPU model tracked: specs, current coverage, the 3+-seller retail median, and the manufacturer list price where the vendor publishes one.

Updated: With every site build. · Size now: 81 models.

FieldMeaning
id, name, vendor, architecture, vram_gb, form_factorspecs
providers_listing, current_quotescoverage now
rate_cards, rate_card_median_usd_per_gpu_hour, rate_card_p25_usd_per_gpu_hour, rate_card_p75_usd_per_gpu_hourthe card median every page prints - each provider once, at its cheapest on-demand rate, community capacity and marketplace floors out, live quotes only - and the 25th and 75th percentile of the same rate cards; null below at least 2 rate cards for the median and at least 4 for the percentiles
retail_median_new_usd, retail_sellers, retail_price_naturenull until three sellers carry the card; price_nature = list_price (stores’ own prices) | listing (marketplace asks) | sold - the store median where stores carry the card, else the marketplace one, never a mix
manufacturer_list_price_usd, manufacturer_list_price_sourceconsumer cards only; datacenter parts have no published price
page, history_pagehistory_page is null until the model has eight weeks of data

Not a settlement price

These files record the prices providers publish, read as described on /methodology. They are offered as they are, without warranty, as the CC BY 4.0 licence itself states. We do not design, license, run or guarantee any figure here as a settlement, fixing or reference price for a contract, option, token or other instrument, and we are not a party to anything built on them — unless a licence says otherwise (below). A figure can be withheld, marked unconfirmed or stopped, retired or corrected when its source is read again, a quote can be gone from the next build, and the site can be unavailable. Anyone who settles money on these figures carries that risk. Stated on September 27, 2026; nothing about access or the licence changed with it. What the publisher itself does and does not do is on /methodology.

Using the index as a reference price

Since October 1, 2026 the Cloud GPU Price Index has a written specification: what it measures, how each week is computed and from which sources, its calendar, what is final and never recomputed, what happens when a week is withheld, and — stated as plainly — what a settlement reference needs that the free series does not define (a fallback value, a fixed calculation time, a dispute procedure, a notice period, an obligation to continue). The data is free under CC BY 4.0 for any use, settling a contract, option, token or other instrument on it included: the licence is irrevocable, and nobody needs our permission to do that. What the free files do not carry, a settlement licence adds, per licensee and for a fee: those undefined terms, written down and binding on us; the right to name the index as the reference in the instrument's documents, with GPU Economy's agreement; values pushed at the moment they freeze and signed so that a contract can verify them; and indices the free series does not publish (another card, region or averaging window). Write to data@gpueconomy.com with what you settle, on which series and when. Anything built without one runs on the terms above. Changes: October 1, 2026 — first published saying that settling on the index "needs a licence"; corrected the same day, since CC BY 4.0 already permits it.

Reading the numbers

Cite this page

Published under CC BY 4.0: use and redistribute with attribution and a link. Cite the linked source for a price itself, and cite us for the normalization, the index and the comparison. For a single figure, cite the page it appears on; for bulk use, cite this page and name the file.

PlainGPU Economy, "Public GPU pricing dataset", October 28, 2026. https://gpueconomy.com/data
Markdown[GPU Economy, "Public GPU pricing dataset" (October 28, 2026)](https://gpueconomy.com/data)
APAGPU Economy. (2026-10-28). Public GPU pricing dataset. Retrieved from https://gpueconomy.com/data

Data updated: