# Chamber of Commerce Member Directory & Business Leads Scraper (`scrapebench/chamber-of-commerce-member-directory`) Actor

Export every member of a Chamber of Commerce directory — business, phone, address, website, socials — and optionally the contact email crawled from each member's own site.

- **URL**: https://apify.com/scrapebench/chamber-of-commerce-member-directory.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Lead generation
- **Stats:** 43 total users, 18 monthly users, 96.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.004 / member row

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/platform/actors/running/actors-in-store#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

## Chamber of Commerce Member Directory & Business Leads Scraper

### Pain points

- Chamber directories are paginated, one-business-at-a-time pages with no export.
- Building a local B2B lead list means copy-pasting hundreds of member pages by hand.
- Chamber directories rarely list a member email — the one field outreach actually needs is usually missing.
- The raw pages aren't structured for a CRM, outreach tool, or market analysis.

### What we solve

- Pull every member of a chamber (or every chamber in a county) in one run.
- Clean, structured rows: business, phone, address, website, categories, socials, reps.
- Optional email enrichment — crawl each member's own website for a real contact email.
- Pay per result; empty and email-less runs don't over-charge.

### Summary

Turn a Chamber of Commerce member directory into a structured B2B lead list. One run returns every member — business name, phone, address, website, categories, social links, and listed representatives — straight from the live directory. Flip on contact enrichment and the actor crawls each member's own website for a real email, flagging franchise/corporate addresses so you know what's the local business. Ready for lead generation, CRM import, or local market research.

### Who it's for

