API to Get the ECB Main Refinancing (ECB_MRO) Rate

API to Get the ECB Main Refinancing (ECB_MRO) Rate

You need to programmatically pull the ECB Main Refinancing Operations rate (ECB_MRO) and wire it into dashboards, pricing engines, or risk models. By the end of this guide, you will query, validate, and use ECB_MRO via the Interest Rates API in production: latest, historical, time series, fluctuation stats, and OHLC—plus how to compute spreads and loan payments on top, with concrete cURL, Python, JavaScript, and PHP examples.

What the ECB_MRO rate is and why it matters

ECB_MRO is the European Central Bank’s Main Refinancing Operations rate—its core policy rate that anchors euro money market conditions. It’s published by the ECB and represented in the API with symbol ECB_MRO. In practical terms, changes in ECB_MRO influence bank funding costs, variable-rate lending, and benchmark-linked products across the euro area.

Illustration: API to Get the ECB Main Refinancing (ECB_MRO) Rate

Within the Interest Rates API, ECB_MRO is categorized as a central bank rate with daily frequency. The values are returned as percentages (for example, 2.65 means 2.65% annualized). Effective dates are carried alongside values so you know when the latest rate became applicable.

You can browse symbols, query the latest ECB_MRO, retrieve specific dates, or pull a time series for quantitative analysis at interestratesapi.com. To ship this into your stack, you’ll authenticate using an api_key query parameter on every GET request.

Quick start: latest ECB_MRO via cURL, JSON, and how to read it

The following request and response are official samples. Copy them as-is to validate your environment and parse the ECB_MRO value and its effective date.

Official cURL

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

Official JSON response

{
    "success": true,
    "date": "2026-10-23",
    "base": "EUR",
    "rates": {
        "ECB_MRO": 2.65
    },
    "dates": {
        "ECB_MRO": "2026-10-23"
    },
    "currencies": {
        "ECB_MRO": "EUR"
    },
    "base_filter_note": null
}

How to read it:

  • rates.ECB_MRO is the policy rate as a percentage (2.65 means 2.65% per year).
  • dates.ECB_MRO is the effective date of that rate.
  • currencies.ECB_MRO confirms the currency context (EUR).
  • date is the API’s response date for the “latest” snapshot.

Python example (latest)

import requests

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

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

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

JavaScript example (latest)

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

const rate = data.rates.ECB_MRO;
const effectiveDate = data.dates.ECB_MRO;
const currency = data.currencies.ECB_MRO;

console.log("ECB_MRO:", rate, "Effective:", effectiveDate, "Currency:", currency);

PHP example (latest)

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

$rate = $data["rates"]["ECB_MRO"];
$effective = $data["dates"]["ECB_MRO"];
$currency = $data["currencies"]["ECB_MRO"];

echo "ECB_MRO: {$rate} | Effective: {$effective} | Currency: {$currency}\n";

Next, we’ll cover all seven endpoints you’ll use to integrate ECB_MRO into your application lifecycle—from discovery to statistics and conversion.

Discover symbols: GET /api/v1/symbols

Use the symbols catalogue to confirm availability and metadata for ECB_MRO and related ECB instruments.

What it returns

It returns objects with symbol, name, category, country_code, currency_code, frequency, and description. Filter by category=central_bank and base=EUR to focus on euro-denominated policy rates.

cURL

JSON response example

Tip: Swap the filters to base=EUR and category=central_bank to browse euro policy symbols like ECB_MRO, ECB_DEPOSIT, and ECB_MLF. Visit interestratesapi.com to explore the full catalogue.

Python

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/symbols",
params={"category": "central_bank", "base": "EUR", "api_key": "YOUR_API_KEY"}
)
symbols = resp.json()

JavaScript

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

PHP

<?php
$url = "https://interestratesapi.com/api/v1/symbols?category=central_bank&base=EUR&api_key=YOUR_API_KEY";
$symbols = json_decode(file_get_contents($url), true);

Latest rate: GET /api/v1/latest

Use /latest to keep dashboards and pricing views current. The returned dates map tells you the effective date of each symbol’s value.

cURL (official sample)

JSON (official sample)

Python

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

JavaScript

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

PHP

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

Historical point-in-time: GET /api/v1/historical

Pull ECB_MRO as it stood on a specific date (Y-m-d). For monthly series, the endpoint uses the last available day in that month; ECB_MRO is daily in this API.

cURL

JSON response example

Python

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/historical",
params={"date": "2025-06-15", "symbols": "ECB_MRO", "api_key": "YOUR_API_KEY"}
)
point = resp.json()

JavaScript

const res = await fetch(
"https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=ECB_MRO&api_key=YOUR_API_KEY"
);
const point = await res.json();

PHP

