UK Carbon Intensity & Low-Carbon Windows
Pricing
from $0.70 / 1,000 result rows
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
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.

Table of contents
- What it does
- Quick start
- Use cases
- Input
- Output
- Pricing and limits
- API, export and integrations
- Troubleshooting
- FAQ
- Source and licence
- Support
What it does
The Actor reads the public Carbon Intensity API run by the National Energy System Operator (NESO). It does three things:
- 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 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
- 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).
Expected result: one row per half-hour per area, plus the ranked windows for each area.
Use cases
| Buyer job | Input path | Output entity | Key fields | Next integration |
|---|---|---|---|---|
| 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 |
Input
Input fields
| Field | Type | Default / prefill | Allowed values | Effect |
|---|---|---|---|---|
includeNational | boolean | true | — | Great Britain series. This is the only series with actual values. |
regions | array of strings | prefill ["13", "16"] | Region IDs "1"–"17" only | 1–14 are distribution network regions (13 London, 1 North Scotland, …), 15 England, 16 Scotland, 17 Wales. |
postcodes | array of strings | — | Up to 5 UK postcodes | Only the outward part is used and kept in the output (SW1A 1AA → SW1A). |
startTime | string | now | now, today, yesterday, tomorrow, YYYY-MM-DD (a UK day), or an ISO date-time | ISO without an offset is read as UTC. The start is rounded down to the half-hour. |
endTime | string | empty | +Nh, YYYY-MM-DD, or an ISO date-time | Empty = 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). |
includeHalfHourPeriods | boolean | true | — | Output one row per half-hour. |
includeGenerationMix | boolean | true | — | Add the fuel mix to each half-hour (national and regional). |
findLowCarbonWindows | boolean | true | — | Output ranked window rows. |
windowDurationHours | number | 2 | 0.5–24, in steps of 0.5 | Length of each window. It must fit inside the range. |
windowCount | integer | 3 | 1–10 | Windows per area. Fewer are returned if the range is too short. |
windowsFromNowOnly | boolean | true | — | 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
| When | Effective behavior |
|---|---|
startTime is a day and endTime is empty | The 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 true | No windows are found. Set windowsFromNowOnly to false. |
| A window has already started | It 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_dataorerror). These rows are free.
Output fields
| Field | Meaning | Can be empty? |
|---|---|---|
recordType | period, window or area_status | no |
area, areaType | Area label and type (national, region, postcode) | no |
regionId, regionName, dnoRegion | NESO region; regionId is null for Great Britain | yes |
postcode | Outward postcode of the lookup | yes |
from, to | Start and end, UTC ISO 8601 | null on status rows |
forecastIntensity | Forecast, gCO2/kWh | yes |
actualIntensity | Actual, gCO2/kWh. National past half-hours only; otherwise null (not 0) | yes |
intensityIndex | very low, low, moderate, high, very high | yes |
unit | Always gCO2/kWh | no |
generationMix | Percent by fuel: biomass, coal, gas, imports, nuclear, hydro, solar, wind, other | yes |
windowRank | 1 = lowest average forecast | window rows only |
windowDurationHours, averageForecastIntensity, minForecastIntensity, maxForecastIntensity | Window length and its forecast (average rounded to 0.1) | window rows only |
isUpcoming | true if the window starts after the run started | window rows only |
status, message | ok, or the reason for a status row | message yes |
provider, sourceUrl, fetchedAt | Source, 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
| Situation | What you get | What to do |
|---|---|---|
| Normal run | period and window rows, run status COMPLETE | Use the Overview view or the WINDOWS record |
| Unknown postcode | One area_status row with not_found | Check 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_RESULTS | Choose a range within the next ~48 hours or the past |
| Some areas failed | Rows for the others, run status PARTIAL | Read RUN_SUMMARY.areas and retry later |
| Invalid input | Run fails with a clear message, no rows | Fix the field named in the message |
Pricing and limits
Pricing unit
This Actor uses pay-per-event pricing:
| Event | Price |
|---|---|
| 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)
| Scenario | Input scope | Rows | Cost |
|---|---|---|---|
| Default run | GB + 2 regions, 24 h, 3 windows each | 153 | $0.158 |
| One window only | 1 postcode, periods off, 1 window | 1 | $0.006 |
| Two days, six areas | GB + 5 regions, 48 h, 3 windows each | 594 | $0.599 |
| Largest tested | GB + 17 regions + 5 postcodes, 7 days, windows on | 7,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
WINDOWSkey-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,windowRankon window rows;forecastIntensity,intensityIndexon 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.