Where to get grid carbon intensity data
gridcarbon is my own project, so this is not a neutral survey — and the cases where it is the wrong answer outnumber the cases where it is the right one. Those are spelled out first. Every price, limit and licence below was re-checked on 2026-09-01.
Every price, limit and licence below was re-checked on 2026-09-01. Two vendor pages moved in the week before that — Singularity's Grid Carbon API page and Electricity Maps' free-tier page — and where a figure I previously published is no longer on the vendor's own site, I have cut it rather than carried it forward. Where I could not read a page without an account, I say so rather than filling the gap from memory.
gridcarbon is my own project. It gets a section like everything else and a row in the table, but it is also named in almost every recommendation at the bottom — usually to rule it out — so do not read this as a neutral survey. The cases where it is the wrong answer outnumber the cases where it is the right one, and they are spelled out first.
§ 1First, work out which number you actually need
First, work out which number you actually need
Most of the confusion in this space is people comparing two products that answer different questions. Four axes decide almost everything.
Average or marginal. Average intensity is "what did a kWh consumed here cost on average this hour". Marginal is "if I add a kWh of load right now, which plant ramps to serve it, and what does that cost". If your question is "will shifting this job actually reduce emissions", the honest answer is marginal, and most feeds — including mine — do not give you it. Using an average number to claim a shifting benefit overstates the benefit in most grids and inverts it in some.
Lifecycle or operational. Lifecycle (IPCC AR5 or similar) prices the whole chain: mining, construction, fuel transport, decommissioning. Operational prices only what comes out of the stack. Nuclear is 12 gCO2eq/kWh lifecycle and 0 operational; wind and solar are the same shape. The gap at grid level is large enough to swamp real differences between grids, so the two bases must never be mixed in one series.
Production or consumption. Production-based means "generation inside this zone". Consumption-based flow-traces imports, so if Denmark is importing Norwegian hydro, its number falls. For a heavily interconnected zone this is not a rounding difference — it can be the difference between the zone looking clean and looking dirty.
How fresh, and how far back. A live dashboard needs the last hour. A scheduler needs a forecast. A carbon report needs a defensible annual figure and years of it. These are three different products and almost nothing does all three well.
§ 2Going direct to the public sources
Going direct to the public sources
The European and US zones in this post mostly resolve to three free upstream sources. It is worth being precise about what that does and does not imply, because I used to state it much too broadly.
ENTSO-E Transparency Platform — per-production-type generation for European bidding zones, back to roughly 2015. You register on the platform, then email transparency@entsoe.eu with "RESTful API access" in the subject line; the token arrives within about three working days. The documented limit is 400 requests per minute, counted both per IP address and per security token — crossing it on either one triggers a temporary ban of about ten minutes. If your traffic leaves through one NAT address, extra tokens do not buy you extra headroom. (That wording is quoted from their API guide; the platform is in maintenance as I write and I could not re-read the page live.) Data on ENTSO-E's open-data list is free to re-use with attribution; some of it is explicitly CC BY 4.0. Output is XML.
EIA Open Data (form EIA-930) — hourly operating data for US balancing authorities. The dataset starts in the second half of 2015; net generation broken out by fuel type starts 2018-07-01. Free API key on registration, JSON, plus bulk CSVs. EIA publishes this as preliminary data, made available as-is, and revises it.
NESO Carbon Intensity API — Great Britain, covered in its own section below.
What you buy when you pay someone else is not the data. It is the mapping from psrType codes to fuels, the bidding-zone EIC lookup, resolution and DST handling, revision handling, and someone noticing when a source goes quiet.
I used to describe that as "a few hundred lines and a small maintenance tax", which was both self-serving and wrong. For three sources and 45 zones, production-based, no forecast, no flow-tracing, no marginal signal, mine is 1,706 lines of TypeScript plus 942 lines of tests plus 910 lines of research notes — and I wrote a whole separate post about the six distinct ways the ENTSO-E half of it goes wrong while returning HTTP 200. The commercial products are not that work; they are that work at one to two orders of magnitude more surface area. Electricity Maps publishes its parsers openly and there are hundreds of them across hundreds of upstream domains, only a minority of which are ENTSO-E — even inside Europe they read Energinet and RTE directly. And on the US side, the marginal and consumption-based products lean on EPA CEMS unit-level emissions rather than EIA-930, which is one reason their published latency is better than mine.
So: if you have one zone and one use case, writing it yourself is genuinely reasonable. If you have thirty, or you need imports traced, it stops being reasonable fast.
§ 3NESO Carbon Intensity API (Great Britain only)
NESO Carbon Intensity API (Great Britain only)
The best free thing in this entire post, and it is not close — within its scope.
- Coverage: Great Britain, national plus 14 DNO regions plus England, Scotland and Wales.
- Resolution: 30 minutes, matching settlement periods.
- History: the first settlement period the API will return is
2017-09-11T23:00Z; I bisected for
it, and 2017-09-10 comes back empty. Per-request window: the docs say 14 days, but 30 days returns 1,441 blocks and only a full 31 days trips a 400 ("greater than 31 days"). Write for 14 and do not build on the slack.
- Forecast: 96+ hours ahead.
- Basis: operational (combustion), and it accounts for interconnector imports, transmission and
distribution losses, and embedded wind and solar.
- Access: no API key. The published
actualfor a period moves for an hour or two after first
publication, which is worth knowing before you cache one, and the newest half-hour is a forecast rather than a settled value.
- Licence: CC BY 4.0. Price: free.
Right for: anyone whose grid is GB. If that is you, stop reading — use this. It has a forecast, years of history, regional breakdown, import accounting, and a public-sector operator behind it. gridcarbon's GB zone is a thin proxy over this same API and is strictly worse than calling it directly.
Wrong for: anything outside GB. And note the operational basis means GB numbers here are structurally lower than lifecycle numbers elsewhere and are not comparable to them.
§ 4Electricity Maps
Electricity Maps
The most complete product in the category, and priced accordingly.
- Coverage: three different numbers depending on which of their pages you land on. The pricing
page says 130+ zones; the data page says 350+ bidding zones and a decade of history; the free-tier page said 200+ regions before it was replaced by a signup redirect. These are probably different things — commercially available zones, modelled zones, and marketing regions — but I did not find a page reconciling them, so treat any single figure with care.
- Basis: lifecycle, consumption-based with flow-traced imports. This is the thing nobody else in
this post does properly, and for interconnected zones it is the correct approach.
- Resolution: hourly as standard; 15-minute and 5-minute available, priced on request.
- History: real-time subscriptions include 3 months of trailing history. Longer history is a
custom configuration.
- Price: all prices are per country, per year, at hourly granularity. Real-time carbon intensity
is €6,000/year. Carbon-free energy % and renewable energy % are €4,500 each; all three sustainability signals bundled are €12,000. On the grid side, electricity mix and interconnector flows are €6,000 each, total load and net load €4,500 each, all grid signals €18,000. Every signal also has a Forecast column, and every cell in that column reads "Custom" — the forecast exists and is sold, but not at a published price.
- Discounts: their pricing page states that regional bundles and global coverage are available at
volume discounts and that pricing is tailored to scope, plus up to 50% for companies with fewer than 25 employees or under €2M ARR. So do not multiply €6,000 by your country count and conclude it is out of reach — ask them. What is true is that there is no self-serve tier between the free single zone and a sales conversation.
- Trial: 14 days, no payment details required.
- Free personal tier: live carbon intensity for one zone, chosen at account creation, framed
as personal and non-commercial. Their free-tier page now redirects to a signup, so I could not re-read the terms or the rate limit today and I am not going to quote figures from a page I cannot open. Check them yourself before shipping anything on it.
- Free categorical API: they also publish a Carbon Intensity Level API returning high, moderate
or low relative to a 10-day rolling average, free across their zones, access via a request form. Raw numbers or absolute thresholds require a paid plan.
- Open source: their data parsers are published openly, which is more than I can say for my
backend.
Right for: a funded company that needs consumption-based numbers, wide coverage, a real methodology team, and a vendor relationship. If you are reporting to customers or regulators on electricity emissions and can afford it, this is the default choice.
Wrong for: a side project, or anyone who needs a price without a sales conversation.
§ 5WattTime
WattTime
The only source here whose main product is marginal emissions.
- Signals: MOER (marginal operating emissions rate), AOER (average operating rate), and a
health-damage signal in USD/MWh from marginal generation air pollution.
- Coverage: they state global coverage of 200+ countries and territories.
- Forecast: 72-hour rolling, updated every five minutes.
- History: 2+ years.
- Free "Basic" tier: all signals and endpoints for one region — specifically
CAISO_NORTH—
plus a CO2 percentile signal for all regions. General support.
- Paid "Analyst" and "Pro" tiers: contact sales. Both list premium support including an SLA. No
public price; I am not going to guess one.
Right for: anyone making a claim about the effect of load shifting. If you are writing "we moved this workload and saved X tonnes", average intensity does not support that sentence and MOER does. Also right if you are in CAISO_NORTH and want a free, forecast-carrying feed.
Wrong for: European multi-zone work on a budget, or anyone who needs a price before starting a sales conversation.
§ 6Singularity
Singularity
US-focused, and the one product here I cannot give you a price for from a public page.
- Coverage: "all U.S. balancing authorities and parts of Canada", their wording. I have seen a
list of eight real-time ISOs cited to their developer docs but could not load that docs page myself, so I am not repeating a count here.
- Latency: their wording is "current within hours to days". They do not publish a per-region
figure.
- Signals: generated, consumed and marginal carbon intensity, plus generated and marginal fuel
mix. Consumed intensity means they do the import tracing on the US side.
- Forecast: up to 24 hours ahead.
- Free for academics: verified researchers with a
.eduemail get access to the same real-time
API at no cost, renewed annually.
- Price: not published. There is a free trial with no stated duration.
singularity.energy/pricing
404s, and the Grid Carbon API section of singularity.energy/tools carries no figures at all — I re-read it on 2026-09-01 and there is not a dollar sign on the page. I had a set of per-region monthly numbers here from an earlier read of a page that has since been removed; rather than repeat figures I can no longer point at, I have cut them. Assume a sales conversation.
Right for: a US company that needs consumed or marginal intensity across several ISOs, or an academic who qualifies for free access.
Wrong for: Europe, and for anyone who needs a price before talking to someone.
§ 7Open Grid Emissions
Open Grid Emissions
Free, open source, and better than gridcarbon on US history by two orders of magnitude. It belongs in this post and its absence from the previous version was a real gap.
Published by Singularity, built on eGRID's methodology and the same EPA CEMS and EIA survey inputs, but released months before eGRID and far more granular.
- Coverage: all US balancing authority areas, generator-level.
- History: 2005–2025 annual and monthly; hourly from 2019 onward.
- Basis: generated and consumed — it accounts for imports, which I do not.
- Licence: CC BY 4.0 for the data, MIT for the code. Open-source, documented, peer-reviewed.
- Price: free.
Right for: anyone who wants US hourly history. This is better than anything I have and it costs nothing. It is a dataset rather than a live API, so it is not the tool for "what is the grid doing right now".
§ 8Climatiq
Climatiq
Worth including precisely because it is often suggested for this and is the wrong shape for it.
Climatiq is an emission-factor database with a calculation API, not a live grid feed. Its energy endpoint returns annual average grid factors by region — roughly 150 country codes and subdivisions — with a year parameter that defaults to the latest available. There is no hourly signal.
- Starter: free, limited metadata, non-commercial licence.
- Data Pro: €2,000/year (listed against a €3,000 regular price), or €250/month. A consultant
variant with commercial licensing is €3,500/year, or €400/month.
- PCF Pro: from €4,900/year, contact sales. Enterprise: custom, with an enterprise SLA.
Right for: product carbon footprinting and Scope 2 reporting where you need a documented, auditable factor with provenance, alongside factors for everything else in your inventory.
Wrong for: any question containing the word "now".
§ 9Annual factors for reporting: eGRID, AIB, IEA, Ember
Annual factors for reporting: eGRID, AIB, IEA, Ember
If your output is a compliance number rather than a control signal, none of the hourly feeds above are what a reviewer expects.
- eGRID (US EPA) — free, annual, subregion-level, the standard location-based source for US
Scope 2 under the GHG Protocol. Check the current data year on EPA's own page; the release lags the year it describes by roughly two years.
- AIB residual mixes — the European market-based counterpart, published annually and free. The
2025 residual mix was published on 2026-05-28; the report PDF and the calculation datasheet are both free downloads.
- IEA emission factors — global and widely accepted; sold rather than free. I could not load
their product page to confirm current terms (it returned 403), so check the price yourself.
- Ember — free under CC BY 4.0, yearly and monthly generation, emissions and carbon intensity;
monthly data for 88 geographies, updated twice a month. Excellent for charts and trend work.
§ 10gridcarbon
gridcarbon
Mine. Here it is on the same axes, including the parts I would rather not write.
- Coverage: 45 zones — 33 European bidding zones (ENTSO-E), 11 US balancing authorities and
aggregates (EIA-930, ten BAs plus a US-wide aggregate), and GB (NESO).
- Resolution: hourly; 30 minutes for GB.
- Basis: IPCC AR5 lifecycle factors for the 44 computed zones; operational for GB, because GB
is passed through from NESO and NESO uses combustion-only factors. GB is structurally lower and not comparable to the rest.
- The GB asterisk, in full. NESO's
actualis null for the newest settlement periods and I fall
back to their forecast rather than leave a gap, flagged in the method field as upstream:uk-neso:forecast rather than upstream:uk-neso:actual. That flag is the only signal, and the newest GB point is normally a forecast — so /v1/intensity/latest?zone=GB is usually not a measured number. Measured 2026-09-01T03:15Z: latest returned 129 g while the four settled half-hours behind it read 71, 69, 67 and 62. A forecast that runs 2× over settlement is not a bug in their data; it is what a forecast is. Branch on method, or use NESO directly, which is the better answer anyway.
- Imports: not modelled. Production-based only, and at the generator terminal — no transmission
or distribution losses.
- History: about 3.3 months as of 2026-09-01 — 107,430 intervals across 45 zones, earliest
2026-05-24T23:30Z, growing an hour at a time. There is no deep backfill: nothing older than the start of the archive has ever been loaded, and the trailing window only self-heals outages shorter than 72 hours. Assume months, not years.
- Freshness, and the outage happening as I publish. The lag climbs between hourly polls rather
than sitting at a fixed offset, so these are shapes, not constants: European zones roughly 1.5–4 hours behind when ENTSO-E is up, GB about 1 hour with the forecast caveat above, US 11–26 hours. As I publish this, ENTSO-E has been in scheduled maintenance for about two days and all 33 European zones are stale: no European zone holds a value newer than 2026-08-30T20:00Z, and they range from 31 to 54 hours behind. Every endpoint still returns 200 and all 45 zones still return, because each value carries the timestamp of the interval it describes; /v1/status returns HTTP 503 while a source is behind its window, and it is returning 503 right now. That is the system working as designed, and it is also the honest answer to "is this thing current": for Europe, today, no.
- Forecast: none. There is no forecast endpoint at any price.
- Access: no API key, no signup, CORS open. There is a per-IP rate limit that returns 429 with a
retry-after header. The documented figure is 60 requests per minute, but the limiter is more permissive than that in practice — 100 requests to unique uncacheable URLs from one IP completed in 14.1 seconds, about 426/minute, with zero 429s, measured 2026-09-01. Do not build against the headroom; it is not a promise.
- Source: the client libraries — Python, TypeScript and the MCP server — are MIT at
github.com/gridcarbon/clients. The Worker that serves the API is not open source. You can read the clients, the emission factors and the methodology; you cannot read the ingestion and compute path or run your own copy. Worth saying plainly, because two of the products above are more open than mine: Electricity Maps publishes its parsers, and Singularity's Open Grid Emissions is MIT end to end.
- Price: free. SLA: none. Status: pre-alpha, three months old, one person, derived values
rather than measured ones.
Two defects you should hear from me rather than find yourself.
The coal family is one factor. Hard coal, lignite, oil shale and peat all get AR5's single 820 gCO2eq/kWh coal number, which biases lignite-heavy zones low. Re-measured over 73 hours of German data: substituting a 1,100 g lignite factor raises DE by a median 13.5% (range 9.0–20.7%); at the top of the plausible band, 1,200 g, the median is 18.3% and the single worst hour is 28.1%. I had been quoting "15–25%" for this, which was the ceiling stated as if it were the typical case.
The plausibility gate is six days old. When a zone published only a fragment of its mix for an interval, the weighted average landed on whichever fuel dominated the fragment. Ireland did this at 02:00Z and 03:00Z on 2026-08-26, printing within a few percent of 820 while the hours either side ran 374–440. That is now gated: an interval is dropped rather than published if its total output falls below 10% of the zone's reference or it carries fewer than 60% of the zone's typical fuel count, already-published bad values are retracted, and the trailing window backfills the hour once upstream completes the mix. Ireland has returned no value at 820 since. I am leaving the story here because the gate is new and both thresholds were tuned against exactly two incidents; treat it as young code, not a solved problem.
Right for: a developer who wants an hourly number for many European zones from one keyless curl — a dashboard, a live badge, a region-picking heuristic, a prototype, or teaching. The gap it fills is the €0–100/month self-serve band.
Wrong for: everything in the last section.
§ 11The comparison, in one table
The comparison, in one table
| Coverage | Resolution | History | Basis | Imports traced | Forecast | Price | Licence | |
|---|---|---|---|---|---|---|---|---|
| ENTSO-E direct | EU bidding zones | 15–60 min | ~2015– | raw fuel mix; you apply factors | no | day-ahead available | free (token by email) | open-data list, attribution; some CC BY 4.0 |
| EIA-930 direct | US BAs | hourly | 2015– (fuel mix 2018-07–) | raw fuel mix; you apply factors | no | no | free (key) | US government data |
| NESO Carbon Intensity | GB only | 30 min | 2017-09– | operational | yes | 96+ h | free, no key | CC BY 4.0 |
| Electricity Maps | 130+ priced / 350+ modelled | hourly (5/15 min priced on request) | 3 months included | lifecycle | yes, flow-traced | yes, priced "Custom" | €6,000/country/yr real-time | commercial; parsers open |
| — free personal tier | 1 zone | live only | none | lifecycle | yes | no | free | personal use |
| WattTime | 200+ claimed | forecast updated 5 min | 2+ years | operating rates | n/a (marginal) | 72 h | free for CAISO_NORTH; paid undisclosed | commercial |
| Singularity | all US BAs + parts of Canada | hourly | not stated | generated/consumed/marginal | yes | 24 h | not published (trial; free for academics) | commercial |
| Open Grid Emissions | all US BAs | hourly 2019–; monthly/annual 2005– | 2005–2025 | generated and consumed | yes | n/a (dataset) | free | CC BY 4.0 data, MIT code |
| Climatiq | ~150 regions | annual | multi-year | annual grid factors | n/a | n/a | free–€4,900+/yr | tiered |
| eGRID / Ember | US / global | annual (Ember: monthly) | long | annual averages | n/a | n/a | free | public / CC BY 4.0 |
| gridcarbon | 45 zones | hourly (GB 30 min) | ~3.3 months | lifecycle (GB operational) | no | no | free, no key | data CC BY 4.0; clients MIT; backend closed |
§ 12Pick by what you are doing
Pick by what you are doing
Audited Scope 2 reporting. Do not use gridcarbon. Do not use any hourly modelled feed as your primary figure. Use eGRID for US location-based, your national published factor or the AIB residual mix for European market-based, and your supplier's contractual instruments where you have them. If you want a vendor to carry the provenance for you, Climatiq is built for exactly this. gridcarbon recomputes values in place over a 72-hour trailing window and now retracts implausible ones, which alone disqualifies it: a number that can change after you cited it is not an auditable number.
More than a few months of history. Not gridcarbon — it reaches back to 2026-05-24 and no further. For the US, Open Grid Emissions is free and goes hourly to 2019. For Europe, pull ENTSO-E yourself, or buy Electricity Maps history. Ember if monthly resolution is enough.
An SLA, or anything with money attached to uptime. Not gridcarbon; there is no SLA and no promise that it exists next month. Electricity Maps, WattTime's paid tiers and Singularity all offer support commitments.
Claiming an emissions reduction from load shifting. WattTime. Average intensity, which is what gridcarbon and most others give you, cannot support that claim.
An interconnected zone where imports dominate — DK-1, AT, CH, NL, LU. Electricity Maps, or NESO if you are in GB. gridcarbon's production-based numbers for these zones are wrong in a direction and magnitude I cannot quantify for you.
Anything real-time in the US. Not gridcarbon at 11–26 hours behind, and not EIA-930 directly either — that lag is EIA's, not mine. Singularity's own wording is "current within hours to days", which is better than a day; WattTime gives a five-minute-updated forecast free for CAISO_NORTH.
Scheduling a job in the next N hours. You need a forecast, and gridcarbon has none at all. NESO for GB, free. ENTSO-E day-ahead if you want to build it. WattTime, Singularity or Electricity Maps if you want it bought.
Academic research. Singularity gives verified .edu researchers the full real-time API free, and Open Grid Emissions is free to everyone.
Great Britain, anything. NESO, directly. Always.
A dashboard, a badge, a demo, a course, or a heuristic that picks between European regions — today, without a procurement conversation. That is the case gridcarbon was built for, and it is a narrower case than the rest of this page might make it look. It is also the case most affected by the outage described in section 10, which is a fair illustration of what "one person, no SLA" buys you.
If any figure above is out of date or I have described your product wrongly, tell me and I will correct it here. Prices move, pages move, and I would rather this page be right than flattering.