# US Commercial Solar Pipeline Intelligence (NYSERDA) (`afkdigital/us-commercial-solar-project-pipeline-nyserda`) Actor

Explore official NYSERDA solar project intelligence for New York State. Filter Pipeline or Complete projects by sector, county, kW DC capacity, USD cost and dates. Export deduplicated JSON/CSV to Clay and n8n. $6.50 per 1,000 unique projects.

- **URL**: https://apify.com/afkdigital/us-commercial-solar-project-pipeline-nyserda.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$6.50 / 1,000 unique solar projects

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 Clean Energy & Commercial Solar Project Pipeline Intelligence (NYSERDA)

Find NYSERDA-supported New York solar projects from the official [Solar Electric Programs Reported by NYSERDA: Beginning 2000](https://data.ny.gov/d/3x8r-34rs) dataset. Despite the US product category, coverage is **New York State only**, not the entire US clean-energy market.

Default: 100 unique **Pipeline / Non-Residential** projects. Choose **Complete** explicitly for historical installation research. Complete records are never labelled as pipeline leads. This product supplies project intelligence, not verified contact or outreach lists.

### Inputs

Use `status`: `Pipeline`, `Complete`, or `All`; `sector`: `Non-Residential`, `Residential`, or `All`. These are real source values; the source does not identify separate Commercial and Industrial sectors. `counties` accepts exact county names such as `Albany` or `New York`.

`minCapacityKw` / `maxCapacityKw` filter total nameplate **kW DC**. `minCostUsd` / `maxCostUsd` filter expected project installation cost in USD, **not incentives**. Missing costs do not match numeric cost filters. `dateField` is `date_application_received` (default) or `date_install`; `dateFrom` and `dateTo` are inclusive YYYY-MM-DD dates. Pipeline projects generally have no completion date. `maxResults` is 1–50,000 (default 100); `pageSize` is 1–1,000 (default 500).

```json
{"status":"Pipeline","sector":"Non-Residential","maxResults":100}
```

For completed projects:

```json
{"status":"Complete","sector":"Non-Residential","counties":["Albany"],"minCapacityKw":25,"maxResults":100}
```

### Output and field mapping

| Output | Official SODA field / meaning |
| --- | --- |
| project_number | project_number, preserved as text including leading zeros |
| city_county | city and county joined; separate city/county also included |
| sector_commercial_industrial | sector verbatim; no inferred Commercial/Industrial classification |
| project_status | project_status verbatim: Pipeline or Complete |
| contractor_developer_name | contractor for Complete; always null for Pipeline |
| system_size_kw | totalnameplatekwdc; kW DC |
| total_project_cost_usd | project_cost; expected installation cost reported by contractor |
| incentive_amount_usd | total_nyserda_incentive; program incentives, separate from cost |

Also includes application/completion dates, reporting period, `is_pipeline`, source URL, dataset ID and actual source-data update timestamp. Missing values remain null; zero money values remain zero. Contractor is not necessarily the project owner or developer. Pipeline contractors are intentionally suppressed even where Community Distributed Generation exceptions provide them.

### Freshness and limitations

At verification, source data was updated **October 4, 2026**; portal metadata was updated **October 6, 2026**. The reported period is September 30, 2026. The source is updated monthly. Each run fetches live metadata and records `source_data_updated_at` and `RUN_INFO`. Pipeline projects may change, be cancelled or never be installed. Blank cells mean unavailable or not required. Some legacy projects and contractor details are missing. No completeness, accuracy, future completion or opportunity availability is guaranteed. Check the official record before making a business decision. This Actor is independent and not endorsed by NYSERDA or New York State.

### Clay, n8n, JSON and CSV

Results are stored in the run's default Apify Dataset. Use its Export button or authenticated API:

- JSON: `https://api.apify.com/v2/datasets/DATASET_ID/items?format=json&clean=true`
- CSV: `https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&clean=true&bom=true`

In n8n use Apify Run Actor followed by Get Dataset Items, or an HTTP Request with your Apify credential. In Clay import the CSV or fetch the JSON through an HTTP integration. Keep API tokens in your integration's credential store. `RUN_INFO` in the key-value store reports freshness and any detected mid-run source change.

### Price

**$0.0065 per successfully saved unique project ($6.50 per 1,000)** using the `apify-default-dataset-item` Pay-per-Event event. No start fee and no additional run platform usage fee. Empty runs, missing project IDs and duplicate project numbers are not billed. Deduplication applies within a run, including resumed/resurrected runs using the same default Dataset; separate new runs are independently billed. Apify spending limits are respected. Post-run storage/export operations may incur Apify account charges under the platform's terms.

### Reliability

Sequential SODA keyset pagination ordered by project number plus row ID; maximum 2 source requests per second. 30-second request timeout and up to four retries for timeouts, HTTP 408/429 and transient 5xx errors, exponential backoff and Retry-After (capped at 60 seconds). Other HTTP errors fail immediately. Project-number deduplication, bounded results and schema/vocabulary checks protect output quality. A source update during a run is flagged; rerun for a fresh extraction. This is not a transactional database snapshot.

### Source and use terms

Official provider: New York State Energy Research and Development Authority Solar Electric Programs. SODA endpoint: `https://data.ny.gov/resource/3x8r-34rs.json`. Dataset-specific license is unspecified. The [OPEN-NY Terms of Use](https://data.ny.gov/dataset/OPEN-NY-Terms-Of-Use/77gx-ii52) permit lawful reuse, including private-sector projects, subject to their terms. Public developer APIs are used without circumventing access controls. No logos or endorsement claims are reused. The service charge covers filtering, normalization, delivery and operation; the underlying government data is publicly available.

### Development

Version **1.0.0**. Python 3.13; Apify SDK 3.4.1. `pip install -r requirements.txt`, then `python -m src.main`. Run `python -m unittest discover -s tests`. Container: `docker build -t newapi40:1.0.0 .`. Default examples should complete in less than five minutes under normal source availability.

# Actor input Schema

## `status` (type: `string`):

Complete projects are historical installations, not pipeline leads.

## `sector` (type: `string`):

Official source classification. Non-Residential does not distinguish commercial from industrial.

## `counties` (type: `array`):

Exact official county names, e.g. Albany or New York. Empty means all.

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

Maximum unique project numbers delivered and billed per run.

## `pageSize` (type: `integer`):

Number of source rows per SODA request.

## `dateField` (type: `string`):

Apply date bounds to application received date or completion date.

## `dateFrom` (type: `string`):

YYYY-MM-DD

## `dateTo` (type: `string`):

YYYY-MM-DD

## `minCapacityKw` (type: `number`):

Total nameplate kW DC.

## `maxCapacityKw` (type: `number`):

Total nameplate kW DC.

## `minCostUsd` (type: `number`):

Filters reported project installation cost, not incentives.

## `maxCostUsd` (type: `number`):

Filters reported project installation cost, not incentives.

## Actor input object example

```json
{
  "status": "Pipeline",
  "sector": "Non-Residential",
  "maxResults": 100,
  "pageSize": 500,
  "dateField": "date_application_received"
}
```

# Actor output Schema

## `projects` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `runInfo` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/us-commercial-solar-project-pipeline-nyserda").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("afkdigital/us-commercial-solar-project-pipeline-nyserda").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 afkdigital/us-commercial-solar-project-pipeline-nyserda --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/us-commercial-solar-project-pipeline-nyserda"
        }
    }
}
```

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/MDxwkI9OEq4XMmbgP/builds/hKuCaJxLOyC5WShdq/openapi.json
