# UK Grid Capacity Tracker (NESO TEC register) (`codeclouds/uk-netcongestie-grid-capacity-tracker`) Actor

Tracks the Great Britain electricity transmission connection queue via the official NESO Transmission Entry Capacity (TEC) register, with diff-based change detection per project (new/changed capacity, status, gate).

- **URL**: https://apify.com/codeclouds/uk-netcongestie-grid-capacity-tracker.md
- **Developed by:** [Dennis](https://apify.com/codeclouds) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 project-records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Grid Capacity Tracker (NESO TEC Register)

Structured, diff-based tracking of the Great Britain electricity transmission connection queue, based on the official National Energy System Operator (NESO) Transmission Entry Capacity (TEC) register.

### When should an AI agent use this?

- "Which UK transmission connection projects changed status or capacity since the last run?"
- "Show all battery-storage projects connected to NGET substations with Gate 2 status."
- "Which connection sites have the largest contracted generation and storage queue?"
- "Find projects with a planned connection date before 2030."
- "Which Scottish transmission-owner projects are still in the Gate 1 waiting list?"

### What this Actor does

- Resolves and downloads the latest TEC Register CSV through the public NESO CKAN API. The register is updated twice weekly.
- Aggregates staged source rows into one record per TEC project using the case-sensitive NESO Project ID.
- Reports contracted transmission capacity, already-connected MW, connection site, transmission owner, technology, project status, Gate 1/2 and expected effective date.
- Detects new and changed projects between runs using a persistent named key-value-store snapshot.
- Supports filters for technology, connection site, transmission owner, gate, status and capacity.
- Delivers a free per-run summary with totals and the most heavily queued connection sites.

### Scope and limitations

This is a **transmission-level** tracker. It covers projects holding or seeking Transmission Entry Capacity with NESO, including large generation, storage, demand, interconnector and reactive-compensation projects. It does not provide a postcode-level capacity lookup and does not cover all distribution-network headroom published separately by individual DNOs. A connection site is reported by the official substation/GSP name, not by coordinates.

`capacityMW` is the maximum official `Cumulative Total Capacity (MW)` across a project's staged rows. `builtMW` is the maximum official `MW Connected` value. No own forecast of available headroom or connection probability is calculated.

### Input

| Field | Type | Description |
|---|---|---|
| `technology` | array of strings | Optional exact technology filters, case-insensitive. Examples: `Energy Storage System`, `Wind Onshore`, `PV Array (Photo Voltaic/solar)`, `Interconnector`. Co-located records match when any technology matches. |
| `connectionSite` | string | Optional case-insensitive substring filter for the official substation/GSP name. |
| `hostTO` | array of strings | Optional transmission-owner filter: `NGET`, `SHET`, `SPT`, `OFTO`. |
| `gate` | array of strings | Optional Connections Reform filter: `1` or `2`. Blank-gate projects are excluded when this filter is set. |
| `status` | array of strings | Optional exact case-insensitive filter on the official Project Status, such as `Scoping`, `Awaiting Consents`, `Consents Approved`, `Built`. |
| `minCapacityMW` | number | Optional minimum total contracted TEC. |
| `maxCapacityMW` | number | Optional maximum total contracted TEC. |
| `onlyChangedSinceLastRun` | boolean | Default `true`. Delivers only new/changed records. If `false`, delivers the full filtered snapshot while change flags remain available. |

### Output

```json
{
  "projectId": "a0l8e000000f3zXAAQ",
  "projectNumber": "PRO-003804",
  "projectName": "012 NEP Coventry West",
  "customerName": "NEW ENERGY PARTNERSHIP LIMITED",
  "connectionSite": "Berkswell GSP",
  "hostTO": "NGET",
  "agreementType": "Embedded",
  "technologies": ["Energy Storage System"],
  "capacityMW": 92.4,
  "builtMW": 0,
  "commissioningDate": "2034-10-31",
  "projectStatus": "Scoping",
  "gate": null,
  "connectionReadiness": "scoping",
  "stageCount": 1,
  "stages": [
    {
      "stage": null,
      "status": "Scoping",
      "mwConnected": 0,
      "mwIncreaseDecrease": 92.4,
      "cumulativeTotalCapacityMW": 92.4,
      "mwEffectiveFrom": "2034/10/31",
      "commissioningDateISO": "2034-10-31"
    }
  ],
  "isNewSinceLastRun": false,
  "isChangedSinceLastRun": true,
  "previousStatus": "Awaiting Consents",
  "previousGate": null,
  "previousCapacityMW": 92.4,
  "sourceUrl": "https://api.neso.energy/dataset/.../download/tec-register-04-august-2026.csv",
  "scrapedAt": "2026-08-04T21:00:00.000Z"
}
```

`connectionReadiness` is a transparent normalization of official fields, not an investment prediction:

- `built`: official Project Status is `Built`.
- `gate2_firm`: Gate is `2`.
- `gate1_waiting`: Gate is `1`.
- `in_consents`: status is `Awaiting Consents` or `Consents Approved` and no gate is present.
- `scoping`: status is `Scoping` and no gate is present.
- `unknown`: another source status.

The dataset also receives one free summary item per run with total project count, total contracted MW, built MW, counts by status/technology/owner/gate and the top ten connection sites by contracted MW.

### Use cases

- Renewable, storage and interconnector developers monitoring the GB transmission queue.
- Grid-connection consultants tracking Gate 1/Gate 2 reform signals.
- Infrastructure investors screening project and connection-site concentration.
- Energy analysts comparing contracted versus already-connected capacity.
- Data pipelines that need stable JSON instead of repeatedly parsing the NESO CSV.

### Pricing

This Actor uses Apify Pay-Per-Event pricing.

- **Actor Start:** Apify default.
- **`project-record`:** $0.01 per delivered project record after the initial baseline run. This includes records delivered in full-snapshot mode; the first run seeds the baseline without charging.
- **`connection-update`:** $0.02 extra per project that is new or changed since the previous run. This event is charged only after the baseline exists.

### Legal and source

Source: National Energy System Operator (NESO) Transmission Entry Capacity (TEC) register, published through the NESO Data Portal. The source identifies project/customer companies and grid infrastructure; it is not intended as a personal-data directory. The dataset is provided under the NESO Open Data Licence:

`https://www.neso.energy/data-portal/ngeso-open-licence`

The actor does not bypass authentication, scrape a private portal or make connection/financial/legal recommendations. Users remain responsible for checking the latest official connection offer and network information before making an investment decision.

### FAQ

**How often is the source updated?**

NESO states that the TEC register is updated twice weekly, on Tuesdays and Fridays. Running more frequently will normally return the same source snapshot.

**Does Gate 2 mean the project is guaranteed to connect?**

No. Gate 2 is an official Connections Reform classification and indicates the firm/ordered pipeline as represented by the register. It is not a guarantee, investment recommendation or substitute for a connection agreement.

**Why are there multiple stages in a project?**

NESO can publish several staged TEC rows for one Project ID. The actor merges those rows into one project record, keeps the stage details in `stages`, and uses the maximum cumulative capacity as `capacityMW`.

**Does this include every UK distribution connection?**

No. This v1 covers the NESO transmission register. Distribution-level embedded-capacity and connection-queue data is fragmented across DNOs and is intentionally outside the first release.

**Does the actor calculate spare capacity at a substation?**

No. The TEC register reports contracted/connected project capacity, not a complete engineering headroom calculation. The summary shows queue concentration, not available hosting capacity.

### Keywords

uk grid capacity, UK grid connection queue, NESO TEC register, Transmission Entry Capacity, electricity transmission, grid connections, Gate 1, Gate 2, battery storage, solar, wind, renewable energy, interconnector, substation, connection queue

### Changelog

#### 0.1.0

- Initial release.
- Added live NESO CKAN resource resolution and retrying CSV download.
- Added one-record-per-project aggregation for staged TEC rows.
- Added filters, persistent change detection and per-run queue summary.

# Actor input Schema

## `technology` (type: `array`):

Optional: only include projects whose plant type matches one of these (case-insensitive). Common values: "Energy Storage System", "Wind Onshore", "Wind Offshore", "PV Array (Photo Voltaic/solar)", "CCGT (Combined Cycle Gas Turbine)", "Hydro", "Pump Storage", "Interconnector", "Demand", "Nuclear", "Reactive Compensation". Co-located projects list multiple types separated by ";" and match if ANY of them is in this list. Leave empty for all technologies.

## `connectionSite` (type: `string`):

Optional: only include projects whose connection site (substation / GSP name, e.g. "Berkswell GSP", "Alverdiscott 400kV Substation") contains this text (case-insensitive).

## `hostTO` (type: `array`):

Optional: only include projects of these transmission owners / hosts: "NGET" (National Grid Electricity Transmission), "SHET" (Scottish Hydro Electric Transmission / SSEN), "SPT" (SP Transmission), "OFTO" (Offshore transmission owner). Leave empty for all.

## `gate` (type: `array`):

Optional: only include projects in this gate. "2" = firm, near-term ordered pipeline (Gate 2 offers to 2035); "1" = waiting list / speculative (Gate 1). Leave empty for all, including projects not yet assigned a gate (blank).

## `status` (type: `array`):

Optional: only include projects with one of these official Project Status values (case-insensitive), e.g. "Scoping", "Awaiting Consents", "Consents Approved", "Built". Leave empty for all statuses.

## `minCapacityMW` (type: `integer`):

Optional: only include projects whose total contracted Transmission Entry Capacity (max cumulative MW across stages) is at least this many MW.

## `maxCapacityMW` (type: `integer`):

Optional: only include projects whose total contracted Transmission Entry Capacity is at most this many MW.

## `onlyChangedSinceLastRun` (type: `boolean`):

If true (default), only projects that are new or changed since the previous run are delivered and charged. If false, the full filtered snapshot is delivered every run, but only new/changed projects are still charged the change-alert. Uses a shared, persistent key-value store snapshot ('uk-netcongestie-grid-capacity-tracker-snapshot') that is also read and updated by scheduled monitoring runs, not just this one. On the very first call ever (no snapshot exists yet), there is nothing to compare against: every project in the filtered set is treated as new, so the entire filtered snapshot is delivered that first time (and charged per the pricing rules).

## Actor input object example

```json
{
  "onlyChangedSinceLastRun": true
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("codeclouds/uk-netcongestie-grid-capacity-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("codeclouds/uk-netcongestie-grid-capacity-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call codeclouds/uk-netcongestie-grid-capacity-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codeclouds/uk-netcongestie-grid-capacity-tracker"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LDVf759QbZfs4hgXS/builds/OOU9W6y6fgCKHp3oL/openapi.json
