SpotWave API
The prices on SpotWave come from a small, read-only JSON API. You're welcome to use it for personal projects, dashboards and home automation, within the fair-use terms below.
Basics
- Base URL:
https://spotwave.eu/api. Every endpoint is a plainGETwith no API key. - Prices are per kWh in currency units (€/kWh for the EUR fields). Each row also has a
nativeblock in the market's own currency (DKK, SEK, NOK, PLN, …), converted at the daily ECB reference rate. - Times are ISO 8601 in UTC. Day-ahead prices come in 15-minute periods.
countrytakes a market code from/meta/markets—NL,DE,SE3,DK1,NO2,ITNand so on.- All-in figures are spot + energy tax + per-kWh grid fee, then VAT. Supplier markups are not included; see data sources for how each figure is derived.
Endpoints
GET /meta/markets
Every supported market (bidding zone) with its display name, currency and fixed monthly costs (incl. VAT), which are never folded into the per-kWh price.
curl https://spotwave.eu/api/meta/markets[
{
"code": "NL",
"name": "Netherlands",
"currency": "EUR",
"fees": {
"gridFixedPerMonth": 39.83,
"energyTaxCreditPerMonth": 52.41,
"netPerMonth": -12.58,
"native": { "currency": "EUR", "gridFixedPerMonth": 39.83, "energyTaxCreditPerMonth": 52.41, "netPerMonth": -12.58 }
}
},
…
]GET /spotprice?country=…&from=…&to=…
The all-in price breakdown for each period in a range. from and to are ISO timestamps (inclusive); a range longer than 92 days is cut to the last 92 days.
curl "https://spotwave.eu/api/spotprice?country=NL&from=2026-10-20T00:00:00Z&to=2026-10-20T23:59:59Z"[
{
"periodUtc": "2026-10-20T12:00:00Z",
"country": "NL",
"spotEurPerKwh": 0.10301,
"energyTaxEurPerKwh": 0.0916,
"gridFeeEurPerKwh": 0.0,
"vatEurPerKwh": 0.0408681,
"totalEurPerKwh": 0.2354781,
"native": { "currency": "EUR", "spotPerKwh": 0.10301, "energyTaxPerKwh": 0.0916, "gridFeePerKwh": 0.0, "vatPerKwh": 0.0408681, "totalPerKwh": 0.2354781 }
},
…
]GET /forecast?country=…&from=…&to=…
Same parameters and response shape as /spotprice, used for tomorrow's window. It returns an empty array until tomorrow's day-ahead prices are published, usually around 13:00 CET.
curl "https://spotwave.eu/api/forecast?country=DE&from=2026-10-21T00:00:00Z&to=2026-10-21T23:59:59Z"GET /spotprice/current?country=…
The most recent stored wholesale price for a market — the raw spot price only, without taxes or fees. hourUtc is the start of the period. Returns 404 when the market has no data.
curl "https://spotwave.eu/api/spotprice/current?country=NL"{ "id": 3179619, "country": "NL", "hourUtc": "2026-10-20T15:45:00Z", "eurPerKwh": 0.25471 }GET /spotprice/stats?country=…
Percentiles of the wholesale price over the trailing 30 days — what SpotWave uses to call a price cheap or expensive.
curl "https://spotwave.eu/api/spotprice/stats?country=SE3"{
"p25": 0.0401, "median": 0.0825, "p75": 0.1208, "avg": 0.0842,
"native": { "currency": "SEK", "p25": 0.4452, "median": 0.9165, "p75": 1.3411, "avg": 0.9352 }
}GET /spotprice/context?country=…
Long-run reference levels: the rolling yearly average all-in price, last year's, and a typical band (low/mid/high per hour of the day, UTC) built from the same time of year over recent years. Fields are null until enough history exists.
curl "https://spotwave.eu/api/spotprice/context?country=NL"{
"yearAvg": 0.2409, "lastYearAvg": 0.2219,
"typical": [ { "i": 0, "low": 0.1694, "mid": 0.2172, "high": 0.2650 }, … ],
"native": { "currency": "EUR", "yearAvg": 0.2409, "lastYearAvg": 0.2219, "typical": [ … ] }
}GET /compare
A snapshot of every market: the current all-in and spot price, today's range so far, tax share, VAT rate and an hourly sparkline, sorted cheapest first. This feeds the markets page.
curl https://spotwave.eu/api/compare{
"asOf": "2026-10-20T15:58:49Z",
"euAvgSpot": 0.1596,
"zones": [
{
"country": "NL", "name": "Netherlands",
"currentAllIn": 0.4012, "spot": 0.2400, "taxShare": 40.19, "vatRate": 21.0,
"todayMin": 0.2307, "todayMax": 0.4012, "isNegative": false,
"sparkline": [0.1701, 0.1681, 0.1722, …],
"native": { "currency": "EUR", "currentAllIn": 0.4012, "spot": 0.2400, "todayMin": 0.2307, "todayMax": 0.4012, "sparkline": [ … ] }
},
…
]
}GET /meta/status
When the data was last updated, and per market whether tomorrow's prices are in yet. Useful to decide when to fetch /forecast.
curl https://spotwave.eu/api/meta/status{ "lastUpdated": "2026-10-20T13:05:12Z", "tomorrowPublished": { "NL": true, "DE": true, "SE3": false, … } }Fair use
- The API is free and keyless but runs on a small server, so requests are rate limited. If requests start being rejected, back off and try again later.
- Prices change at most every 15 minutes and tomorrow's arrive once a day: poll no more than every 15 minutes, and cache what you fetch.
- Send a descriptive
User-Agent(your app's name and a contact URL). Some default HTTP-library user agents are blocked by the CDN in front of the API. - Cross-origin requests from browsers aren't enabled. Call the API from a server, script or automation tool rather than from front-end code on another site.
- There is no uptime guarantee, and endpoints can change.
Attribution
If you publish something built on this data, please credit SpotWave with a link to spotwave.eu. The wholesale prices come from the ENTSO-E Transparency Platform; taxes and fees are SpotWave's own indicative figures, documented on the data sources page.
Home Assistant
A Home Assistant integration that reads this API lives in the SpotWave repository, under integrations/home-assistant.