BCRP Rate API: First Request

BCRP Rate API: First Request

You need the Banco Central de Reserva del Perú reference rate (BCRP_RATE) inside your software, with a reliable way to fetch the latest value, query historical snapshots, analyze ranges, and compute loan impacts. By the end of this guide, you’ll make your first successful requests to retrieve BCRP_RATE from the Interest Rates API, understand how to read its dates and units, and know which endpoints to use for dashboards, models, and lending workflows.

What BCRP_RATE Represents and Why It Matters

BCRP_RATE is the policy rate set by the Banco Central de Reserva del Perú, referenced here as the “BCRP Reference Rate.” It is a central bank benchmark that transmits monetary policy to the Peruvian financial system, affecting lending costs, savings rates, and valuation models denominated in PEN. Developers and analysts leverage this rate to price loans, compute spreads to interbank benchmarks, construct macro dashboards, and calibrate risk models.

Key properties for integration:

  • Symbol: BCRP_RATE
  • Category: central_bank
  • Frequency: monthly (policy rate decisions are reflected at a monthly cadence)
  • Use cases: interest-rate dashboards, loan pricing tools, macroeconomic backtests, risk and scenario analysis

All requests in this article use the Interest Rates API at https://interestratesapi.com and are authenticated with an api_key query parameter. Every endpoint is HTTP GET only and returns JSON.

Getting Access and Setup

To authenticate, append ?api_key=YOUR_API_KEY to every request (never use a header for auth). You can create an API key here:

Developer-focused docs and model coverage are also available here:

For convenience, the quick registration link (with UTM tracking for this guide) is here:

Endpoint Walkthrough for BCRP_RATE

All examples below use GET and include an api_key query parameter. Unless otherwise noted, JSON values shown are illustrative to demonstrate structure and field names; do not treat them as live market values.

1) Catalogue of Available Symbols — GET /api/v1/symbols

Use this endpoint to confirm BCRP_RATE is available, and to inspect metadata such as category, country_code, currency_code, and frequency.

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

Python (requests):

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params=dict(category="central_bank", api_key="YOUR_API_KEY")
)
data = resp.json()
print(data.get("success"), data.get("count"))

JavaScript (fetch):

const response = await fetch(
"https://interestratesapi.com/api/v1/symbols?category=central_bank&api_key=YOUR_API_KEY"
);
const data = await response.json();
console.log(data.success, data.count);

PHP (file_get_contents):

<?php
$url = "https://interestratesapi.com/api/v1/symbols?category=central_bank&api_key=YOUR_API_KEY";
$json = file_get_contents($url);
$data = json_decode($json, true);
echo $data["success"] ? "OK" : "Error";
?>

Illustrative JSON (subset):

{
"success": true,
"count": 1,
"symbols": [
{
"symbol": "BCRP_RATE",
"name": "Banco Central de Reserva del Perú Reference Rate",
"category": "central_bank",
"country_code": "PE",
"currency_code": "PEN",
"frequency": "monthly",
"description": "Peru's policy rate set by the Banco Central de Reserva del Perú"
}
]
}

What to read: symbol to confirm the code you will query; frequency to plan scheduling; and currency_code to understand units and reporting currency.

2) Latest Value — GET /api/v1/latest

Request the current policy rate for BCRP_RATE. The response includes the top-level date and a dates map per symbol indicating the effective date for that symbol’s latest value.

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

Python (requests):

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/latest",
params=dict(symbols="BCRP_RATE", api_key="YOUR_API_KEY")
)
data = resp.json()
rate = data["rates"]["BCRP_RATE"]
effective_date = data["dates"]["BCRP_RATE"]
print("BCRP_RATE:", rate, "Effective:", effective_date)

JavaScript (fetch):

const res = await fetch(
"https://interestratesapi.com/api/v1/latest?symbols=BCRP_RATE&api_key=YOUR_API_KEY"
);
const json = await res.json();
const rate = json.rates["BCRP_RATE"];
const eff = json.dates["BCRP_RATE"];
console.log("BCRP_RATE", rate, "effective", eff);

PHP (file_get_contents):

