Wattnet is an open-source service funded by the European Union (Horizon Europe / GreenDIGIT) that tracks the environmental footprint of electricity across Europe. It provides free, real-time, historical and forecasted carbon intensity data for 52 European zones at 15-minute resolution, plus water footprint data (not yet integrated — see the roadmap below).
Since GreenKube 0.3.x, grid carbon intensity is provider-agnostic: you can use Electricity Maps (default) or Wattnet as the electricity data source without touching the pipelines.
IT_NORTH,
SE3, NO1)./v1/footprints, footprint_type=carbon,
scope=life-cycle, use_global=true) for a window around the requested
timestamp.zone_status, valid) are translated into GreenKube’s
isEstimated / estimationMethod fields and the records are stored in the
same repository used for Electricity Maps data.Zones not covered by Wattnet (e.g. US-CAL-CISO) automatically fall back to
the static default grid intensity map, exactly like Electricity Maps does when
its token is missing or the API fails.
Most EU country codes are identical in both naming schemes (FR, DE, ES,
NL, …) and pass through automatically. The following table lists every
European Electricity Maps zone code used by GreenKube and its Wattnet
counterpart. Country-level codes that have no Wattnet aggregate are mapped to
the most representative sub-zone (largest demand area).
| Electricity Maps | Wattnet | Notes |
|---|---|---|
AT, BE, BG, CH, CY, CZ, DE, EE, ES, FI, FR, GB, GE, GR, HR, HU, IE, LT, LU, LV, MD, ME, MK, NL, PL, PT, RO, RS, SI, SK, TR, XK |
same code | Identical country codes — pass through |
IT |
IT_NORTH |
Country-level default (Milan area) |
IT-NO |
IT_NORTH |
Northern Italy |
IT-CNO |
IT_CNORTH |
Central-Northern Italy |
IT-CSO |
IT_CSOUTH |
Central-Southern Italy |
IT-SO |
IT_SOUTH |
Southern Italy |
IT-SAR |
IT_SARDINIA |
Sardinia |
IT-SIC |
IT_SICILY |
Sicily |
SE |
SE3 |
Country-level default (Stockholm area) |
SE-SE1 |
SE1 |
Luleå |
SE-SE2 |
SE2 |
Sundsvall |
SE-SE3 |
SE3 |
Stockholm |
SE-SE4 |
SE4 |
Malmö |
NO |
NO2 |
Country-level default (Oslo/Southern Norway) |
NO-NO1 |
NO1 |
Oslo |
NO-NO2 |
NO2 |
Southern Norway |
NO-NO3 |
NO3 |
Central Norway |
NO-NO4 |
NO4 |
Northern Norway |
NO-NO5 |
NO5 |
Western Norway |
DK |
DK1 |
Country-level default (mainland/Jutland) |
DK-DK1 |
DK1 |
Western Denmark |
DK-DK2 |
DK2 |
Eastern Denmark |
NI |
NIE |
Northern Ireland |
GB-NIR |
NIE |
Northern Ireland |
DK-BHM, ES-CE, ES-CN-*, ES-IB-*, ES-ML, FR-COR, GB-ORK, PT-MA |
— | Islands/exclaves not covered by Wattnet → static fallback |
All associations are automatic. Cloud regions outside Europe (US, Asia, South America, Australia, …) have no Wattnet counterpart and fall back to the static default grid intensity, exactly like Electricity Maps does when its token is missing.
Full list of Wattnet zones (52): Austria, Belgium, Bosnia and Herzegovina, Bulgaria, Croatia, Cyprus, Czechia, Denmark (DK1/DK2), Estonia, Finland, France, Georgia, Germany, Great Britain, Greece, Hungary, Ireland, Italy (7 zones), Latvia, Lithuania, Luxembourg, Moldova, Montenegro, Netherlands, North Macedonia, Northern Ireland, Norway (NO1–NO5), Poland, Portugal, Romania, Serbia, Slovakia, Slovenia, Spain, Sweden (SE1–SE4), Switzerland, Turkey, and Kosovo.
POST /token-request/register with {"email": ..., "password": ...}).Set the provider and credentials:
# helm values
config:
electricityProvider: wattnet
secrets:
wattnetEmail: "you@example.com"
wattnetPassword: "your-password"
Or via environment variables:
ELECTRICITY_PROVIDER=wattnet
WATTNET_EMAIL="you@example.com"
WATTNET_PASSWORD="your-password"
Optional overrides (defaults shown):
WATTNET_API_BASE_URL="https://api.wattnet.eu/v1"
WATTNET_TOKEN_SERVICE_URL="https://api.wattnet.eu/token-request"
Note:
ELECTRICITY_MAPS_TOKENis ignored whileELECTRICITY_PROVIDER=wattnet.
wattnet service:
GET /api/v1/health/services/wattnet should return "healthy".POST /api/v1/config/services with wattnet_email / wattnet_password),
and are persisted to the Kubernetes Secret.GreenKube currently uses a subset of the Wattnet API (docs: https://api.wattnet.eu/v1/docs):
| Endpoint | Purpose |
|---|---|
POST /token-request/get_token |
Obtain a Bearer token (cached, auto-refreshed daily) |
GET /v1/footprints |
Carbon footprint time series (footprint_type=carbon, scope=life-cycle, use_global=true) |
Data quality flags (zone_status: complete/preview/missing, valid:
true/false) are preserved in the stored records: preview or invalid data
is marked as estimated in GreenKube. Data younger than ~4h may still be
recalculated upstream (valid=false); it is refreshed on subsequent hourly
collection cycles.
Wattnet values are provisional for about 4 hours after measurement: the
underlying ENTSO-E inputs are still arriving, so the API marks recent points
as valid=false / zone_status=preview and recalculates them later. Once
consolidated, the same timestamps are returned with valid=true /
zone_status=complete and the values are final.
GreenKube handles this in two steps:
carbon_intensity_history
(same zone + timestamp, new value — both for Wattnet and Electricity Maps).The recomputation reuses the same carbon calculator as the main pipeline, so
the corrected grid_intensity and co2e_grams are identical to what a fresh
calculation would produce. On PostgreSQL this runs as a single bulk UPDATE;
other backends fall back to a per-row recompute.
Wattnet also exposes water footprint data (footprint_type=water, unit
l/kWh) through the same /v1/footprints endpoint. Water footprint
integration is intentionally not wired into GreenKube yet.
The provider abstraction was designed with this in mind: a future
BaseWaterProvider (and a Wattnet implementation) can be added alongside the
existing electricity providers without affecting the carbon pipelines. Because
Electricity Maps does not provide water data, water and electricity will stay
as separate provider abstractions — a combined ElectricityWaterProvider
would force pairing Wattnet with another source for no benefit.