Skip to content
RPI

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.csv

    One row per product × plan × storefront × channel × billing cycle.

    text/csv
  • countries.csv

    Storefront metadata: index score, tax, gift cards, IMF PPP rate, postal formats.

    text/csv
  • history.csv

    Observed price change log with USD value at the time.

    text/csv
  • dataset.json

    Everything above plus per-product summaries; filterable with ?product=&country=&channel=&cycle=&verified=1.

    application/json
  • datapackage.json

    Frictionless Tabular Data Package manifest.

    application/json
  • .zenodo.json

    Zenodo deposit metadata (GitHub release → DOI).

    application/json
  • dataset-metadata.json

    Kaggle dataset metadata for `kaggle datasets version`.

    application/json
  • llms-full.txt

    Full Markdown corpus for AI answer engines.

    text/markdown

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

FieldTypeDescription
product_slugstringProduct identifier (URL slug)
product_namestringProduct display name
plan_idstringPlan tier identifier, e.g. plus, pro, 2tb
plan_namestringPlan tier display name
categorystringai | streaming | productivity | cloud | steam | apple
billing_cyclestringmonthly | annual | one_time
country_codestringISO 3166-1 alpha-2 storefront
country_slugstringCountry URL slug
channelstringios | play | web | steam
local_pricenumberList price in the billing currency
currencystringISO 4217 billing currency
fx_ratenumberUnits of currency per USD at snapshot
spot_usdnumberlocal_price / fx_rate
landed_usdnumberspot_usd × (1 + observed reseller premium) on gift-card routes with an observed listing; otherwise spot_usd. No tax added
savings_vs_usnumber1 − landed_usd / lowest US list price (same plan and cycle)
spread_vs_usnumberspot_usd / lowest US list price − 1
work_hoursnumberHours of GNI per capita per month of use (or per purchase): spot / (GNI per capita / 2000)
ppp_intl_usdnumberLocal price per month of use (or per purchase) ÷ IMF implied PPP conversion rate
payment_routestringgift_card (official gift cards; Steam: resold wallet codes) | store_payment (no gift cards) | web_checkout (vendor checkout)
verification_tierstringpurchase_tested | checkout_checked | source_verified | observed
is_best_channelbooleanCheapest landed channel for this plan in this storefront
observed_atdateDate the price was observed
source_urlstringWhere the price was read