# entsoe-mcp > A self-hosted MCP server exposing 11+ years of European power-market data — day-ahead and balancing prices, load, generation, cross-border flows, outages — across 47 bidding zones, from the ENTSO-E Transparency Platform plus six native TSO/operator sources (Elexon BMRS, NESO, Elia, Energinet, LCCC, Baltic Transparency Dashboard; GB generation mix back to 2009). Queryable by Claude, ChatGPT, Perplexity, Cursor, Microsoft Copilot, Mistral Le Chat, or any MCP-compatible AI agent. Public site: https://entsoemcp.com MCP transport: https://entsoemcp.com/mcp (anonymous; rate-limited per Mcp-Session-Id) JSON tools manifest: https://entsoemcp.com/endpoints.json Health check: https://entsoemcp.com/healthz · Human status page: https://entsoemcp.com/status ## What it does Caches the ENTSO-E Transparency Platform and six native TSO/operator feeds (Tier 1) into a Parquet + SQLite Tier-2 store, then exposes both an MCP server (for AI agents) and a JSON API (for human and script callers). Hot-path queries are sub-second via DuckDB over Parquet. Operated as an independent, non-commercial project; not affiliated with any of the data sources. ## How to connect Add `https://entsoemcp.com/mcp` as a custom MCP server (streamable HTTP, anonymous — no API key, no OAuth): - Claude / ChatGPT / Perplexity — Settings → Connectors → add a custom connector, paste the URL - Microsoft Copilot Studio — Tools → Add a tool → Model Context Protocol → Authentication: None - Mistral Le Chat — Intelligence → Connectors → + Add Connector - Claude Code — `claude mcp add --transport http entsoe https://entsoemcp.com/mcp` - Cursor / any mcpServers-style JSON client — `{"mcpServers": {"entsoe": {"type": "http", "url": "https://entsoemcp.com/mcp"}}}` - VS Code — uses `"servers"` as the top-level key: `{"servers": {"entsoe": {"type": "http", "url": "https://entsoemcp.com/mcp"}}}` in `.vscode/mcp.json` Machine-readable server card: https://entsoemcp.com/.well-known/mcp.json ### Blocked by your organisation? What to send IT Team and Enterprise admins control which MCP servers their users may connect. There is no central approved list that overrides this — the admin allowlists the server URL. Everything they need: - Server URL to allow: `https://entsoemcp.com/mcp` (streamable HTTP; anonymous; no OAuth, no API key; read-only — every tool declares `readOnlyHint: true`) - Claude Code managed settings (`allowedMcpServers` matches on URL, which is the robust key — `serverName` is a user-chosen label and not a security control): `{"allowedMcpServers": [{"serverUrl": "https://entsoemcp.com/mcp"}]}` - Claude.ai Team/Enterprise: Organization settings → Connectors → add `https://entsoemcp.com/mcp` as an organisation connector, or allow it for the relevant roles - What it reads: public European power-market data (ENTSO-E, Elexon, NESO). It never receives files, chat history or user data; requests are logged with an IP retained for 12 months. Privacy: https://entsoemcp.com/privacy · Licensing: https://entsoemcp.com/licensing · Imprint: https://entsoemcp.com/imprint - Outbound traffic from the org: HTTPS to entsoemcp.com only ## Pages - [Home](https://entsoemcp.com/) — Product overview, agent setup, real-conversation example - [Live coverage](https://entsoemcp.com/coverage) — Freshness matrix for all 47 zones × every endpoint family - [Ask](https://entsoemcp.com/ask) — Natural-language query playground (templates + Claude fallback) - [Explore](https://entsoemcp.com/explore) — Capture rate, negative-price hours, compare zones, download CSV/Parquet - [Day-ahead prices](https://entsoemcp.com/day-ahead) — Live + 11-year historical day-ahead spot prices per country and per bidding zone - [Negative prices](https://entsoemcp.com/negative-prices) — Monthly negative-price-hour counts and share of hours per country and per bidding zone - [Capture rates](https://entsoemcp.com/capture-rate) — Monthly solar & wind onshore capture prices and capture rates per country and per bidding zone - [Emissions](https://entsoemcp.com/emissions) — Map of grid CO2 intensity per country (every complete year and the last 12 months; production-based, IPCC AR5 lifecycle), the GO abatement multiple against a base country you pick on three bases — average, solar hours, wind hours (`#map=go&base=ES&basis=solar`) — drawn explainers of each method, monthly emissions by fuel per bidding zone - [Status](https://entsoemcp.com/status) — Live service status (human-readable) - [Licensing](https://entsoemcp.com/licensing) — Per-source re-use terms and required attributions - [Imprint](https://entsoemcp.com/imprint) — Operator identity, contact, full GDPR notice - [Privacy](https://entsoemcp.com/privacy) — What the site logs, in plain words: no accounts, no cookies, no trackers ## API & JSON feeds No key required; per-IP rate limits apply. robots.txt disallows /api/ for bulk crawlers — that is an indexing opt-out, not a use prohibition: on-demand fetches by an agent acting for a user are welcome, and Claude-User / ChatGPT-User / Perplexity-User are explicitly allowed. - [/api/series](https://entsoemcp.com/api/series?endpoint=day_ahead_price&zone=DE_LU&start=2026-01-01&end=2026-01-02) — JSON time series for any endpoint × zone; `start` inclusive, `end` exclusive, UTC by default (`tz=local` for market time); `aggregation=raw|hourly|daily|monthly` - [/api/derivation](https://entsoemcp.com/api/derivation?slug=capture_price&zone=DE_LU&start=2025-01-01&end=2026-01-01&psr_types=solar) — computed metrics (see Derived metrics below) - [/download](https://entsoemcp.com/download?endpoint=day_ahead_price&zone=DE_LU&start=2015-01-01&end=2026-01-01&format=csv) — bulk export, `format=csv|parquet`, single-zone endpoints only; streamed, at most 2,000,000 rows per request (HTTP 413 above that, with the row count in `X-Row-Count`: split the window or pass `aggregation=`); HTTP 503 with `Retry-After` when the export slots are busy - [/endpoints.json](https://entsoemcp.com/endpoints.json) — every endpoint family: schema, unit, granularity, source, licence, applicable zones - [/zones.json](https://entsoemcp.com/zones.json) — the 47 active bidding zones: EIC codes, timezones, market clusters, lifecycle - [/psr_types.json](https://entsoemcp.com/psr_types.json) — production-type codes; `?zone=GB` scopes to what a zone publishes and flags codes that are not comparable across zones - [/coverage.json](https://entsoemcp.com/coverage.json) — per-(endpoint, zone) freshness: earliest/latest timestamps, lag class - [/headlines.json](https://entsoemcp.com/headlines.json) — a handful of real-data example figures, continuously refreshed - [/emissions_trend.json](https://entsoemcp.com/emissions_trend.json) — per-country CO2 intensity (g/kWh), Mt, TWh and Grid Carbon Index (European average = 100) for every complete calendar year, plus `latest_12m`: the same over the twelve most recent complete months, with `prior_intensity` for the twelve before; per period also `solar_intensity` / `wind_intensity` (the grid intensity in the hours that technology produced, output-weighted) and `solar_twh` / `wind_twh`; the data behind /emissions. A GO abatement multiple is intensity(X) ÷ intensity(base), on the same basis for both - [/healthz](https://entsoemcp.com/healthz) — liveness, version, landed row counts ## Endpoint families The full machine-readable catalogue — schemas, units, granularity, per-zone applicability — is https://entsoemcp.com/endpoints.json; this list is the human/agent summary. - day_ahead_price — Hourly DA clearing price, EUR/MWh (from 2015-01-01) - day_ahead_price_exaa — Day-ahead price from EXAA's separate 10:15 CET morning auction (ENTSO-E "sequence 2"), EUR/MWh; a distinct product from SDAC (different gate, participants, prices), published only for DE_LU and AT (from 2015-01-01) - intraday_prices — Intraday auction sequence-1 clearing price, EUR/MWh (from 2018-06-01) - actual_load — Actual total electricity load, MW (from 2015-01-01) - load_forecast — Day-ahead total load forecast, MW (from 2015-01-01) - generation_per_type — Aggregated generation per ENTSO-E PSR type B01–B25, MW (from 2015-01-01) - generation_forecast — Day-ahead total generation forecast, MW (from 2015-01-01) - wind_solar_forecast — Day-ahead wind (on/offshore) and solar generation forecast, MW (from 2015-01-01) - crossborder_flow — Physical electricity flow between adjacent bidding zones, MW (from 2015-01-01) - net_transfer_capacity_dayahead — Day-ahead NTC between adjacent zones, MW (from 2015-01-01) - scheduled_exchanges — Scheduled commercial cross-border exchange (DA + intraday), MW (from 2015-01-01) - imbalance_prices — System imbalance settlement prices (long/short, ENTSO-E A85), per MWh in the currency the TSO publishes (from 2017-01-01). The `_eur_` in the column names is legacy: each row's `currency` column is authoritative and the response `unit` follows it (PL is PLN, CZ is CZK, RO is RON, BA is BAM, GB was GBP until its ENTSO-E series ended in 2021, HR was HRK until 2022-12-31 and is EUR from 2023-01-01, HU was HUF until 2026-09-30 and is EUR from market day 2026-10-01; the rest publish EUR). Never average or compare a price across rows of different `currency`. A row with no `currency` value is of unknown currency, and the response `unit` is then null. Germany: ENTSO-E publishes the German imbalance price (reBAP) under the Germany country area since 2022-06-22, no longer under the DE_LU bidding-zone code; it is served here under DE_LU as one series, with a METHODOLOGY BREAK on 2022-06-22 (PICASSO accession, ISHM-based reBAP formula per BNetzA BK6-21-192) that the response labels in its `publication` block - imbalance_volumes — System imbalance net volumes, MW (from 2017-01-01) - outage_generation_unit — Planned and forced unavailability events (UMM) with metadata (from 2015-01-01), including outages announced ahead of their start: plant and unit name and EIC, psr_type B-code, business_type A53 planned / A54 forced, available vs nominal MW per availability step, and `reason` (ENTSO-E codes B18 failure, B19 maintenance, B20 shutdown, A95 complementary information, with the publisher's text after a colon; NULL on rows stored before the Reason element was parsed). get_outages serves each document's latest revision and leaves out cancelled and withdrawn ones. - installed_generation_capacity — Annual installed capacity per PSR type, MW (from 2016-01-01) - hydro_reservoir_storage — Weekly aggregated filling rate of water reservoirs and hydro storage plants (ENTSO-E A72), stored energy in MWh, ONE value per week per zone with ts_utc at the week start (from 2015-01-01). Published only by zones with reservoir hydro (Nordic, Alpine and Iberian zones, France, Italy and a few others) — other zones genuinely have no data. - balancing_capacity_price_afrr — aFRR contracted-capacity price (ENTSO-E A81), normalized to /MW/h; several non-euro TSOs publish in local currency (PLN/HUF/RON/BAM/BGN/CHF), carried per-row in the `currency` column, never FX-converted (from 2019-01-01). Germany: ENTSO-E stopped publishing the DE_LU aggregate after 2023-06-30 and publishes the same daily tenders per control area (50Hertz, Amprion, TenneT, TransnetBW); from 2023-07-01 the DE_LU series served here is the control areas' common price (their maximum), verified equal to the old aggregate on their 15-month overlap - balancing_capacity_amount_afrr — aFRR contracted-capacity amount under daily contracts (ENTSO-E A81): up/down/symmetric MW per settlement period (from 2019-01-01). Germany: ENTSO-E stopped publishing the DE_LU aggregate after 2023-06-30 and publishes the same daily tenders per control area (50Hertz, Amprion, TenneT, TransnetBW); from 2023-07-01 the DE_LU series served here is the SUM of the four control areas' contracted MW, verified equal to the old aggregate on their 15-month overlap - balancing_capacity_amount_fcr — Contracted FCR (primary reserve) capacity under daily contracts (ENTSO-E A81), MW per settlement period, up/down/symmetric columns — FCR is usually symmetric, so many zones populate sym_mw only (from 2019-01-01, where published). Germany: ENTSO-E stopped publishing the DE_LU aggregate after 2023-06-30 and publishes the same daily tenders per control area (50Hertz, Amprion, TenneT, TransnetBW); from 2023-07-01 the DE_LU series served here is the SUM of the four control areas' contracted MW, verified equal to the old aggregate on their 15-month overlap - balancing_capacity_price_fcr — Contracted FCR capacity price under daily contracts (ENTSO-E A81), /MW/h with per-row currency column. Converted with the zone's measured price basis for this reserve type where one is declared (measured 2026-10-25 against the TSOs' own published prices; which zones, and how, is in docs/afrr_capacity_price_basis.md "FCR, mFRR and RR"), otherwise with each document's own reporting resolution — treat a zone without a declared basis as provisional; every declared zone's stored history (from 2019-01-01, where published) was re-landed on its basis on 2026-11-02 (Switzerland's on 2026-10-28). Germany: ENTSO-E stopped publishing the DE_LU aggregate after 2023-06-30 and publishes the same daily tenders per control area (50Hertz, Amprion, TenneT, TransnetBW); from 2023-07-01 the DE_LU series served here is the control areas' common price (their maximum), verified equal to the old aggregate on their 15-month overlap - balancing_capacity_amount_mfrr — Contracted mFRR (manual frequency restoration reserve) capacity under daily contracts (ENTSO-E A81), MW per settlement period, up/down/symmetric columns (from 2019-01-01, where published). Germany: ENTSO-E stopped publishing the DE_LU aggregate after 2023-06-30 and publishes the same daily tenders per control area (50Hertz, Amprion, TenneT, TransnetBW); from 2023-07-01 the DE_LU series served here is the SUM of the four control areas' contracted MW, verified equal to the old aggregate on their 15-month overlap. Switzerland: Swissgrid's A81 publication is intermittent since August 2026 — no document for delivery days 2026-08-29..2026-10-20, and on many other days a single-point placeholder served as 0 MW although its daily TRL auction awarded capacity every day (probed 2026-10-25); every awarded bid is on ENTSO-E's A15 document, served as procured_balancing_capacity_mfrr - balancing_capacity_price_mfrr — Contracted mFRR capacity price under daily contracts (ENTSO-E A81), /MW/h with per-row currency column. Converted with the zone's measured price basis for this reserve type where one is declared (measured 2026-10-25 against the TSOs' own published prices; which zones, and how, is in docs/afrr_capacity_price_basis.md "FCR, mFRR and RR"), otherwise with each document's own reporting resolution — treat a zone without a declared basis as provisional; every declared zone's stored history (from 2019-01-01, where published) was re-landed on its basis on 2026-11-02. Germany: ENTSO-E stopped publishing the DE_LU aggregate after 2023-06-30 and publishes the same daily tenders per control area (50Hertz, Amprion, TenneT, TransnetBW); from 2023-07-01 the DE_LU series served here is the control areas' common price (their maximum), verified equal to the old aggregate on their 15-month overlap. Switzerland: the same intermittent A81 publication (placeholder days served as 0); its raw price is the hourly rate, declared basis 60, on which the whole history was re-landed on 2026-11-02 (verified against Swissgrid's results; probed 2026-10-25) - balancing_capacity_amount_rr — Contracted RR (replacement reserve) capacity under daily contracts (ENTSO-E A81), MW per settlement period, up/down/symmetric columns; only (former) TERRE-market zones publish (from 2019-01-01, where published) - balancing_capacity_price_rr — Contracted RR capacity price under daily contracts (ENTSO-E A81), /MW/h with per-row currency column. Converted with the zone's measured price basis for this reserve type where one is declared (measured 2026-10-25 against the TSOs' own published prices; which zones, and how, is in docs/afrr_capacity_price_basis.md "FCR, mFRR and RR"), otherwise with each document's own reporting resolution — treat a zone without a declared basis as provisional; every declared zone's stored history (from 2019-01-01, where published) was re-landed on its basis on 2026-11-02 - procured_balancing_capacity_afrr — aFRR capacity-auction results (ENTSO-E A15/A51), aggregated from every accepted bid: summed procured up/down MW and the volume-weighted average capacity price per MW per hour, in the bids' own currency (per-row `currency`: EUR, CHF, HUF, PLN or RON; not FX-converted). Switzerland: Swissgrid prices each SRL bid per MW for its whole product — the weekly product (Monday to Monday, 168 h; 167 h / 169 h on the daylight-saving weeks) and, from delivery day 2025-09-30, the daily auction's 4-hour blocks (3 h / 5 h on the daylight-saving days) — served per hour as that ÷ the product's hours, matching Swissgrid's own results (measured bid for bid over the whole history, 2026-11-02); where both products cover a period, the MW are summed and the prices MW-weighted. The Swiss history was re-landed on that basis on 2026-11-04. Swiss volumes are ENTSO-E's listing of Swissgrid's awards. On six weeks (2021-W01 and W52; 2022-W21, W24, W44 and W48) it lists a week's award list two or three times; those copies are dropped at ingest (measured against Swissgrid's results, 2026-11-06). On 21 other weeks of its 285 it differs from Swissgrid's own results (a tranche or the main tender missing; other MW or prices), and it lacks 16 weeks of 2023-24 and the weekly product of 2025-W52 and 2026-W01, W04, W20 and W23, whose days carry the daily blocks alone. ENTSO-E also lists each award list of Belgium's delivery day 2026-09-09 (its six 4-hour blocks) and of four Hungarian delivery days (2023-12-29, 2023-12-31, 2024-01-07, 2024-01-26) twice; those copies are dropped at ingest too (measured against Elia's and MAVIR's award lists, 2026-11-06). Elsewhere the per-hour conversion reads the raw price as per settlement period of the bid's resolution, verified for BE, DE_LU and AT against the TSOs' own bid prices (2026-11-06) — treat other zones' levels as provisional. Where a TSO awards a bid in part, ENTSO-E lists it at its offered MW, so the summed volume can exceed the awarded volume and the price leans toward that bid, the dearest awarded one (measured 2026-11-06 against regelleistung.net's and Elia's bid lists): Germany in 74 % of its 4-hour products, by 0.2 % of the volume in all (at most 88 MW); Austria in 51 %, by 0.7 % (at most 19 MW); Belgium in 35 %, by 3.9 % (median 4 MW, at most 153 MW or 131 % of a block's award). For Germany and Austria from delivery day 2021-12-08, and Belgium from 2022-05-04, ingest caps each period at the award — balancing_capacity_amount_afrr, A81's contracted amount — taking the excess off the dearest bids, so volume and price are the award's; it keeps the listing where one bid awarded in part cannot explain the excess (Belgium's blocks under Elia's 24-hour product, most of 2022-2024; a few Austrian A81 blocks far below the award) or no award is stored yet, and rows stored before this cap keep it until each pair's history is re-landed. For Belgium the award per block is also balancing_capacity_price_afrr_elia. Upstream, Germany's 2026-10-23 lacks 1,422 of the 6,124 bids regelleistung.net lists (volume 15 % low); the Czech series also holds ČEPS's yearly products. Coverage varies by zone - procured_balancing_capacity_mfrr — mFRR capacity-auction results (ENTSO-E A15/A47, daily contracts), aggregated from every accepted bid like the aFRR endpoint: summed procured up/down MW and the volume-weighted average capacity price per MW per hour, in the bids' own currency (EUR; CHF for Switzerland, PLN for Poland, HUF for Hungary through 2026-09-30; not FX-converted). Served for AT, BE, CH, CY, DE_LU, DK_1, DK_2, FI, GR, HU, PL and SK, each zone's price unit measured against the TSO's (or regulator's) own figures (measured 2026-11-02; Cyprus 2026-11-05): APG, Elia, regelleistung.net (Germany) and MAVIR (Hungary) list every awarded bid, and each served bid price is theirs per MW per hour; ADMIE's (Greece) settled prices and ÚRSO's (Slovakia) price caps bound the others; Energinet (DK_1, DK_2), Fingrid (FI) and PSE (Poland) run hourly auctions and pay the clearing price, while ENTSO-E lists each accepted bid at its own price — there the served average is of the bids' prices and sits below the clearing price those TSOs publish. Where a TSO awards a bid in part, ENTSO-E lists it at its offered MW, so Germany's, Belgium's and Greece's summed volume can exceed the awarded volume (Germany 2026-10-26 00:00-04:00 up: 543 MW against 474), and DK_2's, Finland's and Poland's run above the auctions' procured volumes; Slovakia's series holds its mFRR and mFRR3 products together; Hungary's hours with nothing procured are 0 MW at a price of 0. Cyprus: TSO Cyprus pays every unit it clears one price per 30-min trading period; ENTSO-E lists every accepted bid at that price through delivery day 2026-08-09 and at its own offer from 2026-08-10 (both listings, summed, on 2026-02-04, 2026-05-07..05-20 and 2026-06-18..08-09), so the served price is TSOC's where the first listing stands alone and the average offer, below TSOC's, from 2026-08-10; Cyprus's volume runs 3-9× the MW TSOC cleared (accepted bids listed at more MW than cleared, and before 2026-08-10 most bids listed twice) — use its prices, not its volumes. From delivery day: AT 2019-12-12, BE 2020-02-04, SK 2021-01-22, GR 2021-09-18, HU 2023-04-14, DK_1 and DK_2 2023-06-21, PL 2024-06-14, FI 2024-11-13, CY 2025-11-01, DE_LU 2025-11-28. Switzerland is Swissgrid's daily TRL auction, every awarded bid (delivery days 2020-12-28 to 2022-12-31 and from 2026-08-27; nothing published between, and nothing for 2026-09-03 although Swissgrid held that day's auction — probed 2026-11-02). Swissgrid prices a bid per MW for its whole 4-hour block; served per hour as that ÷ the block's hours (÷ 5 or ÷ 3 on the two daylight-saving days), matching Swissgrid's own results (measured 2026-10-27). Through 2022 up is TRL+ and down TRL−; from 2026-08-27 every awarded bid is listed as up, so the up columns are TRL+ and TRL− together and the down columns are empty. Weekly TRL products are not included. This is the complete record of the daily auction that balancing_capacity_amount_mfrr / balancing_capacity_price_mfrr publish intermittently for Switzerland. Not served: NL, FR, CZ and RO (no anonymous publisher figure at a stated unit for ENTSO-E's era of these bids) - activated_balancing_price — Activated balancing-energy price under processType A16 ('Realised', ENTSO-E A84) — each TSO's national activation price for the reserve types it settles — per MWh in the currency the TSO publishes — an energy price, no per-period scaling; one column per reserve type × direction (FCR/aFRR/mFRR/RR × up/down), null where a zone doesn't publish (from 2019-01-01). The `_eur_` in the column names is legacy: each row's `currency` column is authoritative and the response `unit` follows it (PL is PLN, RO is RON, BA is BAM, HU was HUF until 2026-09-30, CZ priced aFRR/mFRR in CZK until May 2022, IE_SEM published some periods in GBP in 2020-08..11). A period priced in two currencies at once (CZ 2020-2022: RR or a standard product in EUR beside CZK) is two rows, one per currency — never average a column across them. A row with no `currency` value is of unknown currency, and the response `unit` is then null. `product` is each series' ENTSO-E market product code (A01 standard, A02 specific, A04 local, …; 'unspecified' when the series declares none): some TSOs publish one reserve type as two series for the same period — CZ and SK mFRR as a standard and a specific product, FR and the Italian zones' RR as the TERRE standard product beside a national one, BE mFRR 2019-2023 as a specific product beside an untagged series — so such a period is one row per product; others publish different reserve types under different products (AT: aFRR untagged, mFRR standard), which also gives several rows per period, each holding different columns. `resource_type` is the series' balancing psrType (A03 mixed, A04 generation, A05 load; 'unspecified' when absent): SK (2019 to 2026-09-07) and ME (2020-21) published one mFRR price for generation and one for load, again one row each. Never average a column across a period's rows. The response's `split_periods` block says which case a window holds: where it lists `overlapping_columns` a column is published as several series — keep one with get_series filters={'product': [...]} (HTTP: filter=product:A01), after checking that product carries the reserve type you need; otherwise read each column from the row that holds it, since a product filter would drop the other reserve types. Rows landed before 2026-10-15 have `product` and `resource_type` null; where the zone published two such series (CZ, SK, FR and Italian RR, ME, GR, FI) they hold the two prices' mean until the zone is re-landed, and a filter on these labels reports the rows it left out in `filter_excluded_unlabelled`. Process types: when a TSO joins PICASSO (aFRR) or MARI (mFRR) its platform prices are published under other process types — served by activated_balancing_price_mfrr_scheduled (A60), activated_balancing_price_mfrr_direct (A61) and activated_balancing_price_afrr_local (A68) — and its A16 series for that reserve type usually stops; the end of an A16 column is not a gap to fill from a sibling, and AT, CZ and SK publish A16 and A60 mFRR side by side at different prices. First day without the A16 column: Belgium mFRR 2024-05-22 and aFRR 2024-12-01; Spain mFRR 2024-12-10, aFRR 2025-06-17 and RR 2025-12-31 (the TERRE platform stopped; no successor); Slovenia every column from 2026-07-01; Austria aFRR 2026-07-01; Hungary every column from 2026-10-01 (its last A16 row is 2026-09-30T12:00Z, in HUF). Belgium, Spain, Slovenia and Hungary therefore publish nothing under A16 any more: those series are retired (`/endpoints.json` `ended_series`; /coverage shows them final). Germany: since 2022-06-22 the A16 prices are fetched from the TenneT control area — the aFRR column is the one PICASSO price for Germany, a methodology break the response labels in its `publication` block — and since MARI go-live on 2022-10-05 A16 carries only occasional German mFRR rows (MARI's price is the A60 endpoint's). Hungary's aFRR on the local days 2026-07-13..07-20 is ENTSO-E's published value, which divides MAVIR's aFRR fee over aFRR plus IGCC-netting energy and so understates MAVIR's settled price (every other July/August day matches MAVIR's settlement). Cyprus, measured 2026-10-15 against TSO Cyprus's own daily Balancing Market report: the mFRR value CY publishes is 1/6 of the balancing-energy marginal price of each 30-minute ISP's LAST 5 minutes, not an ISP activation price. 166666.5 and 6190 are placeholders, not prices, and FCR/aFRR/RR are 0.00 placeholders from 2026-08-07 to 2026-09-30. ENTSO-E has since re-sent CY's 2025-10..2026-07 history as its reserve capacity prices. That copy is never served: CY rows start 2026-06-28 and hold what CY first published - activated_balancing_price_mfrr_scheduled — Activated balancing-energy price under processType A60 ('Scheduled activation mFRR', 'mFRR SA' on the Transparency Platform): mFRR energy activated in the scheduled quarter-hour process — for a zone on MARI, the European mFRR platform, MARI's marginal price for the zone, usually one value republished in both directions and absent for a quarter-hour with no price; some TSOs publish a local scheduled mFRR product here before or outside MARI. Belgium from 2024-05-22: Elia's local standard mFRR product, 0.00 on non-activated quarter-hours until 2024-06-29 (exclude those zeros from averages — and ENTSO-E also published some activated quarter-hours of that era as 0.00), then activated quarter-hours only, MARI's price from MARI access on 2025-05-21; Spain from 2024-12-10, Slovenia from 2026-07-15 and Hungary from 2026-10-01 (two quarter-hours, regular from 2026-10-05): MARI's price, one value republished in both directions. Same columns, `currency`/`product`/`resource_type` row keys and caveats as activated_balancing_price, mFRR columns only (from 2022-08-24). Germany: since MARI go-live on 2022-10-05 fetched from the TenneT control area, a break the response labels in its `publication` block. AT, CZ and SK publish an A16 and an A60 mFRR price for the same quarter-hour with different values: never merge, average or gap-fill one endpoint from the other. - activated_balancing_price_mfrr_direct — Activated balancing-energy price under processType A61 ('Direct activation mFRR', 'mFRR DA'): mFRR energy activated directly, outside the scheduled quarter-hour process. Published only for periods with a direct activation, so most periods have no row — sparse by design, not a gap. Same columns and periods as the A60 scheduled price, but a different price for different energy; mFRR columns only (from 2022-08-24). Germany: since MARI go-live on 2022-10-05 fetched from the TenneT control area, labelled in the response's `publication` block. - activated_balancing_price_afrr_local — Activated balancing-energy price under processType A68 ('Local selection aFRR', 'aFRR LS'): a 15-minute directional aFRR price from the TSO's local selection. It is NOT PICASSO's cross-border marginal price (processType A67, published at 4-second resolution and not served here) and can differ from the TSO's own settlement figure (Belgium: not Elia's open-data aFRR price). aFRR columns only; some zones publish it on a few periods a week (from 2024-05-30). Belgium from 2024-11-26, Spain from 2025-06-17 (almost no A68 price on 2026-02-22/23 and 2026-04-17..06-22, when only PICASSO's A67 had one; ENTSO-E began republishing A68 from 04-17 on 2026-10-13), Slovenia 2026-07-01 to 2026-07-13 only (afterwards only A67), Austria from 2026-07-01; Hungary's A68 is a handful of local-selection rows a week, not its aFRR price. - system_price — GB half-hourly system / imbalance cash-out price (DISEBSP) from Elexon BMRS, GBP/MWh, plus the Net Imbalance Volume in the same rows (niv_mwh, MWh, positive = system short). Single price under BSC P305 (sell == buy, stored once) (Great Britain only, from 2015-11-06). Prices are revised by successive settlement runs for months after delivery — recent values are provisional. - market_index_price — GB half-hourly Market Index Price (MID) from Elexon BMRS, GBP/MWh (Great Britain only, from 2016-09-12; ENTSO-E stopped publishing GB on 2021-06-15). Two data providers per settlement period: APXMIDP carries the price signal; N2EXMIDP is published as 0.00 across the whole series and stored as-is — filter to data_provider='APXMIDP' or any average you take will be exactly half the real price. - demand_outturn_transmission — GB half-hourly TRANSMISSION-SYSTEM demand outturn from Elexon BMRS, MW (Great Britain only, from 2021-01-01): indo_mw = Initial National Demand Outturn (INDO), itsdo_mw = Initial Transmission System Demand Outturn (ITSDO, adds station load, pumping and interconnector exports). Transmission-metered only — embedded (distribution-connected) generation is invisible, so these run roughly 5-11 GW BELOW total GB demand. NOT a total-load series; do NOT compare against other zones' actual_load. - wind_forecast_transmission — GB HOURLY transmission-connected (BM-visible) wind generation forecast from Elexon BMRS, latest published value per period, MW (Great Britain only, from 2021-01-01). Excludes embedded wind — NOT total GB wind. Hourly grain despite settlement-period numbering (rows only on hour boundaries). - balancing_adjustment_disbsad — GB disaggregated balancing-services adjustment ACTIONS from Elexon BMRS dataset DISBSAD (Great Britain only, from 2016-09-12): one row per adjustment action within a 30-min settlement period, so several rows share one ts_utc and action_id keys them — an action archive, not a plain series. Every settlement period carries at least one row: a period with no actions keeps a single zero-cost placeholder (action_id 1, cost 0, volume 0), and upcoming periods show the same placeholder before actions publish — do NOT read a lone zero-cost row as a real action. cost_gbp is the action's total signed cost in GBP (NOT a per-MWh price; divide by volume_mwh for the implied GBP/MWh), volume_mwh the signed MWh (buy actions positive, sell negative). so_flag/stor_flag/is_tendered are 0/1 flags; party_id/asset_id/service are populated only in recent years (null across the earlier history). Values revise in place for a few days after delivery (the placeholder mutates into the first real action, further actions append) — recent rows are provisional. - balancing_adjustment_netbsad — GB net balancing-services adjustment from Elexon BMRS dataset NETBSAD, per 30-min settlement period (Great Britain only, from 2016-02-29): net buy/sell cost (GBP), volume (MWh) and price (GBP/MWh) adjustments applied to the imbalance-price calculation. Under BSC P305 the adjustment is disaggregated (see balancing_adjustment_disbsad), so almost every value in the API-served history is zero — the surviving signal is the occasional buy_price_adj_gbp_mwh (the BPA feeding the DISEBSP system price). Do not read the zeros as missing data; they are real published values. - generation_mix — GB half-hourly generation mix from the NESO Data Portal, MW (Great Britain only, from 2009-01-01). The ONLY source of GB solar: GB solar is ~99% embedded (distribution-connected), so it is absent from Elexon BMRS (which has no SOLAR fuel type at all) and from ENTSO-E (which froze GB generation on 2021-06-15). See the Great Britain section below before using it. - frequency_response_auction — GB frequency-response / balancing-reserve auction (EAC) clearing prices from the NESO Data Portal, GBP/MW/h; the service column carries all twelve products — Response (DCH/DCL/DMH/DML/DRH/DRL) and Balancing Reserve (PBR/NBR/PQR/NQR/PSR/NSR) — negatives legal (Great Britain only, from 2023-11-01) - frequency_response_auction_pay_as_clear — GB pre-EAC pay-as-clear frequency-response auction clearing prices (the six Response products), GBP/MW/h; the direct predecessor of frequency_response_auction, same schema — union the two for continuous history (Great Britain only, 2021-09 to 2023-11, frozen archive) - dynamic_containment_bids — GB Dynamic Containment pay-as-bid unit bids (2020-10 to 2021-09), all battery: per-unit availability fee (bid price, GBP/MW/h), volume offered/accepted, accepted/rejected outcome (Great Britain only, frozen archive) - balancing_capacity_price_afrr_elia — Belgium aFRR (secondary reserve) capacity auction from Elia Open Data, EUR/MW/h + MW (Belgium only, from 2022-05-04), at Elia's NATIVE 4-hour delivery-block grain: six rows per delivery day per direction, ts_utc being the block start and the direction column carrying Up/Down. Elia auctions OVERLAPPING delivery products per day — a 24-hour product (0-24) plus six 4-hour blocks (0-4 … 20-24) tiling the day — in BOTH of its dataset generations (ods125 2022-05→2026-05 and ods207 2026-05→now, where the 0-24 product currently clears 0 MW and the blocks carry the volume). Because those products cover different hours, they are flattened onto the block grid, never summed across the day: procured_mw is the capacity actually HELD during that block — the sum of every product whose window covers it (on 2024-01-15 Up: the 85 MW 24-hour award + the 32 MW block award = 117 MW) — and capacity_price_eur_mw_h is those products' award-weighted price. Expect roughly 100–125 MW per direction; a figure in the hundreds would mean the products had been summed. For the daily figure use the afrr_capacity_daily_elia derivation rather than averaging the block prices yourself — the roll-up is weighted by held capacity and is exact. Elia's NATIVE auction result — DISTINCT from the ENTSO-E-sourced balancing_capacity_price_afrr BE series (per-ISP, A81); expect the same order of magnitude, not equality. - balancing_capacity_price_fcr_energinet — Danish FCR (primary reserve) capacity price from Energinet Energi Data Service, EUR/MW/h + MW, hourly (Denmark only, from 2021). The product column carries the procured product, and the two Danish areas buy DIFFERENT products because they sit in different synchronous areas: DK_1 is coupled to the Continental-European FCR Cooperation and reports one symmetric product split into "FCR domestic" and "FCR cross-border" legs, while DK_2 is Nordic and buys FCR-N and FCR-D up/down. Do NOT compare a DK_1 price to a DK_2 price as if they were the same product. procured_mw is always THIS ZONE's own volume (for DK_2, Energinet's PurchasedVolumeLocal — its similarly-named PurchasedVolumeTotal is the volume across ALL Nordic price areas, is identical for every zone, and is deliberately not stored). The two DK_1 legs are complementary halves of ONE requirement (domestic vs abroad), so adding them is meaningful and gives Denmark's total FCR obligation for that hour — but that requirement LEVEL CHANGES OVER TIME and must never be hard-coded as a validation rule: across the full series (2021-01-18 to 2026-07-20) the sum steps 20 → 22 → 23 → 25 → 29 MW at successive year-ends. A leg may also be NEGATIVE (408 of 48,210 hours): the legs are net positions, so a negative "FCR cross-border" means Denmark sold FCR abroad rather than buying it, and the two still sum to the requirement (26 + -6 = 20 MW). Do not clip a leg at zero or read one alone as a procured volume. The DK_2 products are separate requirements and must not be summed at all. Rows are the native hourly grain with no aggregation applied (DK_1's 4-hour FCR-Cooperation blocks arrive from Energinet already expanded to one row per hour). Energinet's NATIVE auction result — DISTINCT from the ENTSO-E-sourced balancing_capacity_price_afrr DK series (A81): different product and publisher, not reconciled. - balancing_capacity_price_afrr_energinet — Nordic aFRR (secondary reserve) Capacity Market results from Energinet Energi Data Service, EUR/MW/h + MW, hourly (all twelve Nordic price areas — DK_1, DK_2, FI, NO_1-NO_5, SE_1-SE_4 — from 2022-12-07): the direction column carries Up/Down, capacity_price_eur_mw_h the hourly clearing price, procured_mw the procured capacity. The market is jointly operated by Energinet, Statnett, Svenska kraftnät and Fingrid and clears natively in EUR/MW/h. This is the market's NATIVE result, published at source; it is a SEPARATE endpoint from the ENTSO-E-sourced balancing_capacity_price_afrr series for the same zones (A81) because one endpoint = one source. But the two are NOT independent measurements: ENTSO-E A81 for the Nordic zones REPUBLISHES this same clearing, so for a given hour and direction the PRICES ARE EXPECTED TO MATCH — verified 192/192 exact across DK_2, FI, NO_2 and SE_3 on 2026-05-01 UTC. If they diverge, treat it as evidence one of the two pipelines is broken (most often a delivery-day boundary or resolution artefact, since A81 is per-ISP and this feed is natively hourly), not as normal. What this endpoint adds over A81 is procured_mw (A81 carries price only) and the native hourly grain. - balancing_capacity_baltic — Baltic FCR/aFRR/mFRR reserve capacity auctions from the Baltic Transparency Dashboard (the three Baltic TSOs' joint platform), EUR/MW/h + MW, 15-minute MTU (Estonia, Latvia and Lithuania only, from 2025-09-30). reserve_type carries FCR/aFRR/mFRR and direction carries Symmetric (FCR) or Up/Down (aFRR, mFRR), so one endpoint covers all three products. Every value is the source's own per-MTU, per-zone figure with NO aggregation — nothing is summed across zones, products or time, and the three products are concurrent obligations on one common grid rather than differing-duration products tiling the day, so no duration weighting applies. procured_mw is genuinely per-zone (never identical across EE/LV/LT in any MTU of a sampled month); the Baltic FCR total across all three zones sits at 28-29 MW, so a figure near 84 MW would mean the zones had been summed. capacity_price_eur_mw_h is a COMMON BALTIC clearing that separates on congestion — over June 2026 the FCR price was identical in all three zones in 100% of MTUs but the aFRR/mFRR upward prices in only ~60%, so it is a real per-zone price, not one number broadcast onto three rows. A SEPARATE endpoint from the ENTSO-E-sourced balancing_capacity_price_afrr (A81) series for the same zones (one endpoint = one source), but NOT an independent measurement of it: the Baltic dashboard declares EUR/MW/h in-band and is the Baltic TSOs' own publication of their own auction, and A81 republishes that same clearing, so for a given MTU and direction the aFRR PRICES ARE EXPECTED TO MATCH 1:1 — verified 2026-07-20 across EE, LV and LT over the 2026-07-05 to 07-19 delivery window: 7,930 of 7,962 zone-MTU-directions exact, and all 32 exceptions sit on the single 22:00Z delivery-day-boundary MTU. If they diverge anywhere else, treat it as evidence one of the two pipelines is broken, not as normal. Resolved historical artefact, recorded so it is not rediscovered and mistaken for a venue difference: A81 rows for delivery BEFORE 2026-07-05T04:15Z used to read exactly 4x high, because they landed before afrr_price_basis_minutes=60 was set for EE/LV/LT (A81 reports these zones at PT15M, so the reporting-resolution fallback quadrupled the hourly price; the registry forces x1). Those rows were re-materialized on 2026-07-20 (372,750 rows across EE/LV/LT) and now agree with this endpoint 1:1 — spot-verified LT 2026-06-10 (569.89 vs 569.89) and LV 2026-05-20 (85.71 vs 85.71), ratio 1.0000. A 4x on any A81 Baltic row today means a partition escaped that re-fetch, not a real difference; this endpoint is the correct denomination throughout. The A81 FCR and mFRR price series of these zones carry the same denomination since 2026-10-25 (basis 60, measured against this endpoint at every quarter-hour; before their re-land they read 4x high from the 2025-10-01 delivery day). What this endpoint adds over A81 is procured volume. History starts on the 2025-09-30 delivery day, NOT at the February 2025 Baltic desynchronization — both exports return all-null values for every earlier MTU. BTD's pre-October 2025 60-minute archive is a separate export and is not served here. - day_ahead_price_imrp — GB hourly day-ahead AUCTION price, GBP/MWh (Great Britain only, from 2016-06-30; batched publication, newest delivery day typically D-2 but D-4 after a weekend): the CfD Intermittent Market Reference Price from the LCCC Data Portal, a volume-weighted average across the two GB day-ahead auctions (EPEX SPOT GB + N2EX) since GB decoupled from SDAC on 2021-01-01. THE series for GB day-ahead questions after 2020 — ENTSO-E's day_ahead_price for GB ends 2020-12-31 (penny-identical to this one on their 2016→2020 overlap). Contractually referenced (CfDs, most GB PPAs); distinct from market_index_price (MID), a within-day traded index with ~2% mean basis — do not splice the two. ## Derived metrics - capture_price — Monthly capture price (production-weighted VWAP) + baseload price + capture rate (capture / baseload, also known as quality factor, value factor, or Marktwertfaktor) per zone × PSR type. Priced against the day-ahead auction, in the zone's trading currency — the per-row `currency` column is authoritative (EUR for euro zones; GBP for GB; PLN/RON/BGN for the PL/RO/BG local-currency eras) and the `*_eur_per_mwh` column names are fixed for API stability; a month spanning a redenomination splits into one row per currency, never blended. Exposed via the get_derivation MCP tool and the /api/derivation HTTP wrapper. - capture_price_mid — The same three numbers for GB, priced against the Elexon Market Index Price in GBP/MWh, covering 2016-09-12 to today (Great Britain only). Use this for any GB capture-price question from 2021 onward — ENTSO-E cannot answer it. See the Great Britain section below. - afrr_capacity_daily_elia — Daily roll-up of the Belgium aFRR capacity auction (balancing_capacity_price_afrr_elia), one row per delivery day per direction (Belgium only). capacity_price_eur_mw_h is weighted by the capacity held in each 4-hour block — NOT the unweighted mean of the six block prices, which diverges whenever the day is not flat — and procured_mw is the mean capacity held across the day. Because every Elia delivery product spans a whole number of blocks, this reproduces the auction's daily figures exactly (2024-01-15: 117 MW in both directions, matching Elia's published symmetric BE aFRR requirement). n_blocks surfaces partial days; a complete day is 6. - negative_price_hours — Count of hours with negative day-ahead prices per zone-month, with min/avg negative price. - residual_load — Monthly residual load (load minus wind + solar): what dispatchable resources must cover. Mean / min (the duck-curve floor) / max per zone, MW. - res_share — Renewable share of monthly generation: (renewable + hydro) / (renewable + hydro + fossil + nuclear), Ember/Bruegel convention; pumped storage and "other" excluded. - emissions — Monthly CO2 emissions per zone × production type: generation × IPCC AR5 lifecycle factors (the factor set used by Electricity Maps, Ember, Climate TRACE). Production-based attribution. - tb_spread — Top-Bottom (TBx) battery-arbitrage spread in the zone's trading currency per MW (per-row `currency`: EUR for euro zones, GBP for GB, PLN/RON/BGN local-currency eras; a period spanning a redenomination splits into one row per currency): per day, the sum of the x highest hourly prices minus the x lowest (TB1/TB2/TB4/TB6); monthly/annual values sum the daily ones. zone="all" returns every zone at once. ## Great Britain — read this before querying GB GB is the one zone where the obvious query gives the wrong answer. It left the EU internal market, so it is served by three sources with different taxonomies, and the naming does not warn you. **Which source answers what.** ENTSO-E stopped publishing GB day-ahead prices on 2020-12-31, when GB left European market coupling, and the rest of GB (generation, load, imbalance prices, outages) on 2021-06-15. Both remain queryable for the years they cover, and neither is wrong — they are just over. After those dates the GB day-ahead auction price is `day_ahead_price_imrp` (LCCC, GBP/MWh), generation is `generation_mix` (NESO), and Elexon carries the within-day market index, the system price, transmission demand and transmission wind. A GB query that reaches past an ENTSO-E end — `get_day_ahead_prices(zone="GB")`, `get_generation(zone="GB")`, a GB `capture_price`, `negative_price_hours` or `tb_spread` — answers with a `series_ended` block: the last day, why, and `successors` naming the endpoint or metric that carries the series on, with a ready-to-run `call`. Follow it; do not read the empty answer as missing data. An empty GB answer's `unit` is GBP, never EUR. **GB solar is invisible to two of the three sources.** Roughly 99% of GB solar is embedded — connected to distribution networks, below the transmission meter. Elexon BMRS therefore has no SOLAR fuel type at all: its generation outturn reports ~17 fuel types and solar is not among them, even at midday in June when GB solar is running at ~10 GW. ENTSO-E's GB generation stopped in 2021. `generation_mix` (NESO) is the only source that sees GB solar, and it reaches back to 2009. The same applies to embedded wind. **GB carries wind under two incompatible taxonomies.** ENTSO-E splits wind by *technology*: B18 Wind Offshore, B19 Wind Onshore. NESO splits it by *connection level*: transmission-metered vs embedded. These are orthogonal axes, not two names for one thing. NESO's transmission-metered wind is roughly 75–80% offshore, so it is not B19, and it is not B18 either. That is why it carries a source-native code (`NESO_WIND_TRANSMISSION`) rather than being mapped onto a B-code that would look comparable and not be. Codes whose `source` is not `entsoe` are native to that source and only exist where it publishes — never compare them across zones without reading their `description`. **Some GB figures are not generation.** `NESO_IMPORTS_NET` is interconnector net flow and `NESO_STORAGE_NET` is net storage discharge. Both are zero-clipped upstream (exports and charging are not observable), so they are half-signals, and neither is production. They carry `counts_as_generation: false` and are excluded from generation totals and from capture-price weighting. Do not sum them into a generation figure. **GB solar is a modelled estimate.** `SOLAR` and embedded wind in the NESO mix are modelled, not metered — unavoidable for generation that sits behind distribution meters. Treat them as best available, not as a meter read. **Two GB capture-price series exist and must not be spliced.** `capture_price` for GB prices the ENTSO-E day-ahead auction against ENTSO-E transmission-only generation (2015-01 → 2020-12). `capture_price_mid` prices the Elexon MID against NESO embedded-inclusive generation (2016-09 → today). They overlap from 2016-09 to 2020-12, but differ on three axes at once — product (day-ahead auction vs within-day traded index), currency LABELLING (both report GBP in their `currency` column, but `capture_price` carries it under EUR-named keys while `capture_price_mid` names GBP in the column itself), and generation definition (transmission-only vs embedded-inclusive). The overlap is a cross-validation window, not a join. For "GB solar capture price" from 2021 onward, `capture_price_mid` is the only answer. **Currency.** GB values are GBP. Most GB columns say so in the name (`capture_price_gbp_per_mwh`, `gbp_per_mwh`, `clearing_price_gbp_mw_h`), but the column name is NOT a reliable currency signal on its own: the `capture_price` and `tb_spread` derivations keep fixed `*_eur_per_mwh` / `tb*_eur_per_mw` key names for API stability and carry the real currency in each row's `currency` column (GBP for GB), which is authoritative. Read `currency`, not the key name. No FX conversion is applied anywhere. Do not assume EUR because other zones are EUR. Call `list_psr_types(zone="GB")` for the machine-readable version of all of this: it returns only the codes GB actually publishes, each with its `source`, `counts_as_generation`, the endpoints that carry it, and a `taxonomy_note`. ## Coverage - 47 active EU bidding zones across 8 clusters: CWE (DE-LU, FR, NL, BE, AT, CH), Iberia (ES, PT), Italy (7 zones: IT-NORD, IT-CNOR, IT-CSUD, IT-SUD, IT-CALA, IT-SICI, IT-SARD), British Isles (GB, IE), Nordics (DK1, DK2, NO1–NO5, SE1–SE4, FI), Baltics (EE, LV, LT), South-East Europe (RO, BG, GR, HU, SI, HR, RS, ME, MK, BA, AL) - Data from 2015-01-01 to present for most series - Refresh latency: DA prices once per day (~14:00 CET for next day), load and generation 30–120 min, outages event-driven - Revisions: several TSOs restate activated_balancing_price, imbalance_prices and imbalance_volumes days to months after delivery (provisional placeholders first, monthly settlement runs later). Each such zone is re-fetched weekly over its measured finalisation lag, so its most recent values are provisional and may still change. The A84 process-type siblings (activated_balancing_price_mfrr_scheduled, _mfrr_direct, _afrr_local) have no measured lag yet: they are re-fetched only over a short default window, so a TSO revision later than that is not yet picked up. ## MCP tools (high-level) - list_zones, list_endpoints, list_psr_types — discovery. `list_psr_types(zone=...)` scopes production types to what a zone actually publishes and flags codes that are not comparable across zones; always pass zone= for GB. - get_series — generic time-series query, any endpoint × zone. A window that reaches past the day a series stopped upstream (a zone that left ENTSO-E, a frozen archive, a series that ended) carries `series_ended`: the last day, why, and `successors` — the endpoints that carry it on, each with a ready `call` and a `note` on how it differs (`series_ended_by_zone` on compare_zones; `X-Series-Ended` on /download) - get_day_ahead_prices, get_load, get_generation, get_crossborder_flow, get_outages — typed wrappers - compare_zones — multi-zone comparison - get_tb_spread — top-bottom hour spread - data_coverage — freshness snapshot per (endpoint, zone) - list_derivations, get_derivation — derived metrics (capture price, baseload, capture rate, negative price hours, residual load, renewable share, CO2 emissions, monthly/annual TB1/TB2/TB4/TB6 battery-arbitrage spreads incl. zone='all') MCP prompts (slash-commands in most clients): zone_briefing(zone) — one-zone market briefing; capture_rate_report(zone, year) — solar/wind capture rates; battery_spread_scan(zone) — TBx battery-arbitrage scan across zones. ## What's new - 2026-10 — a query past the end of a series says so: `series_ended` names the last day, why, and the endpoint that carries it on (GB day-ahead after 2020-12-31 → day_ahead_price_imrp; GB generation after 2021-06-15 → generation_mix), instead of an empty answer with no note - 2026-10 — /emissions is public: a map of grid CO2 intensity per European country and the GO abatement multiple — what a Guarantee of Origin from each country abates against a base country you pick - 2026-10 — activated balancing-energy prices split by ENTSO-E process type: activated_balancing_price (A16 realised) plus the mFRR scheduled (A60), mFRR direct (A61) and aFRR local-selection (A68) endpoints; `product` and `resource_type` row keys; `filters` and `split_periods` on get_series - 2026-09 — MCP prompts (zone_briefing, capture_rate_report, battery_spread_scan); self-describing /api error responses; listed in the official MCP registry as com.entsoemcp/entsoe-mcp - 2026-08 — agent-discovery overhaul: this file census-synced with the live registries (drift-tested), /.well-known/mcp.json server card, ENTSO-E A81/A15/A84 balancing families documented - 2026-07 — GB multi-source build: Elexon BMRS (market index, system price, demand outturn, transmission wind), NESO (generation mix back to 2009, frequency-response auctions), LCCC day-ahead auction price (2016→now); native reserve-capacity feeds from Elia, Energinet and the Baltic TSOs - 2026-05 — public launch: 47 bidding zones, ENTSO-E core series from 2015 ## Data source and licence Data: ENTSO-E Transparency Platform — re-distributed under their terms, with attribution: "Source: ENTSO-E Transparency Platform (transparency.entsoe.eu)". https://eepublicdownloads.entsoe.eu/clean-documents/mc-documents/transparency-platform/ENTSOE_Transparency_Terms_Conditions.pdf Attribute re-used ENTSO-E data as: "Source: ENTSO-E Transparency Platform (transparency.entsoe.eu)". Which datasets are CC-BY 4.0 (ENTSO-E free re-use list) and which are attribution-only: https://entsoemcp.com/licensing Great Britain market data (market_index_price, system_price, demand_outturn_transmission, wind_forecast_transmission) comes from Elexon Insights (BMRS), not ENTSO-E — GB left the ENTSO-E Transparency Platform in 2021. It is redistributed under Elexon's Licence to use BMRS open data, with attribution: "Contains BMRS data © Elexon Limited copyright and database right 2026". See https://entsoemcp.com/licensing for the full source-by-source breakdown. Great Britain generation-mix and balancing-service data (generation_mix, frequency_response_auction, frequency_response_auction_pay_as_clear, dynamic_containment_bids) comes from the NESO Data Portal, published by the National Energy System Operator. It is redistributed under the NESO Open Data Licence v1.0, with the prescribed attribution: "Supported by National Energy SO Open Data". Belgium aFRR capacity auction results (balancing_capacity_price_afrr_elia) come from Elia Open Data, the open-data portal of the Belgian TSO Elia. They are redistributed under the Creative Commons Attribution 4.0 International licence (CC-BY 4.0), with attribution: "Contains data from Elia Open Data, licensed under CC-BY 4.0". Danish and Nordic reserve-capacity results (balancing_capacity_price_fcr_energinet, balancing_capacity_price_afrr_energinet) come from Energinet Energi Data Service, the open-data platform of the Danish TSO Energinet. They are redistributed under the Creative Commons Attribution 4.0 International licence (CC-BY 4.0), which applies platform-wide, with attribution: "Contains data from Energinet Energi Data Service, licensed under CC-BY 4.0". The GB day-ahead auction price (day_ahead_price_imrp) is the Intermittent Market Reference Price from the Low Carbon Contracts Company Data Portal, published under the UK Open Government Licence v3.0, with attribution: "Contains public sector information licensed under the Open Government Licence v3.0". Raw EPEX SPOT / Nord Pool (N2EX) market data is proprietary and is NOT served here — the IMRP is LCCC's own OGL-licensed publication. Baltic reserve-capacity auction results (balancing_capacity_baltic) come from the Baltic Transparency Dashboard, the joint transparency platform of the three Baltic TSOs Elering, AST and Litgrid. They are redistributed under the Creative Commons Attribution 4.0 International licence (CC-BY 4.0), with attribution: "Contains data from the Baltic Transparency Dashboard (Elering, AST, Litgrid), licensed under CC-BY 4.0". This site is not affiliated with ENTSO-E, Elexon, NESO, Elia, Energinet, LCCC, Elering, AST or Litgrid.