← Back to Dashboard

API Documentation

Programmatic access to real-time payment system data

Overview

The RTP Dashboard API provides read-only access to transaction data, time series, and metadata for 33 real-time payment systems worldwide. Data is sourced from central banks, payment operators, and BIS CPMI statistics.

All responses are JSON. No authentication is required.

Base URL

https://rtpdashboard.net/.netlify/functions/api

Endpoints

GET /latest Try it →

Returns all payment system data: latest summaries, historical time series, system metadata, and exchange rates.

Response Fields

Field Type Description
data object Latest confirmed period for each system. Keyed by system ID.
timeseries object Full history per system. Keyed by system ID. Arrays of data points in ascending period order, at whatever granularity the operator publishes.
systems object Metadata for each system. Keyed by system ID. Includes name, country, flag emoji, region, currency, launch year, operator, settlement type, infrastructure capabilities, description, and participant count.
fx_historical object The rate table every USD figure in this response was produced from. Keyed by ISO 4217 currency code, then by year, giving units of local currency per US dollar (period average). Covers 2009 onwards.
fx_basis object Which basis produced which field, the year used by the fixed basis (constant_basis_year), the rate source, and any currency-years supplied from somewhere other than the main source (exceptions).
systems_with_data number Count of systems with at least one confirmed period. Systems with none are absent from data and timeseries entirely.
total_systems number Count of systems in systems.
updated_at string ISO 8601 timestamp of when this response was generated. Not the date the data was last revised.
exchange_rates object Deprecated. Single-point spot rates, retained for older clients. No figure in this response is produced from them — use fx_historical. Note the opposite direction: these are US dollars per unit of local currency.
fx_meta object Deprecated. Provenance for exchange_rates only.

Example Response

{
  "data": {
    "upi": {
      "system": "upi",
      "transaction_count": 21634670000,
      "transaction_value_usd": 320876837684,
      "period_end": "2025-12-01",
      "data_frequency": "monthly",
      "source": "NPCI",
      "source_url": "https://www.npci.org.in/product/upi/product-statistics",
      "source_published": "2026-01-12"
    }
    // ... one entry per system with confirmed data
  },

  "timeseries": {
    "upi": [
      {
        "period": "2021-01-01",
        "volume": 2302730000,
        "value_usd": 58189529040,
        "value_usd_fixed": 49471037853,
        "value_local": 4311818900000,
        "fx_year": 2020
      }
      // ... more data points, ascending by period
    ]
  },

  "systems": {
    "upi": {
      "name": "UPI",
      "country": "India",
      "flag": "\ud83c\uddee\ud83c\uddf3",
      "region": "asia_pacific",
      "currency": "INR",
      "launched": 2016,
      "type": "Account Transfer + QR",
      "operator": "NPCI",
      "settlement": "Instant",
      "rail": "UPI",
      "population": 1430000000,
      "participants": 300,
      "infra": {
        "qr": "yes",
        "wallet": "yes",
        "twentyFourSeven": true,
        "crossBorder": "yes",
        "iso20022": "no",
        "requestToPay": "yes",
        "openApi": "yes",
        "proxy": "yes"
      },
      "description": "Unified Payments Interface..."
    }
  },

  "fx_historical": {
    "INR": { "2009": 48.4052667, "2010": 45.7258121, "2024": 83.6692816, "2025": 87.1584484 },
    "USD": { "2009": 1, "2025": 1 }
    // local currency units per US dollar, period average
  },

  "fx_basis": {
    "default": "each_year",
    "constant_basis_year": 2025,
    "source": {
      "source": "World Bank, Official exchange rate (LCU per US$, period average), indicator PA.NUS.FCRF",
      "underlying_source": "IMF International Financial Statistics",
      "url": "https://data.worldbank.org/indicator/PA.NUS.FCRF",
      "source_last_updated": "2026-07-13"
    },
    "exceptions": {}
  },

  "systems_with_data": 37,
  "total_systems": 37,
  "updated_at": "2026-07-28T09:14:22.108Z"
}

Data Entry Fields

Each entry in data is the most recent confirmed period for that system, and contains:

Field Type Description
system string System ID, repeating the key
transaction_count number | null Transactions in the period. null where the operator publishes value but not volume.
transaction_value_usd number | null Value in USD on the each-year basis. null where the operator publishes volume but not value, or where no rate exists for the currency-year.
period_end string Last day of the period, YYYY-MM-DD
data_frequency string One of monthly, quarterly, or annual \u2014 the granularity the operator publishes at
source string The operator, central bank or scheme that published the figure
source_url string|null Link to the publication the figures were read from, so you can check our working. Every system carrying data has one.
source_published string|null Date of the edition used, YYYY-MM-DD. Sources restate: this records which vintage a figure came from.

Timeseries Point Fields

Each point in a timeseries array contains:

