BOK (BOK_BASE_RATE) Rate Change

BOK (BOK_BASE_RATE) Rate Change

You need to track and react to changes in the Bank of Korea’s policy rate (BOK_BASE_RATE) directly in your application. By the end of this article, you’ll be able to query the latest and historical BOK_BASE_RATE, stream it into dashboards and risk models, compute spreads and loan costs, and design robust caching around a monthly publication cadence using the Interest Rates API.

What the BOK_BASE_RATE represents and how it’s published

BOK_BASE_RATE is the Bank of Korea’s base policy rate (KRW). It is a central bank benchmark that guides short-term money market conditions and influences mortgage, SME, and corporate borrowing costs across Korea. It matters for banks’ repricing frameworks, variable-rate loans indexed to policy benchmarks, and macro models that rely on policy stance signals.

Frequency: monthly. As a central bank policy rate, BOK_BASE_RATE is not updated every calendar day. In the Interest Rates API, monthly symbols are served on business days and aligned to effective dates in the source time series. For requests targeting a particular day, the API returns the latest available value for that period; for the historical endpoint, the last day with data within that month is used when you query a date inside that month.

Units and interpretation: returned values are numeric interest rates in percent per annum. For finance calculations, convert to decimals where needed (e.g., 3% → 0.03). Effective dates indicate when a rate level applies, not when you happened to query the API. Always read the date fields to align observations with your time series logic.

Authentication and method: every request is a GET to https://interestratesapi.com/api/v1/ with an api_key query parameter. Do not use headers for authentication. See the MCP and explore more at interestratesapi.com. To start building, get an API key: Register.

Quick start: latest BOK_BASE_RATE (official sample)

Use this when you need the current BOK policy rate with its effective date and currency code.

cURL

curl -s "https://interestratesapi.com/api/v1/latest?api_key=YOUR_API_KEY&symbols=BOK_BASE_RATE"

JSON response (official)

{
    "success": true,
    "date": "2026-09-30",
    "base": "KRW",
    "rates": {
        "BOK_BASE_RATE": 3
    },
    "dates": {
        "BOK_BASE_RATE": "2026-09-30"
    },
    "currencies": {
        "BOK_BASE_RATE": "KRW"
    },
    "base_filter_note": null
}

How to read this:

  • rates: map of symbol → latest value. BOK_BASE_RATE is 3 (percent per annum).
  • date: the response’s reference date; consult dates.BOK_BASE_RATE for the effective date applied to the symbol (2026-09-30).
  • currencies: confirms the rate’s currency context (KRW).

Python (requests)

import requests

url = "https://interestratesapi.com/api/v1/latest"
params = {"symbols": "BOK_BASE_RATE", "api_key": "YOUR_API_KEY"}
resp = requests.get(url, params=params)
data = resp.json()

rate = data["rates"]["BOK_BASE_RATE"]
effective_date = data["dates"]["BOK_BASE_RATE"]
currency = data["currencies"]["BOK_BASE_RATE"]

print("BOK_BASE_RATE:", rate, "Effective:", effective_date, "Currency:", currency)

JavaScript (fetch)

const response = await fetch(
"https://interestratesapi.com/api/v1/latest?symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY"
);
const data = await response.json();
const rate = data.rates.BOK_BASE_RATE;
const effectiveDate = data.dates.BOK_BASE_RATE;
const currency = data.currencies.BOK_BASE_RATE;
console.log("BOK_BASE_RATE:", rate, "Effective:", effectiveDate, "Currency:", currency);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/latest?symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY";
$json = file_get_contents($url);
$data = json_decode($json, true);

$rate = $data["rates"]["BOK_BASE_RATE"];
$effectiveDate = $data["dates"]["BOK_BASE_RATE"];
$currency = $data["currencies"]["BOK_BASE_RATE"];

echo "BOK_BASE_RATE: {$rate} | Effective: {$effectiveDate} | Currency: {$currency}\n";

Find the symbol and metadata (catalogue)

The symbols endpoint lists all rate identifiers and meta fields (name, country_code, currency_code, frequency). Use filters to narrow by category or base currency. Below is the provided sample (you can adapt base=KRW to discover KRW central bank rates in your own calls).

