Environment — entry 017 of 18
UK Carbon Intensity
This is the official carbon intensity forecast and outturn API for Great Britain's electricity grid, published by National Grid ESO, giving live and forecast gCO2/kWh figures nationally and regionally. It's a fully open government data feed with no key required.
The UK Carbon Intensity API, published by National Grid ESO, gives half-hourly forecast (and, once settled, actual) grams-of-CO2-per-kWh figures for Great Britain's electricity, both nationally and broken down by DNO region and postcode. A live GET this run against the national `/intensity` route and against `/regional/postcode/RG10` both returned genuine current-window JSON with `access-control-allow-origin: *`, and no key of any kind.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required -- live GETs this run against the national and regional routes both returned real data with zero credentials and `access-control-allow-origin: *` on every response, confirmed on AWS API Gateway responses fronted by CloudFront.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Fetch the current national carbon intensity forecast
GEThttps://api.carbonintensity.org.uk/intensity
{"data":[{"from":"2026-07-31T11:30Z","to":"2026-07-31T12:00Z","intensity":{"forecast":74,"actual":null,"index":"low"}}]}`data` is a one-element array covering the current 30-minute settlement window, confirmed live this run. `actual` stays `null` until the window has fully settled (the API backfills it after the fact); `forecast` and `index` (a banded low/moderate/high/very high label) are always populated. Both values change every half hour, so treat the numbers above as a shape example, not a fixed fact.
Try it
Developer reference
https://api.carbonintensity.org.uk- GET/intensity
- GET/regional/postcode/{postcode}
- GET/generation
Gotchas & limits
- Regional data is a separate route family, not a query parameter on `/intensity` -- a live GET this run against `/regional/postcode/RG10` returned a distinct payload keyed by DNO region (`{"data":[{"regionid":12,"dnoregion":"SSE South","shortname":"South England","postcode":"RG10","data":[{"from":...,"intensity":{"forecast":50,"index":"low"},"generationmix":[{"fuel":"biomass","perc":1.6},...]}]}]}`), including a `generationmix` breakdown the national route doesn't return at all.
- An unrecognized postcode doesn't 404 -- a live GET this run against `/regional/postcode/ZZ1` returned **HTTP 400** `{"error":{"code":"400 Bad Request","message":"No postcode match can be found."}}`, so check `error.message` rather than assuming a non-2xx means the route itself is wrong.
- The national fuel mix lives at yet another route, `/generation`, not nested under `/intensity` -- a live GET this run returned `{"data":{"from":...,"to":...,"generationmix":[{"fuel":"biomass","perc":7.4},...,{"fuel":"solar","perc":37},{"fuel":"wind","perc":15.5}]}}`, a different shape again from the regional `generationmix` (no `regionid`/`postcode` wrapper).
- Every route returns only the current 30-minute settlement window by default -- forecasts for other windows or historical actuals need explicit date-range routes (e.g. `/intensity/{from}/{to}`), documented separately; there's no `?date=` shortcut on the plain routes tried here.