# CEC Solar Equipment List: PV Modules, Inverters & Batteries (`prudent_businessman/cec-solar-equipment-list`) Actor

Search and export the California Energy Commission (CEC) Solar Equipment Lists: ~36K PV modules, inverters, batteries, energy storage systems, meters and PCS with Pmax, PTC, CEC efficiency, kWh and UL certifications. Bulk model lookup and new-listing monitor.

- **URL**: https://apify.com/prudent_businessman/cec-solar-equipment-list.md
- **Developed by:** [Benningfield Data](https://apify.com/prudent_businessman) (community)
- **Categories:** E-commerce, Lead generation, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 records

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

## CEC Solar Equipment List: PV Modules, Inverters & Batteries

Search, export and monitor the official **California Energy Commission (CEC) Solar Equipment Lists**, the reference lists US solar installers, permitting offices, utilities and incentive programs use to check eligible equipment. It covers about 36,000 listings:

- **PV modules** (~22K): Pmax, PTC rating, Isc/Voc/Imp/Vmp, NOCT, temperature coefficients, safety certification, technology, BIPV
- **Grid support inverters**, solar and battery (~3.4K): max continuous output, CEC weighted efficiency, UL 1741 SA/SB, CSIP, microinverter flag, efficiency curves
- **Batteries** (~1K): kWh, kW, chemistry, UL 1973 certification
- **Energy storage systems** (~6.8K): kWh, kW, UL 9540 and UL 1741 certifications, JA12
- **Meters** (~800) and **power control systems / PCS** (~1.7K)

Source: [solarequipment.energy.ca.gov](https://solarequipment.energy.ca.gov) (public California state government data). The Actor downloads the CEC's own full-data Excel files, so results match the official lists. CEC updates them on the 1st, 11th and 21st of each month. No login or proxy needed.

### Why use it

- **Installers and EPC designers:** check that the modules, inverters and batteries on a quote are CEC listed (required for many state and utility incentives, NEM interconnection and permits).
- **Distributors and ecommerce sellers:** export spec sheets for whole brands (Pmax, PTC, efficiency, kWh) into your catalog.
- **Bulk model lookup:** paste model numbers or wildcards (`IQ8*`). Unlisted models come back as `cecListed: false`. Voltage suffixes like `{240V}` are ignored when matching.
- **Monitoring:** schedule with monitor mode to get only newly listed equipment, useful for competitor tracking and lead generation for new manufacturers.
- **Market research:** compare PTC/STC ratios, inverter efficiencies or battery capacities across the market.

### Input

| Field | Description |
|---|---|
| `lists` | `pv_modules`, `inverters`, `batteries`, `energy_storage_systems`, `meters`, `power_control_systems`. Empty = PV modules. |
| `manufacturers` | Manufacturer or brand contains, e.g. `Enphase`, `Tesla`, `Qcells`. |
| `model_numbers` | Exact model numbers or wildcards. Unmatched exact numbers are output as not found. |
| `keywords` | Match in manufacturer, brand, model, description or technology, e.g. `bifacial`, `LFP`. |
| `listed_since` / `updated_since` | `YYYY-MM-DD` date filters. |
| `include_all_specs` | Include every official column in a `specs` object (default on). |
| `only_new` / `report_removed` | Monitor mode: output only changes since the previous run. |
| `max_items` | Limit results (0 = all). |

#### Examples

All Enphase inverters and storage:

```json
{ "lists": ["inverters", "energy_storage_systems"], "manufacturers": ["Enphase"] }
```

Check a quote's equipment:

```json
{ "lists": ["pv_modules", "inverters", "batteries", "energy_storage_systems"], "model_numbers": ["IQ8PLUS-72-2-US", "Q.TRON BLK M-G2+ 430"] }
```

New PV module listings since your last run (schedule on the 2nd, 12th and 22nd):

```json
{ "lists": ["pv_modules"], "only_new": true }
```

### Output (sample)

```json
{
  "list": "inverters",
  "equipmentType": "Solar inverter",
  "manufacturer": "Enphase Energy, Inc.",
  "modelNumber": "IQ7PD-72-2-US {240V}",
  "description": "190 W, 240 Vac Grid Support Utility Interactive Microinverter",
  "maxContinuousOutputKw": 0.19,
  "weightedEfficiencyPct": 96.5,
  "nominalVoltageVac": 240,
  "listDataAsOf": "2026-10-21",
  "cecListed": true,
  "specs": { "UL 1741 Supplement SB Certification - 3rd Edition": "Y", "Microinverter": "Y", "...": "..." },
  "source": "California Energy Commission Solar Equipment Lists"
}
```

### Pricing

Pay per result: you pay only for the records returned, with no start fee. Use filters to export just what you need.

### Notes

- Field names inside `specs` follow the official column headers and units.
- Data is provided as-is from the CEC. This Actor is not affiliated with or endorsed by the California Energy Commission.

# Actor input Schema

## `lists` (type: `array`):

Which CEC lists to load. Empty = PV modules only.

## `manufacturers` (type: `array`):

Manufacturer or brand contains (case-insensitive), e.g. Enphase, Tesla, REC, Qcells.

## `model_numbers` (type: `array`):

Exact model numbers (spaces, dashes, dots, braces ignored) or wildcards with \* and ?, e.g. IQ8\*. Unmatched exact models are output with cecListed=false.

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

Match any keyword in manufacturer, brand, model, description or technology, e.g. bifacial, microinverter, LFP.

## `listed_since` (type: `string`):

Only equipment with a CEC listing date on or after this date (records without a listing date are excluded).

## `updated_since` (type: `string`):

Only equipment whose last update (or listing date) is on or after this date.

## `include_all_specs` (type: `boolean`):

Adds a 'specs' object with every column of the official list (certifications, electrical ratings, efficiency curves).

## `output_not_found` (type: `boolean`):

For exact model lookups, output a row with cecListed=false for each model not on the selected lists.

## `max_items` (type: `integer`):

0 = no limit.

## `only_new` (type: `boolean`):

First run saves a baseline; later runs output only newly listed (and removed) equipment. CEC updates lists on the 1st, 11th and 21st of each month.

## `report_removed` (type: `boolean`):

In monitor mode, also output equipment that disappeared since the last run.

## `state_store_name` (type: `string`):

Use a different name per saved filter set.

## Actor input object example

```json
{
  "lists": [
    "inverters"
  ],
  "manufacturers": [
    "Enphase"
  ],
  "include_all_specs": true,
  "output_not_found": true,
  "max_items": 0,
  "only_new": false,
  "report_removed": true,
  "state_store_name": "cec-solar-equipment-state"
}
```

# Actor output Schema

## `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 = {
    "lists": [
        "inverters"
    ],
    "manufacturers": [
        "Enphase"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("prudent_businessman/cec-solar-equipment-list").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 = {
    "lists": ["inverters"],
    "manufacturers": ["Enphase"],
}

# Run the Actor and wait for it to finish
run = client.actor("prudent_businessman/cec-solar-equipment-list").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 '{
  "lists": [
    "inverters"
  ],
  "manufacturers": [
    "Enphase"
  ]
}' |
apify call prudent_businessman/cec-solar-equipment-list --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,prudent_businessman/cec-solar-equipment-list"
        }
    }
}
```

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/GYNWfQ3djXUiTZjra/builds/BgoGDxJ5QIVMw3k0r/openapi.json
