Budapest Interbank Offered Rate 3-Month Historical Data API: Timeseries, Charts & Downloads

Budapest Interbank Offered Rate 3-Month Historical Data API: Timeseries, Charts & Downloads

Financial applications and research workflows live and die by the quality, consistency, and timeliness of interest rate data. Whether you are calibrating macroeconomic models, building lending and deposit pricing engines, or prototyping risk dashboards, you need historically accurate rate time series, point-in-time lookups, and chart-ready aggregates you can query and integrate reliably. This article shows how to build an end-to-end historical data pipeline, interactive charts, and quantitative analytics around the Budapest Interbank Offered Rate 3-Month (BUBOR_3M) and central bank policy benchmarks using interestratesapi.com. We will focus our code and advanced techniques on RBA_CASH_RATE (Reserve Bank of Australia Cash Rate Target) to demonstrate monthly and daily frequency handling, while also explaining how the same patterns apply to interbank references like BUBOR_3M and others from the available symbols catalogue.

You will learn how to:

  • Query multi-year historical ranges for RBA_CASH_RATE with the timeseries endpoint for robust backtesting and econometric modeling.
  • Fetch exact point-in-time values, accounting for frequency edge cases and month-end behavior.
  • Generate candlestick OHLC aggregates for charting with Chart.js or Plotly.
  • Build a Python data pipeline to pull data into pandas and export CSV/Parquet for downstream analytics.
  • Navigate common developer pitfalls: missing dates, frequency alignment, interpretation of data_points, and symbol selection.
  • Handle responses, validate fields, and integrate the API into resilient microservices with retries and observability.

All examples use the Interest Rates API at https://interestratesapi.com/api/v1/ with strict GET semantics and the api_key parameter appended in the query string. Only the documented symbols are valid; do not invent identifiers. If you are ready to explore live endpoints and build your finance stack faster, visit:

Business problem: Why a dedicated interest rates API matters in finance

Developers, economists, and data engineers frequently need a unified source for central bank rates, interbank offered rates, treasury yields, and reference benchmarks—with consistent schemas, edge-case handling, and tools for downstream charting and analytics. Without a focused service, teams typically spend hours stitching together disparate CSVs, wrangling inconsistent date formats, patching gaps in weekends/holidays, and writing custom aggregation logic for charts. Worse, subtle issues—like monthly vs. daily frequency or month-end observations—can silently corrupt calculations of carry, accruals, or changes in term structure.

interestratesapi.com streamlines this end-to-end by:

  • Providing a standardized symbol catalogue with clear categories (central bank, interbank, treasury, reference) and metadata like currency and frequency.
  • Offering unified endpoints—latest, historical, timeseries, fluctuation, ohlc, convert—so your application logic is consistent across instruments.
  • Ensuring time series are queryable by date ranges and returned in a predictable JSON shape suitable for pandas, R, or BI tools.
  • Enabling fast prototyping: a single GET request gives you the data you need, already aligned to a calendar behavior appropriate for the symbol’s frequency.

From a business standpoint, this means faster feature delivery for:

  • Loan pricing engines that benchmark spreads against central bank policy rates like RBA_CASH_RATE or interbank references such as BUBOR_3M.
  • Macro dashboards showing cross-country policy shifts and interbank trend diagnostics.
  • Risk systems monitoring volatility and changes over policy cycles using fluctuation statistics.
  • Quant pipelines that need robust, reproducible inputs for factor modeling and backtesting.

Platform and integration advantages: Reliability, routing choices, and developer ergonomics

In production finance systems, data access is a reliability function. The Interest Rates API surface supports robust integration patterns that allow you to:

  • Use simple, idempotent GET requests for every endpoint, aiding caching strategies and edge/CDN acceleration where applicable.
  • Implement retries with exponential backoff on network failures in your client, using request timeouts to prevent cascading failures in your services.
  • Add per-application API client wrappers to enforce logging, standardized error handling, and structured observability events (success flags, latency, payload size).
  • Adopt health checks in your services by pinging a lightweight endpoint (e.g., /symbols) to validate connectivity and symbol availability at startup.
  • Design fallback chains: if a broader time window is unavailable, reduce the range or relax optional filters (e.g., base currency filter) and retry.

Operational best practices:

  • Regional routing: Host your data-consuming services in regions close to your infrastructure to reduce latency. If you run multi-region, ensure your retry logic stays within the same region first to avoid cross-continent latency spikes.
  • Circuit breakers: Wrap Interest Rates API calls in a circuit breaker to rapidly fail closed if repeated transient issues occur, preventing queue buildup.
  • Observability: Log request URLs (excluding sensitive keys), response sizes, and response time. Emit metrics per endpoint (latest, historical, timeseries, ohlc) to spot anomalies in data latency or schema changes.

Developer ergonomics:

  • Uniform query parameters and response shapes allow templated client methods per endpoint.
  • Consistent JSON fields (success, rates, dates, frequencies, currencies) simplify downstream parsing.
  • In code reviews, include validators that assert expected symbol presence and non-empty ranges before proceeding to transformations or PnL pipelines.