cURL

JSON response

For BOK_BASE_RATE specifically, note the frequency will be monthly and currency_code is KRW. Keep this in mind when designing caching and sampling intervals.

Python (requests)

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params={"category": "central_bank", "base": "KRW", "api_key": "YOUR_API_KEY"}
)
catalog = resp.json()
print("Symbols found:", catalog.get("count"))
# Iterate and locate BOK_BASE_RATE if present
for s in catalog.get("symbols", []):
if s.get("symbol") == "BOK_BASE_RATE":
print("Found:", s)

JavaScript (fetch)

const r = await fetch(
"https://interestratesapi.com/api/v1/symbols?category=central_bank&base=KRW&api_key=YOUR_API_KEY"
);
const symbols = await r.json();
console.log(symbols);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/symbols?category=central_bank&base=KRW&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
echo "Count: " . ($data["count"] ?? 0) . PHP_EOL;

Historical: BOK_BASE_RATE on a specific date

Query a value for one date. For monthly symbols, the last day with data in that month is used.

cURL

JSON response

Fields:

  • rates: symbol → value for the requested day (or month-end for monthly series).
  • currencies: symbol → currency code of the rate.

Note: Values and currency mapping in provided examples are illustrative; always read the returned currencies map in your environment. For monthly BOK_BASE_RATE, expect the effective date to align within the target month.

Python (requests)

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/historical",
params={"date": "2025-06-15", "symbols": "BOK_BASE_RATE", "api_key": "YOUR_API_KEY"}
)
data = resp.json()
val = data["rates"]["BOK_BASE_RATE"]
print("Historical BOK_BASE_RATE:", val, "as-of", data["date"])

JavaScript (fetch)

const res = await fetch(
"https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY"
);
const data = await res.json();
console.log("Historical:", data.rates.BOK_BASE_RATE, "for", data.date);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
echo "Rate: " . $data["rates"]["BOK_BASE_RATE"] . " for " . $data["date"] . PHP_EOL;

Time series: daily-observed BOK_BASE_RATE across a window

Get values across a start–end range to power charts and regressions. For monthly rates, you’ll often see a flat step function across business days until the next effective change.

cURL

JSON response

Important fields:

  • rates: per-symbol map of date → value.
  • frequencies: confirms sampling granularity for the returned series.
  • currencies: currency context per symbol.

Python (requests)

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/timeseries",
params={
"start": "2025-11-02",
"end": "2026-11-02",
"symbols": "BOK_BASE_RATE",
"api_key": "YOUR_API_KEY"
}
)
series = resp.json()
bok_series = series["rates"]["BOK_BASE_RATE"]
# Iterate in date order for charting
for d, v in sorted(bok_series.items()):
print(d, v)

JavaScript (fetch)

const ts = await fetch(
"https://interestratesapi.com/api/v1/timeseries?start=2025-11-02&end=2026-11-02&symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY"
).then(r => r.json());

const points = Object.entries(ts.rates.BOK_BASE_RATE).sort(([a], [b]) => a.localeCompare(b));
console.log(points);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/timeseries?start=2025-11-02&end=2026-11-02&symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
foreach ($data["rates"]["BOK_BASE_RATE"] as $date => $value) {
echo $date . " " . $value . PHP_EOL;
}

Fluctuation: changes, highs, lows, and percentage moves

Compute changes over a window server-side: absolute change, change_pct, high, and low.

cURL

JSON response

Field notes:

  • change: end_value − start_value (percent points).
  • change_pct: percentage change relative to start_value; null if start_value is 0.
  • high/low: extrema across the requested period.

Python (requests)

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/fluctuation",
params={"start": "2025-11-02", "end": "2026-11-02", "symbols": "BOK_BASE_RATE", "api_key": "YOUR_API_KEY"}
)
fx = resp.json()["rates"]["BOK_BASE_RATE"]
spread = fx["end_value"] - fx["start_value"]
print("Change:", fx["change"], "Pct:", fx["change_pct"], "High:", fx["high"], "Low:", fx["low"], "Manual spread:", spread)