<?php
$url = "https://interestratesapi.com/api/v1/latest?symbols=BCRP_RATE&api_key=YOUR_API_KEY";
$json = file_get_contents($url);
$data = json_decode($json, true);
$rate = $data["rates"]["BCRP_RATE"];
$eff = $data["dates"]["BCRP_RATE"];
echo "BCRP_RATE: $rate (effective $eff)";
?>

Illustrative JSON (values are examples only):

{
"success": true,
"date": "2026-09-30",
"base": "PEN",
"rates": { "BCRP_RATE": 5.33 },
"dates": { "BCRP_RATE": "2026-09-30" },
"currencies": { "BCRP_RATE": "PEN" }
}

How to read: The rate is a percentage (e.g., 5.33 means 5.33% annualized). Use dates.BCRP_RATE as the effective date for analytics, caches, and audit logs.

Payload sanity check (real response format)

Below is a real API response from the Interest Rates API (for a different symbol, included here to show authentic JSON shape and fields). Values must be copied exactly as provided:

{"success":true,"date":"2026-09-28","base":"USD","rates":{"SOFR":3.9},"dates":{"SOFR":"2026-09-28"},"currencies":{"SOFR":"USD"},"base_filter_note":null}

Note the structure: top-level date, a rates map keyed by symbol, a per-symbol dates map, and a currencies map. BCRP_RATE requests will follow the same shape but will return data specific to BCRP_RATE.

3) Historical Snapshot — GET /api/v1/historical

Retrieve the BCRP_RATE as of a specific date. For monthly symbols, the API returns the last day with data within that month if the exact date lacks a fix.

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

Python (requests):

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/historical",
params=dict(date="2025-06-15", symbols="BCRP_RATE", api_key="YOUR_API_KEY")
)
data = resp.json()
snapshot = data["rates"]["BCRP_RATE"]
print("As-of 2025-06-15:", snapshot)

JavaScript (fetch):

const r = await fetch(
"https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=BCRP_RATE&api_key=YOUR_API_KEY"
);
const j = await r.json();
console.log("BCRP_RATE on 2025-06-15:", j.rates["BCRP_RATE"]);

PHP (file_get_contents):

<?php
$u = "https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=BCRP_RATE&api_key=YOUR_API_KEY";
$j = file_get_contents($u);
$d = json_decode($j, true);
echo $d["rates"]["BCRP_RATE"];
?>

Illustrative JSON:

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

Tip: For month-end alignment, set the date to your analysis cutoff (e.g., last trading day of the month). The API ensures a monthly symbol resolves to the appropriate in-month observation.

4) Time Series — GET /api/v1/timeseries

Pull a continuous series for BCRP_RATE across a date range. For a monthly symbol, expect one value per effective period. Use this for charts, backtests, and macro models.

curl "https://interestratesapi.com/api/v1/timeseries?start=2025-01-01&end=2026-09-30&symbols=BCRP_RATE&api_key=YOUR_API_KEY"

Python (requests):

import requests
from datetime import date

params = dict(
start="2025-01-01",
end="2026-09-30",
symbols="BCRP_RATE",
api_key="YOUR_API_KEY"
)
resp = requests.get("https://interestratesapi.com/api/v1/timeseries", params=params)
ts = resp.json()
series = ts["rates"]["BCRP_RATE"] # dict of { "YYYY-MM-DD": value }
for d, v in series.items():
print(d, v)

JavaScript (fetch):

const tsRes = await fetch(
"https://interestratesapi.com/api/v1/timeseries?start=2025-01-01&end=2026-09-30&symbols=BCRP_RATE&api_key=YOUR_API_KEY"
);
const tsJson = await tsRes.json();
const points = tsJson.rates["BCRP_RATE"];
Object.entries(points).forEach(([d, v]) => console.log(d, v));

PHP (file_get_contents):

<?php
$tsUrl = "https://interestratesapi.com/api/v1/timeseries?start=2025-01-01&end=2026-09-30&symbols=BCRP_RATE&api_key=YOUR_API_KEY";
$tsJson = file_get_contents($tsUrl);
$ts = json_decode($tsJson, true);
$series = $ts["rates"]["BCRP_RATE"];
foreach ($series as $d => $v) { echo $d . ": " . $v . PHP_EOL; }
?>

