# ECB Bank Lending & Deposit Rate Records — Euro Area MIR (`nexgensignal/ecb-bank-interest-rate-records`) Actor

Per-record euro-area MFI (bank) interest rates from the ECB's official keyless SDMX API. Lending and deposit rates by product, maturity, and counterpart sector. Free commercial reuse, no personal data.

- **URL**: https://apify.com/nexgensignal/ecb-bank-interest-rate-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 rate records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ECB Bank Interest Rate Records — Euro Area MFI

**Official source. No API key. Pay per record.**

This actor turns the **European Central Bank's MFI Interest Rate statistics (MIR)** into clean, per-observation records — the interest rates euro-area banks actually charge and pay: mortgage and consumer-loan rates, corporate lending rates, and deposit rates, by product, maturity, and counterpart sector. Each run reads the keyless ECB SDMX data API and delivers one row per observation: the series, the period, and the rate. Euro-area / statistical grain, ECB-licensed for commercial reuse, no person fields.

### What this is, in one paragraph

The ECB publishes the harmonised interest rates that euro-area monetary financial institutions (banks) apply to loans and deposits — the MIR dataflow. This actor reads that dataflow through the ECB's keyless SDMX API for the series key you choose, parses the SDMX structure into human-readable dimensions, and flattens each observation into a single analysis-ready row: which product (e.g. lending for house purchase), which maturity, which sector (households or non-financial corporations), which period, and the rate. Values are delivered unmodified, as the ECB requires. You are billed only for observations actually delivered.

### Who buys this and for what job

- **Bank-treasury, ALM, and pricing teams** benchmarking euro-area lending and deposit rates by product and maturity.
- **Fixed-income and macro analysts** tracking bank funding and lending-rate dynamics distinct from the policy rate.
- **Fintech, mortgage, and consumer-credit products** displaying or modelling prevailing euro-area retail bank rates.
- **Data engineers** who want a keyless, one-call feed of ECB MFI interest rates already reduced to one row per observation.

### Scope — MFI interest rates only (what this is NOT)

This actor serves **only** the ECB MIR dataflow (MFI interest rates). It is deliberately scoped away from two neighbouring things that are already covered elsewhere, and it is structurally incapable of serving them (the dataflow is fixed to MIR in code):

- **ECB policy rate** — the main refinancing / deposit-facility rate is a different series, covered by the sibling `global-central-bank-policy-rates` product (BIS WS\_CBPOL, which includes the euro area).
- **Euro FX / exchange rates** — EUR/USD and other pairs are covered by `fx-rates-tracker` (ECB-backed) and `currency-exchange-rates`.

This exclusion list ships in every run's receipt. What remains — the actual **bank** interest rates euro-area institutions charge and pay — is not covered by any sibling, which is exactly why this cell exists.

### Licence — free reuse, commercial included, values unmodified

The ECB is explicit: *"The ESCB subscribes to a policy of free access and free reuse regarding its publicly released statistics"*, and *"All publicly available ESCB statistics may be reused free of charge on the condition that the source is quoted"* and *"the statistics (including metadata) are not modified."* This actor delivers values **unmodified** and carries the required attribution: *"Source: ECB statistics (MFI interest rate statistics)."* These are observation records for analysis — not investment or economic advice.

### Statistical grain — no person data

This actor works at statistical / euro-area grain: harmonised aggregates by product, maturity, and sector. There are no natural-person fields in this data, and this actor emits none, with a person-key guard on every record as a backstop.

### Pricing

| Event | Free plan | Bronze | Silver | Gold / Platinum / Diamond |
|-------|-----------|--------|--------|---------------------------|
| `rate_record` | $0.05 | $0.045 | $0.04 | $0.0335 |

Delivered before charged. Blocked runs, empty results, and missing observations cost nothing.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `seriesKey` | string | `M.U2.B...R...EUR.` | SDMX key for the MIR flow. The default pulls euro-area annualised agreed rates; leave dimensions empty to wildcard. |
| `lastNObservations` | integer | — | Optional. Keep only the most recent N observations per series (e.g. 24 for two years). Blank = full history. |
| `maxRecords` | integer | 500 | Ceiling on records delivered and billed. |

### Output

One JSON object per observation. Real example (values verbatim):

```json
{
  "record_id": "MIR.M.U2.B.A2A.A.R.A.2240.EUR.N:2026-06",
  "dataflow": "MIR",
  "series_key": "M.U2.B.A2A.A.R.A.2240.EUR.N",
  "time_period": "2026-06",
  "value": 3.72,
  "frequency": "Monthly",
  "ref_area": "Euro area",
  "balance_sheet_item": "Loans",
  "maturity": "Total",
  "rate_data_type": "Annualised agreed rate (AAR)",
  "counterpart_sector": "Non-Financial corporations (S.11)",
  "currency": "Euro",
  "title": "Loans — Total — Non-Financial corporations (S.11) — Annualised agreed rate (AAR)",
  "source": "European Central Bank (MIR statistics, SDMX API)",
  "source_url": "https://data.ecb.europa.eu/data/datasets/MIR",
  "licence": "European Central Bank (ESCB) MFI interest-rate statistics ... free access and free reuse ...",
  "attribution": "Source: ECB statistics (MFI interest rate statistics).",
  "observed_at": "2026-08-19T00:00:00Z"
}
```

An unbilled `RUN_RECEIPT` records the robots check, the series key, the internal-dedupe exclusion list, observations seen, missing observations skipped, records delivered, and whether charged equals delivered.