Symbols catalogue: Discovering BUBOR_3M, RBA_CASH_RATE, and other benchmarks

Start by querying the symbols catalogue to locate instruments like BUBOR_3M (Budapest Interbank Offered Rate 3-Month) and RBA_CASH_RATE (Reserve Bank of Australia Cash Rate Target). The symbols endpoint helps you filter by category and base currency to build curated menus in your apps and to validate user inputs.

Endpoint: GET https://interestratesapi.com/api/v1/symbols

Key parameters:

  • base: ISO-3 currency code to filter symbols (e.g., USD, EUR, AUD).
  • category: central_bank | interbank | treasury | reference.
  • provider: fred | ecb | bis (for subset source hints).

Example: Filter central bank rates in AUD and interbank rates in HUF (for BUBOR_3M), using two queries.

curl "https://interestratesapi.com/api/v1/symbols?category=central_bank&base=AUD&api_key=YOUR_KEY"
curl "https://interestratesapi.com/api/v1/symbols?category=interbank&base=HUF&api_key=YOUR_KEY"

Python:

import requests

# Central bank rates in AUD (e.g., RBA_CASH_RATE)
r1 = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params=dict(category="central_bank", base="AUD", api_key="YOUR_KEY")
)
aud_cb = r1.json()

# Interbank HUF (e.g., BUBOR_3M)
r2 = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params=dict(category="interbank", base="HUF", api_key="YOUR_KEY")
)
huf_ib = r2.json()

print(aud_cb)
print(huf_ib)

JavaScript:

const respAud = await fetch(
"https://interestratesapi.com/api/v1/symbols?category=central_bank&base=AUD&api_key=YOUR_KEY"
);
const audCentral = await respAud.json();

const respHuf = await fetch(
"https://interestratesapi.com/api/v1/symbols?category=interbank&base=HUF&api_key=YOUR_KEY"
);
const hufInterbank = await respHuf.json();

console.log(audCentral, hufInterbank);

PHP:

<?php
$audUrl = "https://interestratesapi.com/api/v1/symbols?category=central_bank&base=AUD&api_key=YOUR_KEY";
$hufUrl = "https://interestratesapi.com/api/v1/symbols?category=interbank&base=HUF&api_key=YOUR_KEY";

$audCentral = file_get_contents($audUrl);
$hufInterbank = file_get_contents($hufUrl);

echo $audCentral;
echo "\n";
echo $hufInterbank;

Example JSON response (shape):

{
"success": true,
"count": 2,
"symbols": [
{
"symbol": "RBA_CASH_RATE",
"name": "Reserve Bank of Australia Cash Rate Target",
"category": "central_bank",
"country_code": "AU",
"currency_code": "AUD",
"frequency": "monthly",
"description": "Policy rate targeted by the Reserve Bank of Australia"
},
{
"symbol": "BUBOR_3M",
"name": "Budapest Interbank Offered Rate - 3 Month",
"category": "interbank",
"country_code": "HU",
"currency_code": "HUF",
"frequency": "daily",
"description": "3-month Hungarian forint interbank offered rate"
}
]
}

Field meanings:

  • symbol: The exact identifier used in all other endpoints.
  • category: Helps you group or filter instruments by type.
  • frequency: daily or monthly, guiding how to interpret returned series and date alignment.
  • currency_code: The currency context of the rate—useful for labeling visuals and for financial calculations.

Use case: Validate a user-supplied symbol before querying timeseries or latest endpoints, and dynamically show the symbol’s frequency to help analysts set the right date ranges.

Timeseries for multi-year history: Core workflow for RBA_CASH_RATE (and BUBOR_3M)

For robust backtests, stress studies, and policy-cycle analysis, the /timeseries endpoint is the workhorse. It returns dense, date-indexed values across a requested window for one or more symbols. Even though this article’s title focuses on BUBOR_3M, we will lead the deep-dive with RBA_CASH_RATE to demonstrate frequency and month-end handling that often trips up production pipelines. You can then apply the same approach to BUBOR_3M or any other interbank rate.

Endpoint: GET https://interestratesapi.com/api/v1/timeseries

Required parameters:

  • start: Start date (YYYY-MM-DD).
  • end: End date (YYYY-MM-DD, must be >= start).
  • symbols: Comma-separated symbols, e.g. RBA_CASH_RATE,BUBOR_3M.

Example (cURL) for RBA_CASH_RATE over a long window:

curl "https://interestratesapi.com/api/v1/timeseries?start=2018-01-01&end=2026-09-24&symbols=RBA_CASH_RATE&api_key=YOUR_KEY"

Python:

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/timeseries",
params=dict(
start="2018-01-01",
end="2026-09-24",
symbols="RBA_CASH_RATE",
api_key="YOUR_KEY"
)
)
data = resp.json()
print(data)

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/timeseries?start=2018-01-01&end=2026-09-24&symbols=RBA_CASH_RATE&api_key=YOUR_KEY"
);
const ts = await response.json();
console.log(ts);

PHP:

