# InterNACHI Inspectors · Emails & Phones by State (`corent1robert/internachi-inspectors-scraper`) Actor

Export InterNACHI certified inspectors — name, company, phone, website, city, state. Optional emails from the inspector website. Filter by US state or paste profile URLs. One row per inspector. Public directory. No login.

- **URL**: https://apify.com/corent1robert/internachi-inspectors-scraper.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 1 total users, 1 monthly users, 37.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 inspector with emails

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## InterNACHI Inspectors · Emails & Phones by State

Export **public InterNACHI certified inspector profiles** as a spreadsheet — name, company, phone, website, city, and US state. Filter by state or paste profile URLs. Optionally copy a mailbox from the inspector’s public website.

**No login. No API key. No InterNACHI account.**

The directory itself publishes **phone and website**. It does **not** publish emails (contact is a Send Message form). Emails appear only when you turn on website lookup.

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Solar / roofing / HVAC sales | Inspectors who already talk to homebuyers | **Florida** or **California** · Only rows with phone or website |
| Home-warranty or insurance BD | Territory list with a real phone | One state · 20-row first run · then raise Max inspectors |
| Agency / SDR | CRM import, one row per inspector | Dataset view **Outreach CRM** · optional website emails |
| Market research | How many certified inspectors per state | Empty states = nationwide · contacts optional |
| Ops / data | Enrich InterNACHI URLs you already have | Paste **Profile URLs** |

**What you get by default:** name, company, InterNACHI ID, city, state, phone when printed, website when printed, extra services, profile URL.

**When to enable website emails:** outbound that needs a mailbox. The Actor visits the published company site (homepage + a few contact pages) and copies a public address when it is printed — never invented, never taken from the InterNACHI form.

### How to use

1. Open this Actor in Apify Console.
2. Keep **Florida** (or pick another state). Leave states empty for nationwide.
3. Leave **Only rows with phone or website** on for a CRM-ready first export.
4. Leave **Find emails on the inspector website** off unless you need mailboxes.
5. Click **Start**.
6. Download JSON / CSV / Excel — views: **Overview**, **Outreach CRM**, **Services**.

**Max inspectors = 0** → no Actor-side ceiling (Free plan still stops at **20** / run).

### Ready-made examples (published tasks)

