Bank of Korea
BOK ECOS — Korea's base rate, won, CPI and household credit — the Bank of Korea's own statistics API
Anything Korean and monetary: the base rate, market rates, USD/KRW, CPI, household credit, money supply — from the institution that publishes them, with history FRED does not carry.
Reach for it when…
Anything Korean and monetary: the base rate, market rates, USD/KRW, CPI, household credit, money supply — from the institution that publishes them, with history FRED does not carry.
Not for: Korean company filings (OpenDART), KOSPI prices (KRX or a market-data API), anything outside Korea.
Units, revisions, traps
Units. Rates in percent; USD/KRW in won per dollar; CPI as an index (2020 = 100); credit in ₩ billions.
Revisions. CPI is final; credit and money aggregates are revised.
- Statistic codes (722Y001) and item codes (0101000) are numeric and their labels are Korean — the card maps the ones we use.
- The URL path encodes frequency (D, M, Q, A) and the date format must match it (YYYYMMDD, YYYYMM, YYYYQn, YYYY).
- The API returns strings; cast DATA_VALUE to float.
Classic mistake: Reading the CPI index level as an inflation rate.
Three recipes
- Recipe 1 · The base rate, monthly
- Recipe 2 · Korean CPI as a 12-month rate
- Recipe 3 · Won per dollar, daily
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 1The base rate, monthly
# statistic 722Y001 (Bank of Korea base rate), item 0101000, monthly — last ten months
import requests, pandas as pd
KEY = "sample" # the sample key answers at most 10 rows; use your own free key for history
u = f"https://ecos.bok.or.kr/api/StatisticSearch/{KEY}/json/kr/1/10/722Y001/M/202601/202612/0101000"
rows = requests.get(u, timeout=30).json()["StatisticSearch"]["row"]
df = pd.DataFrame(rows)
s = df.set_index(pd.to_datetime(df.TIME, format="%Y%m"))["DATA_VALUE"].astype(float)
print(s.tail())- Data → From Web → the same URL (with your key) → expand StatisticSearch › row.
- No native JSON import — use the Python recipe and export CSV.
Recipe 2Korean CPI as a 12-month rate
# statistic 901Y009 (consumer price index), item 0 (all items), monthly
import requests, pandas as pd
KEY = "YOUR_ECOS_KEY" # the sample key answers at most 10 rows
u = f"https://ecos.bok.or.kr/api/StatisticSearch/{KEY}/json/kr/1/200/901Y009/M/201001/202612/0"
rows = requests.get(u, timeout=30).json()["StatisticSearch"]["row"]
df = pd.DataFrame(rows)
s = df.set_index(pd.to_datetime(df.TIME, format="%Y%m"))["DATA_VALUE"].astype(float)
print((s.pct_change(12) * 100).dropna().tail(6).round(1))- From Web with the same URL; add a 12-row percent change column.
- Use the Python recipe.
Recipe 3Won per dollar, daily
# statistic 731Y001 (exchange rates), item 0000001 (USD), daily
import requests, pandas as pd
KEY = "YOUR_ECOS_KEY" # the sample key answers at most 10 rows
u = f"https://ecos.bok.or.kr/api/StatisticSearch/{KEY}/json/kr/1/100/731Y001/D/20260101/20261231/0000001"
rows = requests.get(u, timeout=30).json()["StatisticSearch"]["row"]
df = pd.DataFrame(rows)
s = df.set_index(pd.to_datetime(df.TIME, format="%Y%m%d"))["DATA_VALUE"].astype(float)
print(s.tail())- From Web with the same URL.
- Use the Python recipe.
Series → question map
The ids we use from BOK ECOS, each with the question it answers. The catalog's compare view reads the concept tags behind these rows.
| Series | Answers | Region | Concept |
|---|---|---|---|
| 722Y001 · 0101000 | What is the Bank of Korea's base rate? | Korea | policy_rate |
| 901Y009 · 0 | What is Korean inflation? (index → 12-month change) | Korea | cpi |
| 731Y001 · 0000001 | Won per dollar, daily | Korea | fx_usd |
| 817Y002 · 010210000 | Where is the 10-year KTB yield? | Korea | yield_10y |
| 151Y005 | Is household credit growing? | Korea | bank_lending |
Compare with
Same question, different source: FRED, ECB Data Portal, OpenDART. The compare view lines up coverage, frequency, history and access side by side and lists what the combination makes possible.
Open compare: BOK ECOS · FRED · ECB Data Portal →
Curated: Policy rate and inflation for a country · Is the won weak or the dollar strong?.
Questions readers ask
Do I need a Korean phone number to register?
No — an email address. The interface is Korean; the API itself is language-neutral.
Can I test without a key?
Yes, the literal key 'sample' answers queries of up to 10 rows; larger requests return ERROR-301. Use it only to check a URL.
Where are the item codes?
On the ECOS site each statistic lists its items with codes; the API's StatisticItemList endpoint returns them as JSON.
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.