Your team needs the Bank of Japan’s policy rate in code, side by side with other global benchmarks, to drive pricing, hedging, risk dashboards, or research. By the end of this guide, you will query BOJ_POLICY_RATE from the Interest Rates API, compare it with other central bank and interbank rates, analyze multi-year trajectories, compute spreads and loan costs, and ship production-ready integrations with reliable caching and error handling.
BOJ_POLICY_RATE: what it represents and how to read it
BOJ_POLICY_RATE is the Bank of Japan Policy Rate. In the Interest Rates API, it is a central bank benchmark and is delivered under the symbol BOJ_POLICY_RATE. Key characteristics for this symbol:
- Category: central bank
- Currency: JPY
- Frequency: monthly
- Effective date handling: when you query a specific date within a month, the API uses the last day with data in that month for monthly symbols.
Units are expressed as percent per annum (e.g., 0.30 means 0.30% per year). When you call /latest, you receive the most recent available value and an effective date. For monthly symbols, this date corresponds to the latest published observation. For time-windowed endpoints like /historical and /timeseries, the API returns values per request parameters, with frequency noted for each symbol in the response where applicable.
Base URL and method rules for all examples in this article:
- Base URL: https://interestratesapi.com/api/v1/
- Authentication: api_key query parameter (e.g., ?api_key=YOUR_API_KEY)
- HTTP method: GET for every endpoint
Explore the full capabilities at Explore Interest Rates API features and Try Interest Rates API. When you are ready to build, Register to obtain your API key and start integrating.
Fetch BOJ_POLICY_RATE: official sample request and response
The following is the official sample request/response for BOJ_POLICY_RATE. Copy and run it to validate connectivity and payload shape in your environment.
curl -s "https://interestratesapi.com/api/v1/latest?api_key=YOUR_API_KEY&symbols=BOJ_POLICY_RATE"
{
"success": true,
"date": "2023-12-01",
"base": "JPY",
"rates": {
"BOJ_POLICY_RATE": 0.3
},
"dates": {
"BOJ_POLICY_RATE": "2023-12-01"
},
"currencies": {
"BOJ_POLICY_RATE": "JPY"
},
"base_filter_note": null
}
How to read it:
- rates.BOJ_POLICY_RATE is the latest policy rate in percent (per annum).
- dates.BOJ_POLICY_RATE is the effective date for this observation.
- currencies.BOJ_POLICY_RATE shows the benchmark’s currency (JPY).
- base indicates the base currency context for the response.
Discover comparable rates programmatically
Use /symbols to enumerate available benchmarks across categories. This is helpful for building a curated list for dashboards or for selecting peers to compare against BOJ_POLICY_RATE.
/symbols examples (discover central bank rates)
import requests
r = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params=dict(category="central_bank", api_key="YOUR_API_KEY")
)
symbols = r.json()
const res = await fetch(
"https://interestratesapi.com/api/v1/symbols?category=central_bank&api_key=YOUR_API_KEY"
);
const symbols = await res.json();
<?php
$qs = http_build_query([
'category' => 'central_bank',
'api_key' => 'YOUR_API_KEY'
]);
$response = file_get_contents("https://interestratesapi.com/api/v1/symbols?$qs");
$data = json_decode($response, true);
?>
To widen comparisons, repeat with category=interbank for rates like SOFR, SONIA, or EURIBOR_3M.
Compare BOJ_POLICY_RATE with global benchmarks using /latest
Pull multiple symbols in one request. Below, we fetch BOJ_POLICY_RATE alongside major central bank and interbank benchmarks (all identifiers are from the official list):
import requests
params = dict(
symbols="BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,BOE_BANK_RATE,SNB_POLICY_RATE,RBA_CASH_RATE,SOFR",
api_key="YOUR_API_KEY"
)
r = requests.get("https://interestratesapi.com/api/v1/latest", params=params)
data = r.json()
# Access values
boj = data["rates"].get("BOJ_POLICY_RATE")
boj_eff = data.get("dates", {}).get("BOJ_POLICY_RATE")
sofr = data["rates"].get("SOFR")
ecb = data["rates"].get("ECB_MRO")
const url = "https://interestratesapi.com/api/v1/latest?symbols=BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,BOE_BANK_RATE,SNB_POLICY_RATE,RBA_CASH_RATE,SOFR&api_key=YOUR_API_KEY";
const response = await fetch(url);
const latest = await response.json();
const boj = latest.rates["BOJ_POLICY_RATE"];
const bojDate = latest.dates["BOJ_POLICY_RATE"];
<?php
$query = http_build_query([
'symbols' => 'BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,BOE_BANK_RATE,SNB_POLICY_RATE,RBA_CASH_RATE,SOFR',
'api_key' => 'YOUR_API_KEY'
]);
$json = file_get_contents("https://interestratesapi.com/api/v1/latest?$query");
$latest = json_decode($json, true);
$boj = $latest['rates']['BOJ_POLICY_RATE'] ?? null;
$boj_date = $latest['dates']['BOJ_POLICY_RATE'] ?? null;
?>
Note: In this and later multi-symbol examples, numeric values are illustrative when shown in example payloads. Always trust your runtime response for the latest numbers.
Tabular view for your dashboard
Render a quick comparison table in your UI from the /latest response. The Latest column should be filled from response.rates[symbol].
| Symbol | Name / Region | Category | Currency | Frequency | Latest (from /latest) | Effective Date |
|---|---|---|---|---|---|---|
| BOJ_POLICY_RATE | Bank of Japan Policy Rate (Japan) | central_bank | JPY | monthly | latest.rates["BOJ_POLICY_RATE"] | latest.dates["BOJ_POLICY_RATE"] |
| FED_FUNDS | US Federal Funds Rate (United States) | central_bank | USD | daily | latest.rates["FED_FUNDS"] | latest.dates["FED_FUNDS"] |
| ECB_MRO | Main Refinancing Operations Rate (Euro Area) | central_bank | EUR | daily | latest.rates["ECB_MRO"] | latest.dates["ECB_MRO"] |
| BOE_BANK_RATE | Bank Rate (United Kingdom) | central_bank | GBP | daily | latest.rates["BOE_BANK_RATE"] | latest.dates["BOE_BANK_RATE"] |
| SNB_POLICY_RATE | Swiss National Bank Policy Rate (Switzerland) | central_bank | CHF | daily | latest.rates["SNB_POLICY_RATE"] | latest.dates["SNB_POLICY_RATE"] |
| RBA_CASH_RATE | Cash Rate (Australia) | central_bank | AUD | daily | latest.rates["RBA_CASH_RATE"] | latest.dates["RBA_CASH_RATE"] |
| SOFR | Secured Overnight Financing Rate (US) | interbank | USD | daily | latest.rates["SOFR"] | latest.dates["SOFR"] |
Historical point-in-time queries
If you need a value on a specific date (e.g., backtesting a carry trade strategy or re-running a pricing model historically), use /historical. For monthly symbols like BOJ_POLICY_RATE, the API uses the last day with data in that month.
import requests
r = requests.get(
"https://interestratesapi.com/api/v1/historical",
params=dict(date="2025-06-15", symbols="BOJ_POLICY_RATE", api_key="YOUR_API_KEY")
)
hist = r.json()
value = hist["rates"]["BOJ_POLICY_RATE"]
effective_date = hist.get("date")
const resp = await fetch(
"https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=BOJ_POLICY_RATE&api_key=YOUR_API_KEY"
);
const hist = await resp.json();
const value = hist.rates["BOJ_POLICY_RATE"];
<?php
$params = http_build_query([
'date' => '2025-06-15',
'symbols' => 'BOJ_POLICY_RATE',
'api_key' => 'YOUR_API_KEY'
]);
$json = file_get_contents("https://interestratesapi.com/api/v1/historical?$params");
$hist = json_decode($json, true);
$val = $hist['rates']['BOJ_POLICY_RATE'] ?? null;
?>
Two-year trajectories with /timeseries (multi-line chart concept)
Analyze policy divergence by comparing BOJ_POLICY_RATE to other regions across the last two years. You can join central bank and interbank benchmarks in one call.
import requests
from datetime import date
import matplotlib.pyplot as plt # Optional: plot concept
params = dict(
start="2024-01-01",
end="2026-01-01",
symbols="BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,SOFR",
api_key="YOUR_API_KEY"
)
ts = requests.get("https://interestratesapi.com/api/v1/timeseries", params=params).json()
series = ts["rates"] # dict per symbol of date:value
def to_xy(sym):
dv = series.get(sym, {})
xs = sorted(dv.keys())
ys = [dv[d] for d in xs]
return xs, ys
for sym, color in [("BOJ_POLICY_RATE","black"), ("FED_FUNDS","green"), ("ECB_MRO","blue"), ("SOFR","orange")]:
xs, ys = to_xy(sym)
if xs:
plt.plot(xs, ys, label=sym, color=color, linewidth=1.6)
plt.title("Policy & Interbank Rates (Last 2 Years)")
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
# plt.show() # render in your environment
const url = "https://interestratesapi.com/api/v1/timeseries?start=2024-01-01&end=2026-01-01&symbols=BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,SOFR&api_key=YOUR_API_KEY";
const res = await fetch(url);
const ts = await res.json();
// ts.rates is an object keyed by symbol, then by date string to numeric value
<?php
$q = http_build_query([
'start' => '2024-01-01',
'end' => '2026-01-01',
'symbols' => 'BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,SOFR',
'api_key' => 'YOUR_API_KEY'
]);
$json = file_get_contents("https://interestratesapi.com/api/v1/timeseries?$q");
$ts = json_decode($json, true);
// $ts['rates'][symbol][date] = value
?>
Tip: Some symbols in timeseries responses may indicate "frequencies" with daily or monthly flags. When aligning lines on a chart, resample to a common frequency and forward-fill to the next observation if your analysis requires continuity.
Fluctuation stats and OHLC for BOJ_POLICY_RATE
Use /fluctuation to derive period-over-period changes, highs, and lows. Use /ohlc when you need candlestick-style summaries at weekly, monthly, or quarterly periods. Values in example payloads below are illustrative; consult your live responses for actual numbers.
/fluctuation
import requests
params = dict(
start="2025-10-12",
end="2026-10-12",
symbols="BOJ_POLICY_RATE",
api_key="YOUR_API_KEY"
)
fl = requests.get("https://interestratesapi.com/api/v1/fluctuation", params=params).json()
boj_stats = fl["rates"]["BOJ_POLICY_RATE"]
# Fields include: start_date, end_date, start_value, end_value, change, change_pct, high, low
const flUrl = "https://interestratesapi.com/api/v1/fluctuation?start=2025-10-12&end=2026-10-12&symbols=BOJ_POLICY_RATE&api_key=YOUR_API_KEY";
const flRes = await fetch(flUrl);
const fl = await flRes.json();
const bojStats = fl.rates["BOJ_POLICY_RATE"];
<?php
$q = http_build_query([
'start' => '2025-10-12',
'end' => '2026-10-12',
'symbols' => 'BOJ_POLICY_RATE',
'api_key' => 'YOUR_API_KEY'
]);
$flJson = file_get_contents("https://interestratesapi.com/api/v1/fluctuation?$q");
$fl = json_decode($flJson, true);
$bojStats = $fl['rates']['BOJ_POLICY_RATE'] ?? null;
?>
/ohlc
import requests
params = dict(symbols="BOJ_POLICY_RATE", period="monthly", start="2025-10-12", end="2026-10-12", api_key="YOUR_API_KEY")
ohlc = requests.get("https://interestratesapi.com/api/v1/ohlc", params=params).json()
# For each period entry: open, high, low, close, data_points
const ohlcUrl = "https://interestratesapi.com/api/v1/ohlc?symbols=BOJ_POLICY_RATE&period=monthly&start=2025-10-12&end=2026-10-12&api_key=YOUR_API_KEY";
const ohlcRes = await fetch(ohlcUrl);
const ohlcData = await ohlcRes.json();
<?php
$q = http_build_query([
'symbols' => 'BOJ_POLICY_RATE',
'period' => 'monthly',
'start' => '2025-10-12',
'end' => '2026-10-12',
'api_key' => 'YOUR_API_KEY'
]);
$ohlcJson = file_get_contents("https://interestratesapi.com/api/v1/ohlc?$q");
$ohlc = json_decode($ohlcJson, true);
?>
Compute spreads and interpret signals
A spread is the difference between two rates at the same effective date, often signaling monetary policy divergence or carry opportunities.
- Policy divergence: BOJ_POLICY_RATE compared with FED_FUNDS or ECB_MRO shows relative tightness/looseness of policy.
- Carry trade signal: A lower home funding rate versus a higher foreign yield can imply carry opportunities, but always consider FX risk and basis.
- Transmission to interbank: Compare BOJ_POLICY_RATE with TONAR (an interbank overnight measure in JPY) to study the policy pass-through to money markets.
Programmatically, compute a spread by subtracting values from a single /latest call to ensure aligned dates:
import requests
syms = "BOJ_POLICY_RATE,FED_FUNDS,ECB_MRO,SOFR"
params = dict(symbols=syms, api_key="YOUR_API_KEY")
latest = requests.get("https://interestratesapi.com/api/v1/latest", params=params).json()
boj = latest["rates"]["BOJ_POLICY_RATE"]
fed = latest["rates"]["FED_FUNDS"]
ecb = latest["rates"]["ECB_MRO"]
sofr = latest["rates"]["SOFR"]
spread_boj_fed = boj - fed # percent points
spread_boj_ecb = boj - ecb
spread_boj_sofr = boj - sofr
Loan cost comparisons with /convert
/convert provides a quick interest cost comparison between two benchmarks for a simple loan at the latest rates. Use it to benchmark hypothetical borrowing costs if loans float off different reference rates. The example output values in this section are illustrative.
BOJ_POLICY_RATE vs ECB_MRO
import requests
params = dict(from="BOJ_POLICY_RATE", to="ECB_MRO", amount=100000, term_months=12, api_key="YOUR_API_KEY")
conv = requests.get("https://interestratesapi.com/api/v1/convert", params=params).json()
# Fields: from.rate, to.rate, difference.rate_spread, difference.interest_saved
const c1 = await fetch("https://interestratesapi.com/api/v1/convert?from=BOJ_POLICY_RATE&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY");
const r1 = await c1.json();
<?php
$q = http_build_query([
'from' => 'BOJ_POLICY_RATE',
'to' => 'ECB_MRO',
'amount' => 100000,
'term_months' => 12,
'api_key' => 'YOUR_API_KEY'
]);
$conv = json_decode(file_get_contents("https://interestratesapi.com/api/v1/convert?$q"), true);
?>
BOJ_POLICY_RATE vs three other benchmarks
Repeat for a few peers to build a simple comparator:
Use the difference.interest_saved and difference.rate_spread fields to rank outcomes by potential savings. For amortizing loan payments, if you need a monthly repayment calculation from a returned annual percentage rate r (e.g., from latest or from.*.rate):
- Convert to monthly rate: i = r / 100 / 12
- Payment for principal P over n months: PMT = P * i / (1 - (1 + i)^(-n))
Use this formula with the rate field returned by the API; do not hardcode sample numbers into production logic.
Production considerations: frequency, business days, and caching
Publication cadence and date alignment:
- BOJ_POLICY_RATE frequency is monthly. /historical uses the last available day inside the requested month. /latest returns the most recent observation and effective date in dates.BOJ_POLICY_RATE.
- Interbank rates like SOFR are daily; their dates typically reflect business days. For cross-rate comparisons, align on shared dates or forward-fill the lower-frequency series (e.g., BOJ_POLICY_RATE) to the nearest effective dates for analytics, making sure your UI labels the effective date clearly.
Caching and request hygiene:
- Cache /latest responses for brief intervals suitable for the symbol frequency (e.g., minutes to hours for daily series; hours to a day for monthly series), then invalidate on your schedule or on new publication.
- Cache /symbols infrequently (e.g., daily) since catalogue changes are rare.
- For backfills and charts, cache /timeseries windows per symbol set and date range.
- Inspect rate-limiting headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) and back off or queue when nearing limits.
Error handling and validation
Common error shapes and mitigations:
- 401 or 403: Check api_key in the query string and confirm account status.
- 404: No symbols matched or no data for the requested date/range. The response may contain details with available ranges; adjust your query window accordingly.
- 422: Validation error, e.g., wrong date format (must be Y-m-d) or invalid symbol (use the /symbols endpoint to confirm identifiers like BOJ_POLICY_RATE).
- 429: Request quota exhausted. Respect Retry-After and use X-RateLimit-* headers to schedule retries.
The API reference is available via MCP. You can also Get started with Interest Rates API to integrate in your stack.
Putting it together: a clean BOJ comparison workflow
Here’s a concise process you can adopt in your application code:
- Discover candidates via /symbols with category filters to curate central bank and interbank peers for BOJ_POLICY_RATE.
- Fetch /latest for BOJ_POLICY_RATE and 5–6 global peers in a single request. Render a table with Rate and Effective Date columns.
- Pull /timeseries for BOJ_POLICY_RATE vs 2–4 peers over two years for trend analysis. Normalize frequencies before charting.
- Use /fluctuation or /ohlc to compute change statistics and summarize volatility.
- Benchmark hypothetical loan costs with /convert for BOJ_POLICY_RATE vs 3 other benchmarks. Use difference.interest_saved to rank options.
- Cache results according to frequency and monitor error/limit headers. Build automated refresh jobs timed to expected publication cycles.
For implementation details and more examples, Try Interest Rates API and review the Explore Interest Rates API features page.
FAQ
How often is BOJ_POLICY_RATE updated?
BOJ_POLICY_RATE is monthly in the Interest Rates API. The /historical endpoint uses the last day with data within the requested month. Use /latest to get the most recent observation and its effective date.
Which unit is the rate in?
Rates are percent per annum. For example, 0.3 means 0.30% per year. Convert to a monthly rate for payment calculations by dividing by 100 and then by 12.
How do I align BOJ_POLICY_RATE with daily benchmarks like SOFR?
Fetch both via /latest or /timeseries, then forward-fill the monthly BOJ series across the daily calendar in your analytics window, or align only on the effective dates for event-driven analysis.
Can I chart BOJ_POLICY_RATE alongside EURIBOR_3M or TONAR?
Yes. Use /timeseries with symbols=BOJ_POLICY_RATE,EURIBOR_3M,TONAR and a suitable start/end window. Normalize or annotate frequencies, since interbank rates are typically daily.
How do I compare loan costs quickly?
Use /convert for pairwise comparisons (from=BOJ_POLICY_RATE and to another symbol) over a principal amount and term_months. Read difference.rate_spread and difference.interest_saved to rank outcomes.
Build your BOJ policy rate comparisons today. Register for an API key, then use the examples above to integrate BOJ_POLICY_RATE across discovery (/symbols), latest values (/latest), historicals (/historical, /timeseries), analytics (/fluctuation, /ohlc), and loan comparisons (/convert). For docs, see MCP. You can also Get started with Interest Rates API right now.