# ECB Data Portal

The European Central Bank's data portal, with over a hundred dataflows: ECB policy rates, exchange rates, inflation (HICP), bank mortgage and savings rates, bank balance sheets, money supply and payments. For the Netherlands it holds figures that De Nederlandsche Bank reports to the ECB, always next to the other euro countries. All through an open SDMX API, no key needed. In September 2026 inflation was 3.0 percent in the Netherlands and 3.8 percent in the euro area.

- Publisher: Europese Centrale Bank, De Nederlandsche Bank
- Area: Europe · Finest detail: country (euro countries and euro area), monthly or daily
- Period: verschilt per reeks; wisselkoersen sinds 1999, HICP-reeksen voor Nederland sinds 1997 · Refreshed: daily
- Access: Open · Licence: Vrij te gebruiken met bronvermelding (ECB-voorwaarden, geen CC-licentie)
- Join keys: landcode (NL, U2 = eurozone), periode (dag, maand, kwartaal), SDMX-reekssleutel
- Status: warn (2026-09-01) · HICP Nederland 3 procent (2026-09)
- URL: https://data.ecb.europa.eu/

## What can you do with it?
- **Dutch inflation next to the euro area.** Fetch HICP for NL and U2 in one call (key M.NL+U2…). In September 2022 Dutch inflation peaked at 17.1 percent, far above the euro average.
- **Do the Dutch pay more for a mortgage?.** The MIR series give the rate on new mortgages per euro country. In August 2026: Netherlands 3.91%, Belgium 3.7%, Germany 4.0%, France 3.2%, euro area 3.6%.
- **Savings rate against inflation.** Put the interest rate on Dutch household savings accounts (MIR) next to HICP. The difference is what savers gain or lose in purchasing power.
- **Exchange rate and ECB rate as a timeline.** The deposit facility rate (FM, DFR) and the euro-dollar rate (EXR) are daily series. On 16 October 2026 the deposit rate stood at 2.5 percent.

## How to process it
1. **Find the dataflow.** The dataflow list (SDMX-XML) names every code: HICP (consumer prices), MIR (bank interest rates), EXR (exchange rates), FM (financial markets), BSI (bank balance sheets).
   `https://data-api.ecb.europa.eu/service/dataflow/ECB`
2. **Fetch a series as CSV.** A series is dataflow + key, with dots between dimensions. Use + to ask for several countries at once; detail=dataonly drops the metadata.
   `https://data-api.ecb.europa.eu/service/data/HICP/M.NL+U2.N.000000.4D0.ANR?startPeriod=2024-01&format=csvdata&detail=dataonly`
3. **Mortgage rate per euro country.** Rate on new housing loans (A2C) to households, all maturities. lastNObservations=1 gives only the latest month.
   `https://data-api.ecb.europa.eu/service/data/MIR/M.NL+DE+BE+FR+U2.B.A2C.AM.R.A.2250.EUR.N?lastNObservations=1&format=csvdata&detail=dataonly`
4. **Daily euro-dollar rate.** ECB reference rate, working days only. On 15 October 2026: 1.1208 dollars per euro.
   `https://data-api.ecb.europa.eu/service/data/EXR/D.USD.EUR.SP00.A?lastNObservations=5&format=csvdata&detail=dataonly`

