Netherlands EPEX Day-Ahead Historical Price API

Netherlands EPEX Day-Ahead Historical Price API

You need reliable, programmatic access to historical Netherlands EPEX Day-Ahead power prices for quant models, PnL attribution, and energy risk dashboards. By the end of this guide you’ll query the Energy API timeseries endpoint for the EPEX_NL_DA symbol, parse EUR/MWh prices into your code, and ship a working integration.

What you will build

This article is a focused, hands-on walkthrough for pulling timeseries data for the Netherlands EPEX Day-Ahead price (symbol: EPEX_NL_DA). You will:

Illustration: Netherlands EPEX Day-Ahead Historical Price API
  • Call the GET /api/v1/timeseries endpoint with start, end, and symbols parameters.
  • Authenticate via the api_key query parameter (placeholder: YOUR_API_KEY).
  • Parse the JSON to read rates.EPEX_NL_DA, dates.EPEX_NL_DA, and currencies.EPEX_NL_DA.
  • Handle units (EUR/MWh), base currency, and basic integration edge cases.

Symbol, units, and plan basics

Origin catalog facts for this instrument:

  • Symbol name: Netherlands EPEX Day-Ahead
  • Symbol code: EPEX_NL_DA
  • Unit: EUR/MWh
  • Auth: api_key query parameter. Use YOUR_API_KEY (do not embed real keys in code repos).
  • Starter plan: $19.99/mo with a 7-day trial and 50 calls.
  • Caution: Do not pass base=USD when you also need TTF_GAS or EUA_CO2.
  • No MCP host required.

For account setup and keys, see: Register and the Documentation.

Endpoint and parameters

Use the Energy API timeseries endpoint:

  • Method: GET
  • URL: https://energy-api.com/api/v1/timeseries
  • Query parameters:
    • start: Inclusive start date (YYYY-MM-DD)
    • end: Inclusive end date (YYYY-MM-DD)
    • symbols: Comma-separated list of symbols; for this post, use EPEX_NL_DA
    • api_key: Your API key (value: YOUR_API_KEY in this guide)

Response fields (relevant subset):

  • success: Boolean indicator for the request.
  • date: Typically the API’s processing date for the payload.
  • base: Base currency (EUR for energy symbols in this guide).
  • rates: Object keyed by symbol containing the numeric price for the requested date(s).
  • dates: Object keyed by symbol with the ISO date corresponding to the rate.
  • currencies: Object keyed by symbol specifying the currency for that symbol’s rate.
  • base_filter_note: May contain a note when a base filter is applied; otherwise null.

cURL example you can run

This example fetches Netherlands EPEX Day-Ahead prices for Q1 2026. Paste it into your terminal after replacing YOUR_API_KEY with your actual key.

curl -G "https://energy-api.com/api/v1/timeseries" --data-urlencode "start=2026-01-01" --data-urlencode "end=2026-03-31" --data-urlencode "symbols=EPEX_NL_DA" --data-urlencode "api_key=YOUR_API_KEY"

Notes:

  • symbols accepts multiple comma-separated values if you expand coverage later.
  • All dates must be valid ISO-8601; use UTC in your pipelines to avoid day-boundary confusion.
  • If you are also pulling TTF_GAS or EUA_CO2, avoid setting a conflicting base parameter (see caution above).

Official sample blocks (format reference)

The following two blocks are the official samples. They illustrate the endpoint and response format. Keep using EPEX_NL_DA for Netherlands power in your actual calls.

Official cURL:

curl -G "https://energy-api.com/api/v1/timeseries" --data-urlencode "start=2026-01-01" --data-urlencode "end=2026-03-31" --data-urlencode "symbols=EPEX_NL_DA" --data-urlencode "api_key=YOUR_API_KEY"

Official JSON sample (format reference only):

{
"success": true,
"date": "2026-10-17",
"base": "EUR",
"rates": {
"OMIE_ES_DA": 107.1542
},
"dates": {
"OMIE_ES_DA": "2026-10-17"
},
"currencies": {
"OMIE_ES_DA": "EUR"
},
"base_filter_note": null
}

Real Netherlands EPEX Day-Ahead response and field mapping

Below is a real response for the Netherlands EPEX Day-Ahead symbol (EPEX_NL_DA). Use these exact values in your parsing tests.

{"success":true,"date":"2026-10-16","base":"EUR","rates":{"EPEX_NL_DA":212.757},"dates":{"EPEX_NL_DA":"2026-10-16"},"currencies":{"EPEX_NL_DA":"EUR"},"base_filter_note":null}

What to read in your code:

  • rates.EPEX_NL_DA → numeric price in EUR/MWh.
  • dates.EPEX_NL_DA → ISO date for the price (align with your index).
  • currencies.EPEX_NL_DA → currency string (EUR); keep this in downstream metadata.
  • base → EUR. Keep consistent across joins; avoid mixing bases unless your logic is explicit.

