# US Power Grid Interconnection Queues (CAISO, ERCOT, NYISO, SPP) (`wishbone_data/interconnection-queues`) Actor

Every generation, storage and large-load (data center) interconnection request from CAISO, ERCOT, NYISO and SPP public queue reports, normalized into one schema: MW, fuel, county, POI, status, queue date and proposed COD.

- **URL**: https://apify.com/wishbone\_data/interconnection-queues.md
- **Developed by:** [Walter Washburn](https://apify.com/wishbone_data) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US Power Grid Interconnection Queue Scraper - CAISO, ERCOT, NYISO, SPP

One clean dataset of **every solar, wind, battery storage, gas and large-load (data center) interconnection request** from four US grid operators' public queue reports - normalised to a single schema: **MW, fuel category, state, county, point of interconnection, developer, status, queue date and proposed commercial operation date**.

Each ISO publishes its queue in a different spreadsheet layout with different codes. This Actor reads the latest file from each, decodes it, and gives you rows you can filter and join.

### What's included

| ISO | Source file | What you get |
|---|---|---|
| **CAISO** (California) | Public Queue Report (xlsx) | Active, completed and withdrawn projects; fuel mix, net MW, POI, utility, study process, IA status, current on-line date |
| **ERCOT** (Texas) | Latest monthly GIS Report (xlsx) | Large and small generators with developer (interconnecting entity), POI, study phase, projected COD, construction start; inactive projects |
| **NYISO** (New York) | Interconnection Queue (xlsx) | Queue, cluster projects, **large-load requests (data centers, chip fabs, hydrogen)**, withdrawn and in-service; status codes decoded to text |
| **SPP** (14 central states) | Active queue CSV | Queue number, cluster, state, county, capacity, service type, status, cause of delay |

Codes are translated using each ISO's own legend (e.g. NYISO `CR` = Storage + Solar, status `12` = Under Construction; ERCOT `OTH/BA` = Battery Storage). Every row also gets a common **`fuelCategory`**: Solar, Solar + Storage, Wind, Offshore Wind, Storage, Gas, Nuclear, Hydro, Transmission, Load and so on.

### Who uses it?

- **EPC contractors, substation and transmission builders, equipment vendors** (transformers, switchgear, racking, BESS containers) - find projects heading toward construction, by county.
- **Renewable developers and land teams** - competitive intelligence and POI congestion.
- **Data-center site selectors and utilities** - see large-load requests and nearby generation.
- **Investors, analysts, consultants** - queue statistics by fuel, state, status and year.

### Input examples

Default - active projects of 50 MW or more in all four ISOs:

```json
{ "isos": ["CAISO", "ERCOT", "NYISO", "SPP"], "minMw": 50 }
```

Data-center and industrial large-load requests (NYISO):

```json
{ "isos": ["NYISO"], "fuelCategories": ["Load"] }
```

Wind and storage in Kansas and Oklahoma (SPP):

```json
{ "isos": ["SPP"], "states": ["KS", "OK"], "fuelCategories": ["Wind", "Storage"] }
```

Everything including withdrawn and completed history, with every original column:

```json
{ "statusGroups": ["active", "completed", "withdrawn"], "includeRaw": true }
```

### Output example

```json
{
  "iso": "CAISO",
  "queueId": "32",
  "projectName": "TULE WIND",
  "developer": null,
  "fuel": "Wind Turbine + Battery",
  "fuelCategory": "Wind + Storage",
  "capacityMw": 193.8,
  "state": "CA",
  "county": "SAN DIEGO",
  "poi": "Boulevard East Substation 138 kV",
  "utility": "SDGE",
  "status": "ACTIVE",
  "statusGroup": "active",
  "requestType": "generation",
  "studyPhase": "Serial LGIP",
  "iaStatus": "Executed",
  "queueDate": "2004-05-24",
  "proposedCod": "2030-10-31",
  "sourceUrl": "https://www.caiso.com/documents/publicqueuereport.xlsx"
}
```

A NYISO large-load row looks like: `"projectName": "North Country Data Center", "fuel": "Load (DAT-CM)", "capacityMw": 435, "county": "St. Lawrence", "status": "12 - Under Construction"`.

| Field | Meaning |
|---|---|
| `iso`, `queueId` | Grid operator and its queue/INR/GI number |
| `projectName`, `developer` | Where the ISO publishes them (CAISO has no developer column; SPP publishes neither) |
| `fuel`, `technology`, `fuelCategory` | ISO wording plus a common category |
| `capacityMw` | Net MW to grid (CAISO), summer MW (NYISO), capacity (ERCOT/SPP), peak load MW for load requests |
| `state`, `county`, `poi`, `utility`, `zone` | Location and interconnection point |
| `status`, `statusGroup` | ISO status text and active / completed / withdrawn |
| `requestType` | generation or load |
| `studyPhase`, `iaStatus` | Study stage and interconnection agreement |
| `queueDate`, `proposedCod`, `withdrawnDate`, `constructionStart` | Key dates (ISO-8601 where the ISO gives a full date) |
| `raw` | Optional: every original column |

### Pricing

Pay-per-event:

| Event | Price |
|---|---|
| Actor start | $0.01 per run |
| `queue-project` | **$3.00 per 1,000 projects** |

Examples: all NYISO large-load requests (~50 rows) ~ $0.17. All active projects over 50 MW in four ISOs (~2,700 rows) ~ $8. Complete history of all four ISOs (~7,500 rows) ~ $22.

### FAQ

**Is this legal?** Yes. All four files are public reports that CAISO, ERCOT, NYISO and SPP publish on their websites for anyone to download, without login. The Actor downloads each file once per run. It contains company and project data, not personal data. Treat the ISO as the authoritative source for any filing or investment decision.

**Why not PJM, MISO and ISO-NE?** PJM's queue export requires an authenticated API key and MISO's queue API sits behind a bot challenge; we don't bypass either. ISO-NE is on the roadmap. Tell us in Issues which you need most.

**How fresh is it?** Every run downloads the current file. CAISO and SPP update frequently, NYISO roughly monthly, ERCOT publishes the GIS Report monthly (the Actor picks the newest).

**Why are some NYISO proposed CODs like "06-2028"?** NYISO publishes month-year only; we pass it through unchanged rather than invent a day.

**An ISO changed its spreadsheet and a column is empty?** The Actor finds columns by header name, not position, so most layout changes are absorbed; if a sheet disappears the run logs a warning and still returns the other ISOs. Report it in Issues and we'll patch it.

# Actor input Schema

## `isos` (type: `array`):

Which grid operators' public queue reports to read.

## `statusGroups` (type: `array`):

active = still in the queue; completed = in service / commercial operation; withdrawn = withdrawn or inactive.

## `fuelCategories` (type: `array`):

Leave empty for all. 'Load' = large-load requests (data centers, hydrogen, crypto) - currently published by NYISO.

## `states` (type: `array`):

Two-letter codes (SPP spans 14 states; CAISO includes some NV/AZ projects).

## `minMw` (type: `integer`):

Drop projects smaller than this.

## `keywords` (type: `array`):

Keep projects whose name, developer, POI or county contains any of these.

## `includeLoad` (type: `boolean`):

Keep large-load (data center, fab, hydrogen) interconnection requests.

## `includeRaw` (type: `boolean`):

Adds the ISO's original row under 'raw' (milestone dates, study status, permits...).

## `maxItems` (type: `integer`):

0 = no limit.

## Actor input object example

```json
{
  "isos": [
    "CAISO",
    "ERCOT",
    "NYISO",
    "SPP"
  ],
  "statusGroups": [
    "active"
  ],
  "minMw": 50,
  "includeLoad": true,
  "includeRaw": false,
  "maxItems": 0
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (type: `string`):

No description

# 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 = {
    "isos": [
        "CAISO",
        "ERCOT",
        "NYISO",
        "SPP"
    ],
    "minMw": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("wishbone_data/interconnection-queues").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 = {
    "isos": [
        "CAISO",
        "ERCOT",
        "NYISO",
        "SPP",
    ],
    "minMw": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("wishbone_data/interconnection-queues").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 '{
  "isos": [
    "CAISO",
    "ERCOT",
    "NYISO",
    "SPP"
  ],
  "minMw": 50
}' |
apify call wishbone_data/interconnection-queues --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wishbone_data/interconnection-queues"
        }
    }
}
```

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/qR7QOCmR1CS6A0wRS/builds/ewZoud5pXegJ3jeFr/openapi.json
