# TenneT transparency data

TenneT operates the Dutch high-voltage grid and publishes through an API portal how the grid is kept in balance: imbalance prices and volumes per quarter hour, the activation of reserve power (aFRR, mFRR), the merit order list, available cross-border capacity and metered injections. You need a free key, each API allows only a limited number of requests a day (often only 25), and the terms forbid passing the data on to others. That is why there are no TenneT figures here; the chart comes from the CBS electricity balance.

- Publisher: TenneT TSO B.V.
- Area: Netherlands · Finest detail: quarter hour (imbalance settlement period)
- Period: niet vastgesteld (geen sleutel gebruikt) · Refreshed: live
- Access: Free key · Licence: Voorwaarden TenneT (geen open licentie; data niet doorgeven)
- Join keys: datum en tijd (dd-mm-jjjj uu:mm:ss), onbalansperiode (kwartier), grensverbinding
- Status: grijs
- URL: https://developer.tennet.eu/

## What can you do with it?
- **When was power extremely expensive or negatively priced?.** settlement-prices gives the imbalance price per quarter hour. Find the quarters with the highest and lowest price in a month and compare with the weather.
- **How much power can cross the border?.** available-border-capacity gives the available capacity per interconnector. CBS counts afterwards what was actually imported: in 2025, 42% of imports came from Germany (chart on this page).
- **How often does TenneT have to step in?.** frequency-restoration-reserve-activations and balance-delta-high-res show how much reserve power was used. Add up the volume per day and see whether it relates to lots of sun or wind.

## How to process it
1. **Request a key.** Register on developer.tennet.eu. The key goes in the apikey header. Production: at most 1 request per second, 5 per minute, 25 per day (acceptance: 60 per minute, 300 per day).
   `https://developer.tennet.eu/`
2. **Read the specification per endpoint.** Every API has its own OpenAPI specification (e.g. settlement-prices, version 1.5.1). Times as dd-mm-yyyy hh:mm:ss, at most one month per request.
   `https://developer.tennet.eu/specs/v1/settlement-prices`
3. **A call with a key.** Without a key the gateway returns 403. With the Accept header you choose json, xml, csv or xlsx.
   `curl -H "apikey: <sleutel>" -H "Accept: application/json" "https://api.tennet.eu/publications/v1/settlement-prices?date_from=15-10-2026%2000:00:00&date_to=15-10-2026%2001:00:00"`