End-to-end Python example

The Python snippet below calls the same endpoint and extracts the Netherlands EPEX Day-Ahead price, date, currency, and base. Replace YOUR_API_KEY with your real key before running.

import os
import sys
import json
import urllib.parse
import urllib.request

def fetch_epex_nl_da(start, end, api_key):
base_url = "https://energy-api.com/api/v1/timeseries"
params = {
"start": start,
"end": end,
"symbols": "EPEX_NL_DA",
"api_key": api_key
}
url = base_url + "?" + urllib.parse.urlencode(params)
req = urllib.request.Request(url, method="GET")
with urllib.request.urlopen(req, timeout=30) as resp:
data = resp.read().decode("utf-8")
return json.loads(data)

def main():
api_key = os.environ.get("ENERGY_API_KEY", "YOUR_API_KEY")
start = "2026-01-01"
end = "2026-03-31"
payload = fetch_epex_nl_da(start, end, api_key)

if not payload.get("success"):
print("API response not successful", file=sys.stderr)
sys.exit(1)

base = payload.get("base")
rate = payload.get("rates", {}).get("EPEX_NL_DA")
rate_date = payload.get("dates", {}).get("EPEX_NL_DA")
currency = payload.get("currencies", {}).get("EPEX_NL_DA")

if rate is None or rate_date is None:
print("Missing EPEX_NL_DA fields in response", file=sys.stderr)
sys.exit(1)

print(f"Base: {base}")
print(f"EPEX_NL_DA date: {rate_date}")
print(f"EPEX_NL_DA price: {rate} {currency}/MWh")

if __name__ == "__main__":
main()

Implementation details that save time:

  • Timeouts: Use a client-level timeout (e.g., 30 seconds) to fail fast in pipelines.
  • Schema: Treat base and currencies as first-class metadata for downstream joins.
  • Idempotence: Your code should be repeatable; avoid mutating local caches without checksums.

Time windows, weekends, and caching

The Day-Ahead auction publishes a price per delivery day. The timeseries endpoint returns daily data keyed to ISO dates. For broader ranges (quarters or years), request the full window and index results by the dates.EPEX_NL_DA field per symbol.

  • Non-trading days: Day-ahead power tends to have a daily settlement. If a day is missing, handle it as a gap rather than assuming a zero or a carry-forward.
  • Timezone: Use UTC consistently in downstream systems to avoid off-by-one errors near midnight boundaries.
  • Caching: Cache raw JSON responses by the full URL and revalidate daily. Pin the data source versioning to your ETL release tags.

Validation: smoke tests and schema checks

Use the real sample below to assert your parser reads the right fields (no schema drift, correct symbol, correct unit and base). This is the same real response shown earlier, provided again to help you set up a copy-pasteable unit test fixture:

{"success":true,"date":"2026-10-16","base":"EUR","rates":{"EPEX_NL_DA":212.757},"dates":{"EPEX_NL_DA":"2026-10-16"},"currencies":{"EPEX_NL_DA":"EUR"},"base_filter_note":null}

Recommended checks:

  • Assert payload.success is true.
  • Assert payload.base is "EUR".
  • Assert payload.currencies.EPEX_NL_DA is "EUR".
  • Assert payload.dates.EPEX_NL_DA is a valid ISO date string that you can parse.
  • Assert payload.rates.EPEX_NL_DA is a finite float and non-negative.

FAQ

How do I authenticate?

Use the api_key query parameter with YOUR_API_KEY when calling GET /api/v1/timeseries. Do not put secrets in source control; prefer environment variables at runtime.

Which fields should I store for backtesting?

Store rates.EPEX_NL_DA (numeric), dates.EPEX_NL_DA (ISO date), currencies.EPEX_NL_DA (string), and base (EUR). Keep the raw JSON for auditability.

What unit are Netherlands EPEX Day-Ahead prices in?

EUR/MWh. Retain this unit in your data model to avoid mixing with instruments quoted in different units.

Can I request multiple symbols at once?

Yes, symbols is comma-separated. However, stay consistent with base constraints. For example, do not pass base=USD when you also need TTF_GAS or EUA_CO2.

Do I need pagination for long ranges?

The endpoint accepts a date range; consult the Documentation for any practical range limits. For reliability, segment very large spans into monthly or quarterly calls.

Register and start integrating

Create your account, get YOUR_API_KEY, and run the cURL in this post to pull Netherlands EPEX Day-Ahead historical prices today. Start here: Register. For field-by-field details and additional options, see the Documentation.

Ready to get started?

Get your API key and start querying energy commodity prices in minutes.

Get API Key

Related posts