# Solar Installer Rankings & PV Install Data (NY, CT, OR) (`sublime_maypop/us-solar-installations-data`) Actor

Solar installer rankings and ZIP-level PV install records for New York, Connecticut and Oregon, with system size and $/W. Built on free official state incentive-program data.

- **URL**: https://apify.com/sublime_maypop/us-solar-installations-data.md
- **Developed by:** [Sheng Shen](https://apify.com/sublime_maypop) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 results

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

## Solar Installer Rankings & PV Install Data (NY, CT, OR)

Get **solar installer rankings (market share)**, **installed cost per watt ($/W)** and **ZIP-level PV installation records** for New York, Connecticut and Oregon in one table.

> **Where the data comes from:** every row comes from **free, public state government open-data portals**: [NYSERDA on data.ny.gov](https://data.ny.gov/d/3x8r-34rs), [Connecticut Green Bank on data.ct.gov](https://data.ct.gov/d/fvw8-89kt) and [Oregon Department of Energy on data.oregon.gov](https://data.oregon.gov/d/fbqx-su36). You can download those datasets yourself for free. **This is not exclusive data.** What this Actor adds is: cleaning and type conversion, one unified field schema across the three states, filters (date, ZIP, county, installer, size, status), derived $/W and net-cost fields, and server-side installer market-share summaries. That saves you writing and maintaining the API code.

### Coverage and freshness (checked 2026-11-04)

| State | Records | Date coverage | Updates |
|---|---|---|---|
| NY (NYSERDA) | ~189k | Install dates Dec 2000 – 2026-09-30 | Monthly, about 1-month lag; includes pipeline projects |
| CT (Green Bank RSIP) | ~48k | Completions 2005 – 2022; only 1 record each in 2023 and 2024 | Historical only, no new projects |
| OR (ODOE rebate) | ~6.9k | Funding years 2023–2025 (year only, no exact date) | Annual |

**Only incentive-program projects are included**, not every solar installation in these states. Systems installed without these state programs do not appear.

No login, no proxies, no scraping of HTML. The Actor calls the public Socrata (SODA) APIs that the states publish and applies polite rate limiting.

### What can this solar installations Actor do?

- **Filter** by state, completion date, ZIP code, county, installer name, project status (completed or pipeline) and system size.
- **Installer market-share mode** groups the data on the server. You get one row per installer per state with project count, total kW, average system size, average $/W and first and last install date.
- **Normalized schema** across all three states, so NY, CT and OR rows share the same field names.
- **Derived metrics:** `costPerWattUsd` and `netCostAfterIncentiveUsd`.
- **Privacy by design:** street addresses, coordinates, census tracts and household income fields are never requested.
- **Reliable:** retries with exponential backoff on 429 and 5xx, honours `Retry-After`, about 1 request per second by default and clear error messages.

### Who uses it? Use cases

| Buyer | What they do with it |
|---|---|
| Solar installers and EPCs | Track competitors' volume, pricing ($/W) and territory by ZIP or county; find under-served areas |
| Module, inverter and battery makers and distributors | Brand share by installer and region; build dealer prospect lists from active installers (NY equipment fields) |
| Solar finance, lease and PPA providers | Lease vs. purchase mix by installer; see who sells third-party-owned systems |
| O\&M, repowering and battery-retrofit firms | Find aging fleets (systems installed 5–15 years ago) by ZIP and installer for service campaigns |
| Market researchers, consultants and investors | Installed-cost trends, incentive levels and installer concentration over time |

### Data sources & coverage

| State | Dataset | Publisher | Rows (Nov 2026) | Time span | License |
|---|---|---|---|---|---|
| NY | [Solar Electric Programs Reported by NYSERDA: Beginning 2000](https://data.ny.gov/d/3x8r-34rs) | NYSERDA | ~189k | Install dates Dec 2000 – Sep 2026 (latest record 2026-09-30 as of Nov 2026); published monthly; includes pipeline | [OPEN-NY Terms of Use](https://data.ny.gov/download/77gx-ii52/application/pdf) |
| CT | [Residential Solar Investment Program (RSIP) Enrollment](https://data.ct.gov/d/fvw8-89kt) | Connecticut Green Bank | ~48k | Completions Jan 2005 – 2022 (latest approval 2021-12-30; only 2 records after 2022). Historical only — no new projects | Public Domain |
| OR | [Solar Plus Storage Rebate – Multi-Year Report](https://data.oregon.gov/d/fbqx-su36) | Oregon Department of Energy | ~6.9k | Funding years 2023–2025 only (2023: 5,229, 2024: 1,598, 2025: 67); year only, no exact date; published annually (last refresh Oct 2025) | Public Domain (U.S. Government Works) |

Rows are counted live at run time and logged. The Actor uses the official APIs and does not modify the data, apart from renaming fields, converting types and adding derived fields. This Actor is not affiliated with or endorsed by NYSERDA, the Connecticut Green Bank, the Oregon Department of Energy or Tyler Technologies (Socrata).

### Input

| Field | Type | Description |
|---|---|---|
| `states` | array | `NY`, `CT`, `OR` (default: all) |
| `outputMode` | string | `projects` (default) or `installerSummary` |
| `dateFrom` / `dateTo` | `YYYY-MM-DD` | Completion date (NY `date_install`, CT `completed_date`, OR funding year) |
| `projectStatus` | string | `all`, `completed`, `pipeline` (pipeline exists for NY and OR only) |
| `contractorContains` | string | Case-insensitive installer name match |
| `zipCodes` | array | 5-digit ZIP codes |
| `counties` | array | County names. OR is skipped when set because it has no county column |
| `minSystemSizeKw` / `maxSystemSizeKw` | integer | System size bounds (kW DC) |
| `maxItems` | integer | Total cap across states, split fairly between states (default 1000) |
| `requestsPerSecond` | integer | Politeness limit, default 1 |
| `socrataAppToken` | secret | Optional free Socrata token for very large exports |

#### Ready-to-use input examples

Copy one of these into the JSON input tab.

**1. Installer ranking in one NY county, last 12 months of data (Oct 2025 – Sep 2026)**

```json
{ "states": ["NY"], "outputMode": "installerSummary", "counties": ["Westchester"], "dateFrom": "2025-10-01", "dateTo": "2026-09-30", "maxItems": 50 }
```

**2. NY records with module and inverter brands, to count brand share yourself (e.g. in Excel)**

The Actor does not summarize by brand; it exports `moduleManufacturer`, `moduleModel`, `inverterManufacturer` and `inverterModel` on each NY record so you can pivot them.

```json
{ "states": ["NY"], "outputMode": "projects", "projectStatus": "completed", "dateFrom": "2025-01-01", "maxItems": 1000 }
```

**3. Commercial-scale systems (25 kW+) in Westchester County since 2023**

```json
{ "states": ["NY"], "counties": ["Westchester"], "minSystemSizeKw": 25, "dateFrom": "2023-01-01", "maxItems": 500 }
```

**4. Installer leaderboard for 2025+ (NY and OR)**

```json
{ "states": ["NY", "OR"], "outputMode": "installerSummary", "dateFrom": "2025-01-01", "maxItems": 200 }
```

**Try the New York example:** [top NY solar installers, 2025 onward](https://apify.com/sublime_maypop/us-solar-installations-data/examples/new-york-solar-installer-rankings) runs the installer ranking for New York with one click.

### Output

#### Project record (`projects` mode)

```json
{
  "state": "NY",
  "projectId": "0000748051",
  "status": "Complete",
  "sector": "Residential",
  "city": "FARMNGVILLE",
  "county": "Queens",
  "zipCode": "11734",
  "utility": "Consolidated Edison",
  "contractor": "SunRun Inc.",
  "ownershipType": "Lease",
  "applicationDate": "2024-05-03",
  "completedDate": "2024-09-27",
  "systemSizeKwDc": 3.6,
  "expectedAnnualKwh": 2636,
  "totalCostUsd": 8277,
  "incentiveUsd": 389,
  "moduleManufacturer": "Hanwha Q CELLS",
  "moduleModel": "Q.PEAK DUO BLK ML-G10+/t 400",
  "moduleCount": 9,
  "inverterManufacturer": "Delta Electronics",
  "inverterModel": "E4-TL-US [240V]",
  "costPerWattUsd": 2.299,
  "netCostAfterIncentiveUsd": 7888,
  "source": { "publisher": "NYSERDA", "datasetId": "3x8r-34rs", "url": "https://data.ny.gov/d/3x8r-34rs", "license": "OPEN-NY Terms of Use" },
  "retrievedAt": "2026-11-04T04:09:41.485Z"
}
```

Each row keeps its source's original values, including spellings such as "FARMNGVILLE". Some fields exist only in some states:

- **CT:** `thirdPartyOwner`. CT has no `projectId`.
- **OR:** `fundingYear`, `solarCostUsd`, `storageCostUsd` and `storageIncentiveUsd`.

#### Installer summary row (`installerSummary` mode)

```json
{
  "state": "NY", "contractor": "PlugPV, LLC", "projects": 1992, "totalKwDc": 21171.38,
  "avgSystemKwDc": 10.63, "totalReportedCostUsd": 87411315, "avgCostPerWattUsd": 4.129,
  "firstDate": "2025-01-02", "lastDate": "2026-09-30"
}
```

#### Sample output: top 5 NY installers, 2025-01-01 onward (real test run, 2026-11-04)

| Installer | Projects | Total kW DC | Avg $/W | First date | Last date |
|---|---|---|---|---|---|
| PlugPV, LLC | 1,992 | 21,171 | 4.13 | 2025-01-02 | 2026-09-30 |
| SunRun Inc. | 1,870 | 15,162 | 3.30 | 2025-01-02 | 2026-09-11 |
| Kamtech Restoration Corp | 941 | 8,231 | 5.39 | 2025-01-02 | 2026-09-18 |
| Empire Solar Solutions, LLC | 920 | 11,988 | 3.65 | 2025-01-02 | 2026-09-24 |
| Infinity Solar Systems LLC | 791 | 10,216 | 3.63 | 2025-01-02 | 2026-09-21 |

Export to JSON, CSV, Excel or HTML, or connect it to Google Sheets, Clay, Make, Zapier or n8n through the Apify integrations.

### Pricing and cost estimate

This Actor uses **pay-per-event** pricing: **$1.50 per 1,000 results** ($0.0015 per dataset row). Project records and installer-summary rows are both counted as results. **There is no start fee**, and Apify platform usage (compute, storage) is paid by us, not you.

| Results | Cost to you |
|---|---|
| 30 | $0.045 |
| 500 | $0.75 |
| 1,000 | $1.50 |
| 10,000 | $15.00 |

An installer summary is usually much cheaper than raw records: in our 2026-11-04 test, the NY installer summary since 2025 returned 10 rows (about $0.015) and finished in about 20 seconds; a 30-record pull across NY, CT and OR finished in about 9 seconds. Set *Max cost per run* in Apify Console and the Actor stops before it goes over.

### Related Actor

Want recent permit activity rather than incentive records? [Solar & Battery Permits + Installer Rankings (ATX/SEA/SF)](https://apify.com/sublime_maypop/us-solar-permits-data) returns solar PV and battery storage permits from Austin, Seattle and San Francisco, with installer rankings by permit count for Austin and Seattle. Austin and Seattle permit rows are refreshed daily.

### Limitations

- Coverage is limited to systems that went through each state's incentive program. Systems installed without these incentives do not appear. The datasets are not a full census of every installation.
- CT data is historical: the RSIP dataset's latest approval date is 2021-12-30 and almost all completions are 2022 or earlier (one record each in 2023 and 2024). Filtering CT for 2023+ returns almost nothing.
- Oregon publishes only the funding year (no install date), city and ZIP (no county), and no equipment brands.
- Installer names are as reported, for example "SunRun Inc." and "Sunrun". Normalize names downstream if you need exact roll-ups.
- Cost fields are self-reported to the programs and can contain outliers. Sanity-check `costPerWattUsd` before you average it.
- Freshness depends on the publishers: NY is published monthly (typically lags about 1 month); CT receives no new projects; OR is published annually and 2025 is still sparse.
- Coverage figures were checked against the source APIs on 2026-11-04 and may change.

### FAQ

**Where does the data come from, and can I use it?** From the three state open-data portals linked above. NY data is published under the [OPEN-NY Terms of Use](https://data.ny.gov/download/77gx-ii52/application/pdf); the CT and OR datasets are marked public domain on their portals. Check those terms for your own use case. The Actor uses the official APIs and follows Socrata's robots crawl delay.

**Is this data exclusive?** No. It is free public data. You pay for the cleaning, unified fields, filters and installer summaries, so you don't have to build and maintain that yourself.

**How often is it updated?** Each run queries the source APIs live, so you get whatever the state has published. NY publishes monthly (about 1-month lag, latest install date 2026-09-30 as of 2026-11-04); CT has no new projects (historical, mostly through 2022); OR publishes annually (funding years 2023–2025).

**Why are there no street addresses?** Privacy by design. The Actor never requests street addresses, coordinates, census tracts or household-income fields. You get city, ZIP code and county (no county for OR).

**Does it cover every solar installation?** No. Only projects that went through each state's incentive program.

**Can you add more states?** California DGStats, Massachusetts and New Jersey are being considered but are not available yet. Open an issue with the state you need.

**How is this different from permit data?**
These records come from state incentive programs, so they carry system size, and usually installed cost and installer, for each project, but only for systems that went through the program. City permit data covers every permitted job in a city, incentive or not, but rarely has a reliable cost. For permits, see the Related Actor section above.

**Does it include homeowner names or contact details?**
No. Street addresses, coordinates, census tracts and household income fields are never requested, and no owner or contact columns are selected. Installer names are the contractor names as reported to the programs.

# Actor input Schema

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

Which state datasets to query. NY = NYSERDA (2000–today, ~189k projects), CT = Connecticut Green Bank RSIP (~48k), OR = Oregon Solar + Storage Rebate (~6.9k).

## `outputMode` (type: `string`):

'projects' = one row per installation. 'installerSummary' = one row per installer per state (project count, total kW, average $/W, first/last date), aggregated server-side.

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

Filter by install/completion date (NY: date_install, CT: completed_date, OR: funding year). Pipeline projects without an install date are excluded when a date filter is set. NY data runs to 2026-09-30 (≈1-month lag); CT is historical (almost nothing after 2022); OR has funding years 2023–2025 only.

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

Upper bound of the completion date filter.

## `projectStatus` (type: `string`):

'completed', 'pipeline' (NY & OR only) or 'all'.

## `contractorContains` (type: `string`):

Case-insensitive substring match on the installer/contractor name, e.g. 'SunPower' or 'Tesla'.

## `zipCodes` (type: `array`):

Only return projects in these 5-digit ZIP codes.

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

County names, e.g. 'Westchester' or 'New London'. Oregon is skipped when set (no county column).

## `minSystemSizeKw` (type: `integer`):

e.g. 25 to focus on commercial-scale systems.

## `maxSystemSizeKw` (type: `integer`):

Upper bound on system size.

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

Maximum number of dataset items across all states (you are charged per item).

## `requestsPerSecond` (type: `integer`):

Politeness limit toward the state portals (1 recommended; Socrata robots.txt asks for a 1 s crawl delay).

## `socrataAppToken` (type: `string`):

Free token from dev.socrata.com raises throttling limits for very large exports. Not required.

## Actor input object example

```json
{
  "states": [
    "NY"
  ],
  "outputMode": "projects",
  "dateFrom": "2025-01-01",
  "projectStatus": "all",
  "maxItems": 100,
  "requestsPerSecond": 1
}
```

# Actor output Schema

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

One dataset item per solar installation project (overview view).

## `installers` (type: `string`):

Installer market-share summary rows (installers view).

## `runSummary` (type: `string`):

JSON summary of the input and per-state counts.

# 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": [
        "NY"
    ],
    "outputMode": "projects",
    "dateFrom": "2025-01-01",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("sublime_maypop/us-solar-installations-data").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": ["NY"],
    "outputMode": "projects",
    "dateFrom": "2025-01-01",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("sublime_maypop/us-solar-installations-data").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": [
    "NY"
  ],
  "outputMode": "projects",
  "dateFrom": "2025-01-01",
  "maxItems": 100
}' |
apify call sublime_maypop/us-solar-installations-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sublime_maypop/us-solar-installations-data"
        }
    }
}
```

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/gLpaQvMm9jOJeEYfd/builds/COyTbf0CvmJxHsRGP/openapi.json