<?php
$url = "https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=ECB_MRO&api_key=YOUR_API_KEY";
$point = json_decode(file_get_contents($url), true);

Time series: GET /api/v1/timeseries

For quant work, model calibration, or charting, query ECB_MRO across a date range. You’ll get a map of date-to-value pairs plus frequency and currency metadata.

cURL

JSON response example

Python

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/timeseries",
params={
"start": "2025-10-24",
"end": "2026-10-24",
"symbols": "ECB_MRO",
"api_key": "YOUR_API_KEY"
}
)
series = resp.json()

JavaScript

const res = await fetch(
"https://interestratesapi.com/api/v1/timeseries?start=2025-10-24&end=2026-10-24&symbols=ECB_MRO&api_key=YOUR_API_KEY"
);
const series = await res.json();

PHP

<?php
$url = "https://interestratesapi.com/api/v1/timeseries?start=2025-10-24&end=2026-10-24&symbols=ECB_MRO&api_key=YOUR_API_KEY";
$series = json_decode(file_get_contents($url), true);

Fluctuation stats: GET /api/v1/fluctuation

Compute change, change_pct, high, and low over a range for ECB_MRO. This is useful for risk monitoring and change-detection alerts.

cURL

JSON response example

Field notes:

  • change = end_value - start_value.
  • change_pct is null if start_value is 0; otherwise 100 * change / start_value.
  • high and low are extrema over the requested range.

Python

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/fluctuation",
params={
"start": "2025-10-24",
"end": "2026-10-24",
"symbols": "ECB_MRO",
"api_key": "YOUR_API_KEY"
}
)
fluct = resp.json()

JavaScript

const res = await fetch(
"https://interestratesapi.com/api/v1/fluctuation?start=2025-10-24&end=2026-10-24&symbols=ECB_MRO&api_key=YOUR_API_KEY"
);
const fluct = await res.json();

PHP

<?php
$url = "https://interestratesapi.com/api/v1/fluctuation?start=2025-10-24&end=2026-10-24&symbols=ECB_MRO&api_key=YOUR_API_KEY";
$fluct = json_decode(file_get_contents($url), true);

OHLC aggregation: GET /api/v1/ohlc

Generate OHLC bars over weekly, monthly, or quarterly periods from daily ECB_MRO data—handy for charting and period-over-period analysis.

cURL

JSON response example

Field notes:

  • open: first value in the period; close: last value in the period.
  • high and low are extrema within the period.
  • data_points counts the underlying daily observations aggregated.

Python

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/ohlc",
params={
"symbols": "ECB_MRO",
"period": "monthly",
"start": "2025-10-24",
"end": "2026-10-24",
"api_key": "YOUR_API_KEY"
}
)
ohlc = resp.json()

JavaScript

const res = await fetch(
"https://interestratesapi.com/api/v1/ohlc?symbols=ECB_MRO&period=monthly&start=2025-10-24&end=2026-10-24&api_key=YOUR_API_KEY"
);
const ohlc = await res.json();

PHP

<?php
$url = "https://interestratesapi.com/api/v1/ohlc?symbols=ECB_MRO&period=monthly&start=2025-10-24&end=2026-10-24&api_key=YOUR_API_KEY";
$ohlc = json_decode(file_get_contents($url), true);

Loan cost comparison: GET /api/v1/convert

For lending and treasury teams, /convert estimates total interest for a simple loan using the latest rates, enabling quick benchmarking and spread analysis.

cURL

JSON response example

Field notes:

  • amount is the principal to compare across the two rates.
  • rate_spread is the difference between the two latest rates.
  • total_interest and total_payment help you quantify impacts quickly.

Python

import requests

resp = requests.get(
"https://interestratesapi.com/api/v1/convert",
params={
"from": "ECB_MRO",
"to": "ECB_MRO",
"amount": 100000,
"term_months": 12,
"api_key": "YOUR_API_KEY"
}
)
comp = resp.json()

JavaScript

const res = await fetch(
"https://interestratesapi.com/api/v1/convert?from=ECB_MRO&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY"
);
const comp = await res.json();

PHP

<?php
$url = "https://interestratesapi.com/api/v1/convert?from=ECB_MRO&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY";
$comp = json_decode(file_get_contents($url), true);

How ECB_MRO is expressed, effective dates, and business-day behavior

Units and interpretation:

  • Values are percentages (e.g., 2.65 means 2.65% annualized).
  • For ECB_MRO, frequency is daily in this API. While policy decisions occur on meeting dates, the rate can remain unchanged across days; use dates.ECB_MRO to know its effective day.

Business days and weekends:

  • For days without new decisions, ECB_MRO typically carries forward. Time series may show identical values across consecutive business days.
  • OHLC aggregation counts data_points across the period; for non-business days there are no new data points.