### Field reference

Each record is one observation. Identity: `record_id` (`MIR.series_key:period`), `dataflow` (MIR), and `series_key`. The data point: `time_period` and `value` (percent per annum for rate types). The human-readable dimensions: `frequency`, `ref_area`, `balance_sheet_item` (the loan/deposit product), `maturity`, `rate_data_type`, `counterpart_sector` (households or non-financial corporations), `currency`, and a composed `title`. Provenance: `source`, `source_url`, `licence`, `attribution`, `disclaimer`, and `observed_at`.

### How a run works

A run first re-reads the source's robots posture from your runtime — the ECB API host's `/robots.txt` redirects to an empty robots file, a no-policy posture — and stops at the door if that ever changes. It then requests your MIR series key (fixed to the MIR dataflow, so policy-rate and FX flows are unreachable by construction), parses the SDMX-JSON structure into observations, and flattens each into a record with its dimensions resolved to human-readable names. Each non-missing observation is delivered **before** it is charged, so a blocked or empty run costs you nothing; observations with no value are excluded and tallied in the receipt as `missing_skipped`, so you never pay for a gap in the series. The actor stops at your `maxRecords` ceiling, and `charge_equals_delivered` in the receipt confirms you were billed for exactly what you received.

### Cost guidance

One `rate_record` per delivered observation: cost = observations delivered × your plan's per-record price. The euro-area MIR flow holds on the order of 1,500 series with roughly 300 monthly observations each — hundreds of thousands of data points — so use `seriesKey` to target a product and `lastNObservations` to bound history. A default pull of the last two years across the annualised-agreed-rate series is a few thousand observations; 1,000 observations is **$50** (Free) / **$33.50** (Gold).

### Honest limitations

- **MFI interest rates only.** By design this serves the MIR dataflow — not the ECB policy rate, not FX, not other ECB statistics.
- **SDMX keys are the ECB's.** An empty/over-narrow key returns no data (a genuine-empty result, which costs nothing).
- **Values are unmodified** as the ECB licence requires; rate types are percent per annum, but always read `rate_data_type` to interpret a series.
- **Missing observations are skipped** (excluded and counted in the receipt).
- **No person data** is emitted.

### Differentiation

The NexGenData fleet ships a sibling on the same source — **ecb-bank-interest-rates** ("ECB Bank Interest Rate Statistics (MIR)") — which draws on the ECB's MIR dataflow as well. This actor is the **twin built for the lending-and-deposit-rate buyer angle**: it delivers the MIR series as clean per-record data keyed to the specific product, maturity, and counterparty sector — the working data layer for someone modelling euro-area bank lending and deposit rates, rather than a general MIR statistics browser. Same official ECB MIR source; pick this actor when you want the lending/deposit-rate records ready to join, and the sibling when you want the broader MIR statistics framing. This cell is also deliberately non-overlapping with the fleet's other central-bank coverage — `global-central-bank-policy-rates` (policy rates, BIS) and `fx-rates-tracker` / `currency-exchange-rates` (euro FX) — which is why it is structurally fixed to the MIR flow and can never serve the ECB policy rate or FX; and it is distinct from the World Bank macro-indicator, US Treasury, and EU-regulatory cells in this fleet.

### The NexGen Signal family

Part of the NexGen Signal family of official-source, pay-per-record products:

- [National Macro Indicator Records — World Bank](https://apify.com/nexgensignal/national-macro-indicator-records)
- [EU Regulatory Change Records — EUR-Lex](https://apify.com/nexgensignal/eu-regulatory-change-records)
- [EMA Medicine Status Records — EU Medicines](https://apify.com/nexgensignal/ema-medicine-status-records)
- [World Bank Project Records — Development Pipeline](https://apify.com/nexgensignal/world-bank-project-records)
- [Organization Sanctions & LEI Risk](https://apify.com/nexgensignal/organization-sanctions-lei-risk)

*Source: European Central Bank MFI interest rate statistics (MIR dataflow) via the ECB SDMX data API. ESCB statistics are free to reuse for commercial and non-commercial purposes provided the source is quoted and the statistics are not modified. Reformatted to observation records; values unmodified; missing observations excluded and counted; no person data emitted.*

# Actor input Schema

## `seriesKey` (type: `string`):

SDMX key for the ECB MIR (MFI interest rates) flow. Default pulls euro-area annualised agreed rates. Leave dimensions empty to wildcard (e.g. M.U2.B...R...EUR.).

## `lastNObservations` (type: `integer`):

Optional. Keep only the most recent N observations per series (e.g. 24 for the last two years). Leave blank for full history.

## `maxRecords` (type: `integer`):

Maximum records delivered and billed. You are billed only for records delivered.

## Actor input object example

```json
{
  "seriesKey": "M.U2.B...R...EUR.",
  "maxRecords": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The delivered ECB MIR interest-rate observations.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "seriesKey": "M.U2.B...R...EUR.",
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/ecb-bank-interest-rate-records").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "seriesKey": "M.U2.B...R...EUR.",
    "maxRecords": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/ecb-bank-interest-rate-records").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "seriesKey": "M.U2.B...R...EUR.",
  "maxRecords": 500
}' |
apify call nexgensignal/ecb-bank-interest-rate-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/ecb-bank-interest-rate-records"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bVkbY5esc6Q2jlvX9/builds/zTZOS3WEjrcI2KVAf/openapi.json