## Interesting combinations
- Do house prices follow the mortgage rate? → [cbs-statline](https://www.opendataindex.nl/en/bron/cbs-statline.md) via periode (maand). Put the MIR mortgage rate next to the CBS price index of existing owner-occupied homes per month and see whether a rate drop shows up in prices later.
- Interest and debt per country → [eurostat](https://www.opendataindex.nl/en/bron/eurostat.md) via landcode. Combine the mortgage rate per euro country with household debt from Eurostat and see where a rate rise hits hardest.

## Similar sources
- [dnb-statistieken](https://www.opendataindex.nl/en/bron/dnb-statistieken.md): DNB publishes the Dutch figures itself and in more detail (pension funds, insurers), but the DNB API needs a key. At the ECB they are open, next to the other euro countries.
- [eurostat](https://www.opendataindex.nl/en/bron/eurostat.md): Eurostat produces the HICP and covers all EU countries, also outside the euro. The ECB takes over those figures and adds interest-rate and banking statistics.
- [cbs-statline](https://www.opendataindex.nl/en/bron/cbs-statline.md): CBS has the Dutch CPI (the national inflation measure) and much more detail per product group, but no comparison with other countries.

## What to watch out for
- **HICP is not the CPI.** The European HICP and the Dutch CBS CPI measure inflation slightly differently (owner-occupied housing, among other things). Always name the measure you use.
- **Old HICP series stop at the end of 2025.** In the ICP dataflow the series ran to December 2025 on 16 October 2026. The current series are in the HICP dataflow, with an extra dimension for the provider (4D0 = Eurostat).
- **No asterisk in the key.** An * as wildcard triggered a firewall block (HTTP 400, 'access has been blocked'). Leave a dimension empty (two dots in a row) or list codes with +.
- **State your transformations.** The ECB terms ask for attribution and that you say what you changed yourself, for example seasonal adjustment or growth rates you computed.
- **The euro area changes composition.** Code U2 is the euro area with changing composition. A long series therefore does not always contain the same countries.

## API (SDMX 2.1 REST)

- Base: https://data-api.ecb.europa.eu/service
- Access: No key or account needed (tested)
- Formats: csv, json, xml
- Size: 105 dataflows in /dataflow/ECB (16 Oct 2026) (tested)
- Filtering: Series key in the path: one position per dimension, dots between, + for several codes, empty for all codes. No *. Time with startPeriod/endPeriod or lastNObservations.; ., +

### Endpoints
- `GET /data/{dataflow}/{sleutel}`: Time series. Key = codes in dimension order with dots between; + for several codes, empty for all. E.g. HICP/M.NL+U2.N.000000.4D0.ANR (inflation NL and euro area).
- `GET /dataflow/ECB`: All dataflows with name and data structure (SDMX-ML): HICP, MIR, EXR, FM, BSI …
- `GET /dataflow/ECB/{dataflow}?references=all`: One dataflow with data structure, concepts and code lists (HICP: 700 kB).
- `GET /datastructure/ECB/{dsd}`: Data structure, e.g. ECB_EXR1 (exchange rates) or ECB_ICP1 (prices): order of the dimensions.
- `GET /codelist/ECB/{codelijst}`: Code list with names, e.g. CL_AREA (countries and areas), CL_CURRENCY, CL_FREQ.

### Parameters
- `startPeriod`: Start: 2024, 2024-Q1, 2024-01, 2024-W01, 2024-01-15 (per frequency). (tested)
- `endPeriod`: End, same notation. (tested)
- `lastNObservations`: At most N observations per series, from the latest. (tested)
- `firstNObservations`: At most N observations per series, from the oldest. (from the description)
- `updatedAfter`: Only what was added, revised or deleted since this moment (percent-encoded, e.g. 2026-10-01T00:00:00%2B01:00). Each row then gets an ACTION column. (tested)
- `detail`: full (default), dataonly (no attributes), serieskeysonly (only which series exist), nodata. (tested)
- `includeHistory`: true also returns earlier versions, with VALID_FROM and VALID_TO per value: shows when a figure appeared or was revised. (tested)
- `format`: csvdata, jsondata (SDMX-JSON), structurespecificdata, genericdata (default, SDMX-ML). Or via the Accept header: text/csv, application/json. (tested)
- `references`: For structure queries: none, parents, children, descendants, all. (from the description)

### Columns in format=csvdata (HICP) (9)
`KEY` tekst, `FREQ` code, `REF_AREA` code, `ICP_ITEM` code, `DATA_PROVIDER` code, `ICP_SUFFIX` code, `TIME_PERIOD` periode, `OBS_VALUE` getal, `OBS_STATUS` code

### Limits and pitfalls
- No key and no documented request limit. Compression with Accept-Encoding: gzip, deflate. (from the description)
- If you keep a local copy, use updatedAfter to fetch only the changes, or send If-Modified-Since (304 if nothing changed). We still got a 200 with If-Modified-Since, because the series had been updated that day. (from the description)
- An * as wildcard in the key triggered a firewall block (HTTP 400, HTML 'access has been blocked'). Leave a dimension empty or list codes with +. (experience)
- No series found = 404 with application/problem+json: 'No Series was returned for the query'. (tested)
- robots.txt (redirected to data.ecb.europa.eu) disallows the user agents curl, Wget, python-requests, axios, Go-http-client and Java, but allows others. Set your own User-Agent with a contact address in your code (curl -A, requests headers). (tested)
- Dataflow ICP ran to December 2025 on 16 Oct 2026. Current HICP is in dataflow HICP with an extra dimension DATA_PROVIDER (4D0): September 2026 NL 3.0%, euro area 3.8%. (tested)
- With Accept: application/json and no format you get SDMX-JSON; without Accept and format SDMX-ML (genericdata). Use format=csvdata&detail=dataonly for a small table. (tested)
- MIR (bank rates per euro country, from DNB for NL): new mortgage rate M.NL.B.A2C.AM.R.A.2250.EUR.N, August 2026 3.91%. Euro-dollar rate: EXR/D.USD.EUR.SP00.A (working days only). (tested)

### Example
```
https://data-api.ecb.europa.eu/service/data/HICP/M.NL+U2.N.000000.4D0.ANR?lastNObservations=3&format=csvdata&detail=dataonly
```

## How to fetch it

### curl
```bash
curl "https://data-api.ecb.europa.eu/service/data/HICP/M.NL+U2.N.000000.4D0.ANR?lastNObservations=3&format=csvdata&detail=dataonly"
```

### python
```python
import csv, io, requests

url = "https://data-api.ecb.europa.eu/service/data/MIR/M.NL+U2.B.A2C.AM.R.A.2250.EUR.N"
r = requests.get(url, params={"startPeriod": "2020-01", "format": "csvdata", "detail": "dataonly"},
                 headers={"User-Agent": "mijn-project/0.1 (mail@voorbeeld.nl)"})
for rij in csv.DictReader(io.StringIO(r.text)):
    print(rij["REF_AREA"], rij["TIME_PERIOD"], rij["OBS_VALUE"])
```

## What you can build with it
- [Monitor for inflation, mortgage rates and savings rates](https://www.opendataindex.nl/en/bouwen/inflatie-rente-monitor.md): One dashboard that shows every month how fast prices rise, what a new mortgage costs and what savings earn, in the Netherlands and the euro area.


## What is in it: 126 dataflows

All dataflows in the ECB Data Portal (including the Eurostat and IMF ones the ECB distributes), in the portal's categories, fetched every night. Dataflows the ECB has not categorised are listed separately, split into live and discontinued. Every dataflow has its own page with the SDMX call, for the Netherlands when the dataflow has countries.

- Kinds: dataflow 126
- With an API call on the dataset page: 126
- Search: https://www.opendataindex.nl/api/catalogus/ecb?q=… or the MCP function zoek_datasets with herkomst=ecb
- Every row has its own page: https://www.opendataindex.nl/en/dataset/ecb/<key>

### Folders
- ECB/Eurosystem policy and exchange rates (7)
- Money, credit and banking (1)
- Financial corporations (11)
- Financial markets and interest rates (13)
- Macroeconomic and sectoral statistics (16)
- Balance of payments and other external statistics (4)
- Supervisory and prudential statistics (5)
- Payments statistics (7)
- ECB surveys (3)
- Niet ingedeeld door de ECB (62): Niet op het Data Portal (5), Actief (43), Stopgezet (14)

## Examples with real figures (1)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Inflation in the Netherlands: 3.0 percent in September 2026, 0.8 percentage points lower than in the euro area (3.8 percent)** (september 2026). Table HICP.M.NL+U2.N.000000.4D0.ANR. [Example](https://www.opendataindex.nl/en/voorbeeld/ecb-inflatie-nl-eurozone)
  - `https://data-api.ecb.europa.eu/service/data/HICP/M.NL+U2.N.000000.4D0.ANR?format=csvdata&detail=dataonly&startPeriod=2015-01`
