Financial Literature

Bank for International Settlements

BIS Data Portal — Policy rates for 38 economies, credit, property prices and effective exchange rates on one SDMX API

When the question is cross-country — which central banks are cutting, where private credit is highest relative to GDP, real property prices by country, effective exchange rates — and you want one source with one format instead of thirty national ones.

ratesmacrofxmoneyglobal
Asset classesrates · macro · fx · money
Frequencydaily → annual
History1946 → today
Limit · costNo key · fair use
KeyNo key
Formats · pull withcsv · json · sdmx — python, excel, sheets
LicenceBIS terms: free to use and redistribute with attribution; some series carry national restrictions noted in the metadata.
RedistributeWith attribution; check series notes
Best for“Compare policy rates across countries on one axis” · “Credit-to-GDP and property prices, cross-country”
When to use it

Reach for it when…

When the question is cross-country — which central banks are cutting, where private credit is highest relative to GDP, real property prices by country, effective exchange rates — and you want one source with one format instead of thirty national ones.

Not for: A single country's latest decision the day it happens (the national central bank), inflation and GDP (IMF, World Bank, OECD), anything about markets rather than institutions.

How to read it

Units, revisions, traps

Units. Policy rates in percent; credit as a percent of GDP or in national currency; property prices as indices (2010 = 100), nominal and real; EERs as indices (2020 = 100).

Revisions. Credit and property data are revised as national sources revise; policy rates are not.

  • Keys are dotted (D.US for daily United States); the dataflow name (WS_CBPOL) selects the dataset.
  • Effective exchange rates: a rising index is a stronger currency — the opposite of most bilateral quotes.
  • Credit-to-GDP gaps are the BIS's own construction (HP filter) and lag by a quarter.
  • Daily data for several countries is a large response; ask monthly (M.) unless you need the decision dates, and allow a long timeout.

Classic mistake: Reading a falling nominal effective rate as 'the currency is cheap' without the real one.

How to use it in your own work

Three recipes

Each recipe: Python · Excel · Sheets, with how to read the result. Python recipes run under pandas; recipe 1 is re-run by the weekly check where the source allows it.

How to use it in your own work

Copy the snippet, change the series id, read the result the way the footer says. Replace YOUR_…_KEY with your own key where one is needed.

Recipe 1Policy rates, several countries, one call

# central bank policy rates, monthly, for the US, euro area, Japan and Korea
import requests, pandas as pd, io
H = {"User-Agent": "Your Name [email protected]"}   # identify yourself; generic script user-agents are refused
u = "https://stats.bis.org/api/v2/data/dataflow/BIS/WS_CBPOL/1.0/M.US+XM+JP+KR?format=csv&startPeriod=2022-01"
df = pd.read_csv(io.StringIO(requests.get(u, headers=H, timeout=120).text))
wide = df.pivot(index="TIME_PERIOD", columns="REF_AREA", values="OBS_VALUE")
print(wide.tail())
How to read the resultSame axis, same dates: the spread between US and Japanese rates is the carry that moved the yen in 2022–24.

Recipe 2Credit to the private sector as a share of GDP

import requests, pandas as pd, io
H = {"User-Agent": "Your Name [email protected]"}   # identify yourself; generic script user-agents are refused
u = "https://stats.bis.org/api/v2/data/dataflow/BIS/WS_TC/1.0/Q.US+KR+CN+JP.P.A.M.770.A?format=csv&startPeriod=2010-01-01"
df = pd.read_csv(io.StringIO(requests.get(u, headers=H, timeout=120).text))
print(df.pivot(index="TIME_PERIOD", columns="BORROWERS_CTY", values="OBS_VALUE").tail())
How to read the resultKorea's household credit ratio above 100% of GDP is the number behind every BOK decision.

Recipe 3Real property prices by country

import requests, pandas as pd, io
H = {"User-Agent": "Your Name [email protected]"}   # identify yourself; generic script user-agents are refused
u = "https://stats.bis.org/api/v2/data/dataflow/BIS/WS_SPP/1.0/Q.US+KR+DE+AU.R.628?format=csv&startPeriod=2015-01-01"
df = pd.read_csv(io.StringIO(requests.get(u, headers=H, timeout=120).text))
print(df.pivot(index="TIME_PERIOD", columns="REF_AREA", values="OBS_VALUE").tail())
How to read the resultReal (inflation-adjusted) indices at 2010 = 100 make the German and Korean booms comparable.

Series → question map

The ids we use from BIS Data Portal, each with the question it answers. The catalog's compare view reads the concept tags behind these rows.

SeriesAnswersRegionConcept
WS_CBPOL · D.USPolicy rates, cross-countryglobalpolicy_rate
WS_TC · P.A.M.770.AHow indebted is the private sector?globalbank_lending
WS_SPP · R.628Are house prices rising in real terms?globalhouse_prices
WS_EER · D.N.BIs a currency strong against its trading partners?globalfx_effective

Compare with

Same question, different source: FRED, ECB Data Portal, World Bank Indicators API. The compare view lines up coverage, frequency, history and access side by side and lists what the combination makes possible.

Open compare: BIS Data Portal · FRED · ECB Data Portal →

Questions readers ask

Is the BIS API free?

Yes, no key; v2 of the SDMX API with a CSV format option.

Which countries have policy rates?

38 economies with daily data, some back to 1946 (the US) — the WS_CBPOL dataflow.

How do I find a key?

Browse data.bis.org, open a series, and use its 'API' or download link; the dotted key is in the URL.

From the paper

Educational only — we explain, we never advise · snippet licence: public domain · corrections to [email protected], fixed within a day and logged in the changelog.