Field Type Description
period string Last day of the period, YYYY-MM-DD. Read it with the system's data_frequency to know the span: 2026-03-31 on an annual system is the twelve months to that date, not March.
volume number | null Transactions in the period
value_local number | null Value in the currency the operator published it in. This is the record; both USD fields are derived from it.
value_usd number | null Converted at the rate for fx_year \u2014 what the flow was worth at the time
value_usd_fixed number | null Every period converted at one year's rate (fx_basis.constant_basis_year), which takes exchange-rate movement out of a multi-year comparison
fx_year number | null The rate year applied to value_usd: the calendar year containing the period's midpoint, so a year ending 31 March 2026 uses 2025. null when the source published a dollar figure itself, in which case both USD fields carry it verbatim and no conversion was performed.

A null is not a zero. It means the source has not published that figure. Treating it as zero will understate any total you build. Where value_local is present but both USD fields are null, no period-average rate exists for that currency-year \u2014 convert from value_local yourself if you have a rate you trust.

System Metadata Fields

Each entry in systems contains:

Field Type Description
name string Display name of the payment system
country string Country or region where the system operates
flag string Flag emoji for the country
region string Geographic region (asia_pacific, europe, americas, africa_mideast)
currency string ISO 4217 currency code
launched number Year the system launched
operator string Organization that operates the system
settlement string Settlement type (e.g. "Instant", "Near-instant")
type string What the system does (e.g. "Account Transfer + QR")
rail string The underlying rail the system clears over, where it runs on top of another
population number Population of the addressable market, for per-capita comparisons
infra object Capabilities: qr, wallet, crossBorder, iso20022, requestToPay, openApi, proxy — each the string "yes", "no" or "partial". twentyFourSeven is a boolean.
participants number Approximate number of participating institutions
description string Detailed description of the payment system

System IDs

The API uses the following 37 system identifiers as keys in data, timeseries, and systems:

upi UPI (India)
imps IMPS (India)
pix Pix (Brazil)
fps_uk Faster Payments (UK)
fps_hk FPS (Hong Kong)
npp NPP (Australia)
sct_inst SEPA Instant (EU)
spei SPEI (Mexico)
swish Swish (Sweden)
zengin Zengin (Japan)
paynow FAST (Singapore)
ibps IBPS (China)
fast_tr Fast System (Turkey)
snp_ar SNP (Argentina)
fednow FedNow (US)
rtp_us RTP (US)
promptpay PromptPay (Thailand)
duitnow DuitNow (Malaysia)
bi_fast BI-FAST (Indonesia)
qris QRIS (Indonesia)
instapay_ph InstaPay (Philippines)
napas247 NAPAS 247 (Vietnam)
sarie Sarie (Saudi Arabia)
fawri_plus Fawri+ (Bahrain)
instapay_eg InstaPay EG (Egypt)
mpesa M-Pesa (Kenya)
twint TWINT (Switzerland)
nip NIP (Nigeria)
interac Interac e-Transfer (Canada)
blik BLIK (Poland)
raast Raast (Pakistan)
ipp_ae IPP (UAE)
bakong Bakong (Cambodia)
sbp_ru SBP (Russia)
cefts_lk CEFTS (Sri Lanka)
fisc_tw FISC (Taiwan)
cliq_jo CliQ (Jordan)

Usage Example

// Fetch all data
const response = await fetch('https://rtpdashboard.net/.netlify/functions/api/latest');
const { data, timeseries, systems, fx_historical, fx_basis } = await response.json();

// Latest confirmed period for UPI
console.log(data.upi.transaction_count, data.upi.period_end);
// => 21634670000 '2025-12-01'

// Length of the Pix series
console.log(timeseries.pix.length);

// System metadata
console.log(systems.fps_uk.operator);
// => "Pay.UK"

// The rate a given point was converted at — local currency per US dollar
const point = timeseries.upi.at(-1);
console.log(fx_historical[systems.upi.currency][point.fx_year]);
// => 87.1584484

// Annual totals for one system, on either basis.
// Skip nulls rather than coercing them: a null is an unpublished figure, not a zero.
function annualTotals(id, field = 'value_usd') {
  const out = {};
  for (const d of timeseries[id]) {
    if (d[field] == null) continue;
    const year = d.period.slice(0, 4);
    out[year] = (out[year] || 0) + d[field];
  }
  return out;
}

annualTotals('nip');                    // contemporaneous dollars
annualTotals('nip', 'value_usd_fixed'); // every year at the fx_basis.constant_basis_year rate
annualTotals('nip', 'value_local');     // the published record

// Note: a year is only complete if every period in it is present. For an annual
// system reporting on a fiscal year, `period.slice(0, 4)` is the year the period
// ENDED in, not a calendar year — check `systems[id]` and `data[id].data_frequency`
// before comparing across systems.

Rate Limits

This API is hosted on Netlify Functions and subject to standard Netlify rate limits:

  • Up to 125,000 function invocations per site per month (free tier)
  • Maximum 10-second execution timeout per request
  • Response size limit of 6 MB

For high-volume use cases, consider caching responses locally. The underlying data is updated monthly at most, so aggressive caching is safe.

Notes