Open data: European wholesale electricity prices

Day-ahead prices for 50 European bidding zones, as JSON and CSV. No key, no registration, no rate limit. Every file is a plain URL you can open in a browser, fetch from a script, or paste into a notebook.

The files

URLWhat it holds
/data/europe.jsonEvery zone's average, minimum and maximum for today. One request.
/data/zones.jsonThe registry: ids, the countries each zone covers, timezone, exchange.
/data/zones.geojsonThe 53 bidding-zone boundaries as WGS84 polygons. Ours, CC-BY 4.0.
/data/FR/latest.jsonToday in one zone, interval by interval, with the day's statistics.
/data/FR/2026-09-28.jsonA named local day, same shape.
/data/FR/history.csvEvery daily average we hold for that zone, back to 2016.

Replace FR with any id from /data/zones.json. A zone is not a country: DE_LU spans Germany and Luxembourg, SEM spans Ireland and Northern Ireland, and Italy has seven. 53 zones are listed, 50 of them with a wholesale market.

Examples

curl https://electricity-spot.com/data/europe.json
import pandas as pd
df = pd.read_csv(
    "https://electricity-spot.com/data/FR/history.csv",
    comment="#", parse_dates=["date"],
)
print(df.tail())
const r = await fetch("https://electricity-spot.com/data/FR/latest.json");
const { intervals, statistics } = await r.json();
console.log(statistics.average, intervals.length);

The CSV carries its terms in leading # lines, which is why the pandas example passes comment="#". Cross-origin requests are allowed, so the fetch example works from a browser.

Free to use — we just ask for credit

Every file carries the line ready to paste:

Data: ENTSO-E Transparency Platform, collected and converted to EUR by electricity-spot.com

That is the whole of it for the boundary file below, which is ours to give. The prices are ENTSO-E's, and their own terms govern what you may do with those — the details are further down.

The boundaries, and why they exist

ENTSO-E publishes no geometry for bidding zones. There is no official file of their borders anywhere, which is why every map of the European electricity market redraws them from scratch. /data/zones.geojson is ours: 53 polygons assembled from Natural Earth 1:10m administrative boundaries — public domain — using a composition file that records which administrative units make up each zone.

It is the same geometry this site's map draws, simplified once to 8 km in an equal-area projection and turned back to longitude and latitude, so what you plot is what we show. It loads straight into QGIS, Leaflet, MapLibre or geopandas.

One caveat, carried inside the file: bidding-zone borders are electrical, not administrative. These are the closest approximation public boundary data allows, and the places where a real border cuts through an administrative unit are recorded rather than smoothed over.

Unlike the prices, this file is under CC-BY 4.0 and we mean it: the source is public domain and the assembly is our own work, so it is ours to give. Credit electricity-spot.com and Natural Earth, and do what you like with it.

What the numbers mean

  • EUR per MWh, always. Where the source publishes another currency we convert at the European Central Bank's rate for the day, and where the ECB quotes no rate we publish nothing rather than guess — Ukraine prints in hryvnia, so its prices come back with unconvertible set and no euro figure.
  • Every timestamp is UTC. Local days are derived through each zone's IANA timezone, which is why latest.json for Finland and for Portugal can be different dates.
  • Resolution is data, not a constant. European day-ahead is quarter-hourly now and historical series are hourly, so read resolutionMinutes rather than assuming. A day is not always 96 intervals either: the clocks change, and expectedIntervals is 92 or 100 on those two days a year.
  • Prices go below zero, and we keep them there. On a windy night or a sunny midday there is more generation than anyone wants, and the auction clears at a negative price: the market pays you to consume. It is a normal outcome, not a data error, and it happens hundreds of hours a year in Germany. We never floor these at zero. The lowest the auction itself can go is about −500 EUR/MWh, so treat any value between that and zero as real.
  • Gaps are gaps. Nothing is interpolated or padded. Compare publishedIntervals against expectedIntervals to see what the source has actually published.
  • This is wholesale, not retail. A household bill adds network charges, levies and taxes, and is usually several times these figures.

Terms, and what we are not granting

This section is about the prices. The boundary file above is a different matter and carries a real open licence.

The prices come from the ENTSO-E Transparency Platform, and re-use of them is governed by ENTSO-E's own Terms of Use, not by us.

No licence is granted on this page. ENTSO-E publishes a list of data available for free re-use under CC-BY 4.0; in the version of 18 October 2023 that list runs 12.1.a, 12.1.b, 12.1.c and then 12.1.g. Day-ahead prices are article 12.1.d, and they are not on it.

The measurements are not ours to license in any case — what we added is the collection, the euro conversion and the resolution handling, not the facts.

ENTSO-E performs no control on the accuracy, timeliness or consistency of the underlying data, and neither this site nor ENTSO-E warrants it. Nothing here implies that ENTSO-E sponsors or endorses this site.

How often it changes

The European day-ahead auction clears around 13:00 CET and tomorrow's prices appear shortly after. Collection runs three times a day and these files follow within fifteen minutes. Asking more often than that returns the same bytes, so please don't.