# BBB Scraper - Business Leads, Ratings & Accreditation (`scrapesage/bbb-scraper`) Actor

Scrape Better Business Bureau businesses by category & city: name, BBB rating (A+ to F), accreditation, phone, full address, website, email, years in business, complaints, customer reviews & owner contacts. US & Canada B2B lead generation. Export JSON, CSV, Excel.

- **URL**: https://apify.com/scrapesage/bbb-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Agents, Integrations
- **Stats:** 27 total users, 11 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 business 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?

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

## BBB Scraper — Better Business Bureau Business Leads, Ratings & Accreditation

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the International Association of Better Business Bureaus (BBB) or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "BBB" is referenced only to describe the publicly available website this Actor collects data from.

Extract **complete Better Business Bureau business data** at scale — the fields that make a US/Canada B2B lead actionable: **business name, BBB rating (A+ to F), accreditation status, phone, full address, website, years in business, owner/principal contacts, complaints, customer reviews, licenses and service area.** Optionally turn every listing into a **ready-to-contact lead** by crawling each business's own website for **emails and social profiles**, with a 0–100 **lead score**.

Search by **category + city** (`Roofing Contractors` in `Dallas, TX`), paste BBB search or profile URLs, and export structured JSON, CSV or Excel. No login, no API key — reliable extraction with automatic Cloudflare handling over US residential proxies.

### Why this BBB scraper?

BBB is one of the most trusted US business directories — and a goldmine for B2B prospecting, because every profile is a real, vetted business with a rating, accreditation signal, phone and address. This actor reads BBB's full embedded business record (not just the visible card) and ships the **richest BBB dataset in the category**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Business name, category, phone, full address | ✅ | ✅ |
| **BBB rating (A+ to F) + numeric rating score** | partial | ✅ |
| **Accreditation status + accredited-since date** | ❌ | ✅ |
| **Real business website** | ❌ | ✅ |
| Years in business + business start / incorporation date | ❌ | ✅ |
| **Owner / principal contacts (names + titles)** | ❌ | ✅ opt-in |
| Complaint counts (3-yr & 12-mo) + customer review count & avg rating | ❌ | ✅ |
| Licenses (number + issuing agency) | ❌ | ✅ opt-in |
| Service area (cities served) | ❌ | ✅ opt-in |
| **Contact emails + socials** (from the business website) | ❌ | ✅ opt-in |
| **Lead score (0–100)** | ❌ | ✅ |
| Monitor mode — only output new/changed businesses | ❌ | ✅ |

### Use cases

