How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
13in Grid regions. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Get the half-hourly carbon intensity of electricity (gCO2/kWh) for Great Britain, its grid regions and UK postcodes from the Carbon Intensity API of the National Energy System Operator (NESO). Each half-hour has a forecast, an actual value (national only), an index and the generation mix. The Actor also finds the lowest-carbon time windows for EV charging, heat pumps, batch jobs and other flexible loads.
- It gets every half-hour in your time range for each area you choose: Great Britain, any of the 17 NESO regions, and up to 5 postcodes.
- It turns each half-hour into one clean row with UTC times, forecast and actual intensity, the index and the fuel mix.
- It finds the best non-overlapping windows of the length you choose (for example 3 windows of 2 hours), ranked by the average forecast intensity.
Good for
- You plan EV charging, heat pumps, batteries or batch jobs and need the greenest hours in the next day or two.
- You report on grid carbon intensity for a past day or week (ESG, energy dashboards).
- You compare regions or sites by postcode for the same time range.
Not a good fit
- It does not calculate the carbon footprint of your business and does not issue certificates or guarantees of origin.
- Great Britain only. Northern Ireland is not covered by the source.
- Regions and postcodes have forecasts only. The source has no regional actual values.
- Forecasts reach about 48 hours ahead. History starts in 2017–2018.
Who uses it
EV and heat pump owners
Charge or heat when the grid is cleanest.
Energy and ESG teams
Report grid carbon for a past day or week.
Developers
Move batch jobs to low-carbon hours.
Price
Prices will be shown after release.
Questions
Does it cover Northern Ireland?
No. The source covers Great Britain only.
Why is the actual value empty?
Actual values exist only for Great Britain as a whole. They exist only for past half hours.
Does it calculate my company's footprint?
No. It shows grid carbon intensity. It does not issue certificates.
Do I need an API key?
No. The NESO Carbon Intensity API is free and public.
Why is actualIntensity null?
The source publishes actual values only for Great Britain as a whole and only for half-hours that have passed. Regions and postcodes have forecasts only. A null means "no value", never 0.
How fresh is the data?
Each run requests the source live. fetchedAt shows when. Forecasts change during the day, so a later run can show different forecasts for the same half-hour.
Why are times in UTC?
The source uses UTC. A UK calendar day (today, 2026-10-25) is converted for you, so clock-change days have 46 or 50 half-hours.
Details
Step by step on Apify
- Open the Input tab.
- Keep the prefilled input: Great Britain, regions 13 (London) and 16 (Scotland), from
nowto+24h. - Optionally add a postcode such as
M1orEH1 1YZ. - Click Start.
- In the Output tab, open Low-carbon windows only for the ranked windows, or All rows for every half-hour (the
recordTypecolumn saysperiod,windoworarea_status).
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Schedule EV charging or a heat pump | postcodes, windowDurationHours, windowCount | window | from, to, averageForecastIntensity, windowRank | Your scheduler reads the rank 1 window |
| Daily ESG or energy report | startTime: "yesterday", includeNational | period | actualIntensity, forecastIntensity, generationMix | Export CSV/Excel or Google Sheets |
| Compare regions | regions | period | regionName, forecastIntensity, intensityIndex | Dashboard or BI tool |
Tips for better results
- Ask for a few windows of a fixed length, like 3 windows of 2 hours.
- Times are in UTC. A UK clock-change day has 46 or 50 half hours.
- Run again later in the day. Forecasts change during the day.
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"recordType": "period",
"area": "GB (national)",
"areaType": "national",
"from": "2026-10-12T13:30:00Z",
"to": "2026-10-12T14:00:00Z",
"forecastIntensity": 73,
"actualIntensity": null,
"intensityIndex": "low",
"unit": "gCO2/kWh",
"generationMix": { "wind": 49.5, "gas": 13, "nuclear": 11.5, "imports": 10.7, "biomass": 8.7, "solar": 6.6, "hydro": 0, "coal": 0, "other": 0 },
"status": "ok",
"provider": "Carbon Intensity API (National Energy System Operator)",
"sourceUrl": "https://api.carbonintensity.org.uk/intensity/2026-10-12T13:30Z/2026-10-13T13:30Z",
"fetchedAt": "2026-10-12T13:52:42Z"
}Data fields (25)
| Field | Type | Meaning |
|---|---|---|
recordType | string | period = one half-hour of one area; window = a ranked low-carbon window; area_status = an area with no rows (not_found, no_data or error). |
area | string | Area label: GB (national), region name or postcode. |
areaType | string | |
regionId | integer | NESO region ID 1–17; null for national. |
regionName | string | |
dnoRegion | string | Distribution network operator region name from the source. |
postcode | string | Outward postcode used for the lookup. |
from | string | Start of the half-hour or window, UTC ISO 8601. |
to | string | End, UTC ISO 8601. |
forecastIntensity | number | Forecast carbon intensity, gCO2/kWh. |
actualIntensity | number | Actual (estimated from metered generation) intensity, gCO2/kWh. National only; null for future periods and regions — null is not zero. |
intensityIndex | string | |
unit | string | |
generationMix | object | Percent of generation by fuel. |
windowRank | integer | 1 = lowest average forecast intensity. |
windowDurationHours | number | |
averageForecastIntensity | number | Mean forecast over the window's half-hours, rounded to 0.1 gCO2/kWh. |
minForecastIntensity | number | |
maxForecastIntensity | number | |
isUpcoming | boolean | true if the window starts after the run started; false if it is already in progress. |
status | string | |
message | string | |
provider | string | |
sourceUrl | string | Exact API request behind the row. |
fetchedAt | string | When the source was requested, UTC. |
Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Great Britain (national) | includeNational | boolean | true |
| Grid regions | regions | array | ["13", "16"] |
| UK postcodes (outward code) | postcodes | array | |
| Start | startTime | string | "now" |
| End | endTime | string | "+24h" |
| Half-hour periods | includeHalfHourPeriods | boolean | true |
| Generation mix | includeGenerationMix | boolean | true |
| Find low-carbon windows | findLowCarbonWindows | boolean | true |
| Window length (hours) | windowDurationHours | number | 2 |
| Number of windows | windowCount | integer | 3 |
| Windows only in the future | windowsFromNowOnly | boolean | true |