<?php
$url = "https://interestratesapi.com/api/v1/timeseries?start=2018-01-01&end=2026-09-24&symbols=RBA_CASH_RATE&api_key=YOUR_KEY";
$json = file_get_contents($url);
echo $json;

Example JSON (representative structure):

{
"success": true,
"base": "USD",
"start_date": "2018-01-01",
"end_date": "2026-09-24",
"rates": {
"RBA_CASH_RATE": {
"2018-01-31": 1.50,
"2019-06-30": 1.25,
"2020-11-30": 0.10,
"2022-05-31": 0.35,
"2023-06-30": 4.10,
"2024-12-31": 4.35,
"2025-06-30": 5.33,
"2026-09-24": 5.33
}
},
"frequencies": { "RBA_CASH_RATE": "daily" },
"currencies": { "RBA_CASH_RATE": "USD" }
}

Interpreting fields:

  • rates: For each symbol, a date-to-value map across the requested range.
  • frequencies: The effective frequency returned. For RBA_CASH_RATE, the underlying source is typically monthly; however, the service may provide aligned daily mappings with repeated policy values across business days. Always inspect this field to decide sampling strategies.
  • currencies: Currency context.
  • start_date / end_date: The actual window returned, useful for validation.

Best practices for RBA_CASH_RATE and BUBOR_3M:

  • If the symbol is monthly (typical for policy rates), expect repeated values across days within the month or reporting-date only observations. When rolling up to monthly panels, resample to month-end to avoid double counting.
  • For daily interbank rates like BUBOR_3M, anticipate weekends and holidays with no new observations. Forward-fill only if your metric requires it (e.g., to compute carry or accrual). Never forward-fill for realized daily volatility calculations without careful justification.
  • When combining RBA_CASH_RATE and BUBOR_3M in the same request, expect different frequencies; build normalization functions that resample the higher-frequency series to the lower-frequency anchor for consistent regression inputs.

Performance tip:

  • Split multiyear ranges by year or quarter in parallel if your pipeline runs batch jobs, then concatenate results. This can reduce per-request payload size and improve resiliency of your ETL.

Point-in-time accuracy: /historical for exact dates and edge cases

The /historical endpoint returns values for a specific date. This is critical when backtesting trading decisions or auditing calculations on a given day. For monthly symbols, the service uses the last day with data within that month for your provided date, which prevents accidental nulls on weekends or holidays around month-end.

Endpoint: GET https://interestratesapi.com/api/v1/historical

Required:

  • date: YYYY-MM-DD

Optional:

  • symbols: Comma-separated list. If omitted, a broader set may be returned depending on your filters.
  • base: Currency filter.

Example (cURL) for RBA_CASH_RATE:

curl "https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=RBA_CASH_RATE&api_key=YOUR_KEY"

Python:

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/historical",
params=dict(date="2025-06-15", symbols="RBA_CASH_RATE", api_key="YOUR_KEY")
)
print(resp.json())

JavaScript:

const r = await fetch(
"https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=RBA_CASH_RATE&api_key=YOUR_KEY"
);
const d = await r.json();
console.log(d);

PHP:

<?php
$url = "https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=RBA_CASH_RATE&api_key=YOUR_KEY";
echo file_get_contents($url);

Example JSON:

{
"success": true,
"date": "2025-06-15",
"base": "USD",
"rates": { "RBA_CASH_RATE": 5.33 },
"currencies": { "RBA_CASH_RATE": "USD" }
}

Edge cases and guidance:

  • Monthly symbols: If 2025-06-15 is mid-month, the service returns the value consistent with June’s valid observation behavior. Use this to audit month-end exposures or for contract repricing dates falling on weekends.
  • Daily symbols: For an interbank series like BUBOR_3M, if the requested date is a weekend/holiday, expect either no data or the most recent business day if the service maps daily frequency to effective dates. Always validate the returned date/value against your business logic.
  • Data completeness: When auditing PnL at a specific historical date, use historical to avoid time-window aggregation complexities and to confirm that the value used by your system matches an official reference date.

Building candlestick charts from rates: /ohlc for chart-ready aggregates

While interest rates are typically visualized as line charts, OHLC views are valuable when analyzing intraperiod dynamics of daily series—especially interbank or treasury rates—aggregated into weekly, monthly, or quarterly candles. The /ohlc endpoint provides open, high, low, and close values computed on the fly from the underlying daily data. For a policy rate like RBA_CASH_RATE that changes infrequently, OHLC candles will often show identical open/close with low variability, but the aggregation is still useful for unified charting components and cross-instrument comparisons.

Endpoint: GET https://interestratesapi.com/api/v1/ohlc

Required:

  • symbols: Comma-separated list

Optional:

  • period: weekly | monthly | quarterly (default monthly)
  • start, end: YYYY-MM-DD range filters

Example (cURL) for monthly candles:

curl "https://interestratesapi.com/api/v1/ohlc?symbols=RBA_CASH_RATE&period=monthly&start=2024-01-01&end=2026-09-24&api_key=YOUR_KEY"

JSON response example:

