# US NABCEP Solar Installers & Accredited Companies Scraper (`gorkha-io/us-nabcep-solar-scraper`) Actor

Extract 6,750+ NABCEP Board Certified Solar Professionals, Associates, and Accredited Solar Installation Companies (with CEO/Owner names, company websites, certification numbers, veteran status, and locations).

- **URL**: https://apify.com/gorkha-io/us-nabcep-solar-scraper.md
- **Developed by:** [Santosh Nepali](https://apify.com/gorkha-io) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 verified solar leads

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 NABCEP Solar Installers & Accredited Companies Scraper

Extract **6,750+ NABCEP Certified Solar Professionals, Associates, and Accredited Solar Installation Companies** directly from the official North American Board of Certified Energy Practitioners registries (`directories.nabcep.org` and `nabcep.org/accredited/`).

Built for **solar equipment wholesalers, B2B SaaS sales teams, clean-energy recruiters, and market researchers** who need verified US & Canadian solar contractor leads without slow browser automation.

***

### What Data Does This Scraper Extract?

1. **NABCEP Accredited Solar Companies (`record_type: "accredited_company"`)**
   - **Company Name & Website URL**
   - **Decision-Maker Name & Title** (CEO, President, Owner, Co-Founder)
   - **Full Street Address, City, State, and Postal Code**
2. **NABCEP Certified Solar Professionals & Associates (`record_type: "certified_directory_member"`)**
   - **Full Name & US Military Veteran Status (`is_veteran`)**
   - **Employer / Solar Company Name & Normalized Website URL**
   - **Certification Tier** (`Board Certified Professional` — 2,673 pros, or `Associate` — 4,078 pros)
   - **All Active Certifications, Cert Numbers (`PVA-...`, `PVIP-...`), and Expiration Dates**
   - **Location (`City`, `State`, `Postal Code`, `Country`) & Direct NABCEP Contact Endpoint**

***

### Key Features

- **Ultra-Fast Lightweight HTTP Architecture:** Uses pure async HTTP requests (`httpx`) with zero headless browser overhead—consumes minimal Apify Compute Units (CUs).
- **B2B Company Filter (`onlyWithCompanyOrWebsite`):** Toggle one checkbox to skip individual technicians without an employer/website and strictly extract B2B solar company leads.
- **Granular Filtering:** Filter by certification tier (`professional` vs `associate`), country (`usa`, `canada`), state (`CA`, `TX`, `FL`, etc.), or keyword.

***

### Sample Output Record

```json
{
  "record_type": "certified_directory_member",
  "name": "Darren Aaserude",
  "company": "Power Northwest",
  "website": "https://powernw.com",
  "certification_tier": "Board Certified Professional",
  "primary_certification": "PV Installation Professional (PVIP)",
  "primary_cert_number": "PV-041517-011428",
  "primary_cert_expires": "04-15-2026",
  "certifications": [
    {
      "title": "PV Installation Professional (PVIP)",
      "cert_number": "PV-041517-011428",
      "expires": "04-15-2026"
    }
  ],
  "street_address": "",
  "city": "Portland",
  "state": "OR",
  "state_full": "",
  "postal_code": "97210",
  "country": "USA",
  "location_raw": "Portland, Or 97210",
  "is_veteran": true,
  "candidate_id": "84122",
  "contact_form_url": "https://directories.nabcep.org/wp-admin/admin-ajax.php?action=ci_nabcep_contact_form&candidate_id=84122",
  "source_url": "https://directories.nabcep.org/"
}
```

***

### Sample Dataset Downloads (CSV & JSON)

Want to inspect the exact B2B data structure before running the Actor? Check out the live sample exports in this repository:

- **[50 Verified US Solar Companies & Installers (CSV)](./sample_output/nabcep_b2b_sample_50.csv)**
- **[10 Verified US Solar Leads (JSON)](./sample_output/nabcep_b2b_sample_10.json)**

# Actor input Schema

## `includeAccreditedCompanies` (type: `boolean`):

Extract NABCEP Accredited Solar Installation Companies from nabcep.org/accredited/ (includes Company Name, CEO/Owner Name & Title, Street Address, City, State, Zip, and Website).

## `certType` (type: `string`):

Filter the 6,751 directory listings by NABCEP tier: All, Board Certified Professionals (2,673), or Associates (4,078).

## `country` (type: `string`):

Filter by country slug (e.g., 'usa', 'canada', 'puerto-rico'). Leave empty for all countries.

## `state` (type: `string`):

Filter by state/province name or 2-letter code (e.g., 'CA', 'TX', 'FL', 'IL'). Leave empty for all states.

## `searchQuery` (type: `string`):

Search by installer name, company name, or certification number.

## `onlyWithCompanyOrWebsite` (type: `boolean`):

When enabled, skips individual installers who did not list an employer/company name or website URL.

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

Maximum number of records to extract (0 = unlimited, extracts all matching records).

## `concurrency` (type: `integer`):

Number of directory pages to fetch in parallel via HTTP.

## `proxyConfiguration` (type: `object`):

Optional proxy settings. Works without proxies for light runs; enable Apify Proxy for full 6,750+ record extractions.

## Actor input object example

```json
{
  "includeAccreditedCompanies": true,
  "certType": "all",
  "country": "",
  "state": "",
  "searchQuery": "",
  "onlyWithCompanyOrWebsite": false,
  "maxItems": 100,
  "concurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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("gorkha-io/us-nabcep-solar-scraper").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("gorkha-io/us-nabcep-solar-scraper").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 gorkha-io/us-nabcep-solar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gorkha-io/us-nabcep-solar-scraper"
        }
    }
}
```

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/Abe0ZdIq4roRMCMqW/builds/5EfeJgwy0dxiIr0Gt/openapi.json