## Interesting combinations
- Expensive grid at times of no wind? → [knmi-daggegevens](https://www.opendataindex.nl/en/bron/knmi-daggegevens.md) via datum. Compare the daily imbalance prices with KNMI wind speed and sunshine. Mind the terms if you publish the result.
- Which offshore wind farms feed in? → [emodnet](https://www.opendataindex.nl/en/bron/emodnet.md) via windpark en aansluitpunt. EMODnet shows the offshore wind farms with capacity and status; TenneT's metered-injections gives the measured injection into the grid.

## Similar sources
- [ENTSO-E Transparency Platform](https://transparency.entsoe.eu): European platform where all grid operators, including TenneT, report their generation, load and cross-border data. Its API also needs a token after registration (without one: 401).
- [ned-energie](https://www.opendataindex.nl/en/bron/ned-energie.md): Solar and wind generation and gas use, from ten minutes to a year. An initiative of Gasunie and TenneT, with its own terms.
- [cbs-statline](https://www.opendataindex.nl/en/bron/cbs-statline.md): Open monthly and annual figures on electricity generation, consumption, imports and exports (table 84575NED), but nothing per quarter hour.

## What to watch out for
- **Do not pass the data on.** According to the general terms (C.4) you may not distribute, sell or share data from the APIs with third parties unless the API documentation allows it. You get no rights to the data (E.3).
- **Few requests a day.** The limit differs per API: 25 a day for settlement-prices, settled-imbalance-volumes and metered-injections among others, 600 for the merit-order-list, 1,500 for FRR-activations and reconciliation-control-data, 5 for the monthly reconciliation-prices; on top of that at most 1 per second. Going over can get your key temporarily blocked.
- **Do not use name and logo.** The terms (E.1) forbid using TenneT's name and logo for promotional or commercial purposes without permission. That is why there is no logo here.
- **Not tested ourselves.** We did not request a key. Size and history of the series are therefore not measured; everything here comes from the specifications and the terms (16 October 2026).

## API (REST (JSON, XML, CSV, XLSX))

- Base: https://api.tennet.eu/publications/v1
- Access: Register on developer.tennet.eu and request a key. It goes in the apikey header, together with Accept (application/json, application/xml, text/csv or application/xlsx). Without a key the gateway returned an HTML page with 403; the specification lists 401 for an invalid key. (tested)
- Formats: json, xml, csv, xlsx
- Filtering: No filters besides the time frame: each API returns all series from date_from to date_to.; 

### Endpoints
- `GET /settlement-prices`: Imbalance prices per quarter hour (isp): shortage, surplus, dispatch_up/down, regulation state. At most 1 month per request.
- `GET /settled-imbalance-volumes`: Settled imbalance volumes per time unit with the balance responsible parties. At most 1 hour per request.
- `GET /balance-delta-high-res`: Balance delta in high resolution (activated balancing power); /balance-delta-high-res/latest returns the newest. At most 1 day per request.
- `GET /frequency-restoration-reserve-activations`: Volumes of activated balancing energy (aFRR, mFRR), reserve and emergency energy. At most 1 day.
- `GET /merit-order-list`: Merit order list aFRR and mFRRsa: prices and volumes of the bids per quarter hour. At most 1 hour.
- `GET /merit-order-list-incident-reserve`: Merit order list for incident reserve (mFRRda). Times in UTC with Z; at most 1 day.
- `GET /available-border-capacity`: Available border capacity per quarter hour: total import and export, with Belgium and with Germany, and the aFRR profile limits. Times in UTC with Z; at most 1 day.
- `GET /metered-injections`: Metered injections and scheduled exchanges per market time unit (the load visible on the transmission grid). At most 1 day.
- `GET /reconciliation-prices`: Reconciliation prices per month (v2 also /reconciliation-prices/isp per quarter hour and /reconciliation-prices/mffbas). At most 1 year.
- `GET /reconciliation-control-data`: Data to recalculate the reconciliation prices yourself. At most 1 year.

### Parameters
- `date_from / date_to`: Start and end of the time frame, required. Maximum length differs per API (1 hour to 1 year). For available-border-capacity and merit-order-list-incident-reserve RFC3339 in UTC with Z instead (2024-01-01T00:00Z). (from the description)
- `apikey`: Your personal key. (from the description)
- `Accept`: application/json, application/xml, text/csv or application/xlsx (required). (from the description)
- `response_format`: Only on the newer APIs (border capacity, incident reserve): format as query parameter, default JSON. (from the description)
- `x-conversation_id`: Only on the newer APIs: required caller id for tracing the request. (from the description)
- `bidding-zone / start-date / end-date / product`: Only /reconciliation-prices/mffbas (v2): bidding zone 10YNL----------L, dates YYYY-MM-DD (max 1 month), product e.g. 023. (from the description)

### Fields (per the specifications; not seen ourselves). Prices come as text. (8)
`Response.TimeSeries[].Period.Points[].isp` tekst, `timeInterval_start / timeInterval_end` datetime, `shortage / surplus` tekst (getal), `dispatch_up / dispatch_down` tekst (getal), `incident_reserve_up / incident_reserve_down` tekst, `regulation_state / regulating_condition` getal / tekst, `total_border_capacity_import / _export` getal, `german_border_capacity_import / belgium_border_capacity_import` getal

### Limits and pitfalls
- Limits per API (production): settlement-prices, settled-imbalance-volumes and metered-injections 1 per second, 5 per minute, 25 per day; reconciliation-prices (month) 2 per minute, 5 per day; merit-order-list 10 per minute, 600 per day; frequency-restoration-reserve-activations and reconciliation-control-data 1,500 per day; balance-delta-high-res 10 per minute. (from the description)
- Over the limit: 429 "API rate limit exceeded"; repeatedly exceeding it can temporarily block your key. The acceptance environment (api.acc.tennet.eu) has wider limits. (from the description)
- Responses of the newer APIs carry headers with the remaining room: X-RateLimit-Limit-Day/-Minute/-Second and X-RateLimit-Remaining-Day …; 204 means no data in the time frame. (from the description)
- Recommended polling: available-border-capacity every 5 minutes from 00:06; balance-delta-high-res five times a minute, just after second 12. (from the description)
- Terms: do not distribute, sell or share data with third parties unless the API documentation allows it (C.4); no rights to the data (E.3); do not use TenneT's name and logo for promotion without permission (E.1). (experience)
- Two time notations side by side: the older APIs want dd-mm-yyyy hh:mm:ss (encode the space as %20), the newer ones (border capacity, incident reserve) RFC3339 in UTC with Z, with snake_case fields and one time_series object. (from the description)
- No robots.txt rules: developer.tennet.eu allows everything, api.tennet.eu returns 403 on robots.txt (the gateway). (tested)
- Open alternatives: CBS table 84575NED (monthly electricity balance, with imports and exports per country) and the ENTSO-E Transparency Platform (also with a token). (experience)


## Examples with real figures (1)

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

- **Electricity imports into the Netherlands by neighbouring country (CBS electricity balance): Germany is the largest part, 42% in 2025** (2025). Table 84575NED. [Example](https://www.opendataindex.nl/en/voorbeeld/tennet-stroominvoer-per-buurland-cbs)
  - `https://opendata.cbs.nl/ODataApi/OData/84575NED/TypedDataSet?$filter=Perioden%20eq%20'2025JJ00'&$select=Duitsland_20,Belgie_18,Noorwegen_22,VerenigdKoninkrijk_21,Denemarken_19`