JavaScript (fetch)

const f = await fetch(
"https://interestratesapi.com/api/v1/fluctuation?start=2025-11-02&end=2026-11-02&symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY"
).then(r => r.json());
const stats = f.rates.BOK_BASE_RATE;
console.log(stats);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/fluctuation?start=2025-11-02&end=2026-11-02&symbols=BOK_BASE_RATE&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
$stats = $data["rates"]["BOK_BASE_RATE"];
printf("Δ: %s (%.2f%%) High: %s Low: %s\n", $stats["change"], $stats["change_pct"], $stats["high"], $stats["low"]);

OHLC: candlestick-style monthly aggregation from daily observations

When building charts, OHLC aggregates provide open, high, low, and close per period. For monthly BOK_BASE_RATE, the open is the first business day’s value in that period, and close is the last business day’s value. The API computes OHLC from the underlying daily series on-the-fly.

cURL

JSON response

Key fields:

  • open/high/low/close: levels within the aggregation period.
  • data_points: number of daily observations included (business days).

Python (requests)

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/ohlc",
params={
"symbols": "BOK_BASE_RATE",
"period": "monthly",
"start": "2025-11-02",
"end": "2026-11-02",
"api_key": "YOUR_API_KEY"
}
)
ohlc = resp.json()["rates"]["BOK_BASE_RATE"]
for row in ohlc:
print(row["period"], row["open"], row["high"], row["low"], row["close"], row["data_points"])

JavaScript (fetch)

const o = await fetch(
"https://interestratesapi.com/api/v1/ohlc?symbols=BOK_BASE_RATE&period=monthly&start=2025-11-02&end=2026-11-02&api_key=YOUR_API_KEY"
).then(r => r.json());
console.log(o.rates.BOK_BASE_RATE);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/ohlc?symbols=BOK_BASE_RATE&period=monthly&start=2025-11-02&end=2026-11-02&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
foreach ($data["rates"]["BOK_BASE_RATE"] as $row) {
echo "{$row["period"]} O:{$row["open"]} H:{$row["high"]} L:{$row["low"]} C:{$row["close"]} N:{$row["data_points"]}\n";
}

Compare loan interest costs across benchmarks

The convert endpoint helps quantify the cost impact between two benchmarks for a simple loan at the latest rate levels. This is useful when comparing BOK_BASE_RATE to another policy or reference rate for internal pricing analysis.

cURL

JSON response

How to use:

  • rate_spread: difference in latest levels between the two symbols.
  • total_interest/total_payment: simple-loan cost comparison at the latest rate snapshots.

Python (requests)

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/convert",
params={
"from": "BOK_BASE_RATE",
"to": "ECB_MRO",
"amount": 100000,
"term_months": 12,
"api_key": "YOUR_API_KEY"
}
)
cmp = resp.json()
print("Spread:", cmp["difference"]["rate_spread"], "Interest saved:", cmp["difference"]["interest_saved"])

JavaScript (fetch)

const cmp = await fetch(
"https://interestratesapi.com/api/v1/convert?from=BOK_BASE_RATE&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY"
).then(r => r.json());
console.log(cmp.difference);

PHP

<?php
$url = "https://interestratesapi.com/api/v1/convert?from=BOK_BASE_RATE&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
echo "Rate spread: " . $data["difference"]["rate_spread"] . PHP_EOL;
echo "Interest saved: " . $data["difference"]["interest_saved"] . PHP_EOL;

Practical implementation notes for BOK_BASE_RATE

Publication cadence and business days

  • Frequency is monthly; intra-month daily values will typically be flat until a policy change takes effect.
  • The timeseries endpoint serves business-day-indexed observations. OHLC data_points correspond to observed business days included in each period bucket.
  • When calling historical with a date inside a month, the API uses the last day with data within that month for monthly series.

Effective dates and alignment

  • Use dates maps (e.g., dates.BOK_BASE_RATE in the latest response) to align the rate to your time axis. Treat that as the effective date for models and accrual logic.
  • When computing spreads or month-over-month changes, ensure both legs are aligned to the same effective dates to avoid timing mismatches.

