Price API
Free JSON day-ahead prices for all Nordic areas and Germany. No sign-up, no keys, no tracking.
Try it live
curl -s "https://nordicenergypulse.com/api/public/v1/prices/current?area=FI"
Endpoints
Base URL https://nordicenergypulse.com/api/public/v1 · GET only · times in UTC ISO 8601 with a start_local copy in the area's timezone.
GET /api/public/v1/prices/current
Price right now (15-minute slot when available), plus the hourly average and change vs. the last 7 days.
| Parameter | Values | Notes |
|---|---|---|
| area | FI, SE1…SE4, NO1…NO5, DK1, DK2, DE | Required |
GET /api/public/v1/prices/today
All of today's prices, tomorrow's once the full day is published (otherwise null), day stats and the cheapest 1–4 hour windows.
| Parameter | Values | Notes |
|---|---|---|
| area | Area code | Required |
| resolution | 1h | 15min | Optional, default 1h. Norway (NO1–NO5) is always hourly; 15min returns hourly prices with resolution "1h". |
GET /api/public/v1/prices/history
Daily average, minimum and maximum price.
| Parameter | Values | Notes |
|---|---|---|
| area | Area code | Required |
| days | 7 | 14 | 30 | 90 | 180 | 365 | Optional, default 30 |
GET /api/public/v1/areas
Every supported area with timezone, currency, VAT rate and available resolutions (e.g. ["1h"] for Norway).
Price fields
eur_per_mwh— wholesale price, no VAT.eur_cents_per_kwh/_incl_vat— euro cents per kWh.local_per_kwh/_incl_vat— EUR, SEK, NOK or DKK per kWh (daily ECB rate).- VAT: FI 25.5%, SE/NO/DK 25%, NO4 0%, DE 19%. Grid fees and contract margins are not included.
Examples
Home Assistant
# configuration.yaml
sensor:
- platform: rest
name: Spot price FI
resource: https://nordicenergypulse.com/api/public/v1/prices/current?area=FI
scan_interval: 300
value_template: "{{ value_json.current.eur_cents_per_kwh_incl_vat }}"
unit_of_measurement: "c/kWh"
json_attributes:
- current
- delta_vs_seven_day_average_pctPython
import requests
r = requests.get("https://nordicenergypulse.com/api/public/v1/prices/today",
params={"area": "SE3", "resolution": "1h"}, timeout=10)
r.raise_for_status()
data = r.json()
best = data["cheapest_windows"][2] # 3-hour window
print(best["start_local"], best["average_eur_cents_per_kwh_incl_vat"])JavaScript
const res = await fetch("https://nordicenergypulse.com/api/public/v1/prices/current?area=NO1");
const { current } = await res.json();
console.log(current.local_per_kwh_incl_vat, "NOK/kWh");Fair use and errors
- Send a normal
User-Agentheader (as any browser, Python or Home Assistant client does) — requests without one, or with an empty one, are refused before reaching the API. - 60 valid requests per minute per client, counted across all servers. Rejected requests (400) don't use up this allowance but have their own limit. Over the limit you get HTTP 429 with a Retry-After header.
- Give each parameter once — repeating one (e.g. two
areavalues) returns 400duplicate_parameter. Paths are lowercase; other spellings are redirected. - Responses are cached (current 1 min, today 1–5 min, history 30 min) and send an ETag — polling every 5 minutes is plenty.
- Errors are JSON:
{ "error": { "status", "code", "message" } }— 400 invalid parameter, 404 unknown endpoint, 405 wrong method, 503 source unavailable. - CORS is open, so the API works directly from browser apps. No personal data is collected or stored.
- Please credit "Nordic Energy Pulse" when you show the data publicly.