# BPI Certified Contractors · Emails & Phones by State (`corent1robert/bpi-certified-contractors`) Actor

Export BPI GoldStar contractors and companies with Building Performance Institute certified pros by US state: company, contact, phone, email, website, address, GPS and certifications. One row per company. Public locator. No login.

- **URL**: https://apify.com/corent1robert/bpi-certified-contractors.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## BPI Certified Contractors · Emails & Phones by State

Export **Building Performance Institute (BPI) certified contractors** as a CRM sheet: company, contact person, phone, email, website, address, GPS and BPI certifications (Building Analyst, Energy Auditor, Heat Pump, Envelope, Quality Control Inspector…). BPI GoldStar contractors are flagged.

**No login. No API key. No BPI account.**

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Heat pump, insulation and air-sealing manufacturers / distributors | Dealers who already do home performance work | One state · Companies · contacts on |
| Utilities and energy-efficiency programs (IRA / HEEHRA rebates) | Recruit or audit a contractor network | All states · GoldStar only |
| Home energy software (audit, modeling, CRM) | Prospect list of certified auditors | Companies · contacts on |
| Weatherization and solar installers | Partners and subcontractors by territory | Several states |
| Lead-gen agencies and SDR teams | One CRM-ready row per company | Dataset view **Outreach CRM** |
| Market research | Count certified companies and professionals by state | All states · All listings |

**By default:** companies only (BPI GoldStar contractors + companies with certified professionals), because they publish their phone, email and website. Measured on the whole locator (25 Oct 2026): **1,096 companies** (257 GoldStar), **~93% with email, ~99% with phone, ~70% with website, ~98% with GPS**. Individual certified professionals (5,200+) are available with **All** and carry name, city and certifications only.

### Quick start

1. Open the Actor in Apify Console.
2. Keep **New York** (or pick states / **All states**).
3. Keep **Companies** and **Only rows with email or phone** on.
4. Click **Start**. Download **Overview** or **Outreach CRM**.

**Max rows = 0** → no cap. **Free plan: 20 rows per run.**

### Ready-made examples

| Example | Input | Best for |
|---------|-------|----------|
| New York BPI contractors with emails | `{"states":["NY"],"onlyWithContact":true,"maxItems":200}` | Largest state (~230 companies) |
| California home performance contractors | `{"states":["CA"],"onlyWithContact":true,"maxItems":200}` | West Coast heat pump dealers |
| BPI GoldStar contractors nationwide | `{"states":["ALL"],"listingType":"goldstar","maxItems":0}` | Top-tier partners |
| Northeast heat pump & weatherization | `{"states":["MA","CT","VT","NH","ME","RI"],"onlyWithContact":true,"maxItems":300}` | Mass Save / Efficiency Vermont territories |

### What it extracts

| Category | Fields |
|----------|--------|
| Identity | `companyName`, `contactName`, `listingType`, `isGoldStar`, `bpiId` (`professionalName` for individuals) |
| Contact | `email`, `phone`, `phoneE164`, `website` |
| Location | `address`, `city`, `stateCode`, `postalCode`, `latitude`, `longitude` |
| Credentials | `certifications` (codes), `certificationNames` |
| Source | `sourceUrl` (public locator page) |

### Input

| Field | Default | Notes |
|-------|---------|--------|
| `states` | `["NY"]` | Two-letter codes (50 states + DC, PR, GU, VI) or `ALL` |
| `listingType` | `companies` | `companies`, `goldstar`, or `all` (adds individual professionals, no contact) |
| `onlyWithContact` | off (on in the form) | Keep only rows with an email or phone |
| `maxItems` | `20` | **0** = no cap. Free plan: 20 / run |

```json
{ "states": ["NY"], "listingType": "companies", "onlyWithContact": true, "maxItems": 20 }
```

API-only: `useProxy` (Apify Proxy, off by default) and `verboseLogs`.

### How it works

One public locator page per state (HTTP only, 512 MB, about 1.5 s per state). Rows are deduplicated on the BPI listing id, saved as soon as each state is read, and billed per row. A full nationwide export of every listing takes about 80 seconds.

### Output sample

Real row (25 Oct 2026), contact masked here; the Actor returns it in full.