- B2B sales and lead-gen teams targeting local businesses
- Agencies running local outreach campaigns
- Suppliers, SaaS, and insurers building local prospect lists
- Market researchers profiling a city or county's business base

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "cities": [
    "Concord"
  ],
  "state": "CA",
  "enrichContacts": true,
  "maxResults": 25
}
```

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `business_name` | Member business name |
| `chamber_name` | Source chamber of commerce |
| `phone` | Business phone |
| `address` | Street address |
| `city` | Business city |
| `zip_code` | ZIP code |
| `website` | Business website |
| `categories` | Chamber category labels |
| `facebook` | Facebook URL |
| `linkedin` | LinkedIn URL |
| `instagram` | Instagram URL |
| `twitter` | Twitter/X URL |
| `contact_reps` | Listed representatives (name, title) |
| `emails` | Emails crawled from the member's website (when enrichContacts is on): {email, source\_url, type, confidence} |
| `email_domain_matches_website` | False = franchise/corporate email, not the local business |
| `enrichment_status` | found | no\_email | unreachable | corporate\_site |
| `source_url` | Chamber member detail page |

Sample:

```json
{
  "business_name": "A2Z Media Group, LLC",
  "chamber_name": "Concord Chamber of Commerce",
  "phone": "(415) 404-6407",
  "address": "1350 Arnold Dr., Suite 201",
  "city": "Martinez",
  "zip_code": "94553",
  "website": "http://a2zmediagroup.com",
  "categories": [
    "Marketing/Advertising"
  ],
  "facebook": "https://www.facebook.com/A2ZMediaGroup/",
  "linkedin": "https://www.linkedin.com/company/a2z-media-group/",
  "contact_reps": [
    {
      "name": "Zuleyka Jinks",
      "title": "Owner/Partner"
    }
  ],
  "emails": [
    {
      "email": "info@a2zmediagroup.com",
      "source_url": "http://a2zmediagroup.com/contact",
      "type": "generic",
      "confidence": "high"
    }
  ],
  "email_domain_matches_website": true,
  "enrichment_status": "found",
  "source_url": "https://business.concordchamber.com/list/member/a2z-media-group-llc-12179"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `listChambers` | no | boolean | `false` | If true, skip scraping and return the list of chambers this actor can scrape (city, county, chamber name, directory URL). Free — not charged. Use it to see which cities are available, then run again (or loop) with a 'county' or 'cities'. Optionally narrow the list with 'state'/'county'. |
| `county` | no | string | `"Contra Costa"` | Select every indexed chamber in this county, e.g. 'Contra Costa'. Combine with 'state' to disambiguate. Leave empty if using 'cities' or 'directoryUrls'. |
| `cities` | no | array | `[]` | Select indexed chambers in these cities, e.g. \['Concord', 'Danville']. Case-insensitive. |
| `state` | no | string | `"CA"` | Two-letter state code to scope 'county'/'cities' matching, e.g. 'CA'. |
| `categories` | no | array | `[]` | Keep only members whose chamber category contains any of these terms (case-insensitive substring), e.g. \['insurance', 'marketing']. Empty = all members. |
| `enrichContacts` | no | boolean | `false` | If true, crawl each member's own website for a contact email (adds the emails / enrichment fields). Off by default — the directory scrape is fast and cheap on its own. Charged only for members where a real email is found. |
| `maxResults` | no | integer | — | Cap on member rows returned in one run. Leave empty to return every member of the selected chambers. |
| `directoryUrls` | no | array | `[]` | Escape hatch for a GrowthZone/ChamberMaster chamber not yet in the registry. Give the base directory URL, e.g. 'https://business.concordchamber.com'. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. Chamber directories are reachable directly; enable a proxy only if runs return no data because the IP is blocked. |

### Pricing (Pay Per Event)

You pay per result (`member-row`) — **no charge for empty runs**. Example: **500 chamber members** at *$0.004/result* ≈ **$2.00**.

One charge per member row; empty runs are free. Contact enrichment (enrichContacts) is included in the per-member price — no extra charge. Illustrative — final per-result prices are set at publish time. Apify platform compute is billed separately per your plan.

### Use cases

- Local B2B lead lists — every chamber member in a county, with contact email.
- Agency outreach — pull a chamber, enrich for emails, export to a CRM.
- Market research — profile a local economy by category and geography.
- List enrichment — add website, socials, and email to businesses you already track.

### Why this actor

- Bulk export — a whole chamber (or county) per run, not one page at a time.
- The email chambers don't publish — crawled from each member's own site, franchise-flagged.
- Clean, CRM-ready rows straight from the live directory. Pay per result.

### Limitations & updates

Covers Chamber of Commerce directories on the GrowthZone/ChamberMaster platform. Email enrichment is best-effort from each member's public website — it finds an address only when the business publishes one, so expect a meaningful share of members to come back without one; social profiles are captured as columns but not crawled for emails.

### FAQ

**What does one run return?**

Every member of the selected chamber(s) — business, phone, address, website, categories, social links, and listed reps. With enrichContacts on, each member's website is crawled for a contact email.

**How do I pick which chambers to scrape?**

Run with `listChambers: true` (free) to list the available cities/chambers, then run with a `county` (all chambers in it) or `cities`. Advanced: pass a directory URL directly via `directoryUrls`.

**Where do the emails come from?**

Chambers don't publish member emails, so the actor crawls each member's own website (homepage + contact/about/team pages) and extracts the contact address, flagging franchise/corporate ones.

**How am I charged?**

Pay-per-result: one charge per member row, plus a second charge only for members where enrichment finds a real email. Empty and email-less runs don't over-charge.

**Which directories are supported?**

Chambers on the GrowthZone / ChamberMaster / MicroNet platform (the most common). Seeded with Contra Costa County, CA; more are added over time.

### Which actor to choose

Pairs with the standalone contact finder:

- **Chamber of Commerce Member Directory & Business Leads Scraper** *(this actor)* — You want a bulk local B2B lead list — every member of a chamber, optionally enriched with emails.
- **Business Email, Phone & Contact Details Scraper** — You already have a list of business websites (from anywhere) and want their contact details — email, phone, social links and address.

### Guides & use cases

Written up on **[scrapebench.dev](https://scrapebench.dev)** — the bench that runs and verifies this actor against the live source every night:

- **How-to:** [How to run Chamber of Commerce Member Directory & Business Leads Scraper](https://scrapebench.dev/guides/how-to-chamber-of-commerce-member-directory/)
- **Use case:** [All Contra Costa County chamber members](https://scrapebench.dev/use-cases/contra-costa-county-all-chambers/)
- **Use case:** [Concord Chamber members with contact emails](https://scrapebench.dev/use-cases/concord-chamber-members-enriched/)

More actors, coverage and nightly verification results: **[scrapebench.dev](https://scrapebench.dev)**

# Actor input Schema

## `listChambers` (type: `boolean`):

If true, skip scraping and return the list of chambers this actor can scrape (city, county, chamber name, directory URL). Free — not charged. Use it to see which cities are available, then run again (or loop) with a 'county' or 'cities'. Optionally narrow the list with 'state'/'county'.

## `county` (type: `string`):

Select every indexed chamber in this county, e.g. 'Contra Costa'. Combine with 'state' to disambiguate. Leave empty if using 'cities' or 'directoryUrls'.

## `cities` (type: `array`):

Select indexed chambers in these cities, e.g. \['Concord', 'Danville']. Case-insensitive.

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

Two-letter state code to scope 'county'/'cities' matching, e.g. 'CA'.

## `categories` (type: `array`):

Keep only members whose chamber category contains any of these terms (case-insensitive substring), e.g. \['insurance', 'marketing']. Empty = all members.

## `enrichContacts` (type: `boolean`):

If true, crawl each member's own website for a contact email (adds the emails / enrichment fields). Off by default — the directory scrape is fast and cheap on its own. Charged only for members where a real email is found.

## `maxResults` (type: `integer`):

Cap on member rows returned in one run. Leave empty to return every member of the selected chambers.

## `directoryUrls` (type: `array`):

Escape hatch for a GrowthZone/ChamberMaster chamber not yet in the registry. Give the base directory URL, e.g. 'https://business.concordchamber.com'.

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

Optional. Chamber directories are reachable directly; enable a proxy only if runs return no data because the IP is blocked.

## Actor input object example

```json
{
  "listChambers": false,
  "county": "Contra Costa",
  "cities": [],
  "state": "CA",
  "categories": [],
  "enrichContacts": false,
  "directoryUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `members` (type: `string`):

The full member list — business, phone, address, website, socials, reps, and enriched emails.

# 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 = {
    "county": "Contra Costa",
    "state": "CA"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/chamber-of-commerce-member-directory").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 = {
    "county": "Contra Costa",
    "state": "CA",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapebench/chamber-of-commerce-member-directory").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "county": "Contra Costa",
  "state": "CA"
}' |
apify call scrapebench/chamber-of-commerce-member-directory --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapebench/chamber-of-commerce-member-directory",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/ZVGMyMX16uom540iF/builds/sF9Vyjfarhgmu7U1F/openapi.json