{
"success": true,
"period": "monthly",
"start_date": "2024-01-01",
"end_date": "2026-09-24",
"rates": {
"RBA_CASH_RATE": [
{
"period": "2024-01",
"open": 4.35,
"high": 4.35,
"low": 4.35,
"close": 4.35,
"data_points": 23
},
{
"period": "2025-06",
"open": 5.50,
"high": 5.50,
"low": 5.33,
"close": 5.33,
"data_points": 20
}
]
}
}

Field breakdown and usage:

  • period: The aggregation bin in YYYY-MM (monthly) or YYYY-Wxx (weekly) or YYYY-Qx (quarterly) depending on configuration.
  • open/high/low/close: Derived from daily points within the period—ideal for candlestick plots.
  • data_points: Count of daily observations used. For a monthly series, this can indicate the number of business days mapped. Useful for data quality checks.

Chart.js example (render OHLC as candlesticks) using monthly candles for RBA_CASH_RATE:

<canvas id="ohlcChart" width="800" height="400"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-chart-financial"></script>
<script>
(async () => {
const res = await fetch(
"https://interestratesapi.com/api/v1/ohlc?symbols=RBA_CASH_RATE&period=monthly&start=2024-01-01&end=2026-09-24&api_key=YOUR_KEY"
);
const json = await res.json();
const candles = json.rates["RBA_CASH_RATE"].map(row => ({
x: row.period + "-01",
o: row.open,
h: row.high,
l: row.low,
c: row.close
}));

const ctx = document.getElementById("ohlcChart").getContext("2d");
new Chart(ctx, {
type: "candlestick",
data: {
datasets: [{
label: "RBA Cash Rate (Monthly OHLC)",
data: candles
}]
},
options: {
parsing: false,
plugins: {
legend: { display: true }
},
scales: {
x: { type: "time", time: { unit: "month" } },
y: { title: { display: true, text: "Rate (%)" } }
}
}
});
})();
</script>

For an interbank series like BUBOR_3M, OHLC charts can highlight intramonth volatility and rate spikes; for central bank policy rates, OHLC primarily visualizes step-changes after policy meetings and any intra-month adjustments.

Latest values and cross-benchmark snapshots

Dashboards frequently need the most recent values for multiple instruments in a single call. Use /latest to power “headline” tiles showing current policy rates versus interbank references or treasury yields.

Endpoint: GET https://interestratesapi.com/api/v1/latest

Parameters:

  • symbols: Comma-separated list (optional; if omitted, behavior depends on your filters and defaults).
  • base, category: Additional filters.

Example (cURL):

curl "https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"

Example JSON (shape similar to docs):

{
"success": true,
"date": "2026-09-24",
"base": "MIXED",
"rates": {
"RBA_CASH_RATE": 5.33,
"BUBOR_3M": 7.85
},
"dates": {
"RBA_CASH_RATE": "2026-09-24",
"BUBOR_3M": "2026-09-24"
},
"currencies": {
"RBA_CASH_RATE": "USD",
"BUBOR_3M": "HUF"
}
}

Usage tips:

  • Display the date for each symbol (from the dates map) to indicate staleness if one series updates less frequently than others.
  • Store a snapshot with the timestamp as an audit record for your dashboards, enabling reproducible views and user trust.

Python example:

import requests

r = requests.get(
"https://interestratesapi.com/api/v1/latest",
params=dict(symbols="RBA_CASH_RATE,BUBOR_3M", api_key="YOUR_KEY")
)
print(r.json())

JavaScript:

const resp = await fetch(
"https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"
);
const latest = await resp.json();
console.log(latest);

PHP:

<?php
$url = "https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY";
echo file_get_contents($url);

Quant deltas and risk summaries: /fluctuation over custom date ranges

Change statistics matter for policy-cycle attribution, carry/roll analyses, and stress dashboards. The /fluctuation endpoint summarizes start/end values, absolute and percentage changes, and high/low bounds over a period. These outputs are directly actionable in portfolio monitors and lending risk reports.

Endpoint: GET https://interestratesapi.com/api/v1/fluctuation

Required:

  • start, end
  • symbols

Example (cURL):

curl "https://interestratesapi.com/api/v1/fluctuation?start=2025-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"

JSON example:

{
"success": true,
"rates": {
"RBA_CASH_RATE": {
"start_date": "2025-01-01",
"end_date": "2026-09-24",
"start_value": 5.50,
"end_value": 5.33,
"change": -0.17,
"change_pct": -3.09,
"high": 5.50,
"low": 5.25
},
"BUBOR_3M": {
"start_date": "2025-01-01",
"end_date": "2026-09-24",
"start_value": 9.20,
"end_value": 7.85,
"change": -1.35,
"change_pct": -14.67,
"high": 9.35,
"low": 7.60
}
}
}

Field interpretations:

  • start_value, end_value: Boundary values in the window.
  • change, change_pct: Absolute and percent changes, useful for ranking instruments by movement.
  • high, low: Period extrema; plot as reference bands in dashboards.