Illustrative JSON (abbreviated; monthly symbol):

{
"success": true,
"base": "PEN",
"start_date": "2025-01-01",
"end_date": "2026-09-30",
"rates": {
"BCRP_RATE": {
"2025-01-31": 5.50,
"2025-02-28": 5.50,
"2025-03-31": 5.33
}
},
"frequencies": { "BCRP_RATE": "monthly" },
"currencies": { "BCRP_RATE": "PEN" }
}

What to read: rates.BCRP_RATE is a map of date strings to rate values. The frequencies object confirms frequency, which you can use to select chart intervals.

5) Fluctuation Statistics — GET /api/v1/fluctuation

Get change statistics over a range. Use for monitoring policy trajectories, alerts, and summary analytics.

curl "https://interestratesapi.com/api/v1/fluctuation?start=2025-01-01&end=2026-09-30&symbols=BCRP_RATE&api_key=YOUR_API_KEY"

Python (requests):

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/fluctuation",
params=dict(start="2025-01-01", end="2026-09-30", symbols="BCRP_RATE", api_key="YOUR_API_KEY")
)
fx = resp.json()["rates"]["BCRP_RATE"]
print(fx["start_value"], fx["end_value"], fx["change"], fx["change_pct"])

JavaScript (fetch):

const fRes = await fetch(
"https://interestratesapi.com/api/v1/fluctuation?start=2025-01-01&end=2026-09-30&symbols=BCRP_RATE&api_key=YOUR_API_KEY"
);
const fJson = await fRes.json();
const s = fJson.rates["BCRP_RATE"];
console.log(s.start_value, s.end_value, s.high, s.low);

PHP (file_get_contents):

<?php
$u = "https://interestratesapi.com/api/v1/fluctuation?start=2025-01-01&end=2026-09-30&symbols=BCRP_RATE&api_key=YOUR_API_KEY";
$j = file_get_contents($u);
$d = json_decode($j, true);
$s = $d["rates"]["BCRP_RATE"];
echo "Δ=" . $s["change"] . " (" . $s["change_pct"] . "%)";
?>

Illustrative JSON:

{
"success": true,
"rates": {
"BCRP_RATE": {
"start_date": "2025-01-01",
"end_date": "2026-09-30",
"start_value": 5.50,
"end_value": 5.33,
"change": -0.17,
"change_pct": -3.09,
"high": 5.50,
"low": 5.25
}
}
}

Key fields: change is absolute difference; change_pct is percentage change (null if start_value is zero). Use high and low for min/max monitoring.

6) OHLC (Candlestick) — GET /api/v1/ohlc

Generate open-high-low-close bars on the fly from the underlying daily curve. For a monthly policy rate, monthly OHLC typically equals that month’s open/close policy values with limited intra-month variation, but the shape still standardizes visualization for chart components.

curl "https://interestratesapi.com/api/v1/ohlc?symbols=BCRP_RATE&period=monthly&start=2025-01-01&end=2026-09-30&api_key=YOUR_API_KEY"

Python (requests):

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/ohlc",
params=dict(symbols="BCRP_RATE", period="monthly", start="2025-01-01", end="2026-09-30", api_key="YOUR_API_KEY")
)
ohlc = resp.json()["rates"]["BCRP_RATE"]
for bar in ohlc:
print(bar["period"], bar["open"], bar["high"], bar["low"], bar["close"], bar["data_points"])

JavaScript (fetch):

const o = await fetch(
"https://interestratesapi.com/api/v1/ohlc?symbols=BCRP_RATE&period=monthly&start=2025-01-01&end=2026-09-30&api_key=YOUR_API_KEY"
);
const ohlcJson = await o.json();
const bars = ohlcJson.rates["BCRP_RATE"];
bars.forEach(b => console.log(b.period, b.open, b.close));

PHP (file_get_contents):

