UK Carbon Intensity & Low-Carbon Windows avatar

UK Carbon Intensity & Low-Carbon Windows

Pricing

from $0.70 / 1,000 result rows

Go to Apify Store
UK Carbon Intensity & Low-Carbon Windows

UK Carbon Intensity & Low-Carbon Windows

Half-hourly carbon intensity (gCO2/kWh) for Great Britain, its grid regions and UK outward postcodes from the NESO Carbon Intensity API: forecast, actual, index and generation mix, plus the lowest-carbon time windows for EV charging, heat pumps and other flexible loads.

Pricing

from $0.70 / 1,000 result rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Security

Limited permissions

Share

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.

No login or API key is needed. The default run (Great Britain, London and Scotland for the next 24 hours) takes about 5 seconds, returns 153 rows (144 half-hours plus 9 ranked windows) and costs about $0.16 on the Free plan.

UK Carbon Intensity & Low-Carbon Windows: choose areas and time, get every half-hour of grid CO2 with fuel mix, and get the best low-carbon windows

Table of contents

What it does

The Actor reads the public Carbon Intensity API run by the National Energy System Operator (NESO). It does three things:

  1. 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.
  2. It turns each half-hour into one clean row with UTC times, forecast and actual intensity, the index and the fuel mix.
  3. 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 fit

  • 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 fit / limits

  • 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.

Quick start

  1. Open the Input tab.
  2. Keep the prefilled input: Great Britain, regions 13 (London) and 16 (Scotland), from now to +24h.
  3. Optionally add a postcode such as M1 or EH1 1YZ.
  4. Click Start.
  5. In the Output tab, open Low-carbon windows only for the ranked windows, or All rows for every half-hour (the recordType column says period, window or area_status).

Expected result: one row per half-hour per area, plus the ranked windows for each area.

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Schedule EV charging or a heat pumppostcodes, windowDurationHours, windowCountwindowfrom, to, averageForecastIntensity, windowRankYour scheduler reads the rank 1 window
Daily ESG or energy reportstartTime: "yesterday", includeNationalperiodactualIntensity, forecastIntensity, generationMixExport CSV/Excel or Google Sheets
Compare regionsregionsperiodregionName, forecastIntensity, intensityIndexDashboard or BI tool

Input

Input fields

FieldTypeDefault / prefillAllowed valuesEffect
includeNationalbooleantrue—Great Britain series. This is the only series with actual values.
regionsarray of stringsprefill ["13", "16"]Region IDs "1"–"17" only1–14 are distribution network regions (13 London, 1 North Scotland, …), 15 England, 16 Scotland, 17 Wales.
postcodesarray of strings—Up to 5 UK postcodesOnly the outward part is used and kept in the output (SW1A 1AA → SW1A).
startTimestringnownow, today, yesterday, tomorrow, YYYY-MM-DD (a UK day), or an ISO date-timeISO without an offset is read as UTC. The start is rounded down to the half-hour.
endTimestringempty+Nh, YYYY-MM-DD, or an ISO date-timeEmpty = 24 hours after the start (or the end of the UK day for a day value). A date covers that whole UK day. Max range 7 days (168 hours).
includeHalfHourPeriodsbooleantrue—Output one row per half-hour.
includeGenerationMixbooleantrue—Add the fuel mix to each half-hour (national and regional).
findLowCarbonWindowsbooleantrue—Output ranked window rows.
windowDurationHoursnumber20.5–24, in steps of 0.5Length of each window. It must fit inside the range.
windowCountinteger31–10Windows per area. Fewer are returned if the range is too short.
windowsFromNowOnlybooleantrue—Only search windows from the current half-hour onward. Turn it off to rank windows in a past range.

At least one area is required. Duplicate regions and postcodes with the same outward code are merged. If both includeHalfHourPeriods and findLowCarbonWindows are off, the input is rejected.

Interacting settings

WhenEffective behavior
startTime is a day and endTime is emptyThe range is that whole UK calendar day: 48 half-hours, or 46/50 on clock-change days.
The range is in the past and windowsFromNowOnly is trueNo windows are found. Set windowsFromNowOnly to false.
A window has already startedIt can still be ranked; its isUpcoming is false.

Input example

{
"includeNational": true,
"regions": ["13", "16"],
"postcodes": ["M1 1AE"],
"startTime": "now",
"endTime": "+24h",
"includeGenerationMix": true,
"findLowCarbonWindows": true,
"windowDurationHours": 2,
"windowCount": 3
}

Expected output: 4 areas × 48 half-hours = 192 period rows plus up to 12 window rows. M1 1AE is reported as M1.

Output

Each Dataset row has a recordType:

  • period: one half-hour of one area;
  • window: one ranked low-carbon window of one area;
  • area_status: an area with no rows (not_found, no_data or error). These rows are free.

Output fields

FieldMeaningCan be empty?
recordTypeperiod, window or area_statusno
area, areaTypeArea label and type (national, region, postcode)no
regionId, regionName, dnoRegionNESO region; regionId is null for Great Britainyes
postcodeOutward postcode of the lookupyes
from, toStart and end, UTC ISO 8601null on status rows
forecastIntensityForecast, gCO2/kWhyes
actualIntensityActual, gCO2/kWh. National past half-hours only; otherwise null (not 0)yes
intensityIndexvery low, low, moderate, high, very highyes
unitAlways gCO2/kWhno
generationMixPercent by fuel: biomass, coal, gas, imports, nuclear, hydro, solar, wind, otheryes
windowRank1 = lowest average forecastwindow rows only
windowDurationHours, averageForecastIntensity, minForecastIntensity, maxForecastIntensityWindow length and its forecast (average rounded to 0.1)window rows only
isUpcomingtrue if the window starts after the run startedwindow rows only
status, messageok, or the reason for a status rowmessage yes
provider, sourceUrl, fetchedAtSource, exact API request and fetch time (UTC)no

