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:
- Register for Interest Rates API
- Get started with Interest Rates API
- Interest Rates API homepage
- Interest Rates API MCP
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-AfterandX-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/fluctuationfor change summaries, and show monthly OHLC bars from/ohlcto fit existing chart components. - Loan comparison tools: Use
/latestand/convertto quantify total interest at BCRP_RATE versus a peer rate. Show rate spreads and estimated monthly payments. - Macro research: Align
/historicaland/timeseriesto policy statement windows. Track turning points usinghigh/lowfrom/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.




