Big Mac Index API
Big Mac prices, exchange rates, and purchasing power parity as plain JSON and CSV over HTTPS — 54 countries and aggregates, 2000–2026. Open CORS, no signup, no API key, no rate limit.
Try it now
Paste this in a terminal. There is no setup step — the endpoint is live as you read this.
curl -s https://bigmacindex.app/data/countries.json | head -20 Every file under /data/ comes back with these headers, which is what makes browser fetch() work without a proxy:
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=3600 Endpoints
Five files, all under https://bigmacindex.app/data/. GET and HEAD only.
GET /data/countries.json 17 KB
Array of the latest snapshot, one object per country, pre-ranked and pre-joined with display metadata (slug, flag, region, currency symbol).
The one to start with. Everything you need for a table or a map.
GET /data/bigmac-latest.json 14 KB
Latest snapshot with the raw Economist fields, including the GDP-adjusted index. Wrapped in an object with updated / source / latestDate.
When you need usdRaw / usdAdjusted / gdpBigmac rather than display fields.
GET /data/bigmac-history.json 297 KB
Full time series, keyed by snapshot date (2000–2026). Each key holds a trimmed array for that period.
Charts. Grab one key for a period, or one ISO across all keys for a country series.
GET /data/bigmac.csv 331 KB
Every record ever published, 2,056 rows × 19 columns, including the base-currency variants (EUR / GBP / JPY / CNY) that the JSON files omit.
Analysis in pandas / R / Excel. The most complete of the five.
GET /data/bigmac-meta.json 1 KB
Provenance: upstream CSV URL, upstream publication timestamp, our retrieval timestamp, record count, date range, column list.
Cheap freshness check — poll this instead of re-downloading the CSV.
Response fields
/data/countries.json
A flat array, sorted by USD price descending and pre-ranked.
[
{
"rank": 1,
"code": "CHE",
"slug": "switzerland",
"name": "Switzerland",
"flag": "🇨🇭",
"region": "europe",
"currency": {
"code": "CHF",
"symbol": "CHF"
},
"local_price": 7.3,
"dollar_ex": 0.80735,
"price_usd": 9.0419272929956,
"diff_percent": 45.4
},
...
] | Field | Type | Description |
|---|---|---|
rank | number | 1 = most expensive Big Mac in USD terms |
code | string | ISO 3166-1 alpha-3. EUZ is the euro-area aggregate, not a country |
slug | string | URL segment for the country page: /country/{slug}/ |
region | string | europe | asia | americas | africa | oceania | other |
currency.code | string | ISO 4217 currency code |
local_price | number | Big Mac price in local currency |
dollar_ex | number | Exchange rate, local units per 1 USD, at the snapshot date |
price_usd | number | local_price / dollar_ex. Not rounded — round it yourself for display |
diff_percent | number | % vs the US Big Mac. Positive = currency looks overvalued against the dollar |
/data/bigmac-latest.json
Same snapshot, raw Economist fields, sorted by ISO code. Note the field names are camelCase here and snake_case in countries.json — the two files were written years apart and the names are frozen so existing consumers keep working.
| Field | Type | Description |
|---|---|---|
updated | string | ISO timestamp of the upstream publication this file was built from |
latestDate | string | Snapshot date, YYYY-MM-DD |
countries[].iso | string | ISO 3166-1 alpha-3 |
countries[].localPrice | number | Big Mac price in local currency |
countries[].dollarPrice | number | Big Mac price in USD |
countries[].dollarEx | number | Exchange rate, local units per 1 USD |
countries[].usdRaw | number | Raw Big Mac Index vs USD. 0.45 = 45% overvalued |
countries[].usdAdjusted | number | null | GDP-adjusted index vs USD. null where The Economist publishes no GDP figure |
countries[].gdpBigmac | number | null | GDP-adjusted implied exchange rate. Same null caveat |
/data/bigmac-history.json
An object keyed by snapshot date, not an array. Each value is a trimmed array for that period.
{
"2000-04-01": [ { "iso": "ARG", "name": "Argentina",
"localPrice": 2.5, "dollarPrice": 2.5,
"usdRaw": 0.11607 } ... ],
"2026-07-01": [ ... ]
} Country coverage grows over time — early snapshots carry far fewer countries than the current one. Do not assume every key holds the same list.
/data/bigmac.csv
19 columns, documented in full on the data download page — the same table, not repeated here.
Examples
curl
# The latest snapshot, one object per country
curl -s https://bigmacindex.app/data/countries.json
# Just Japan, with jq
curl -s https://bigmacindex.app/data/countries.json \
| jq '.[] | select(.code == "JPN")'
# Check freshness without downloading the dataset
curl -s https://bigmacindex.app/data/bigmac-meta.json | jq '.sourcePublishedAt'
# Full history as CSV
curl -O https://bigmacindex.app/data/bigmac.csv JavaScript fetch()
// CORS is open, so this works from any origin — no key, no proxy.
const res = await fetch('https://bigmacindex.app/data/countries.json');
if (!res.ok) throw new Error('HTTP ' + res.status);
const countries = await res.json();
const japan = countries.find((c) => c.code === 'JPN');
console.log(japan.name, japan.price_usd.toFixed(2), japan.diff_percent);
// → Japan 3.08 -50.4
// Cheapest five, by USD price
const cheapest = [...countries]
.sort((a, b) => a.price_usd - b.price_usd)
.slice(0, 5)
.map((c) => `${c.flag} ${c.name}: $${c.price_usd.toFixed(2)}`);
console.log(cheapest); Building a time series
// One country's series across every snapshot
const history = await fetch('https://bigmacindex.app/data/bigmac-history.json')
.then((r) => r.json());
const series = Object.entries(history)
.map(([date, rows]) => {
const row = rows.find((r) => r.iso === 'CHE');
return row ? { date, usd: row.dollarPrice } : null;
})
.filter(Boolean);
console.log(series.length + ' snapshots for Switzerland'); What this is, and what it is not
These are static files on a CDN, not a hosted application. That is the whole design — it is why there is no key and no rate limit, and it is also the source of every limitation below. Read this list before you build on it.
- No query parameters. No filtering, no pagination, no
?base=EUR. You download the whole file and filter client-side. The largest file is 331 KB. - No authentication and no rate limit — and therefore no SLA and no uptime guarantee. If your product cannot tolerate an outage, mirror the files.
- Updated on site rebuild, not on a schedule. The Economist publishes twice a year; we refresh within days of each release. Poll
/data/bigmac-meta.jsonrather than guessing. - No live FX. The
dollar_exvalues are The Economist's snapshot rates for the snapshot date. The live conversion on our calculator uses a separate in-browser feed that is not part of these files. - No versioning. Files are overwritten in place on each release. If you need a reproducible figure for a paper, keep your own dated copy and cite the snapshot date.
- Responses are cached for one hour (
Cache-Control: public, max-age=3600). A fresh release may take up to an hour to reach you. - Coverage is the Economist series only. The files carry the 54 countries and aggregates The Economist publishes. This site has 76 country pages, because it also covers 5 euro-area countries broken out of the
EUZaggregate by our own editorial research and 17 markets with no McDonald's at all. Neither of those layers is in these files. If you need them, they are on the country pages, not here.
If you need something this does not do — a filtered endpoint, a webhook, a guaranteed uptime — say so. That is a better reason to build it than a guess.
License & attribution
Free under Creative Commons Attribution 4.0 International (CC-BY 4.0), for personal, academic, and commercial use alike. Attribution is the only condition. If you publish a number, a chart, or an answer built on this data:
BigMacIndex.app, Big Mac Index Dataset, retrieved 2026-08-10, https://bigmacindex.app/data/
Underlying Big Mac prices come from The Economist's Big Mac Index, MIT-licensed via TheEconomist/big-mac-data. Code samples on this page are MIT.
Where the numbers come from
Source tiers, confidence scoring, how in-store prices differ from delivery-platform prices, and why the euro area is published as one aggregate — all of it is written up on the methodology page. If you are going to publish anything from these files, read it first; the EUZ row in particular is a common way to get a chart wrong.
Human-readable downloads with the same data live at /data/.