# Grid Interconnection Queue Tracker (`conceivable_extension/grid-interconnection-queue-tracker`) Actor

Real project-level interconnection queue data — 38,000+ real projects across all 7 major US ISOs (LBNL's public dataset) plus real UK National Grid connection queue CSVs — with status-change tracking, not fabricated aggregate estimates.

- **URL**: https://apify.com/conceivable\_extension/grid-interconnection-queue-tracker.md
- **Developed by:** [joseph fadero](https://apify.com/conceivable_extension) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 project status returneds

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/actors/running/actors-in-store.md#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

## Grid Interconnection Queue Tracker

**~8,200 projects are actively seeking grid interconnection in the US alone (1,312 GW generation + ~749 GW storage)**, with delays of three to seven years common across ISOs/RTOs — and the OBBBA's December 31, 2027 deadline for wind/solar projects to be placed in service to keep federal tax credits makes queue position acutely time-sensitive right now. This tracks real, project-level interconnection queue data — not fabricated aggregate estimates — across all 7 major US ISOs and UK National Grid.

### Phase 1 source audit — the most fragmented source landscape in this program, verified live

Interconnection queue data is published per-ISO/RTO/TSO, not centrally — the PRD itself flagged this as the most fragmented of the five actors in this batch. Here's what direct testing found:

| Source | Verdict | Basis |
|---|---|---|
| **LBNL "Queued Up"** | ✅ Primary source — richer than expected | Confirmed live: not just an aggregate/summary file as the PRD anticipated, but a genuine **project-level** dataset — 38,203 real rows across all 7 US ISOs (CAISO, ERCOT, ISO-NE, MISO, NYISO, PJM, SPP) plus two non-ISO utility aggregates, real columns (`q_id`, `q_status`, `q_date`, `IA_phase_clean`, `mw_1`, etc.) mapping close to 1:1 onto this actor's schema. CC BY 4.0 licensed. |
| **Individual US ISOs** (PJM, MISO, ERCOT direct) | ❌ Not built for v1 | Given LBNL already provides real project-level detail for all 7 ISOs in one comprehensive file, separately scraping each ISO's own bespoke format (Excel/PDF/proprietary, confirmed each ISO publishes differently) wasn't pursued — a documented scope decision based on what Phase 1 found, not a gap. `interconnection.fyi` (by GridTracker) was found and confirmed real and valuable during research — a free, daily-updated aggregator tracking 43,887 requests with per-project status-change history — but its actual project list loads via a mechanism this build didn't fully reverse-engineer in the time available; flagged here as a genuine, verified v2 candidate, not silently omitted. |
| **UK National Grid ESO** | ✅ Included | Confirmed live: `connecteddata.nationalgrid.co.uk` is a real, standard CKAN open-data platform with a documented public API (`/api/3/action/package_show`) returning clean JSON with all 45 real per-substation CSV download URLs — no HTML scraping needed for discovery, no login, plain HTTP throughout. |
| **EU TSOs** | ❌ Scoped out, per the PRD's own suggestion | 27 member states, no single aggregator — the PRD itself flagged this as a v2 expansion candidate, confirmed reasonable rather than second-guessed. |

### Two real, honest limitations — not smoothed over

- **LBNL is an annual snapshot, not a real-time feed.** The "2026 Edition" reflects data as of the end of 2025 — LBNL's own real update cadence, not a shortcut taken here. For faster-moving monitoring, `interconnection.fyi`'s daily updates would be the better source — a genuine reason to revisit it in v2.
- **UK data has no queue-entry-date or estimated-in-service-date columns at all.** Confirmed live across multiple real CSV files — `queueEnteredDate`/`estimatedInServiceDate` are always `null` for UK records, not fabricated to look complete like the US data. UK's `Status` field is used for both `queueStatus` (normalized) and `studyStage` (verbatim) since the source doesn't separate those two concepts the way LBNL does.

### Two real bugs worth knowing about, both caught by live testing

- **UK region\_summary came back empty.** The status string `"Accepted not yet Connected"` contains the substring `"connected"`, and a naive status-mapping check order classified it as `operational` (matching the generic "connected" check) before it ever reached the more specific "not yet connected" / "accepted" check — silently filtering out every active UK project. Fixed by reordering the checks; verified live afterward that real active UK projects come through correctly.
- **LBNL worked locally, then failed consistently once deployed** — the same "worked on my machine, blocked on Apify's cloud" pattern found elsewhere in this program (Instagram, in the Creator Rate-Card actor). Confirmed via the real run log: Crawlee's own block-detection fired on a literal HTTP 403 from Cloudflare, not a passable "Just a moment..." JS challenge. Confirmed further that Apify's *default* (datacenter-class) proxy pool didn't fix it either — still 403ing across multiple rotated IPs — pointing to Cloudflare blocking datacenter IP ranges broadly, not just Apify specifically. Switching to Apify's `RESIDENTIAL` proxy group (a genuinely different IP class) fixed it, confirmed live with a real successful run returning real ERCOT project data afterward.

### Modes

| Mode | Behavior |
|---|---|
| `region_summary` | Active projects for a region, capped at 300 (see below), optionally filtered by `resourceType` |
| `project_lookup` | A specific project by `projectId` within a `region` |
| `monitor` | Same as `region_summary`, plus `statusChangedSinceLastRun` — computed by comparing `queueStatus` + `studyStage` + `estimatedInServiceDate` against this actor's own stored history from a prior run (reuses `deltaStore.ts`, originally built for Actor 26's Tariff Monitor, unmodified — the same module is now used by 3 actors in this program) |

Results are capped at 300 rows per run — LBNL's PJM region alone has thousands of active projects; a full unfiltered dump isn't the useful shape for either a dashboard or an n8n alert workflow. Use `resourceType` to narrow further.

### Output schema

```json
{
  "region": "string",
  "projectId": "string",
  "resourceType": "solar | wind | storage | other",
  "capacityMw": "number | null",
  "queueStatus": "active | withdrawn | operational | suspended | null",
  "studyStage": "string | null",
  "queueEnteredDate": "string | null",
  "estimatedInServiceDate": "string | null",
  "statusChangedSinceLastRun": "boolean | null",
  "sourceUrl": "string",
  "checkedAt": "ISO timestamp",
  "status": "success | failed",
  "errorMessage": "string | null"
}
```

`statusChangedSinceLastRun` is `null` outside monitor mode, and `false` (not `true`) the very first time a project is ever seen — there's nothing to compare against yet, so "changed" would be a false signal, not an honest one.

### Setup note

Playwright/Chrome base image required for LBNL specifically — its webpage sits behind Cloudflare (confirmed live, a plain HTTP GET 403s) even though the actual `.xlsx` file, once its current URL is discovered, downloads fine over plain HTTP. UK National Grid needs no browser at all.

### Pricing

Pay-per-event. `apify-actor-start` and `apify-default-dataset-item` (Project Status Returned) are built-in, auto-billed events.

| Event | Charged when | Price |
|---|---|---|
| Actor Start (`apify-actor-start`) | Actor run starts (auto-billed) | $0.10 |
| Project Status Returned (`apify-default-dataset-item`) | a project queue status is returned with study stage, capacity, and estimated in-service date (auto-billed) | $0.006 |
| Status Change Detected (`status-change-detected`) | monitor mode: a project's queue status changed since the last run (not a withdrawal) | $0.025 |
| Withdrawal Detected (`withdrawal-detected`) | monitor mode: a project is detected as withdrawn from the queue | $0.03 |
| Market Queue Snapshot (`market-queue-snapshot`) | a full regional queue snapshot is returned (region\_summary/monitor), once per run | $0.01 |
| Project Not Found (`project-not-found`) | project\_lookup mode: the queried project ID isn't found in that region's queue | $0.001 |

A region-level fetch failure (e.g. source unreachable) pushes a failed record but isn't charged — no configured event matches that case.

### n8n integration

- **Workflow A (trigger):** scheduled run against a developer's or investor's tracked projects/regions, frequency matched to each source's real update cadence (LBNL: effectively annual; UK: check per your own needs).
- **Workflow B (processing):** alert on `statusChangedSinceLastRun: true` — stage advancement or withdrawal are both materially important signals for developers and investors.

# Actor input Schema

## `mode` (type: `string`):

region\_summary: active projects for a region (capped, see README). project\_lookup: a specific project by ID. monitor: same as region\_summary plus statusChangedSinceLastRun, computed from this actor's own stored run history.

## `region` (type: `string`):

pjm/miso/ercot/spp/caiso/nyiso/iso\_ne/southeast/west are all real LBNL-tracked US regions with project-level data (southeast/west are LBNL's own non-ISO utility aggregates, not literal ISOs). uk\_national\_grid uses real UK National Grid CSV data instead. Required for region\_summary and monitor modes.

## `projectId` (type: `string`):

The queue ID (e.g. LBNL's q\_id, like "Q007 - 061") to look up. Required for project\_lookup mode. Region is still required alongside this, since project IDs are only unique within a region's own queue.

## `resourceType` (type: `string`):

Optional filter. Classified from the source's own technology field — combo projects (e.g. "Solar+Battery") are classified by their first-listed technology, a real simplification, not a precise multi-technology breakdown.

## Actor input object example

```json
{
  "mode": "region_summary",
  "region": "pjm"
}
```

# Actor output Schema

## `resultsDatasetUrl` (type: `string`):

Project-level grid interconnection queue data across the 7 major US ISOs/RTOs and UK National Grid, produced by this run.

# 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("conceivable_extension/grid-interconnection-queue-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("conceivable_extension/grid-interconnection-queue-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 conceivable_extension/grid-interconnection-queue-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conceivable_extension/grid-interconnection-queue-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/a4dkyb49KpCv4ZcW0/builds/0Lgo1QJv0ay8mBdMH/openapi.json
