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
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
- Every figure is one an authoritative source published. Nothing is extrapolated from a growth rate, interpolated across a gap, or derived from an average transaction size. Where a source has published nothing, the field is
nullor the period is absent. See the methodology in full. - Local currency is the record. Both USD fields are derived from
value_local, never the reverse. Where they disagree,value_localis the figure to use. - USD figures are for comparison only, and for volatile currencies the two bases can differ by several times over. Which one is right depends on your question — currency conversion sets out both.
- Rates do not move once published. The rate for a completed year is written once and left alone, so a 2021 dollar figure returned today will be the same figure next year.
- Only completed periods appear. A part-year is never returned as though it were a full one, and a fiscal year appears once its own end date has passed.
- Reporting granularity varies by system — see
data_frequency. So does history: Faster Payments (2008) goes back further than FedNow (2023). - Responses are cached for one hour. The underlying data changes monthly at most, so caching further is safe.
- This API is for informational purposes only. See the dashboard disclaimer for full terms.