Open data
Observed local list prices of 15 digital subscriptions, games and devices (21 plan tiers) across 18 storefronts on App Store, direct web and Steam, with FX-converted USD, landed cost adjusted only by observed gift-card reseller premiums, official gift-card availability, IMF PPP and work-hour affordability (GNI per capita), and a verification tier.
- Price rows
- 351
- Observed
- 351
- History points
- 351
- Snapshot
- Oct 20, 2026
- License
- CC BY 4.0
Downloads
- prices.csvtext/csv
One row per product × plan × storefront × channel × billing cycle.
- countries.csvtext/csv
Storefront metadata: index score, tax, gift cards, IMF PPP rate, postal formats.
- history.csvtext/csv
Observed price change log with USD value at the time.
- dataset.jsonapplication/json
Everything above plus per-product summaries; filterable with ?product=&country=&channel=&cycle=&verified=1.
- datapackage.jsonapplication/json
Frictionless Tabular Data Package manifest.
- .zenodo.jsonapplication/json
Zenodo deposit metadata (GitHub release → DOI).
- dataset-metadata.jsonapplication/json
Kaggle dataset metadata for `kaggle datasets version`.
- llms-full.txttext/markdown
Full Markdown corpus for AI answer engines.
Cite this dataset
RegionalPriceIndex.com (2026). Regional Price Index: Multi-Channel Digital Subscription Prices by Country. Version 2026.10.20. https://regionalpriceindex.com/open-data/
@dataset{regionalpriceindex_2026,
author = {{RegionalPriceIndex.com}},
title = {Regional Price Index: Multi-Channel Digital Subscription Prices by Country},
year = {2026},
version = {2026.10.20},
publisher = {RegionalPriceIndex.com},
url = {https://regionalpriceindex.com/open-data/},
note = {Licensed CC BY 4.0}
} Monthly releases are built by scripts/export_open_data.py and deposited to Zenodo (citable DOI per version) and Kaggle from the same datapackage.json, .zenodo.json and dataset-metadata.json.
API
curl "https://regionalpriceindex.com/api/dataset.json?product=chatgpt&country=india&verified=1" \
| jq '.prices[] | {plan_id, channel, local_price, currency, landed_usd}' CORS-enabled JSON, cached at the edge for an hour, no key required. Add history=1 for the price change log.
Field dictionary: prices.csv
| Field | Type | Description |
|---|---|---|
| product_slug | string | Product identifier (URL slug) |
| product_name | string | Product display name |
| plan_id | string | Plan tier identifier, e.g. plus, pro, 2tb |
| plan_name | string | Plan tier display name |
| category | string | ai | streaming | productivity | cloud | steam | apple |
| billing_cycle | string | monthly | annual | one_time |
| country_code | string | ISO 3166-1 alpha-2 storefront |
| country_slug | string | Country URL slug |
| channel | string | ios | play | web | steam |
| local_price | number | List price in the billing currency |
| currency | string | ISO 4217 billing currency |
| fx_rate | number | Units of currency per USD at snapshot |
| spot_usd | number | local_price / fx_rate |
| landed_usd | number | spot_usd × (1 + observed reseller premium) on gift-card routes with an observed listing; otherwise spot_usd. No tax added |
| savings_vs_us | number | 1 − landed_usd / lowest US list price (same plan and cycle) |
| spread_vs_us | number | spot_usd / lowest US list price − 1 |
| work_hours | number | Hours of GNI per capita per month of use (or per purchase): spot / (GNI per capita / 2000) |
| ppp_intl_usd | number | Local price per month of use (or per purchase) ÷ IMF implied PPP conversion rate |
| payment_route | string | gift_card (official gift cards; Steam: resold wallet codes) | store_payment (no gift cards) | web_checkout (vendor checkout) |
| verification_tier | string | purchase_tested | checkout_checked | source_verified | observed |
| is_best_channel | boolean | Cheapest landed channel for this plan in this storefront |
| observed_at | date | Date the price was observed |
| source_url | string | Where the price was read |