Timezone and date handling:

  • API dates are in ISO Y-m-d. Align them with your system’s timezone normalization to avoid off-by-one issues in UI or analytics.
  • When caching, treat the rates map and the corresponding dates map as an atomic pair.

Computing spreads and monthly payments from returned values

Rate spread:

  • Given two values r1 and r2 from data.rates, spread = r1 - r2 (in percentage points). Use dates to ensure you compare like-for-like dates unless you explicitly want latest-versus-latest.

Monthly payment using a simple amortization formula (illustrative math, not tied to any specific returned number):

  • Convert APR% to monthly rate: i = (APR / 100) / 12.
  • Payment for principal P over N months: payment = P * i / (1 - (1 + i)^(-N)).
  • Use ECB_MRO as an input to build pricing scenarios; actual lending spreads/margins are your product logic.

If you need a quick, comparable interest-cost estimate at latest rates, the /convert endpoint already returns total_interest, total_payment, and rate_spread. For custom amortization schedules or compounding conventions, compute payments client-side using the latest or historical ECB_MRO you fetch via /latest or /historical.

Error handling, rate limits, and resilience

Common error responses are returned with success=false and an error message. Plan for these statuses in your client:

  • 401: Missing or invalid api_key.
  • 403: Account without active plan.
  • 404: No symbols matched or no data for the requested date/range; may include details with available ranges.
  • 422: Validation error (e.g., invalid date format or symbol code).
  • 429: Request quota exhausted. Inspect Retry-After and X-RateLimit-* headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) to back off and retry responsibly.

Caching and refresh policy:

  • Cache successful /latest and /historical responses alongside the dates map to avoid stale displays.
  • For time series, cache by (symbol, start, end) key to accelerate repeat analytics queries.
  • Invalidate caches when your job detects a new effective date via /latest (compare dates.ECB_MRO to your stored effective date).

Comparing ECB policy instruments you might also track

Many euro-area models consider multiple ECB tools. The following table summarizes three related symbols you can query with the same endpoints:

Symbol Name Category Currency Frequency Typical Role
ECB_MRO Main Refinancing Operations Rate central_bank EUR daily Core policy rate used for main refinancing operations
ECB_DEPOSIT Deposit Facility Rate central_bank EUR daily Lower bound in the ECB’s policy corridor
ECB_MLF Marginal Lending Facility Rate central_bank EUR daily Upper bound in the ECB’s policy corridor

You can request any combination with the same patterns shown for ECB_MRO. Explore more on the MCP page and Interest Rates API MCP.

Real-world use cases for ECB_MRO

  • Interest rate dashboards: Stream /latest to notify stakeholders when the effective date shifts.
  • Loan pricing tools: Combine ECB_MRO with product-specific margins; compute amortized payments or use /convert for quick comparisons.
  • Macro research and risk: Pull /timeseries and /fluctuation to study policy cycles and sensitivity of models to policy changes.
  • Treasury ALM: Incorporate /ohlc to visualize monthly policy transitions and scenario planning.
  • Fintech apps: Serve API-powered widgets using /historical to show policy context around user actions.

Production checklist for ECB_MRO integration

  • Always pass api_key as a query parameter on HTTPS GET.
  • Parse and store both rates and dates maps; display the effective date in UI.
  • Retry on transient network errors; respect 429 responses using Retry-After and X-RateLimit-* headers.
  • Cache immutable historical/time-series windows; invalidate on new effective dates for /latest.
  • Guard for 404 with a user-friendly message; optionally fallback to the nearest available date.

Frequently Asked Questions

Q1: What unit does ECB_MRO use in the API?
A1: Percent per annum. For example, 2.65 means 2.65% annualized.

Q2: How do I know when the rate took effect?
A2: Check dates.ECB_MRO in the JSON. Use this effective date in your audit logs and UI.

Q3: How often should I poll for updates?
A3: ECB policy decisions are not daily, but the API is daily. Polling once per business day is common; rely on the dates map to detect an actual change.

Q4: Can I compare ECB_MRO against other benchmarks?
A4: Yes. Use /latest, /timeseries, and /fluctuation with multiple symbols. For quick loan-style comparisons, call /convert.

Q5: What’s the best way to compute a loan payment using ECB_MRO?
A5: Pull the rate via /latest or /historical, convert APR to a periodic rate, and apply your amortization formula. If you only need comparative totals at latest rates, /convert returns total_interest and total_payment.

Ready to integrate ECB_MRO into production? Start with the official samples above, then expand to historical, time series, and OHLC for analytics. Register for an API key and build fast. You can also Register for Interest Rates API, browse the MCP, or Get started with Interest Rates API to wire ECB_MRO into your fintech, lending, and risk platforms.

Ready to get started?

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

Get API Key