Environment — entry 017 of 18

UK Carbon Intensity

Verified Jul 2026

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.

carbon-emissionsenergyunited-kingdomopen-datagovernment
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score74out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 74 on greatapis.com
<a href="https://greatapis.com/api/uk-carbon-intensity/"><img src="https://greatapis.com/badge/uk-carbon-intensity.svg" alt="Scored 74 on greatapis.com"></a>

Auth quickstart

  1. 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.
Stored keyNo key stored

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

200 application/json

{"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

Base URLhttps://api.carbonintensity.org.uk
Key endpoints
  • 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.