- **B2B lead generation** — build targeted lists of real, vetted businesses by category and city with phone, website, owner name and (optionally) email. Score and prioritize with `leadScore`, filter to **BBB-accredited** or **A+ rated** prospects, then push into your CRM.
- **Sales prospecting** — agencies and SaaS/insurance/financial teams that sell to local businesses can find every `HVAC`, `Roofing`, `Plumbing`, `Auto Repair`, `Law Firm` or `Dentist` in a metro — and reach the owner directly.
- **Reputation & competitor intelligence** — track BBB ratings, accreditation, complaint volume and review scores across a market.
- **Vendor & supplier vetting** — pull accreditation, years in business, complaints and licenses to qualify vendors at scale.
- **Data enrichment** — paste a list of BBB profile URLs to enrich them with full contact and trust data.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **BBB Scraper**, enter one or more **search terms** (categories/keywords) and **locations** (or paste BBB URLs), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchTerms": ["Roofing Contractors", "Plumbers"],
    "locations": ["Dallas, TX", "Austin, TX"],
    "maxResults": 100,
    "accreditedOnly": false,
    "minRating": "any",
    "includeDetails": true,
    "includeReviews": true,
    "enrichContacts": true,
    "monitorMode": false
}
```

- **searchTerms** — categories or keywords (`Plumbers`, `HVAC`, `Lawyers`) or a specific business name. Combined with every location.
- **locations** — `City, ST` strings (`Austin, TX`), ZIP/postal codes, or a state/province. Combined with every search term.
- **startUrls** — direct BBB **search** pages (`/search?find_text=…&find_loc=…`) or **profile** pages (`/us/.../profile/...`). Profile URLs are always fully enriched.
- **maxResults** *(default 100)* — total businesses across all searches. `0` = no limit.
- **maxResultsPerSearch** — optional cap per term+location combination.
- **accreditedOnly** — keep only BBB-accredited businesses.
- **minRating** — keep only businesses at/above a BBB letter rating (`A+`, `A`, `B+`, …).
- **includeDetails** *(default false)* — open each profile for website, owner contacts, years in business, complaints, reviews count, licenses, service area and the "About" overview.
- **includeReviews** *(default false)* — add recent BBB customer reviews (requires details).
- **enrichContacts** *(default false)* — crawl each business's own website for emails and socials. BBB rarely publishes emails — this is how you get them.
- **monitorMode** *(default false)* — only output businesses that are new or changed (e.g. rating change) since the last run. Perfect for scheduled lead pipelines.
- **proxyConfiguration** — keep the default Apify Residential (US) for the best reliability on profile pages.

### Output

One record per business (`type: "business"`). List-only runs return the core fields; turning on details/reviews/enrichment fills the rest:

```json
{
    "type": "business",
    "businessId": "1000193414",
    "bbbId": "0825",
    "bbbChapter": "BBB Heart of Texas",
    "businessName": "Ecotech Roofing and Construction",
    "category": "Roofing Contractors",
    "bbbRating": "A+",
    "ratingScore": 100,
    "accredited": true,
    "phone": "(214) 555-0188",
    "address": "1200 Commerce St, Dallas, TX 75202",
    "city": "Dallas",
    "state": "TX",
    "zip": "75202",
    "country": "US",
    "latitude": 32.7791,
    "longitude": -96.7954,
    "profileUrl": "https://www.bbb.org/us/tx/dallas/profile/roofing-contractors/ecotech-roofing-and-construction-0875-1000193414",
    "website": "https://ecotechroofing.com/",
    "email": null,
    "yearsInBusiness": 17,
    "businessStarted": "2009-04-01",
    "dateAccredited": "2014-03-25",
    "numberOfEmployees": 24,
    "description": "Full-service residential & commercial roofing contractor.",
    "principalContacts": [{ "name": "Robert Burnley", "title": "Owner/Manager" }],
    "licenses": [{ "number": "RCAT-12345", "agency": "Roofing Contractors Association of Texas", "expiration": "2027-01-31" }],
    "serviceArea": "Dallas, TX; Plano, TX; Frisco, TX; Garland, TX",
    "complaintCount": 2,
    "complaintsLast3Years": 1,
    "customerReviewCount": 38,
    "averageStarRating": 4.7,
    "leadScore": 84,
    "searchTerm": "Roofing Contractors",
    "searchLocation": "Dallas, TX",
    "scrapedAt": "2026-06-26T12:00:00.000Z"
}
```

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

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Business lead** - Each BBB business from search: name, BBB rating, accreditation, phone, address, category, geo & profile URL
- **Full business profile** - Per business enriched with website, owner/principal contacts, years in business, complaints, reviews count, licenses, hours & service area
- **Customer review** - Each BBB customer review extracted (author, rating, date, text)
- **Website contact enrichment** - Per business whose website was crawled for emails & social profiles

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly to keep a city + category lead list fresh. Combine with **monitor mode** to drip only new businesses into your pipeline.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/bbb-scraper').call({
    searchTerms: ['HVAC'],
    locations: ['Phoenix, AZ'],
    maxResults: 100,
    includeDetails: true,
    enrichContacts: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} BBB business leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new business leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new businesses.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find A+ accredited roofing contractors in Dallas with a website and owner contact" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **local-business lead-gen stack**:

- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** — places, business leads, emails & contacts.
- **[Thumbtack Scraper](https://apify.com/scrapesage/thumbtack-scraper)** — home-service pro leads, reviews & hire data.
- **[Expertise.com Scraper](https://apify.com/scrapesage/expertise-scraper)** — vetted local-business leads across US verticals.
- **[BuildZoom Scraper](https://apify.com/scrapesage/buildzoom-scraper)** — contractor directory leads.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — emails, phones & socials from any domain list.
- **[LinkedIn Company Scraper](https://apify.com/scrapesage/linkedin-company-scraper)** — firmographics & B2B company leads.
- **[TaxBuzz Scraper](https://apify.com/scrapesage/taxbuzz-scraper)** — tax & accounting professional leads.
- **[Care.com Scraper](https://apify.com/scrapesage/care-com-scraper)** — caregiver & care-business leads.

### Tips

- **Best leads first**: set `accreditedOnly: true` and/or `minRating: "A"` to focus on vetted, high-trust businesses — accredited profiles also carry the richest data (website, owner, years in business, dates).
- **Go deep on a market**: split by sub-category (e.g. `Residential Roofing`, `Commercial Roofing`) and by city/ZIP to exhaust a metro.
- **Emails**: turn on `enrichContacts` — BBB itself rarely lists emails, so the actor pulls them from each business's own website.
- **Cost control**: details, reviews and enrichment are all opt-in; list-only runs are fast and cheap.
- **Recurring leads**: pair **monitor mode** + **Schedules** to receive only newly listed or changed businesses each day.

### FAQ

**How do I scrape BBB businesses for a specific city?** Put the category in `searchTerms` (`Plumbers`) and the city in `locations` (`Austin, TX`). Each term is combined with each location.

**Does it work without the BBB API?** Yes. No API key or login needed — the actor reads BBB's public server-rendered data.

**Where do the emails come from?** BBB rarely publishes business emails. With `enrichContacts` on, the actor visits each business's own public website and extracts publicly listed contact emails — the same thing a human visitor would see.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new businesses automatically?** Turn on `monitorMode`, set a `monitorKey`, and create a [Schedule](https://docs.apify.com/platform/schedules). Each run outputs only new or changed businesses.

**A field is null — why?** BBB holds richer data for accredited/established businesses than for unrated (NR) listings. Fields like owner contacts, years in business, hours and service area are populated when BBB has them; email is rarely published by BBB (use `enrichContacts`). Fields are `null` only when the data isn't on the page.

**Is scraping BBB legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and BBB's terms.

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the International Association of Better Business Bureaus (BBB) or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"BBB" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official BBB product, is not authorised or certified by the International Association of Better Business Bureaus (BBB), and does not distribute BBB software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search for on BBB — a category or keyword such as <code>Plumbers</code>, <code>Roofing Contractors</code>, <code>Auto Repair</code>, <code>HVAC</code>, <code>Lawyers</code>, or a specific business name. Each term is combined with every location below.

## `locations` (type: `array`):

Where to search — a <code>City, ST</code> string (<code>Austin, TX</code>, <code>Chicago, IL</code>), a ZIP/postal code, or a US state / Canadian province. Each location is combined with every search term. Leave empty to search nationwide for a named business.

## `startUrls` (type: `array`):

Direct BBB URLs to scrape in addition to searches: search pages (<code>https://www.bbb.org/search?find\_text=...\&find\_loc=...</code>) or business profile pages (<code>https://www.bbb.org/us/.../profile/...</code>). Profile URLs are always fully enriched.

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

Maximum number of businesses to scrape across all searches. Use <code>0</code> for no limit (exhaust every search — only with narrow searches).

## `maxResultsPerSearch` (type: `integer`):

Optional cap per individual search term + location combination. <code>0</code> = no per-search cap (still bounded by Max businesses).

## `accreditedOnly` (type: `boolean`):

Keep only businesses that are BBB Accredited (paying members that meet BBB standards).

## `minRating` (type: `string`):

Keep only businesses at or above this BBB letter rating.

## `includeDetails` (type: `boolean`):

Open each business profile for the complete record: website, email, additional phones, years in business, date incorporated, accredited-since, hours, number of employees, owner / principal contacts, BBB file details, complaint count and the full "About" overview. Adds one request per business.

## `includeReviews` (type: `boolean`):

Extract recent BBB customer reviews for each business (author, rating, date, text). Requires business details.

## `maxReviewsPerBusiness` (type: `integer`):

How many recent customer reviews to keep per business when "Include customer reviews" is on.

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

For businesses that list a website, visit it (home + contact/about, up to 3 pages) and extract public contact emails, phone numbers, a contact-form URL and social profiles (LinkedIn, Instagram, Facebook, Twitter/X, YouTube). Requires business details.

## `monitorMode` (type: `boolean`):

Remember businesses seen on previous runs (in a named key-value store) and output only businesses that are new or changed (e.g. rating change) since last time. Perfect for scheduled lead pipelines — pair with Apify Schedules to drip only fresh leads into your CRM.

## `monitorKey` (type: `string`):

Names the persistent monitor store so you can keep separate watch-lists (e.g. <code>austin-plumbers</code>). Reuse the same key across scheduled runs to keep deduplicating against history.

## `maxConcurrency` (type: `integer`):

How many browser pages to run in parallel. 3–6 is a good balance of speed and reliability; Crawlee auto-scales down if memory is limited.

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

Proxies to use. US residential proxies are recommended for the highest reliability on BBB profile pages. The default (Apify Residential, US) works out of the box.

## `urlsFromFile` (type: `string`):

Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically.

## Actor input object example

```json
{
  "searchTerms": [
    "Plumbers"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxResults": 100,
  "maxResultsPerSearch": 0,
  "accreditedOnly": false,
  "minRating": "any",
  "includeDetails": false,
  "includeReviews": false,
  "maxReviewsPerBusiness": 8,
  "enrichContacts": false,
  "monitorMode": false,
  "monitorKey": "default",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

All scraped BBB business records as JSON items in the default dataset.

# 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 = {
    "searchTerms": [
        "Plumbers"
    ],
    "locations": [
        "Austin, TX"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    },
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/bbb-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 = {
    "searchTerms": ["Plumbers"],
    "locations": ["Austin, TX"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
    "urlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/bbb-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 '{
  "searchTerms": [
    "Plumbers"
  ],
  "locations": [
    "Austin, TX"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "urlsFromFile": ""
}' |
apify call scrapesage/bbb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/bbb-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/d3TJ8xD7yXsYERtta/builds/Hdjr80DEkInmwxrPn/openapi.json