Implementation notes:

  • Use fluctuation as a quick summary to avoid fetching full time series when you only need change deltas.
  • Combine with OHLC monthly candles to build compact “trend + delta” cards for executive views.

Scenario analysis: Compare interest costs with /convert

The /convert endpoint estimates total interest cost for a simple loan at the latest rate of two symbols, allowing users to visualize rate spreads in monetary terms. This is particularly effective in educational dashboards, internal bank tools that map benchmark changes to customer outcomes, and in fintech applications that propose refinancing strategies.

Endpoint: GET https://interestratesapi.com/api/v1/convert

Required:

  • from: symbol
  • to: symbol
  • amount: numeric >= 0

Optional:

  • term_months: 1–360 (default 12)

Example (cURL):

curl "https://interestratesapi.com/api/v1/convert?from=RBA_CASH_RATE&to=BUBOR_3M&amount=100000&term_months=12&api_key=YOUR_KEY"

JSON example:

{
"success": true,
"amount": 100000,
"term_months": 12,
"from": {
"symbol": "RBA_CASH_RATE",
"rate": 5.33,
"date": "2026-09-24",
"total_interest": 5330.00,
"total_payment": 105330.00
},
"to": {
"symbol": "BUBOR_3M",
"rate": 7.85,
"date": "2026-09-24",
"total_interest": 7850.00,
"total_payment": 107850.00
},
"difference": {
"rate_spread": 2.52,
"interest_saved": -2520.00
}
}

Usage ideas:

  • Customer education: Demonstrate how benchmark changes translate to yearly interest differences.
  • Product strategy: Evaluate competitiveness by comparing your product’s benchmark to a policy rate or interbank reference.
  • Risk: Convert rate spreads into PnL impact for a stylized balance sheet of loans.

Python data pipeline: Fetch → pandas DataFrame → CSV/Parquet exports

Below is a complete Python example that:

  • Fetches multi-year RBA_CASH_RATE timeseries.
  • Loads data into a tidy pandas DataFrame.
  • Resamples to month-end where appropriate.
  • Exports to CSV and Parquet for analytics and BI consumption.
import requests
import pandas as pd
from pathlib import Path

API_BASE = "https://interestratesapi.com/api/v1/"
API_KEY = "YOUR_KEY"
SYMBOL = "RBA_CASH_RATE"
START = "2015-01-01"
END = "2026-09-24"

def fetch_timeseries(symbol: str, start: str, end: str) -> dict:
url = API_BASE + "timeseries"
params = dict(start=start, end=end, symbols=symbol, api_key=API_KEY)
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()
data = r.json()
assert data.get("success") is True, f"API error: {data}"
return data

def to_dataframe(data: dict, symbol: str) -> pd.DataFrame:
rates = data["rates"][symbol]
# Convert date-to-value map into a DataFrame
df = pd.DataFrame(
[{"date": d, "value": v} for d, v in rates.items()]
).sort_values("date")
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")
# Attach metadata
freq = data.get("frequencies", {}).get(symbol, None)
curr = data.get("currencies", {}).get(symbol, None)
df.attrs["symbol"] = symbol
df.attrs["frequency"] = freq
df.attrs["currency"] = curr
return df

def resample_month_end(df: pd.DataFrame) -> pd.DataFrame:
# For monthly policy rates mapped across daily indices, taking last business day is typical
return df.resample("M").last()

def export_data(df: pd.DataFrame, stem: str):
out_dir = Path("exports")
out_dir.mkdir(parents=True, exist_ok=True)
csv_path = out_dir / f"{stem}.csv"
parquet_path = out_dir / f"{stem}.parquet"
df.to_csv(csv_path, index=True)
df.to_parquet(parquet_path, index=True)
print(f"Exported: {csv_path} and {parquet_path}")

if __name__ == "__main__":
raw = fetch_timeseries(SYMBOL, START, END)
df = to_dataframe(raw, SYMBOL)
# Validate index continuity for analytics; do not forward-fill unless needed
print("Head:\n", df.head())
print("Tail:\n", df.tail())
print("Metadata:", df.attrs)

# Produce a month-end panel suitable for regressions or dashboards
df_m = resample_month_end(df)
export_data(df, f"{SYMBOL}_daily")
export_data(df_m, f"{SYMBOL}_month_end")

Pitfalls and solutions:

  • Missing dates: Central bank rates may repeat across days with the same value; interbank series will skip weekends/holidays. Before merging with other datasets, align frequencies (e.g., convert both to month-end) to avoid look-ahead bias.
  • data_points interpretation in OHLC: Use this metric to detect sparse periods that may bias high/low. If data_points is unexpectedly small, annotate your charts or fall back to line charts.
  • Currency labels: Many policy rates are quoted as dimensionless percentages; still, attach currency metadata for clarity in multi-currency dashboards.

Complete endpoint coverage: Requests, examples, and practical use

1) /symbols — Discoverability and input validation

Use /symbols to power search bars and drop-downs, filter by category, and pre-validate user requests. You can also show frequency and country metadata alongside names for better UX.

