Hourly grid carbon intensity, as an API
gridcarbon returns hourly carbon intensity in gCO2eq/kWh for 45 zones — 33 European bidding zones, 11 US balancing authorities, and Great Britain — over plain JSON with no API key.
Try it without a terminal: api.gridcarbon.dev/v1/intensity/latest?zone=FR
Zone catalogue: /v1/zones · Health: /v1/health
Run the first curl
curl -s "https://api.gridcarbon.dev/v1/intensity/latest?zone=FR"{"unit":"gCO2eq/kWh","data":[{"zone":"FR",
"ts":"2026-08-25T13:00:00Z","gco2eq_kwh":34,
"method":"computed:v1"}]}
curl -s "https://api.gridcarbon.dev/v1/intensity?zone=DE&from=2026-08-25T00:00:00Z&to=2026-08-25T04:00:00Z"{"zone":"DE","from":"2026-08-25T00:00:00Z",
"to":"2026-08-25T04:00:00Z","unit":"gCO2eq/kWh",
"count":4,"truncated":false,"data":[
{"ts":"2026-08-25T00:00:00Z","gco2eq_kwh":367.5,"method":"computed:v1"},
{"ts":"2026-08-25T01:00:00Z","gco2eq_kwh":366.2,"method":"computed:v1"},
{"ts":"2026-08-25T02:00:00Z","gco2eq_kwh":366.8,"method":"computed:v1"},
{"ts":"2026-08-25T03:00:00Z","gco2eq_kwh":366.4,"method":"computed:v1"}]}
curl -s "https://api.gridcarbon.dev/v1/intensity/latest" \
| jq -r '.data | sort_by(.gco2eq_kwh) | .[:6][]
| "\(.zone)\t\(.gco2eq_kwh)\t\(.method)"'SE-1 23.1 computed:v1
NO-5 24 computed:v1
NO-3 25.6 computed:v1
NO-1 28.8 computed:v1
CH 29.1 computed:v1
NO-2 33.7 computed:v1
Figure 1 — Latest observation, all zones
Every zone the API covers, drawn on one axis, read live from this page’s own endpoint.
Each row is the newest hour the upstream operator has published for that zone. That is not the current hour — European feeds run 2–4 hours behind and US feeds 11–14 hours behind. Read ts in the response rather than assuming latest means now.
Order
| Zone | Name | Trace, 0 to 500 gCO2eq per kWh | gCO2eq/kWh | Source | Behind |
|---|---|---|---|---|---|
| Reading /v1/intensity/latest… | |||||
Fetching…
†GB is measured differently. Its values come straight from NESO, which uses operational (combustion-only) factors — wind, solar, nuclear and hydro count as zero. Every other row uses IPCC AR5 lifecycle factors, where those sources are non-zero. GB is therefore structurally lower than a lifecycle number for the same physical grid. Compare GB to GB.
‡This value is exactly 820 g, the generic coal factor. That normally means the zone published only part of its generation mix for the hour, so the computed value reflects only what was published. Treat it as a bad hour, not a reading.
»Value exceeds the 500 g axis. The printed number is the real one.
§ 1What this is
A read-only HTTP API that answers one question.
How much CO2-equivalent was emitted per kWh of electricity on a given grid, in a given hour. The unit is gCO2eq/kWh throughout. Responses are JSON, CORS is open, there is no key to request and no SDK to install — curl, fetch and requests all work as-is.
| Endpoint | Parameters | Returns |
|---|---|---|
GET /v1 | — | Index of endpoints and attribution. |
GET /v1/health | — | {ok, ts}. Liveness only — it does not tell you whether ingestion is current. |
GET /v1/zones | — | All 45 zones with source and resolution_min. Cached one hour. |
GET /v1/intensity/latest |
zone optional |
Newest stored point. Without zone, all 45 zones in one response — prefer this over 45 separate calls. Cached five minutes. |
GET /v1/intensity |
zone requiredfrom, to optional |
Hourly series, ascending. from/to are ISO‑8601 UTC and default to the last 24 hours; the window is half-open [from, to). Every response carries count and truncated; past 5000 points truncated is true and a note tells you to narrow the window. Cached ten minutes. |
Errors are JSON carrying an error string: 400 when a required parameter is missing, 404 for an unknown zone or an unknown path. Every timestamp is UTC and names the start of the interval.
It exists because the Scope 2 and carbon-aware-scheduling data that already exists publicly is scattered across three upstream formats, and because self-serve access to it at an individual developer’s budget is hard to come by.
§ 2Coverage
45 zones today. Bidding zones, not countries.
Europe — 33 bidding zones from the ENTSO-E Transparency Platform, hourly.
DE FR ES PT IT-NORD IT-CNOR IT-CSUD IT-SUD IT-CALA IT-SICI IT-SARD NL BE AT CH PL CZ DK-1 DK-2 SE-1 SE-2 SE-3 SE-4 NO-1 NO-2 NO-3 NO-4 NO-5 FI IE GR RO HU
United States — 11 balancing authorities from EIA-930, hourly.
US US-PJM US-MISO US-ERCOT US-SPP US-SOCO US-CAISO US-TVA US-NYISO US-ISONE US-BPA
Great Britain — 1 zone from the NESO Carbon Intensity API, at 30-minute resolution.
Italy is seven zones, Norway five, Sweden four, Denmark two; IE is the all-island SEM. GET /v1/zones returns the authoritative list with each zone’s source and resolution.
§ 3Method
Two methods. The method field on every data point tells you which one produced it.
computed:v1 — used for Europe and the US. Per-hour generation mix from the upstream operator, multiplied by IPCC AR5 (2014) Annex III median lifecycle emission factors, divided by total generation. Lifecycle means construction, fuel supply and decommissioning are included, so wind, solar and nuclear are non-zero.
Storage rule
Pumped-storage and battery discharge are excluded from both the numerator and the denominator. Stored energy is not a primary source, and its emissions already appear in the hour it was charged.
upstream:uk-neso:actual and upstream:uk-neso:forecast — used for GB. These are NESO’s own published numbers, passed through unchanged. NESO uses operational (combustion-only) factors, where wind, solar, nuclear and hydro are zero. GB is therefore structurally lower than a lifecycle number for the same physical grid, and is not directly comparable to the other 44 zones. Compare GB to GB.
The full factor table and the storage-exclusion rule are in the methodology page.
§ 4Limitations
Stated plainly, because you will find them anyway.
- The factors are 12 years old.
- IPCC AR5 dates from 2014. Its utility-solar median of 48 g is high against UNECE 2022 (around 37); nuclear at 12 g is high against UNECE’s 5–6. Low-carbon zones read somewhat pessimistic as a result.
- Lignite is treated as generic coal, at 820 g.
- Lignite, oil shale and peat all get the coal factor, which understates lignite-heavy zones — DE and PL most of all — by roughly 15–25%.
- GB is a different metric.
- Operational, not lifecycle. See § 3, and the † note under Figure 1.
- US CAISO reports no battery rows.
- Batteries land in the
OTHcategory and are excluded as storage for that zone, so CAISO’s denominator differs slightly from its peers. - EIA-930 is provisional.
- Values are revised for days after publication. A 72-hour trailing window is re-pulled on every run, so recent US numbers can change under you.
- Behind-the-meter solar is invisible.
- Rooftop generation is not in any upstream feed. The NL and CH generation-category breakdowns are also thin.
- Partial reporting produces bad hours.
- When a zone publishes only part of its mix for an hour, the computed value reflects only what was published. IE has produced hours at exactly 820 g this way. Treat single-hour outliers with suspicion; averages are sturdier.
§ 5Status
Pre-alpha. Honestly pre-alpha, not the marketing kind.
Ingestion runs on an hourly cron. Stored history begins 2026-08-21T11:00Z and grows by one point per zone per hour — this is days of history, not years, and backfill has not been done yet. There are no API keys, no accounts, no rate limits and no pricing. Responses are edge-cached: /v1/zones for an hour, /v1/intensity for ten minutes, /v1/intensity/latest for five.
What is planned, in order: deeper backfill, API keys with a free tier, a documented stability contract for /v1, and updated emission factors beyond AR5. Pricing, when it arrives, is aimed at the self-serve band that individual developers can expense without a procurement cycle.
Do not build a system with a hard uptime requirement on this yet.
§ 6Questions
Answers to what people ask first.
- Do I need an API key?
- No. There is no auth today — no key, no account, no header. CORS is
*, so browser JavaScript can call it directly, which is how the table above is drawn. Keys are on the roadmap; when they arrive there will be a free tier and advance notice, not a silent cutoff. - What are the rate limits?
- None are enforced today. Please be reasonable:
/v1/intensity/latestcarriesCache-Control: public, max-age=300, so poll no faster than every five minutes and you will hit cache instead of origin./v1/intensity/latestwith no zone parameter returns all 45 zones in one response — use that rather than 45 separate calls. - How fresh is the data?
- It depends on the upstream, and the gaps are large. Measured on 2026-08-25: European zones were 2 to 4 hours behind real time, GB about 1 hour behind with a forward forecast point beyond that, and US zones 11 to 14 hours behind. EIA-930 is the slow one and there is nothing we can do about it. Always read
tson the point rather than assuming latest means now. - Why is GB so much lower than everywhere else?
- Different accounting, not a cleaner grid than the numbers deserve. GB values come straight from NESO, which uses operational (combustion-only) factors — wind, solar, nuclear and hydro count as zero. Every other zone uses IPCC AR5 lifecycle factors, where those sources are non-zero. The
methodfield distinguishes them. Do not put GB and DE in the same league table without saying which method produced each. - How accurate is it?
- The arithmetic is exact; the inputs are not. The two documented error sources are the age of the AR5 factor set, which makes low-carbon zones read pessimistic, and the use of the generic coal factor for lignite, which understates lignite-heavy zones by roughly 15–25%. Both are set out in § 4 with the rest.
- Can I use this commercially?
- The API is free and unrestricted today, so yes. But you inherit the upstream terms: attribution to the ENTSO-E Transparency Platform, the U.S. Energy Information Administration and the NESO Carbon Intensity API is required wherever you display the data, and EIA’s terms specifically forbid implying that EIA endorses you or your product. None of these organisations endorse, sponsor or are affiliated with gridcarbon. For regulated disclosure — CSRD, SEC, an audited GHG inventory — do not rely on a pre-alpha service as your system of record.