Financial Literature

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.

ratesmacrofxpricesmoneyKorea
Asset classesrates · macro · fx · prices · money
Frequencydaily → annual
History1960s → today
Limit · costFree key · 10,000 calls/day; the 'sample' key answers at most 10 rows per query
KeyFree key needed — Register at ecos.bok.or.kr/api (Korean interface; email confirmation). The literal key 'sample' answers queries of up to 10 rows for testing.
Formats · pull withjson · xml · browser — python, excel
LicenceFree to use with attribution to the Bank of Korea (Korea Open Government Licence type 1).
RedistributeWith attribution; check series notes
Best for“Korea's base rate and CPI from the source” · “Won per dollar with a long daily history”
When to use it

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.

How to read it

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.

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 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())
How to read the resultCompare with CPI inflation (recipe 2) to see whether Korean policy is restrictive in real terms.

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))
How to read the resultKorea's target is 2%; the index is 2020 = 100 and rebased every five years — the rate is unaffected, the level is not.

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())
How to read the resultWon per dollar: a rising number is a weaker won. Set it beside FRED's broad dollar index to separate 'won weak' from 'dollar strong'.

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.

SeriesAnswersRegionConcept
722Y001 · 0101000What is the Bank of Korea's base rate?Koreapolicy_rate
901Y009 · 0What is Korean inflation? (index → 12-month change)Koreacpi
731Y001 · 0000001Won per dollar, dailyKoreafx_usd
817Y002 · 010210000Where is the 10-year KTB yield?Koreayield_10y
151Y005Is household credit growing?Koreabank_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.