curl "https://interestratesapi.com/api/v1/symbols?category=interbank&api_key=YOUR_KEY"
{
"success": true,
"count": 5,
"symbols": [
{ "symbol": "BUBOR_3M", "name": "Budapest Interbank Offered Rate - 3 Month", "category": "interbank", "country_code": "HU", "currency_code": "HUF", "frequency": "daily", "description": "3-month Hungarian forint interbank offered rate" },
{ "symbol": "EURIBOR_3M", "name": "EURIBOR 3M", "category": "interbank", "country_code": "EU", "currency_code": "EUR", "frequency": "daily", "description": "Euro interbank rate for 3 months" },
{ "symbol": "BBSW_3M", "name": "BBSW 3M", "category": "interbank", "country_code": "AU", "currency_code": "AUD", "frequency": "daily", "description": "Bank Bill Swap Rate for 3 months" },
{ "symbol": "WIBOR_3M", "name": "WIBOR 3M", "category": "interbank", "country_code": "PL", "currency_code": "PLN", "frequency": "daily", "description": "Polish zloty interbank offered rate for 3 months" },
{ "symbol": "REIBOR_3M", "name": "REIBOR 3M", "category": "interbank", "country_code": "IS", "currency_code": "ISK", "frequency": "daily", "description": "Icelandic interbank 3-month rate" }
]
}

Use case: As users type “BUB…”, query the catalogue and present BUBOR_3M with country and currency tags.

2) /latest — Real-time dashboard tiles

Show a quick snapshot for RBA_CASH_RATE, BUBOR_3M, and a few comparables:

curl "https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M,EURIBOR_3M&api_key=YOUR_KEY"

Best practice: Log not only the returned rate values but also the dates map to inform users when a symbol’s last update occurred.

3) /historical — Auditable point lookups

For compliance or PnL investigations, fetch exactly what your system should have used on a given date:

curl "https://interestratesapi.com/api/v1/historical?date=2024-12-31&symbols=BUBOR_3M&api_key=YOUR_KEY"

Validate that the returned value aligns with the stated policy for weekend/holiday handling and record it in your audit logs.

4) /timeseries — Backtests and modeling inputs

Pull parallel histories for mixed-frequency symbols, then resample to a common frequency for regression:

curl "https://interestratesapi.com/api/v1/timeseries?start=2020-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"

In your transformation layer, keep the native daily series for BUBOR_3M and resample RBA_CASH_RATE to month-end, then compute differences, correlations, or event studies.

5) /fluctuation — Change summaries for risk cards

Add a “Change since YTD” card on dashboards:

curl "https://interestratesapi.com/api/v1/fluctuation?start=2026-01-01&end=2026-09-24&symbols=BUBOR_3M&api_key=YOUR_KEY"

Style guidance: Present change_pct prominently, then show high/low as a mini sparkline or band to communicate variability.

6) /ohlc — Candlesticks for volatility narratives

Animate monthly OHLC to illustrate stabilization or turbulence:

curl "https://interestratesapi.com/api/v1/ohlc?symbols=BUBOR_3M&period=monthly&start=2024-01-01&end=2026-09-24&api_key=YOUR_KEY"

Display data_points to explain candles built from fewer daily observations (e.g., holiday-heavy months).

7) /convert — Explain spreads in currency terms

Turn abstract spreads into monetary impact:

curl "https://interestratesapi.com/api/v1/convert?from=BUBOR_3M&to=RBA_CASH_RATE&amount=250000&term_months=24&api_key=YOUR_KEY"

Include the difference.rate_spread and interest_saved fields as headline metrics in UX.

Full-stack code examples for each endpoint: cURL, Python, JavaScript, PHP

/symbols examples

cURL:

curl "https://interestratesapi.com/api/v1/symbols?category=central_bank&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params=dict(category="central_bank", api_key="YOUR_KEY")
)
symbols = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/symbols?category=central_bank&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/symbols?category=central_bank&api_key=YOUR_KEY");

/latest examples

cURL:

curl "https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/latest",
params=dict(symbols="RBA_CASH_RATE,BUBOR_3M", api_key="YOUR_KEY")
)
data = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/latest?symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY");

/historical examples

cURL:

curl "https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=RBA_CASH_RATE&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/historical",
params=dict(date="2025-06-15", symbols="RBA_CASH_RATE", api_key="YOUR_KEY")
)
data = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=RBA_CASH_RATE&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=RBA_CASH_RATE&api_key=YOUR_KEY");

/timeseries examples

cURL:

curl "https://interestratesapi.com/api/v1/timeseries?start=2020-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/timeseries",
params=dict(start="2020-01-01", end="2026-09-24", symbols="RBA_CASH_RATE,BUBOR_3M", api_key="YOUR_KEY")
)
data = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/timeseries?start=2020-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/timeseries?start=2020-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY");

/fluctuation examples

cURL:

curl "https://interestratesapi.com/api/v1/fluctuation?start=2024-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/fluctuation",
params=dict(start="2024-01-01", end="2026-09-24", symbols="RBA_CASH_RATE,BUBOR_3M", api_key="YOUR_KEY")
)
data = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/fluctuation?start=2024-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/fluctuation?start=2024-01-01&end=2026-09-24&symbols=RBA_CASH_RATE,BUBOR_3M&api_key=YOUR_KEY");

/ohlc examples

cURL:

curl "https://interestratesapi.com/api/v1/ohlc?symbols=RBA_CASH_RATE,BUBOR_3M&period=monthly&start=2024-01-01&end=2026-09-24&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/ohlc",
params=dict(symbols="RBA_CASH_RATE,BUBOR_3M", period="monthly", start="2024-01-01", end="2026-09-24", api_key="YOUR_KEY")
)
data = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/ohlc?symbols=RBA_CASH_RATE,BUBOR_3M&period=monthly&start=2024-01-01&end=2026-09-24&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/ohlc?symbols=RBA_CASH_RATE,BUBOR_3M&period=monthly&start=2024-01-01&end=2026-09-24&api_key=YOUR_KEY");

/convert examples

cURL:

curl "https://interestratesapi.com/api/v1/convert?from=RBA_CASH_RATE&to=BUBOR_3M&amount=150000&term_months=36&api_key=YOUR_KEY"

Python:

import requests
response = requests.get(
"https://interestratesapi.com/api/v1/convert",
params=dict(from="RBA_CASH_RATE", to="BUBOR_3M", amount=150000, term_months=36, api_key="YOUR_KEY")
)
data = response.json()

JavaScript:

const response = await fetch(
"https://interestratesapi.com/api/v1/convert?from=RBA_CASH_RATE&to=BUBOR_3M&amount=150000&term_months=36&api_key=YOUR_KEY"
);
const data = await response.json();

PHP:

<?php
echo file_get_contents("https://interestratesapi.com/api/v1/convert?from=RBA_CASH_RATE&to=BUBOR_3M&amount=150000&term_months=36&api_key=YOUR_KEY");

Real-world scenarios: From Budapest interbank markets to Australian policy cycles

Scenario 1: Budapest banking desk monitoring BUBOR_3M

  • Goal: Track BUBOR_3M volatility and its effect on 3M loan repricing.
  • Solution: Use /timeseries for daily data, /ohlc (monthly) for volatility visualization, and /fluctuation for change summaries since the last policy meeting.
  • Deliverable: A dashboard combining candles with trend deltas and an alert that triggers when high-low spans exceed a threshold.

Scenario 2: Australian fintech pricing engine benchmarking to RBA_CASH_RATE

  • Goal: Reprice deposit and lending products against changes in the RBA Cash Rate Target.
  • Solution: Fetch /latest for intra-day UI tiles; compute /fluctuation since the start of quarter; maintain a /timeseries store for long-run calibration of spread policies.
  • Deliverable: Automated pricing adjustments with audit-friendly logs using /historical for dates of interest.

Scenario 3: Cross-market analysis

  • Goal: Compare central bank policy in Australia with interbank conditions in Hungary to study transmission lags.
  • Solution: Pull both RBA_CASH_RATE and BUBOR_3M with /timeseries, resample to common frequency, calculate rolling correlations and lead-lag regressions.
  • Deliverable: A research note with candlestick visuals and data exports (CSV/Parquet) for reproducibility.

Error handling and troubleshooting: Robust client patterns

The API responds with a common error shape:

{
"success": false,
"error": "Message describing the error",
"details": {
"hint": "Optional details, such as available date ranges for a symbol"
}
}

Common status codes to handle:

  • 401: Missing or invalid key. Ensure your query string includes api_key and that it’s correct in secure storage on the client side.
  • 403: Account not authorized for the request. Guard with a friendly message and fallback UI.
  • 404: No symbols matched or no data for the requested date/range. Use details (if present) to adjust your query. For example, shrink the range or remove optional filters.
  • 422: Validation error. Check date formats (YYYY-MM-DD) and confirm symbols are in the official list.

Best practices:

  • Validate symbols client-side using /symbols before making data-heavy requests.
  • On 404 with available ranges, adapt your date picker UI to the supported window.
  • Add retries with exponential backoff on network issues, not on validation errors (422) where immediate user correction is needed.
  • Log the entire error object for supportability and include correlation IDs where possible.

Time series pitfalls and how to avoid them

Frequency alignment:

  • Central bank policy rates like RBA_CASH_RATE may be monthly. If you mix with daily interbank data (e.g., BUBOR_3M), always align frequencies prior to OLS regressions, VARs, or rolling stats. A common approach is to resample your daily series to month-end with last observation carried forward and keep policy series at month-end.

Missing dates:

  • Interbank series skip weekends/holidays. Be explicit in your handling: forward-fill only when the business logic requires it (e.g., daily accrual calculations), and avoid forward-filling for volatility measures.

data_points in OHLC:

  • A small data_points value for a period may indicate few daily observations. Annotate your chart or supplement with a line series to avoid misinterpretation of low-activity periods.

