# EIA-860M Operator Pipeline & Retirement Reports (`thescrapelab/eia-power-operator-pipeline-intelligence`) Actor

Find US power operators with planned generator additions and scheduled retirements. Filter by state and technology; export capacity totals and complete source-linked generator evidence.

- **URL**: https://apify.com/thescrapelab/eia-power-operator-pipeline-intelligence.md
- **Developed by:** [Inus Grobler](https://apify.com/thescrapelab) (community)
- **Categories:** Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.00 / 1,000 complete operator reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## EIA-860M Operator Pipeline & Retirement Reports

Find **US power operators with planned generator additions and scheduled retirements**, grouped into clear capacity reports. Choose states and technologies, then export operator totals and the supporting plant and generator records from the monthly EIA-860M inventory.

For energy equipment and service account research, utility portfolio analysis and monthly operator monitoring. Every report links to the official source; no EIA API key is needed.

### Quick start

1. Choose **Project states** and **Technologies**, or try the prefilled Arizona + Solar example.
2. Keep **Maximum operator reports** at five and start the run. The standard window is 24 months after the source data month.
3. Open **Operator summary** for totals or **Generator evidence** for the supporting records. For a spreadsheet, click **Export**, select the view and choose **CSV**.

```json
{
  "states": ["AZ"],
  "technologies": ["Solar"],
  "maxResults": 5
}
```

Clear states for all main US states; clear technologies for any technology. Selecting Puerto Rico automatically includes its source worksheets. Results follow EIA entity-ID order, not a ranking of commercial opportunities.

### Everyday inputs

| Input | What to choose |
|---|---|
| Project states (`states`) | Generator locations, such as Arizona (AZ). These are not operator headquarters. |
| Operator activity (`activityFilter`) | Any planned activity, has additions, has retirements, or has both. |
| Technologies (`technologies`) | Suggested choices or your own technology phrases, such as Solar or Batteries. |
| Operator names (`entityQueries`) | Optional name fragments, such as Entergy. Leave empty to discover operators. |
| Maximum operator reports (`maxResults`) | 1–1,000 complete reports; default five. Each report may include several generators. |

Filters combine: Arizona + Solar means solar generators in Arizona. Multiple entries within one field match **any** listed value. Name and technology searches ignore letter case. The activity choice selects qualifying operators while retaining all evidence matching your other filters.

The form's starter is Arizona + Solar. Sending empty JSON through the API preserves the broader defaults: all main US states, any technology/activity, five reports.

### What the results mean

**Operator summary** shows planned generator counts, addition MW, scheduled retirement counts/MW, project states, data month and planning-window end. All headline capacity uses **nameplate MW**, within your selected scope.

This starter returned the following first five reports from 17 matches in the August 2026 inventory, checked October 21, 2026:

| Operator | Planned additions (MW) | Scheduled retirements (MW) |
|---|---:|---:|
| Arizona Public Service Co | 168 | 0 |
| Invenergy Services LLC | 475 | 0 |
| 174 Power Global Corp. | 300 | 0 |
| 302PN 8me LLC | 400 | 0 |
| EDF Renewables Development, Inc. | 250 | 0 |

A compact excerpt of the first genuine report:

```json
{
  "entityId": "803",
  "entityName": "Arizona Public Service Co",
  "states": ["AZ"],
  "reportingMonth": "2026-08",
  "horizonEndMonth": "2028-08",
  "plannedAdditionCount": 1,
  "plannedAdditionCapacityMw": 168,
  "plannedRetirementCount": 0,
  "plannedRetirementCapacityMw": 0,
  "sourceUrl": "https://www.eia.gov/electricity/data/eia860m/xls/august_generator2026.xlsx"
}
```

**Generator evidence** expands each report into plant/generator rows: exact IDs, state, activity, technology, nameplate MW, scheduled month or year, published status, worksheet and source row. For example, the first report's Ironwood Solar generator `I168M` has 168 MW and a scheduled period of `2026-11` in that release.

To download a spreadsheet, click **Export** above the run output. In the dialog, explicitly select **Operator summary** (one row per report) or **Generator evidence** (one row per generator), choose **CSV**, then **Download**. Select the view in that dialog even if you already opened its table. State lists appear in indexed CSV columns such as `states/0`.

Five reports can contain more than five generator rows; expanded rows are not additional billable results. **Complete operator reports (JSON)** retains all evidence, quality flags and provenance. Future releases can change these example values.

The run message explains no matches, unchanged comparisons and result limits. **Run summary and continuation** shows coverage. A cap limits delivered reports, not the number of available matches; do not treat a five-report sample as the complete market.

### Uses and integrations

- Research operator portfolios before validating equipment or service needs independently.
- Compare planned additions and power plant retirement data by state and technology.
- Feed monthly operator changes into analyst review workflows.
- Use CSV in Excel, Google Sheets or BI tools; use JSON/API in Make, n8n, Zapier and data pipelines.
- Give AI agents source-linked generator evidence for cited summaries.

### Pricing

**$0.02 per run start plus $0.02 per complete operator report. Platform usage is included.** Five reports cost $0.12 at the base rate. Paid-plan discounts reduce the report price to $0.018 (Bronze), $0.016 (Silver) or $0.014 (Gold and higher). Check the Pricing tab for your effective price before running.

The start fee applies even when nothing matches, nothing changed, or a source failure prevents output after startup. Supporting generator rows, the run summary and skipped unchanged reports are not extra result events. Delivered unchanged snapshots count when changes-only is off. The $0.04 minimum spending limit is a budget requirement, not a minimum amount billed. Run after monthly publication rather than repeatedly polling an unchanged release.

### Source and limitations

Source: [U.S. Energy Information Administration, Form EIA-860M](https://www.eia.gov/electricity/data/eia860m/), reused under EIA's [public-domain policy](https://www.eia.gov/about/copyrights_reuse.php). Calculations by The Scrape Lab; this independent Actor is not endorsed by EIA.

The inventory is monthly, preliminary and subject to publication lag and correction. It is not real-time construction verification, a complete operating-plant database or an early-stage interconnection queue. EIA reporting covers plants with at least 1 MW combined nameplate capacity; individual generators can be smaller.

EIA entity IDs identify **reporting organizations**, not verified owners, developers or parent companies. Schedules are reported plans. Missing values remain null; unknown capacity is excluded from MW sums and flagged. Year-only schedules retain year precision; still-pending earlier dates remain included and flagged. Addition minus retirement MW is arithmetic, not a shortage forecast or replacement contract.

### Optional filters and saved comparisons

**Optional filters:** `horizonMonths` sets a 1–60-month window (default 24); `minimumCapacityMw` sets a per-generator minimum (default 0); `entityIds` selects exact EIA ID strings; `includePuertoRico` adds PR to an otherwise unrestricted search.

For a monthly comparison, open **Saved comparisons**, enter a lowercase name such as `arizona-solar`, and enable changes-only if desired. The first delivered observation is a baseline. Reuse the same name and filters, with one run at a time; unchanged repeats can correctly return zero reports. Complete the initial scope first: capped runs can leave operators without baselines.

Comparisons describe the selected scope. A disappearing operator produces no removal alert, and a project leaving scope is not proof of cancellation. Invalid history stops the run instead of silently resetting. Let the Actor create a new comparison name; a manually pre-created store can be inaccessible. This Actor creates no automatic schedules.

### API example and reference

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("thescrapelab/eia-power-operator-pipeline-intelligence").call(
    run_input={"states": ["AZ"], "technologies": ["Solar"], "maxResults": 5},
    memory_mbytes=1024,
    timeout_secs=300,
    max_total_charge_usd=0.15,
)
if run is None or run["status"] != "SUCCEEDED":
    raise RuntimeError("Inspect the Actor run before consuming partial output")
for report in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(report["entityName"], report["plannedAdditionCapacityMw"])
```

| Additional API field | Meaning |
|---|---|
| `watchlistName` | Optional 1–40 lowercase letters/digits/hyphens; empty means no comparison. |
| `changesOnly` | Default false; requires a comparison name when true. |
| `afterEntityId` | Continue from the run summary with identical filters and both source guards. |
| `expectedReportingMonth` | Optional `YYYY-MM` guard; required for continuation. |
| `expectedSourceSha256` | Optional lowercase workbook digest guard; required for continuation. |

Lists default to empty. Omit optional fields to use defaults; explicit null fields are rejected. If coverage is incomplete, copy the complete `continuation` object from the run summary into the next input with identical filters. A changed month or digest stops continuation; restart collection against the new release.

For support, provide the run URL, public entity/plant ID, data month and expected result through the Actor's support channel. Remove credentials from attachments.

# Actor input Schema

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

Choose generator locations, not company headquarters. Clear for all main US states; selecting Puerto Rico includes its worksheets automatically.

## `activityFilter` (type: `string`):

Choose which operators qualify. Each report keeps all generator evidence matching your other filters.

## `technologies` (type: `array`):

Choose or type technology phrases. Clear for any technology; matching ignores letter case.

## `entityQueries` (type: `array`):

Enter name fragments, such as Entergy. Leave empty to discover operators; any listed name can match.

## `maxResults` (type: `integer`):

Save up to this many complete operator reports (1–1,000). One report can include several generators.

## `horizonMonths` (type: `integer`):

Include plans through this many months after the data month (1–60). Still-pending earlier schedules remain included and flagged.

## `minimumCapacityMw` (type: `number`):

Minimum nameplate capacity for each generator, not the operator total. Leave at 0 for no minimum.

## `entityIds` (type: `array`):

Optional exact EIA reporting-entity IDs. Leave empty when searching by states, technologies or names.

## `includePuertoRico` (type: `boolean`):

Add Puerto Rico when searching all states. Selecting PR in Project states already enables it.

## `watchlistName` (type: `string`):

Optional lowercase name using letters, digits and hyphens, for example arizona-solar. The first run saves a baseline.

## `changesOnly` (type: `boolean`):

Requires a saved comparison name. Unchanged reports are skipped, so a repeat can correctly return zero results.

## `afterEntityId` (type: `string`):

Advanced: copy continuation.afterEntityId from SUMMARY, with both expected source guards below and identical filters. Ordering is numeric entity ID.

## `expectedReportingMonth` (type: `string`):

Optional YYYY-MM source guard. Required for continuation. The run stops if the currently published month differs.

## `expectedSourceSha256` (type: `string`):

Optional lowercase SHA-256 guard. Required for continuation so same-month source revisions cannot silently change the paged dataset.

## Actor input object example

```json
{
  "states": [
    "AZ"
  ],
  "activityFilter": "any",
  "technologies": [
    "Solar"
  ],
  "entityQueries": [],
  "maxResults": 5,
  "horizonMonths": 24,
  "minimumCapacityMw": 0,
  "entityIds": [],
  "includePuertoRico": false,
  "changesOnly": false
}
```

# Actor output Schema

## `reports` (type: `string`):

No description

## `summary` (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 = {
    "states": [
        "AZ"
    ],
    "technologies": [
        "Solar"
    ],
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("thescrapelab/eia-power-operator-pipeline-intelligence").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 = {
    "states": ["AZ"],
    "technologies": ["Solar"],
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("thescrapelab/eia-power-operator-pipeline-intelligence").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 '{
  "states": [
    "AZ"
  ],
  "technologies": [
    "Solar"
  ],
  "maxResults": 5
}' |
apify call thescrapelab/eia-power-operator-pipeline-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thescrapelab/eia-power-operator-pipeline-intelligence"
        }
    }
}
```

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/69n3stFErieuwQrZU/builds/jROk6IHVTmKcSjFba/openapi.json