The key-value store record WINDOWS holds only the window rows (a JSON array). The record RUN_SUMMARY has the run status, counts per area, the best windows, request statistics, warnings and the attribution text.

The Dataset has two table views, Overview and Fuel mix. Both show all rows; filter by recordType if you need one kind. To get only windows in the Dataset, turn off includeHalfHourPeriods.

Output example

A real row from the default run on 2026-10-12, trimmed:

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

And a window row from the same run:

{
"recordType": "window",
"area": "GB (national)",
"from": "2026-10-13T11:30:00Z",
"to": "2026-10-13T13:30:00Z",
"windowRank": 1,
"windowDurationHours": 2,
"averageForecastIntensity": 36.5,
"minForecastIntensity": 35,
"maxForecastIntensity": 38,
"isUpcoming": true
}

Output surfaces

SituationWhat you getWhat to do
Normal runperiod and window rows, run status COMPLETEUse the Overview view or the WINDOWS record
Unknown postcodeOne area_status row with not_foundCheck the postcode; Northern Ireland is not covered
Range with no data (too far ahead or before 2017)area_status row with no_data, run status NO_RESULTSChoose a range within the next ~48 hours or the past
Some areas failedRows for the others, run status PARTIALRead RUN_SUMMARY.areas and retry later
Invalid inputRun fails with a clear message, no rowsFix the field named in the message

Pricing and limits

Pricing unit

This Actor uses pay-per-event pricing:

EventPrice
Actor start (one per run at the default 256 MB memory)$0.005
Result row (one period or window row)$0.001 (Free plan), $0.00095 (Bronze), $0.0009 (Silver), $0.00085 (Gold and higher)

area_status rows are free. A run with no data (for example a range too far ahead) costs only the start event. If the source fails, no rows are charged. Platform usage is included in the price.

Cost examples (Free plan prices)

ScenarioInput scopeRowsCost
Default runGB + 2 regions, 24 h, 3 windows each153$0.158
One window only1 postcode, periods off, 1 window1$0.006
Two days, six areasGB + 5 regions, 48 h, 3 windows each594$0.599
Largest testedGB + 17 regions + 5 postcodes, 7 days, windows on7,958$7.96

The largest tested run finished in 41 seconds. You can set a maximum total charge for a run; the Actor stops saving rows when it is reached (run status CAPPED).

API, export and integrations

  • API: start the Actor with the Apify API and read the Dataset items, or the WINDOWS key-value record for the ranked windows only.
  • Export: download the Dataset as JSON, CSV, Excel, XML or HTML.
  • Scheduling: run it every day (for example at 18:00 UK time) with Apify schedules to plan the next day's flexible loads.
  • Webhooks / no-code: send results to Make, Zapier, Google Sheets or your own webhook with Apify integrations.

Use with AI agents (MCP)

  • MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/uk-carbon-intensity.

  • Smallest useful input:

    { "includeNational": true, "startTime": "now", "endTime": "+24h", "includeHalfHourPeriods": false, "windowCount": 3 }
  • Key output fields: from, to, averageForecastIntensity, windowRank on window rows; forecastIntensity, intensityIndex on period rows.

  • A typical call takes about 5 seconds and costs $0.008 for 3 window rows. Limits: 7 days per run, up to 5 postcodes, region IDs "1"–"17".

Troubleshooting

Input is rejected for a region name

Symptom: the run does not start and says the region value is not allowed. Reason: the input form accepts region IDs only. Action: use "13" for London, "16" for Scotland, and so on (see the Input table).

No windows in the output

Symptom: period rows exist, but there are no window rows. Reason: the range is in the past and windowsFromNowOnly is true, or the range is shorter than windowDurationHours. Action: set windowsFromNowOnly to false for past ranges, or make the window shorter.

Scotland shows 0 gCO2/kWh

Symptom: many half-hours for Scotland (16), North Scotland (1) or Scottish postcodes have forecast 0, and several windows have an average of 0. Reason: this is the value the source publishes for these areas. The Actor keeps it as is and does not invent a ranking. When every forecast in the range is the same, RUN_SUMMARY.warnings says that the windows are ties ordered by start time. Action: none needed; use another region if you need a ranking.

A postcode returns not_found

Symptom: one area_status row with not_found. Reason: the source does not know this outward postcode, or it is in Northern Ireland. Action: check the postcode. Other areas in the same run are not affected.

FAQ

Do I need an account or API key for the source?

No. The source is a free public API. You only need an Apify account to run the Actor.

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.

Source and licence

Contains data from the Carbon Intensity API by National Energy System Operator, licensed under CC BY 4.0. The Actor reformats it (UTC periods, window ranking). This Actor is not affiliated with or endorsed by NESO. Every row keeps provider, sourceUrl and fetchedAt.

Support

For bugs, questions or feature requests, open an issue on the Actor's Issues tab in Apify Store. Include the run ID and your input. Do not send API tokens or other secrets.