Elewatt Price API

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

25 countries, 39 zones
15-minute or hourly
Today and tomorrow
EUR or local currency
Your contract's total price
On/off hours from your filter

Quick start

  1. 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. 2

    Fetch prices

    Shell
    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://elewatt.eu/api/v1/prices?zone=ee&date=today&unit=ct_kwh"
  3. 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.

ParameterValuesDescription
zonerequiredee, 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.
datetoday (default), tomorrow, YYYY-MM-DDCalendar 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.
resolutionnative (default), hournative returns the market's own slots (15 min for most zones). hour averages them into hourly prices.
uniteur_mwh (default), eur_kwh, ct_kwhPrice unit. With currency=local the same names give the local unit: eur_mwh โ†’ SEK/MWh, ct_kwh โ†’ รถre/kWh.
currencyeur (default), locallocal 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):

JSON
{
  "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"]
  }
}
  • start and end are 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's exchangeRate shows the rate used.
  • An empty or partial prices list for tomorrow means 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 as price.
  • on: true or false, whether a device on that filter runs in that slot. With resolution=hour an hour is on when at least half its slots are.
JSON
{ "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.

Shell
curl "https://elewatt.eu/api/v1/zones"
ZoneNameCurrencySource
at๐Ÿ‡ฆ๐Ÿ‡น AustriaEURENTSO-E
be๐Ÿ‡ง๐Ÿ‡ช BelgiumEURENTSO-E
bg๐Ÿ‡ง๐Ÿ‡ฌ BulgariaEURENTSO-E
hr๐Ÿ‡ญ๐Ÿ‡ท CroatiaEURENTSO-E
cz๐Ÿ‡จ๐Ÿ‡ฟ Czech RepublicCZKENTSO-E
dk2๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark East (DK2)DKKEnerginet, ENTSO-E
dk1๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark West (DK1)DKKEnerginet, ENTSO-E
ee๐Ÿ‡ช๐Ÿ‡ช EstoniaEURElering, ENTSO-E
fi๐Ÿ‡ซ๐Ÿ‡ฎ FinlandEURElering, ENTSO-E
fr๐Ÿ‡ซ๐Ÿ‡ท FranceEURENTSO-E
de๐Ÿ‡ฉ๐Ÿ‡ช GermanyEURENTSO-E
gr๐Ÿ‡ฌ๐Ÿ‡ท GreeceEURHEnEx, ENTSO-E
hu๐Ÿ‡ญ๐Ÿ‡บ HungaryHUFENTSO-E
it5๐Ÿ‡ฎ๐Ÿ‡น Italy Calabria (CALA)EURENTSO-E
it2๐Ÿ‡ฎ๐Ÿ‡น Italy Centre-North (CNOR)EURENTSO-E
it3๐Ÿ‡ฎ๐Ÿ‡น Italy Centre-South (CSUD)EURENTSO-E
it1๐Ÿ‡ฎ๐Ÿ‡น Italy North (NORD)EURENTSO-E
it7๐Ÿ‡ฎ๐Ÿ‡น Italy Sardinia (SARD)EURENTSO-E
it6๐Ÿ‡ฎ๐Ÿ‡น Italy Sicily (SICI)EURENTSO-E
it4๐Ÿ‡ฎ๐Ÿ‡น Italy South (SUD)EURENTSO-E
lv๐Ÿ‡ฑ๐Ÿ‡ป LatviaEURElering, ENTSO-E
lt๐Ÿ‡ฑ๐Ÿ‡น LithuaniaEURElering, ENTSO-E
nl๐Ÿ‡ณ๐Ÿ‡ฑ NetherlandsEURENTSO-E
no5๐Ÿ‡ณ๐Ÿ‡ด Norway Bergen (NO5)NOKENTSO-E
no2๐Ÿ‡ณ๐Ÿ‡ด Norway Kristiansand (NO2)NOKEnerginet, ENTSO-E
no1๐Ÿ‡ณ๐Ÿ‡ด Norway Oslo (NO1)NOKENTSO-E
no4๐Ÿ‡ณ๐Ÿ‡ด Norway Tromsรธ (NO4)NOKENTSO-E
no3๐Ÿ‡ณ๐Ÿ‡ด Norway Trondheim (NO3)NOKENTSO-E
pl๐Ÿ‡ต๐Ÿ‡ฑ PolandPLNENTSO-E
pt๐Ÿ‡ต๐Ÿ‡น PortugalEURENTSO-E
ro๐Ÿ‡ท๐Ÿ‡ด RomaniaRONENTSO-E
sk๐Ÿ‡ธ๐Ÿ‡ฐ SlovakiaEURENTSO-E
si๐Ÿ‡ธ๐Ÿ‡ฎ SloveniaEURENTSO-E
es๐Ÿ‡ช๐Ÿ‡ธ SpainEURENTSO-E
se2๐Ÿ‡ธ๐Ÿ‡ช Sweden Mid-North (SE2)SEKENTSO-E
se3๐Ÿ‡ธ๐Ÿ‡ช Sweden Mid-South (SE3)SEKEnerginet, ENTSO-E
se1๐Ÿ‡ธ๐Ÿ‡ช Sweden North (SE1)SEKENTSO-E
se4๐Ÿ‡ธ๐Ÿ‡ช Sweden South (SE4)SEKEnerginet, ENTSO-E
ch๐Ÿ‡จ๐Ÿ‡ญ SwitzerlandCHFENTSO-E

Examples

JavaScript: cheapest hour tomorrow

JavaScript
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

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

YAML
# 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:
          - prices

Want 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.

HTML
<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-Limit and X-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.
StatuserrorMeaning
400bad_requestA parameter is missing or invalid. The message says which.
401missing_api_key / invalid_api_keyNo key sent, or the key doesn't exist.
403revoked_api_keyThe key was revoked by you or by us.
429rate_limitedDaily limit reached. Retry-After tells you when it resets (00:00 UTC).

Terms

  1. 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.
  2. Personal use is free without attribution. Home automation, scripts and dashboards that only you see need no link.
  3. Home and Business plans need no attribution and get a higher daily limit. See plans.
  4. 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.
  5. Keep your key to yourself, one key per project. Don't resell the data as your own price API or feed.
  6. 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.
  7. 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.