Caching strategy

  • For latest BOK_BASE_RATE, you can cache until the next expected policy announcement window, then refresh intraday around decision times.
  • For timeseries and OHLC over historical windows, responses are stable. Cache by full URL to maximize reuse. Consider conditional refresh policies and watch for 429 rate limiting headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
  • Handle error responses gracefully (401/403/404/422) and back off on 429 using Retry-After.

Computing spreads and loan payments

  • Spread: if r1 and r2 are two policy rates in percent, spread_pp = r1 − r2 (percent points). For relative spread, spread_pct = (r1 − r2) / |r2| × 100 if r2 ≠ 0.
  • Amortized monthly payment from an annual rate R%: let r = R/100/12, principal P, term n months. Payment M = P × r / (1 − (1 + r)^(-n)). Use the rate returned by the API (convert to decimal) and your chosen compounding convention. Validate against the convert endpoint for reasonableness where applicable.

Explore these endpoints and field definitions in the MCP, and get your key to integrate: Register. Visit interestratesapi.com for more.

Error handling and resilience patterns

  • 401 Unauthorized: missing or invalid api_key. Ensure it’s appended as a query parameter.
  • 403 Forbidden: account not enabled. Surface a clear message in tooling; do not retry blindly.
  • 404 Not found: may indicate no symbols matched or no data for date/range. The response can include details with available ranges—bubble this to your UI or logs.
  • 422 Validation error: check date formats (Y-m-d), symbol codes (must match AVAILABLE SYMBOLS exactly), and numeric ranges.
  • 429 Too Many Requests: respect Retry-After and consider exponential backoff. Use X-RateLimit-Remaining to schedule preemptive cooldowns.

End-to-end examples across all endpoints (recap)

Below is a concise recapitulation of BOK_BASE_RATE calls you can wire into your app:

  • Get the latest policy rate for KRW with effective date: latest.
  • Retrieve a month’s effective rate via historical for a given date.
  • Draw a chart of policy stance: timeseries and ohlc.
  • Compute performance between decisions: fluctuation.
  • Compare a KRW policy-rate loan vs. another benchmark: convert.

Every call is GET with api_key in the URL. Symbols must be chosen from the provided list—use BOK_BASE_RATE exactly for the Bank of Korea Base Rate.

Use cases for BOK_BASE_RATE in fintech systems

  • Loan pricing engines: pull BOK_BASE_RATE and apply internal margins to produce retail lending offers in KRW; refresh around policy announcements.
  • Interest rate dashboards: plot BOK_BASE_RATE month-over-month with OHLC for decision-day visualization; annotate with effective dates.
  • Treasury ALM and risk: run scenario analyses on NII/earnings-at-risk by coupling BOK_BASE_RATE trajectories with balance sheet models.
  • Macro research notebooks: regress KRW loan growth or real activity indicators on policy rate shifts using the timeseries endpoint.
  • Comparators: quantify the cost impact vs. other central bank benchmarks using the convert endpoint for quick, explainable differences.

FAQ

Does BOK_BASE_RATE update on weekends or holidays?
No. Monthly symbols align to business days. The API reports effective dates on business days; weekends and holidays do not produce new observations.

How do I know the effective date of the latest rate?
Read dates.BOK_BASE_RATE in the latest response. Use that as the observation’s effective timestamp in your models.

What if I request a historical date in the middle of the month?
For monthly series, historical uses the last day with data within that month. This ensures you get the correct effective level for that calendar month.

Can I compute month-over-month changes without a full timeseries?
Yes. Use fluctuation with start and end bounding your months of interest. You’ll get start_value, end_value, change, change_pct, high, and low.

How should I cache BOK_BASE_RATE?
Cache latest until around the next expected policy decision time, then refresh; cache historical/timeseries/OHLC for longer since they are stable. Pay attention to 429 and Retry-After headers to throttle as needed.

Build your BOK_BASE_RATE integration now. Read the MCP and interestratesapi.com docs, then Get started with Interest Rates API to obtain your API key and ship your rate-aware features.

Ready to get started?

Get your API key and start validating bank data in minutes.

Get API Key