Point-in-time accuracy:

  • When auditing PnL, always use /historical for the exact date used by your risk engine. This avoids subtle time-window misalignments that /timeseries transformations can introduce.

Merging symbol sets:

  • When working with multiple symbols from different categories, always check the frequencies map returned by /timeseries and normalize your pipeline accordingly.

Putting it all together: Example JSON payloads and their application

A realistic /timeseries response for dual symbols (RBA_CASH_RATE and BUBOR_3M) and how you might parse it:

{
"success": true,
"base": "USD",
"start_date": "2025-01-01",
"end_date": "2025-03-31",
"rates": {
"RBA_CASH_RATE": {
"2025-01-31": 5.50,
"2025-02-28": 5.50,
"2025-03-31": 5.50
},
"BUBOR_3M": {
"2025-01-02": 9.28,
"2025-01-03": 9.25,
"2025-01-06": 9.24,
"2025-02-03": 8.97,
"2025-02-28": 8.91,
"2025-03-31": 8.80
}
},
"frequencies": {
"RBA_CASH_RATE": "daily",
"BUBOR_3M": "daily"
},
"currencies": {
"RBA_CASH_RATE": "USD",
"BUBOR_3M": "HUF"
}
}

Application:

  • Resample BUBOR_3M to month-end last before merging with RBA_CASH_RATE at month-end. Then compute spreads, correlation, and month-over-month changes for a macro report.

A /historical check to validate month-end policy for auditing:

{
"success": true,
"date": "2025-02-15",
"base": "USD",
"rates": { "RBA_CASH_RATE": 5.50 },
"currencies": { "RBA_CASH_RATE": "USD" }
}

Use: Confirm that mid-month lookups return the correct policy rate for the month.

An /ohlc response to feed Chart.js:

{
"success": true,
"period": "monthly",
"start_date": "2025-01-01",
"end_date": "2025-06-30",
"rates": {
"BUBOR_3M": [
{ "period": "2025-01", "open": 9.30, "high": 9.35, "low": 9.20, "close": 9.21, "data_points": 21 },
{ "period": "2025-02", "open": 9.18, "high": 9.20, "low": 8.90, "close": 8.91, "data_points": 20 },
{ "period": "2025-03", "open": 8.90, "high": 8.95, "low": 8.78, "close": 8.80, "data_points": 21 }
]
}
}

Use: Visualize periods of stability vs. stress using candlesticks, then annotate central bank meeting dates.

A /fluctuation summary for a quick delta:

{
"success": true,
"rates": {
"RBA_CASH_RATE": {
"start_date": "2025-01-01",
"end_date": "2025-12-31",
"start_value": 5.50,
"end_value": 5.33,
"change": -0.17,
"change_pct": -3.09,
"high": 5.50,
"low": 5.25
}
}
}

Use: Present QoQ or YoY change cards without loading full series.

Performance tuning and observability in production

To ensure low-latency, reliable data ingest:

  • Cache control: Since many rates, especially policy rates, change infrequently, implement a short-lived cache (e.g., 5–10 minutes) for /latest and longer for /symbols. For /timeseries, cache by hash of the date-window and symbol set.
  • Pagination strategy: While /timeseries returns a map, break very long ranges into year-sized windows in parallel ETL jobs.
  • Retry policy: Implement exponential backoff with jitter for transient network issues. Cap retries to avoid thundering herds.
  • Timeouts: Set client read timeouts appropriate to your environment; fail fast and rely on retries for resiliency.
  • Monitoring: Track success flag rates, median/95th percentile latencies per endpoint, and payload sizes to optimize downstream parsing.

Security and governance patterns:

  • Per-app keys in your own platform layers: Use internal configuration management so that each microservice calling the API can be audited and rotated independently.
  • Audit logs: Save request URLs (with masked secrets) and responses or summaries to reconstruct historical dashboard states or backtest reproducibility.
  • Data locality: If your application is multi-region, segregate data pipelines by region and choose the closest compute for calling the API to reduce egress and latency.

From API to impact: Designing finance analytics that scale

With the Interest Rates API, a small set of coherent endpoints supports a wide range of finance data needs—from Budapest’s interbank curves to Australia’s policy rate dynamics. The combination of /timeseries for modeling, /historical for audits, /ohlc for charts, /fluctuation for summaries, and /convert for scenario narratives substantially reduces the integration effort and ongoing maintenance your team faces. You can channel the saved effort into delivering better UX, richer analytics, and more transparent financial products.

Next steps:

  • Prototype the RBA_CASH_RATE pipeline above, then extend to BUBOR_3M to compare policy transmission across markets.
  • Embed OHLC charts into your analytics front end and annotate with event calendars for policy meetings and macro releases.
  • Automate CSV/Parquet exports to your data lake, and schedule daily refresh jobs keyed to your reporting cycles.

When you are ready to build, explore the live endpoints and start integrating:

By aligning your financial analytics around a dependable, well-structured interest rates API, you transform fragile data wrangling into a durable capability—accelerating delivery timelines, reducing operational risk, and empowering more insightful finance applications.

Ready to get started?

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

Get API Key

Related posts