<?php
$u = "https://interestratesapi.com/api/v1/ohlc?symbols=BCRP_RATE&period=monthly&start=2025-01-01&end=2026-09-30&api_key=YOUR_API_KEY";
$j = file_get_contents($u);
$d = json_decode($j, true);
foreach ($d["rates"]["BCRP_RATE"] as $b) {
echo $b["period"] . " O:" . $b["open"] . " H:" . $b["high"] . " L:" . $b["low"] . " C:" . $b["close"] . PHP_EOL;
}
?>

Illustrative JSON:

{
"success": true,
"period": "monthly",
"start_date": "2025-01-01",
"end_date": "2026-09-30",
"rates": {
"BCRP_RATE": [
{
"period": "2025-01",
"open": 5.50,
"high": 5.50,
"low": 5.33,
"close": 5.33,
"data_points": 23
}
]
}
}

What to read: Each bar has open, high, low, close, and data_points (count of daily points that formed the bar). Even for monthly policy rates, data_points helps you assess completeness.

7) Loan Interest Cost Comparison — GET /api/v1/convert

Compare total interest for an amount at the latest BCRP_RATE against another symbol’s latest rate over a simple term. This is useful for pricing comparisons and dashboards.

curl "https://interestratesapi.com/api/v1/convert?from=BCRP_RATE&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY"

Python (requests):

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/convert",
params=dict(from="BCRP_RATE", to="ECB_MRO", amount=100000, term_months=12, api_key="YOUR_API_KEY")
)
cmp = resp.json()
print(cmp["from"]["rate"], cmp["to"]["rate"], cmp["difference"]["rate_spread"])

JavaScript (fetch):

const c = await fetch(
"https://interestratesapi.com/api/v1/convert?from=BCRP_RATE&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY"
);
const cmpJson = await c.json();
console.log(cmpJson.from.rate, cmpJson.to.rate, cmpJson.difference.rate_spread);

PHP (file_get_contents):

<?php
$url = "https://interestratesapi.com/api/v1/convert?from=BCRP_RATE&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY";
$json = file_get_contents($url);
$data = json_decode($json, true);
echo "Spread: " . $data["difference"]["rate_spread"];
?>

Illustrative JSON:

{
"success": true,
"amount": 100000,
"term_months": 12,
"from": {
"symbol": "BCRP_RATE",
"rate": 5.33,
"date": "2026-09-30",
"total_interest": 5330.00,
"total_payment": 105330.00
},
"to": {
"symbol": "ECB_MRO",
"rate": 4.50,
"date": "2026-09-30",
"total_interest": 4500.00,
"total_payment": 104500.00
},
"difference": {
"rate_spread": 0.83,
"interest_saved": 830.00
}
}

Important: rate_spread is the difference between the two latest rates (in percentage points). total_interest and total_payment reflect a simple-interest comparison for the specified term_months.

Computations and How to Read Effective Dates

Units: All rates are percentages per annum (e.g., 5.33 means 5.33% annualized). Use the value as a decimal fraction in formulas by dividing by 100.

Effective dates: For the latest endpoint, use dates.BCRP_RATE as your effective date when logging or versioning. For monthly symbols, that date generally aligns with the latest effective fixing in the requested month.

Time zones and business days: Policy rates do not follow an intraday trading schedule. For monthly series, plan your fetch schedule shortly after the BCRP policy communication each month and be aware of local business days and holidays. If you request a mid-month historical date where no new policy decision occurred, the API will return the last effective value within that month.

Caching: Because BCRP_RATE updates monthly, you can cache the latest value for the remainder of the month or until your update window (e.g., overnight or after policy meeting announcements). Respect rate-limit headers in responses such as X-RateLimit-Remaining and consider backoff if you receive 429 with Retry-After.

Common Patterns: Spreads and Payments Without Hardcoding Numbers

Compute a spread

If you fetch two latest rates r1 (BCRP_RATE) and r2 (another policy or interbank rate), both as percentages:

  • rate_spread_pp = r1 - r2 (in percentage points)
  • rate_spread_bp = (r1 - r2) * 100 (basis points)

Example in pseudocode:

