The public dataset
| Current rental quotes | 1269 | one per provider, GPU, price type and region, each with its source URL and the time it was read |
|---|---|---|
| GPU models | 81 | specs, coverage, retail median where three or more sellers carry the card |
| Providers | 116 scraped, 122 listed | hyperscalers, specialist clouds and 4 marketplaces |
| Weekly history | 102 weeks | 8 from our own scrape, 94 reconstructed from a public price catalog, kept apart |
| Per-model series | 20 models | 1695 weekly points with the cheapest listed rate and who listed it |
| Files | 12 | 7 JSON, 4 CSV, 1 Atom feed — no key, no rate limit |
| Updated | hourly | rental prices every hour when a price moved, retail weekly, history weekly |
| License | CC BY 4.0 | attribution to “GPU Economy” with a link to the page or file used |
| Archived | 10.5281/zenodo.22706541 | the 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
| File | What it holds | Size 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:
| URL | Contains | Files |
|---|---|---|
/gpu/{gpu_id}/prices.json | every current rate for one card, across providers — e.g. /gpu/h100-sxm/prices.json | 81 |
/providers/{provider_id}/prices.json | every current rate at one provider, across cards — e.g. /providers/runpod/prices.json | 122 |
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.
list_gpus- every GPU model with its id, VRAM, providers and median on-demand rate card.gpu_prices- current rates for one GPU, cheapest first; on-demand by default, or any market.provider_prices- every current rate at one provider.price_index- the H100 Price Index this week and the last eight weeks.recent_price_changes- quotes whose listed price changed in the last 30 days, one row each; marketplace floors on request.
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.
| Field | Meaning |
|---|---|
provider, provider_id, gpu, gpu_id | names and slugs; provider_page and gpu_page link back here |
price_type | on_demand | spot | reserved |
market | which 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_scope | instance | gpu_only | marketplace_floor | advertised_from - what the figure covers |
risk | low | 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) |
region | the provider’s own partition label (a geography, a data center, or a tier); null = global |
instance | what 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_hour | the normalized, comparable figure |
listed_price_usd_hour, listed_unit, gpu_count | the quote as listed (per_gpu or per_node) and the divisor |
listed_currency, listed_price_hour, fx_rate, fx_date | for 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_at | where and when the price was read |
listed_since, listed_since_first_read | since 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_version | semver of the rules behind these figures; the dated log is /methodology/changelog |
change_notices | at 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, status | when 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_reason | on 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_pct | the 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.
| Field | Meaning |
|---|---|
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_is | how 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, details | false: 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_hour | the 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_reason | published | 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_base100 | one row per published ISO week; vintage = provisional | final |
series[].p25_usd_per_gpu_hour, series[].p75_usd_per_gpu_hour | the 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 | marketplace | the 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_check | a 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_required | weeks since the series began that the coverage guard suppressed; they have no row in series or in price-index.csv |
exclusion_rules | why a quote is left out of the index, by code: not_confirmed_48h, marketplace_floor, eur_listing |
markets_included | one 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_reason | the 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_face | the 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_providers | the rules, in words |
methodology_version, methodology_changelog | semver 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.
| Field | Meaning |
|---|---|
week_start, usd_per_gpu_hour, quotes, providers, vintage, index_base100 | one 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_providers | the 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_hour | the 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.
| Field | Meaning |
|---|---|
scraped_at, usd_per_gpu_hour, quotes, providers, status | status withheld means fewer than 8 providers and no value |
iso_week, receipt, rule_version | the 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.
| Field | Meaning |
|---|---|
month, usd_per_gpu_hour, status, vintage | withheld when averaged hours cover less than 75% of the month |
points, hours, coverage | hours averaged, hours in the month (so far), their ratio |
panel, panel_pairs, panel_file, frozen_at, rule_version | open 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.
| Field | Meaning |
|---|---|
week_start, usd_per_gpu_hour, quotes, providers, index_base100, source | source 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.
| Field | Meaning |
|---|---|
index, historical_index | the two index series, as in price-index.json |
models[].gpu_id, series[].source | source = gpueconomy | skypilot-catalog |
series[].weeks[].week_start, providers, median_usd_per_gpu_hour, min_usd_per_gpu_hour | per ISO week; median of each provider’s cheapest region |
min_provider, min_region, min_source_url | who 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.
| Field | Meaning |
|---|---|
cards[].gpu_id, runs[].model, output_tokens_per_second_per_gpu | throughput as NVIDIA published it, per GPU |
framework, precision, sequence, concurrency, gpus, date, config | the run that produced it |
formula, source_page | how 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).
| Field | Meaning |
|---|---|
changed_at | the read at which the new figure was first seen |
provider, provider_id, gpu, gpu_id, price_type, region | the quote that moved; provider_page and gpu_page link back here |
listed_currency, was_listed_per_gpu_hour, now_listed_per_gpu_hour, change_pct | the 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_hour | the same pair in USD per GPU-hour |
source_url | the 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.
| Field | Meaning |
|---|---|
entry: id, title, updated | a 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, summary | the 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.
| Field | Meaning |
|---|---|
id, name, type | type = hyperscaler | specialist | marketplace |
website, pricing_page, source_kind | source_kind = api | html | js_rendered | console_only | quote_only |
summary | what 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, page | notes = how the source is read (registry detail) |
referral_url | our 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.
| Field | Meaning |
|---|---|
id, name, vendor, architecture, vram_gb, form_factor | specs |
providers_listing, current_quotes | coverage now |
rate_cards, rate_card_median_usd_per_gpu_hour, rate_card_p25_usd_per_gpu_hour, rate_card_p75_usd_per_gpu_hour | the 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_nature | null 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_source | consumer cards only; datacenter parts have no published price |
page, history_page | history_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
- usd_per_gpu_hour is the only cross-provider comparable figure. A node price is divided by its GPU count; a per-second rate is multiplied by 3,600; a listing in another currency is converted at the official rate stored next to it (ECB; the Bank of Russia for RUB and VND).
- price_scope says what a figure covers: a full instance, the GPU line item alone, a marketplace floor (median of the five cheapest verified asks), or an advertised “from” rate. Compare like with like.
- The index is a level (the dollar median, printed with its panel size) and a change (the base-100 index, which moves only when a listed price changes). Cite the median for “what it costs” and the index for “how it moved”.
- Vintage: the running week is provisional and is recomputed every hour; a week that has closed is final and never recomputed.
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.
| Plain | GPU 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) |
| APA | GPU Economy. (2026-10-28). Public GPU pricing dataset. Retrieved from https://gpueconomy.com/data |
Data updated: