Quickstart
Read the day-ahead price of three price zones, in three steps.
This walkthrough reads the day-ahead auction price in Sweden's SE-SE3 (Stockholm), Denmark's
DK-DK1 (Jutland and Funen) and Norway's NO-NO1 (Oslo). It assumes the API and KEY (or
HEADERS) setup from Authentication. Where a response below is shortened,
… marks what was left out.
1. Find the timeseries
Search for "day-ahead" among the ENTSO-E price timeseries of a zone:
curl "$API/timeseries?entity=SE-SE3&category=price&q=day-ahead&provider=entsoe" -H "X-API-Key: $KEY"r = requests.get(
f"{API}/timeseries",
headers=HEADERS,
params={"entity": "SE-SE3", "category": "price", "q": "day-ahead", "provider": "entsoe"},
)
items = r.json()["items"]{
"total": 1,
"items": [
{
"entity": "SE-SE3",
"name": "price.day_ahead.day_ahead_auction_price",
"provider": "entsoe",
"data_type": "price",
"metadata": "/entities/SE-SE3/timeseries/price.day_ahead.day_ahead_auction_price"
}
],
"next": null
}The day-ahead price is named price.day_ahead.day_ahead_auction_price, and the name is the same in
every zone. Drop provider to see every organisation that publishes it.
2. Describe it
The metadata link from the search says where the zone sits, what the timeseries measures and in
which unit, and for each provider how often it has a value, how far back it goes and how early it is
published (shown here for ENTSO-E only):
curl "$API/entities/SE-SE3/timeseries/price.day_ahead.day_ahead_auction_price" -H "X-API-Key: $KEY"name = "price.day_ahead.day_ahead_auction_price"
meta = requests.get(f"{API}/entities/SE-SE3/timeseries/{name}", headers=HEADERS).json(){
"entity": {
"id": "SE-SE3",
"kind": "price_zone",
"parent": "Sweden",
"country": "Sweden",
"sync_area": "sync:NSA"
},
"name": "price.day_ahead.day_ahead_auction_price",
"definition": {
"path": "price.day_ahead.day_ahead_auction_price",
"measures": "day-ahead auction clearing price per bidding zone",
"document": "A44",
"baseline": true,
"ref": "https://eepublicdownloads.entsoe.eu/clean-documents/Transparency/MoP_Ref2_DDD_v3r4.pdf"
},
"unit": "EUR/MWh",
"data_type": "price",
"providers": [
{
"provider": "entsoe",
"resolution": "PT15M",
"resolution_history": [
{"valid_from": "2014-12-31T23:00:00Z", "resolution": "PT1H"},
{"valid_from": "2026-09-09T22:00:00Z", "resolution": "PT15M"}
],
"extent": {
"first": "2014-12-31T23:00:00Z",
"last": "2026-11-05T22:45:00Z"
},
"latency_minutes": {"p05": -1985, "p50": -1325, "p95": -680},
"coverage": 1.0,
"annotations_seen": {"a03_forward_fill": 3},
"publication_time": "measured",
"values": "/entities/SE-SE3/timeseries/price.day_ahead.day_ahead_auction_price/values?provider=entsoe",
…
},
…
],
…
}ENTSO-E's prices go back to 2015: hourly at first, quarter-hourly since September 2026
(resolution_history). Over the last seven days no quarter hour was missing (coverage 1.0).
latency_minutes is negative because a day-ahead price is published before the quarter hour it is
for, typically about 22 hours ahead; so extent.last is already tomorrow evening. See Metadata for every field.
3. Read the values
Read one hour of ENTSO-E prices for each of the three zones. A values call reads one timeseries in one zone, so three zones take three calls:
for zone in SE-SE3 DK-DK1 NO-NO1; do
curl "$API/entities/$zone/timeseries/price.day_ahead.day_ahead_auction_price/values?provider=entsoe&start=2026-11-03T12:00:00Z&end=2026-11-03T13:00:00Z" \
-H "X-API-Key: $KEY"
donefor zone in ["SE-SE3", "DK-DK1", "NO-NO1"]:
r = requests.get(
f"{API}/entities/{zone}/timeseries/{name}/values",
headers=HEADERS,
params={
"provider": "entsoe",
"start": "2026-11-03T12:00:00Z",
"end": "2026-11-03T13:00:00Z",
},
)
for p in r.json()["points"]:
print(zone, p["valid_time"], p["value"])The full response for SE-SE3, one point per quarter hour (end is inclusive, so 12:00 to 13:00 is
five points):
{
"entity": "SE-SE3",
"name": "price.day_ahead.day_ahead_auction_price",
"provider": "entsoe",
"unit": "EUR/MWh",
"resolution": "PT15M",
"publication_time": "measured",
"columns": ["value"],
"as_of": "latest",
"points": [
{"valid_time": "2026-11-03T12:00:00Z", "value": 144.57, "knowledge_time": "2026-11-02T12:36:27.898646Z", "annotation": null},
{"valid_time": "2026-11-03T12:15:00Z", "value": 143.3, "knowledge_time": "2026-11-02T12:36:27.898646Z", "annotation": null},
{"valid_time": "2026-11-03T12:30:00Z", "value": 155.45, "knowledge_time": "2026-11-02T12:36:27.898646Z", "annotation": null},
{"valid_time": "2026-11-03T12:45:00Z", "value": 182.57, "knowledge_time": "2026-11-02T12:36:27.898646Z", "annotation": null},
{"valid_time": "2026-11-03T13:00:00Z", "value": 125.6, "knowledge_time": "2026-11-02T12:36:27.898646Z", "annotation": null}
]
}And what the Python version prints:
SE-SE3 2026-11-03T12:00:00Z 144.57
SE-SE3 2026-11-03T12:15:00Z 143.3
SE-SE3 2026-11-03T12:30:00Z 155.45
SE-SE3 2026-11-03T12:45:00Z 182.57
SE-SE3 2026-11-03T13:00:00Z 125.6
DK-DK1 2026-11-03T12:00:00Z 228.53
DK-DK1 2026-11-03T12:15:00Z 236.74
DK-DK1 2026-11-03T12:30:00Z 233.37
DK-DK1 2026-11-03T12:45:00Z 231.08
DK-DK1 2026-11-03T13:00:00Z 224.57
NO-NO1 2026-11-03T12:00:00Z 174.6
NO-NO1 2026-11-03T12:15:00Z 174.82
NO-NO1 2026-11-03T12:30:00Z 174.79
NO-NO1 2026-11-03T12:45:00Z 175.53
NO-NO1 2026-11-03T13:00:00Z 174.44valid_time is the quarter hour the price is for; knowledge_time is when it became known, here
just after the auction cleared at midday the day before. annotation is null for a value as
published, otherwise a code such as a03_forward_fill (the provider carried the previous value
forward). Reading values covers the time range, earlier versions (as_of) and
paging.