| Example | Best for |
|---------|----------|
| [Florida InterNACHI inspectors with phones](https://apify.com/corent1robert/internachi-inspectors-scraper/examples/florida-internachi-inspectors-phones) | Home-services outreach in FL |
| [California InterNACHI inspectors with phones](https://apify.com/corent1robert/internachi-inspectors-scraper/examples/california-internachi-inspectors-phones) | West Coast territory |
| [Enrich InterNACHI inspectors from profile URLs](https://apify.com/corent1robert/internachi-inspectors-scraper/examples/internachi-inspectors-from-profile-urls) | A short list you already have |
| [Nationwide InterNACHI CRM sample](https://apify.com/corent1robert/internachi-inspectors-scraper/examples/nationwide-internachi-inspectors-crm) | 20-row Try, contacts only |

### What it extracts

| Category | Fields |
|----------|--------|
| Identity | `name`, `firstName`, `lastName`, `companyName`, `internachiId` |
| Contact | `phone`, `phones`, `website`, `email` (website only), `emails` |
| Location | `city`, `state`, `states` |
| Services | `extraServices` |
| Profile | `profileUrl`, `slug`, `profileId`, `hasEmail`, `hasPhone`, `hasWebsite`, `scrapedAt` |

InterNACHI headquarters phones and `@nachi.org` / `@internachi.org` mailboxes are dropped. The **Send Message** form is never harvested.

**Typical fill:** almost every listing publishes a **phone**. Many profiles publish a **website**. **Email** is empty unless website lookup is on and the company site prints a mailbox.

### How it works

1. Open the public InterNACHI browse pages for the states you picked (or nationwide).
2. Read the Member / Servicing / Phone table and follow each inspector profile.
3. Copy name, company, phone, website, city, state, InterNACHI ID, and extra services **when they are printed**.
4. If website emails are on, visit the company site and copy a public mailbox when present.
5. Write one row immediately — the Dataset fills as the run goes.

### How much does it cost to scrape InterNACHI?

Pay-per-event on each exported inspector, plus a ~$0.00005 start. Browser work uses about 2 GB.

| | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Inspector with email | $0.00399 | $0.00349 | $0.00299 | $0.00249 | $0.00249 | $0.00249 |
| Inspector with phone only | $0.00249 | $0.00219 | $0.00189 | $0.00169 | $0.00169 | $0.00169 |
| Inspector without contact | $0.00149 | $0.00129 | $0.00109 | $0.00099 | $0.00099 | $0.00099 |
| 20 phones (Try) | **$0.05** | $0.04 | $0.04 | $0.03 | $0.03 | $0.03 |
| 1,000 with phone | **$2.49** | $2.19 | $1.89 | $1.69 | $1.69 | $1.69 |
| 1,000 with email | **$3.99** | $3.49 | $2.99 | $2.49 | $2.49 | $2.49 |

Free Apify plan: **20 inspectors per run**. Paid plans follow your max charge.

### Is it legal to scrape InterNACHI?

This Actor only copies data InterNACHI publishes on **public** inspector listing and profile pages, plus public pages on the inspector’s own website when that option is on. Names, emails and phones are personal data — make sure your use complies with GDPR, CAN-SPAM, TCPA and any rules that apply to you. This is not legal advice.

### Is scraping InterNACHI free?

InterNACHI does not charge to view public profiles. You still pay Apify PPE (and a little compute). There is no high-volume free path.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `states` | array | `["FL"]` prefill | US states. Empty = nationwide. |
| `onlyWithContact` | boolean | `false` (`true` in Try) | Keep rows with published phone and/or website. |
| `profileUrls` | array | — | Public profile URLs. When set, states are ignored. |
| `maxItems` | integer | `20` | **0** = no numerical cap. **Free plan: 20 / run.** |
| `findEmailsOnWebsite` | boolean | `false` | Copy a mailbox from the inspector’s public website. |

API-only: `websiteEmailMaxPages` (default 3), `maxConcurrency` (default 2), `proxyConfiguration` (Apify residential proxy on the platform).

```json
{
  "states": ["FL"],
  "onlyWithContact": true,
  "maxItems": 20
}
```

```json
{
  "profileUrls": ["https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121"],
  "maxItems": 1
}
```

```json
{
  "states": ["FL"],
  "onlyWithContact": true,
  "findEmailsOnWebsite": true,
  "maxItems": 20
}
```

### Output example

```json
{
  "profileId": "19121",
  "slug": "david-wiggins-jr",
  "name": "David Wiggins Jr",
  "firstName": "David",
  "lastName": "Wiggins Jr",
  "companyName": "Jax Inspect",
  "internachiId": "NACHI10030604",
  "email": null,
  "emails": [],
  "emailFromWebsite": null,
  "phone": "(904) 248-8665",
  "phones": ["(904) 248-8665"],
  "website": "http://www.jaxinspect.com",
  "city": "Jacksonville",
  "state": "FL",
  "states": ["FL"],
  "extraServices": ["Four-Point Inspections", "Wind Mitigation Inspections"],
  "profileUrl": "https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121",
  "hasEmail": false,
  "hasPhone": true,
  "hasWebsite": true,
  "scrapedAt": "2026-09-06T13:10:00.000Z"
}
```

Download JSON, CSV, Excel, or HTML from the Dataset tab.

### Also available

**[US Home Inspectors Hub](https://apify.com/corent1robert/us-home-inspectors-hub)** — ASHI + InterNACHI in one run.

**[ASHI Home Inspectors · Emails & Phones by State](https://apify.com/corent1robert/ashi-homeinspector-scraper)** — public ASHI inspector emails and phones by US state.

**[IICRC Certified Firms](https://apify.com/corent1robert/iicrc-certified-firms-scraper)** — restoration / mold / cleaning firm contacts by US state.

### Local development

```bash
cd internachi-inspectors-scraper
npm install
cp .actor/INPUT.json storage/key_value_stores/default/INPUT.json
apify run --purge
```

Use `apify run` (not `npm start`). Default **INPUT.json** must include required schema fields (or pass `--input-file`). Local `storage/` is not synced to Apify Console. Root `input.json` is merged locally; CLI KV input wins on key collision.

`npm test` runs parser unit tests (no network).

### FAQ

**Does every row have an email?** No. The public directory does not print mailboxes. Turn **Find emails on the inspector website** on to copy addresses from company sites when they exist.

**Why phone or website for “contacts”?** That is what InterNACHI publishes on the listing and profile. Email is extra.

**Will a 20-row Try finish in 5 minutes?** Yes for a single state without website emails.

**Do I need a proxy?** Cloud runs use Apify proxy by default. You can pass `proxyConfiguration` via API.

### Support

Questions, custom scrapers, or integrations: <corentin@outreacher.fr>.

Ready? Pick a state, keep contacts on, and click Start.

# Actor input Schema

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

Keep inspectors listed in these states. Leave empty for a nationwide list.

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

Get a CRM-ready file. Skip cards that do not publish a phone or a company website on the public page.

## `profileUrls` (type: `array`):

Paste public profile links (one per line). Example: https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121

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

Stop after this many matching inspectors. **0 = no numerical cap**.

## `findEmailsOnWebsite` (type: `boolean`):

Visit the published company website (homepage + a few contact pages) and copy a public mailbox when it is printed. Off by default.

## Actor input object example

```json
{
  "states": [
    "FL"
  ],
  "onlyWithContact": false,
  "profileUrls": [
    "https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121"
  ],
  "maxItems": 3,
  "findEmailsOnWebsite": false
}
```

# Actor output Schema

## `results` (type: `string`):

All exported InterNACHI inspector profiles.

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

Name, company, city, state, email, phone, profile URL.

## `outreach` (type: `string`):

Name, email, phone, company, city, state for CRM import.

## `services` (type: `string`):

Additional inspection services.

## `runLog` (type: `string`):

Plain-text progress log for this run.

# 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": [
        "FL"
    ],
    "onlyWithContact": false,
    "profileUrls": [
        "https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121"
    ],
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/internachi-inspectors-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 = {
    "states": ["FL"],
    "onlyWithContact": False,
    "profileUrls": ["https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121"],
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/internachi-inspectors-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 '{
  "states": [
    "FL"
  ],
  "onlyWithContact": false,
  "profileUrls": [
    "https://www.nachi.org/certified-inspectors/david-wiggins-jr-19121"
  ],
  "maxItems": 3
}' |
apify call corent1robert/internachi-inspectors-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/internachi-inspectors-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/gL8OFn4aAFxFPqviV/builds/j2m22fnaAZZ2JN4bK/openapi.json