```json
{
  "listingType": "goldstar",
  "isGoldStar": true,
  "companyName": "ABSOLUTE HVAC CORPORATION",
  "contactName": "C. H***",
  "phone": "(516) ***-**92",
  "email": "a***@gmail.com",
  "city": "Mineola",
  "stateCode": "NY",
  "postalCode": "11501",
  "latitude": 40.7473812,
  "longitude": -73.6468506,
  "certifications": ["MFBA", "ALC", "BA-T", "BA-P"],
  "certificationNames": "Multifamily Building Analyst Professional; Whole House Air Leakage Control Installer; Building Analyst - Technician; Building Analyst - Professional"
}
```

### Limitations

- Only what the BPI locator publishes: no email or phone for individual certified professionals.
- A company that works in several states is listed under its own address state.
- Certification codes are BPI's own (BA-T, BA-P, EA, QCI, HEP, ALC, MFBA…); full names are in `certificationNames`.

### How much does it cost to scrape BPI certified contractors?

Pay per event, platform usage included: $0.05 per run start, then per row (company with email / with phone only / without contact).

| Scenario | FREE | Bronze | Silver | Gold+ |
|----------|------|--------|--------|-------|
| 20 companies with email | ~$0.13 | ~$0.12 | ~$0.11 | ~$0.10 |
| New York, ~230 companies | ~$0.94 | ~$0.83 | ~$0.72 | ~$0.61 |
| All 1,096 companies | ~$4.31 | ~$3.77 | ~$3.24 | ~$2.72 |
| Row prices (email · phone · none) | $0.004 · $0.0025 · $0.0015 | $0.0035 · $0.0022 · $0.0013 | $0.003 · $0.0019 · $0.0011 | $0.0025 · $0.0017 · $0.001 |

Free Apify plan: **20 rows per run**.

### Is it legal to scrape the BPI locator?

This Actor only reads data the Building Performance Institute publishes on its **public** contractor locator. Use contact data in line with CAN-SPAM, TCPA, state privacy laws and GDPR where it applies. This Actor is independent and not affiliated with BPI.

### Also available

- **[IICRC Certified Firms](https://apify.com/corent1robert/iicrc-certified-firms-scraper)** — water damage, mold and restoration firms by state
- **[EPA Lead-Safe Certified Firms](https://apify.com/corent1robert/epa-lead-safe-certified-firms)** — RRP renovation and abatement contractors
- **[NADCA Duct Cleaners](https://apify.com/corent1robert/nadca-duct-cleaners-scraper)** — HVAC duct cleaning companies
- **[US Home Inspectors Hub](https://apify.com/corent1robert/us-home-inspectors-hub)** — ASHI + InterNACHI inspectors

### Local development

```bash
npm install
npm test
echo '{"states":["VT"],"maxItems":20}' > input.json && npm start
```

### Support

Contact <corentin@outreacher.fr> for a custom scraper or automation.

# Changelog

This Actor's version history is a separate document: https://apify.com/corent1robert/bpi-certified-contractors/changelog.md

# Actor input Schema

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

One or more US states, or **All states** for a nationwide export.

## `listingType` (type: `string`):

**Companies** = BPI GoldStar contractors + companies with certified professionals (they publish phone, email, website). **GoldStar only** = the top BPI contractor tier. **All** also adds individual certified professionals (name, city and certifications only, no contact).

## `onlyWithContact` (type: `boolean`):

Skip listings that publish neither a mailbox nor a phone.

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

Stop after this many rows. **0 = no cap**.

## Actor input object example

```json
{
  "states": [
    "NY"
  ],
  "listingType": "companies",
  "onlyWithContact": true,
  "maxItems": 20
}
```

# Actor output Schema

## `companies` (type: `string`):

No description

## `crm` (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": [
        "NY"
    ],
    "listingType": "companies",
    "onlyWithContact": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/bpi-certified-contractors").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"],
    "listingType": "companies",
    "onlyWithContact": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/bpi-certified-contractors").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"
  ],
  "listingType": "companies",
  "onlyWithContact": true,
  "maxItems": 20
}' |
apify call corent1robert/bpi-certified-contractors --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/bpi-certified-contractors"
        }
    }
}
```

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/QB9TD83e9Qj3Texys/builds/0MdOKZewEob7Ddsqe/openapi.json