const r1 = latest.rates["BCRP_RATE"]; // e.g., 5.33 (% p.a.)
const r2 = latest.rates["ECB_MRO"]; // another symbol (% p.a.)
const spread_pp = r1 - r2;
const spread_bp = (r1 - r2) * 100; // basis points

Compute a simple monthly payment

When you need a quick, simple-interest estimate for a principal amount P and a term in months N using an annual rate R%:

  • r = R / 100
  • monthly_interest = P * (r / 12)
  • total_interest = monthly_interest * N
  • equal simple monthly payment approximation = (P + total_interest) / N

If you need amortization with declining balance, use the standard amortization formula with the periodic rate i = r / 12:

i = (R / 100) / 12
payment = P * i / (1 - (1 + i)^(-N))

Do not hardcode numbers; instead, read the rate from /latest and plug it into your function at runtime.

Error Handling, Quotas, and Robustness

Common error responses share this shape: { "success": false, "error": "message" }, and some 404s may include a details field. Handle these HTTP statuses gracefully:

  • 401: Missing or invalid api_key
  • 403: Account not active
  • 404: No symbols matched or no data for requested date/range
  • 422: Validation error (date format, invalid symbol)
  • 429: Quota exhausted — use Retry-After and X-RateLimit-* headers to back off

Client tips:

  • Validate user inputs (dates, symbols). Symbols must match exactly: BCRP_RATE.
  • Cache monthly results and avoid redundant calls within the same analysis window.
  • Surface the per-symbol effective date; do not assume it equals the top-level response date.

Real-World Use Cases with BCRP_RATE

  • Interest-rate dashboards: Plot BCRP_RATE over time via /timeseries, use /fluctuation for change summaries, and show monthly OHLC bars from /ohlc to fit existing chart components.
  • Loan comparison tools: Use /latest and /convert to quantify total interest at BCRP_RATE versus a peer rate. Show rate spreads and estimated monthly payments.
  • Macro research: Align /historical and /timeseries to policy statement windows. Track turning points using high/low from /fluctuation.
  • Risk models: Parameterize stress scenarios as offsets to BCRP_RATE, then recompute pricing and VaR with automated fetches gated by monthly cadence.

You can find more resources and models at interestratesapi.com and deeper references via Interest Rates API MCP.

Putting It All Together: Minimal First Request

Here is the simplest “first request” you can run for BCRP_RATE. Replace YOUR_API_KEY with your key.

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

JavaScript one-liner:

const r = await (await fetch("https://interestratesapi.com/api/v1/latest?symbols=BCRP_RATE&api_key=YOUR_API_KEY")).json();

From this response, parse rates.BCRP_RATE (a percentage per annum) and dates.BCRP_RATE (effective date). Store both for traceability and downstream calculations.

FAQ

Q1: What currency and units does BCRP_RATE use?
A: Rates are expressed as percent per annum (e.g., 5.33 means 5.33% p.a.). The currencies map returns the reporting currency. Use the percent value as-is for display, or divide by 100 to convert to a decimal for calculations.

Q2: How often should I refresh BCRP_RATE?
A: BCRP_RATE is monthly. In practice, poll around anticipated policy communications or refresh daily with caching to simplify operations. Cache stability is high between decisions.

Q3: Why does the top-level date differ from the per-symbol date?
A: The top-level date indicates the response context, while dates.BCRP_RATE is the effective date of the rate itself. Always use the per-symbol date for analytics.

Q4: Can I get a month-end value even if I query mid-month?
A: Yes. For monthly symbols, /historical uses the last day with data within that month if the specific date has no new fix. This makes month-based backtests robust.

Q5: How do I handle 404s for out-of-range dates?
A: Check the error’s details (if present) for available ranges, adjust your requested start/end or date, and retry. Consider adding a preflight query (e.g., a short /timeseries) to detect available coverage before running longer pipelines.

If you are ready to integrate BCRP_RATE, create your key and start calling the API. Use the tracked link here to begin: Register. For model coverage, rate catalogs, and developer docs, browse the MCP.

Ready to get started?

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

Get API Key

Related posts