Free electricity price API for Europe
Day-ahead spot prices for 25 countries and 39 bidding zones in one simple JSON API. 15-minute or hourly prices in EUR or your local currency, today and tomorrow. Free when you show a link back to us.
Not a developer? You can also embed a ready-made calculator on your site with one snippet.
Key features
Quick start
- 1
Create a key
Sign up for free and open Connections → Elewatt price API. Tell us where the prices will appear and accept the free-use terms. Your key starts with
ew_and is shown once, so copy it somewhere safe. - 2
Fetch prices
Shellcurl -H "Authorization: Bearer YOUR_API_KEY" \ "https://elewatt.eu/api/v1/prices?zone=ee&date=today&unit=ct_kwh" - 3
Show the link
If the prices appear on a public website or app, add this link where they are shown or in your footer:
HTML<a href="https://elewatt.eu">Data from elewatt.eu</a>Using the prices only for yourself (Home Assistant, scripts)? No link is needed.
Prices endpoint
GET/api/v1/prices
Prices for one zone and one day. Send your key as Authorization: Bearer ew_…. Where you can't set headers, X-API-Key: ew_… or ?api_key=ew_… work too.
| Parameter | Values | Description |
|---|---|---|
zonerequired | ee, fi, de, se3, … | Bidding zone code. Full list from /api/v1/zones or the table below. Optional for a key linked to a contract: it defaults to the contract's zone. |
date | today (default), tomorrow, YYYY-MM-DD | Calendar day in the zone's local time. Tomorrow's prices usually appear between 13:00 and 15:00 CET (Baltic and Finnish zones from about 12:00 CET). Some zones are published late on some days, occasionally only in the evening, so keep polling until the list is complete. |
resolution | native (default), hour | native returns the market's own slots (15 min for most zones). hour averages them into hourly prices. |
unit | eur_mwh (default), eur_kwh, ct_kwh | Price unit. With currency=local the same names give the local unit: eur_mwh → SEK/MWh, ct_kwh → öre/kWh. |
currency | eur (default), local | local returns prices in the zone's own currency (SEK, NOK, DKK, PLN, CZK, HUF, RON, CHF), converted at the daily ECB rate. Euro zones stay in EUR. |
Example response (trimmed):
{
"zone": "ee",
"date": "2026-10-20",
"timezone": "Europe/Tallinn",
"resolution": "native",
"currency": "EUR",
"unit": "c/kWh",
"priceType": "day-ahead spot, excl. VAT and fees",
"count": 96,
"prices": [
{ "start": "2026-10-19T21:00:00.000Z", "end": "2026-10-19T21:15:00.000Z", "price": 6.412 },
{ "start": "2026-10-19T21:15:00.000Z", "end": "2026-10-19T21:30:00.000Z", "price": 5.987 }
],
"attribution": {
"text": "Data from elewatt.eu",
"url": "https://elewatt.eu",
"sources": ["Elering", "ENTSO-E"]
}
}startandendare UTC (ISO 8601). A local day has 92–100 slots on daylight-saving change days.- These are wholesale day-ahead prices: no VAT, grid fees or supplier margin. Negative prices are real and are kept as they are.
- With
currency=local, prices for Sweden, Norway, Denmark, Poland, Czechia, Hungary, Romania and Switzerland come in that country's currency. We store prices in EUR and convert them at the European Central Bank reference rate, updated once a day, so they can differ slightly from the local figure the exchange publishes. The response'sexchangeRateshows the rate used. - An empty or partial
priceslist fortomorrowmeans the exchange hasn't published that zone yet. We check hourly. Most zones are complete by 15:00 CET, but ENTSO-E publishes some zones (for example GR, NL, HU, SK, RO, HR) late roughly one day in three, sometimes not before 21:00 CET. Treat a day as ready only when it has a full set of slots, and keep polling hourly until then.
Your own prices and on/off hours
When you create or edit a key in Elewatt you can link it to one of your contracts, and optionally to a filter. The response for that contract's zone then has two extra fields per slot:
total: what you pay for that slot under the contract: spot or your fixed price, supplier margin, grid fee and taxes, with VAT if VAT is on in your account. Same unit asprice.on:trueorfalse, whether a device on that filter runs in that slot. Withresolution=houran hour is on when at least half its slots are.
{ "start": "2026-10-19T21:00:00.000Z", "end": "2026-10-19T21:15:00.000Z", "price": 6.412, "total": 17.284, "on": true }The response also names the contract and filter. Change them in Elewatt and the API follows within five minutes; your key stays the same.
Zones
GET/api/v1/zones
Every zone code the prices endpoint accepts. No key needed.
curl "https://elewatt.eu/api/v1/zones"| Zone | Name | Currency | Source |
|---|---|---|---|
at | 🇦🇹 Austria | EUR | ENTSO-E |
be | 🇧🇪 Belgium | EUR | ENTSO-E |
bg | 🇧🇬 Bulgaria | EUR | ENTSO-E |
hr | 🇭🇷 Croatia | EUR | ENTSO-E |
cz | 🇨🇿 Czech Republic | CZK | ENTSO-E |
dk2 | 🇩🇰 Denmark East (DK2) | DKK | Energinet, ENTSO-E |
dk1 | 🇩🇰 Denmark West (DK1) | DKK | Energinet, ENTSO-E |
ee | 🇪🇪 Estonia | EUR | Elering, ENTSO-E |
fi | 🇫🇮 Finland | EUR | Elering, ENTSO-E |
fr | 🇫🇷 France | EUR | ENTSO-E |
de | 🇩🇪 Germany | EUR | ENTSO-E |
gr | 🇬🇷 Greece | EUR | HEnEx, ENTSO-E |
hu | 🇭🇺 Hungary | HUF | ENTSO-E |
it5 | 🇮🇹 Italy Calabria (CALA) | EUR | ENTSO-E |
it2 | 🇮🇹 Italy Centre-North (CNOR) | EUR | ENTSO-E |
it3 | 🇮🇹 Italy Centre-South (CSUD) | EUR | ENTSO-E |
it1 | 🇮🇹 Italy North (NORD) | EUR | ENTSO-E |
it7 | 🇮🇹 Italy Sardinia (SARD) | EUR | ENTSO-E |
it6 | 🇮🇹 Italy Sicily (SICI) | EUR | ENTSO-E |
it4 | 🇮🇹 Italy South (SUD) | EUR | ENTSO-E |
lv | 🇱🇻 Latvia | EUR | Elering, ENTSO-E |
lt | 🇱🇹 Lithuania | EUR | Elering, ENTSO-E |
nl | 🇳🇱 Netherlands | EUR | ENTSO-E |
no5 | 🇳🇴 Norway Bergen (NO5) | NOK | ENTSO-E |
no2 | 🇳🇴 Norway Kristiansand (NO2) | NOK | Energinet, ENTSO-E |
no1 | 🇳🇴 Norway Oslo (NO1) | NOK | ENTSO-E |
no4 | 🇳🇴 Norway Tromsø (NO4) | NOK | ENTSO-E |
no3 | 🇳🇴 Norway Trondheim (NO3) | NOK | ENTSO-E |
pl | 🇵🇱 Poland | PLN | ENTSO-E |
pt | 🇵🇹 Portugal | EUR | ENTSO-E |
ro | 🇷🇴 Romania | RON | ENTSO-E |
sk | 🇸🇰 Slovakia | EUR | ENTSO-E |
si | 🇸🇮 Slovenia | EUR | ENTSO-E |
es | 🇪🇸 Spain | EUR | ENTSO-E |
se2 | 🇸🇪 Sweden Mid-North (SE2) | SEK | ENTSO-E |
se3 | 🇸🇪 Sweden Mid-South (SE3) | SEK | Energinet, ENTSO-E |
se1 | 🇸🇪 Sweden North (SE1) | SEK | ENTSO-E |
se4 | 🇸🇪 Sweden South (SE4) | SEK | Energinet, ENTSO-E |
ch | 🇨🇭 Switzerland | CHF | ENTSO-E |
Examples
JavaScript: cheapest hour tomorrow
const res = await fetch(
"https://elewatt.eu/api/v1/prices?zone=de&date=tomorrow&resolution=hour&unit=eur_kwh",
{ headers: { Authorization: "Bearer " + process.env.ELEWATT_API_KEY } }
);
const { prices } = await res.json();
const cheapest = prices.reduce((a, b) => (b.price < a.price ? b : a));
console.log("Cheapest hour starts", cheapest.start, "at", cheapest.price, "EUR/kWh");Python
import os, requests
r = requests.get(
"https://elewatt.eu/api/v1/prices",
params={"zone": "fi", "date": "today", "unit": "ct_kwh"},
headers={"Authorization": f"Bearer {os.environ['ELEWATT_API_KEY']}"},
timeout=10,
)
r.raise_for_status()
for slot in r.json()["prices"]:
print(slot["start"], slot["price"], "c/kWh")Home Assistant: current price sensor
# configuration.yaml — today's prices as a sensor, refreshed every 15 min
rest:
- resource: https://elewatt.eu/api/v1/prices?zone=se3&date=today&unit=eur_kwh
headers:
Authorization: !secret elewatt_api_key # "Bearer ew_…" in secrets.yaml
scan_interval: 900
sensor:
- name: "Elewatt spot price"
unit_of_measurement: "EUR/kWh"
value_template: >
{% set now_ts = now().timestamp() %}
{% for p in value_json.prices
if as_timestamp(p.start) <= now_ts < as_timestamp(p.end) %}
{{ p.price }}
{% endfor %}
json_attributes:
- pricesWant Home Assistant to switch devices automatically in the cheapest hours instead? Connect it to Elewatt and set it up without writing any YAML.
Attribution
On the free tier, public use needs a visible link to https://elewatt.eu. Show it near the prices or in the footer of every page that shows them. The link text can be Data from elewatt.eu or Powered by elewatt.eu.
<a href="https://elewatt.eu">Data from elewatt.eu</a>In a mobile app, put it on the screen that shows prices or on the About screen. Every response also carries an attribution object you can render directly. It lists the upstream sources too (ENTSO-E, Elering, Energinet, HEnEx). Energinet's data is licensed CC BY 4.0, so credit it when you show Danish prices.
Where the prices come from: EE, FI, LV and LT from Elering, DK1, DK2, SE3, SE4 and NO2 from Energinet, GR from HEnEx (the Hellenic Energy Exchange's own results file), and every other zone from the ENTSO-E Transparency Platform, which also fills any gap the first source leaves. Each response names its zone's sources in attribution.sources.
Limits & errors
- Free: 2,000 requests per key per day. Home and Business plans: 20,000. Limits reset at 00:00 UTC.
- Each response carries
X-RateLimit-LimitandX-RateLimit-Remaining. - Prices change once a day, so there's no need to poll every minute. Fetch today and tomorrow, cache them, and refresh hourly until tomorrow's list is complete.
- CORS is open, so browser calls work. Your key is visible in the browser, though. Prefer calling from your server.
| Status | error | Meaning |
|---|---|---|
| 400 | bad_request | A parameter is missing or invalid. The message says which. |
| 401 | missing_api_key / invalid_api_key | No key sent, or the key doesn't exist. |
| 403 | revoked_api_key | The key was revoked by you or by us. |
| 429 | rate_limited | Daily limit reached. Retry-After tells you when it resets (00:00 UTC). |
Terms
- Public use is free with attribution. If the prices, or anything calculated from them, appear on a public website or app, show a visible “Data from elewatt.eu” or “Powered by elewatt.eu” link to https://elewatt.eu as described above.
- Personal use is free without attribution. Home automation, scripts and dashboards that only you see need no link.
- Home and Business plans need no attribution and get a higher daily limit. See plans.
- We check how keys are used. If a public site is missing the link, we'll email you and ask you to add it or upgrade. If nothing changes within 14 days, we revoke the key.
- Keep your key to yourself, one key per project. Don't resell the data as your own price API or feed.
- The data comes as is, without guarantees of accuracy or availability. Don't rely on it for trading or billing. Upstream sources: ENTSO-E, Elering, Energinet, HEnEx.
- We may change these terms or the limits. If we do, we'll email key holders before it takes effect.
Questions or need more requests? Email reedik@elewatt.eu.