# BBB Emails & Info Scraper (`confidential_gnat/bbb-business-scraper`) Actor

Scrapes Better Business Bureau (bbb.org) businesses: name, phone, address, BBB rating, accreditation, complaints, reviews, contacts, website and more. Give it a search page or business profile URL, with caching for new and changed businesses only.

- **URL**: https://apify.com/confidential_gnat/bbb-business-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

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

## Better Business Bureau (BBB) Business Scraper

**Scrape business listings and profiles from the Better Business Bureau (bbb.org)**: name, phone, address, BBB rating, accreditation, complaints, reviews, contacts, website and more. Export the results as **JSON, CSV or Excel**, or call the scraper as an **API**. Paste a BBB search page or a business profile URL, press Start, and get clean, structured **BBB business data**, with optional employee contact leads found from each business website.

**Target website:** [bbb.org](https://www.bbb.org)

### ✨ Features of this BBB business scraper

- **BBB business and profile extraction**: search result pages and single business profile pages, with ratings, accreditation, complaint counts, review totals, contacts, social links and images.
- **Pagination support**: follows search result pages until `maxItems` is reached for each start URL.
- **Employee contact enrichment**: optionally finds employee contacts (name, role, email, LinkedIn) from each business website and adds them as a `leads` array.
- **Change tracking with cache**: reuse a cache project name on scheduled runs to receive only new or changed businesses, each tagged `new` or `updated`.
- **Details switch**: save only the search card data (fast and cheap) or open every business profile for the full record.
- **No browser required**: pages are loaded through a lightweight service, so runs are fast and cost far less than browser-based scrapers.

### 🚀 How to scrape BBB business data in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account, which includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields: a BBB search or business profile URL is required.
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 🖼️ BBB scraper input screenshot

![BBB Business Scraper input form](https://i.postimg.cc/cLvxWWxb/image.png)

The numbers match the input sections below:

1. **Search or business profile URLs**: the BBB pages to scrape.
2. **Scrape business details**: open each profile for the full record.
3. **Cache project name**: skip businesses already saved on earlier runs.
4. **Max items per start URL**: how many businesses to save for each URL.
5. **Find employee contacts (leads)**: add employee contacts found from each business website.

### 💰 Pricing

This actor uses **pay-per-event** billing:

- **$0.002** for each business saved to the dataset.
- **$0.004** more for each business whose full profile page was scraped (Scrape business details on).
- **$0.022** more for each business where employee contacts were found (Find employee contacts on). Nothing is charged when no contacts are found.
- Businesses skipped by the cache are not charged.

New Apify accounts include **$5 of free monthly credit**. Pages are fetched over plain HTTP rather than a headless browser, which keeps runs significantly cheaper than browser-based scrapers.

### 🔧 Input configuration for the BBB business scraper

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Search or business profile URLs (`startUrls`) | array | ✅ | prefilled Dallas lawyers search | BBB search pages (`bbb.org/search?...`) or business profile pages (`bbb.org/us/tx/dallas/profile/...`). |
| Scrape business details (`scrapeDetails`) | boolean | — | `true` | Opens each profile for contacts, website, complaints, reviews and dates. Profile URLs are always scraped in full. |
| Cache project name (`cacheProjectName`) | string | — | — | Use the same name on each scheduled run to get only new or changed businesses. |
| Max items per start URL (`maxItems`) | integer | — | `5` | Maximum businesses saved for each search URL. |
| Find employee contacts (`enrichLeads`) | boolean | — | `false` | Adds a `leads` array with employee contacts found from each business website. Extra charge per business with contacts. |
| Proxy configuration (`proxyConfiguration`) | object | — | proxy off | Accepted for compatibility. Pages are loaded by the actor's built-in service, so no proxy is needed. |

**Supported URL types:**

- Search page: `https://www.bbb.org/search?find_country=USA&find_text=Lawyers&find_loc=Dallas%2C+TX&page=1`
- Business profile: `https://www.bbb.org/us/tx/dallas/profile/lawyers/dfw-criminal-lawyers-llc-0875-91055553`

### 📦 BBB business scraper output data

Results are saved as a dataset (JSON, CSV, Excel, XML or RSS) with these fields: `url`, `businessId`, `bbbId`, `localBbbName`, `name`, `alternateNames`, `category`, `categories`, `rating`, `ratingScore`, `isAccredited`, `accreditedSince`, `fileOpenedDate`, `businessStartDate`, `yearsInBusiness`, `isClaimed`, `isOutOfBusiness`, `phone`, `additionalPhones`, `website`, `address`, `city`, `state`, `postalCode`, `country`, `formattedAddress`, `latitude`, `longitude`, `serviceArea`, `contacts`, `entityType`, `numEmployees`, `description`, `additionalInformation`, `reviewsTotal`, `averageReviewRating`, `complaintsTotal`, `complaintsLast12Months`, `complaintsLast3Years`, `logoUrl`, `imageUrls`, `socialMedia`, `dataLevel`, `searchUrl`, `scrapedAt`, `leads`, `changeType`.

The dataset has **1 view**, **Overview**, a compact table of name, phone, address, city, state, postal code, category, rating, accreditation, website, complaint total, leads, change type, data level and URL.

**Output at a glance:**

| Business | Phone | City | State | Rating | Complaints | Leads |
| -------- | ----- | ---- | ----- | ------ | ---------- | ----- |
| [The Copp Law Firm, PC](https://www.bbb.org/us/tx/dallas/profile/business-law-attorney/the-copp-law-firm-pc-0875-90235351) | (214) 206-1999 | Dallas | TX | A+ | 0 | 2 |
| [Monge & Associates](https://www.bbb.org/us/ga/atlanta/profile/personal-injury-lawyer/monge-associates-0443-27047471) | (678) 579-0203 | Atlanta | GA | A+ | 14 | 0 |
| [Omega Law Group Accident & Injury Attorneys](https://www.bbb.org/us/ca/west-hollywood/profile/lawyers/omega-law-group-accident-injury-attorneys-1216-893613) | (310) 526-8383 | West Hollywood | CA | A+ | 0 | 10 |

**Sample output (raw JSON):**

```json
{
  "url": "https://www.bbb.org/us/tx/dallas/profile/business-law-attorney/the-copp-law-firm-pc-0875-90235351",
  "businessId": "90235351",
  "bbbId": "0875",
  "localBbbName": "BBB serving North Central Texas",
  "name": "The Copp Law Firm, PC",
  "alternateNames": [],
  "category": "Business Law Attorneys",
  "categories": ["Business Law Attorneys", "Lawyers", "Estate Planning Attorneys", "Real Estate Lawyers", "Probate Attorneys", "Corporation Lawyers"],
  "rating": "A+",
  "ratingScore": 100,
  "isAccredited": true,
  "accreditedSince": "2009-11-09",
  "fileOpenedDate": "2009-11-02",
  "businessStartDate": "2004-01-01",
  "yearsInBusiness": 22,
  "isClaimed": true,
  "isOutOfBusiness": false,
  "phone": "(214) 206-1999",
  "additionalPhones": ["(214) 572-7256"],
  "website": "https://www.example-law.com",
  "address": "901 Main St Ste 4350",
  "city": "Dallas",
  "state": "TX",
  "postalCode": "75202-3707",
  "country": "US",
  "formattedAddress": "901 Main St Ste 4350, Dallas, TX 75202-3707",
  "latitude": 32.78,
  "longitude": -96.8,
  "serviceArea": [
    {
      "servingAreaId": 0,
      "description": "",
      "postalCodes": [],
      "stateCodes": [],
      "countryCodes": [],
      "cityStates": [],
      "countyStates": [
        { "county": "Collin", "stateCode": "TX" },
        { "county": "Dallas", "stateCode": "TX" }
      ]
    }
  ],
  "contacts": [{ "name": "Mr. Zachary A. Copp", "title": "Attorney" }],
  "entityType": "Corporation",
  "numEmployees": null,
  "description": null,
  "additionalInformation": [
    {
      "title": "Referral Assistance",
      "text": "State Bar of Texas\n1414 Colorado St.\nAustin TX 78701\nPhone Number: (800) 204-2222\nhttps://www.texasbar.com"
    }
  ],
  "reviewsTotal": 1,
  "averageReviewRating": 5,
  "complaintsTotal": 0,
  "complaintsLast12Months": 0,
  "complaintsLast3Years": 0,
  "logoUrl": "https://m.bbb.org/prod/ProfileImages/198b3948-3399-45be-8740-d110bd9c0b48.png",
  "imageUrls": ["https://m.bbb.org/prod/ProfileImages/ed168322-0c86-4beb-b98f-53734f6bda6f.jpeg"],
  "socialMedia": ["https://www.facebook.com/CoppLaw/", "https://www.instagram.com/copplawfirm/"],
  "dataLevel": "detail",
  "searchUrl": "https://www.bbb.org/search?find_country=USA&find_entity=60075-000&find_latlng=32.78%2C-96.80&find_loc=Dallas%2C+TX&find_text=Lawyers&find_type=Category&page=1",
  "scrapedAt": "2026-10-09T14:45:50.908Z",
  "leads": [
    {
      "name": "Support contact",
      "email": "info@example-law.com",
      "emailType": "generic",
      "position": null,
      "department": "support",
      "seniority": null,
      "phoneNumber": null,
      "linkedinUrl": null,
      "confidence": 95
    },
    {
      "name": "Jane Doe",
      "email": "jane.doe@example-law.com",
      "emailType": "personal",
      "position": "Managing Partner",
      "department": "executive",
      "seniority": "senior",
      "phoneNumber": null,
      "linkedinUrl": "https://www.linkedin.com/in/example-profile",
      "confidence": 99
    }
  ],
  "changeType": null
}
```

### 🐍 How to scrape BBB with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/bbb-business-scraper").call(run_input={
    "startUrls": [{"url": "https://www.bbb.org/search?find_country=USA&find_text=Lawyers&find_loc=Dallas%2C+TX&page=1"}],
    "scrapeDetails": True,
    "maxItems": 5,
    "enrichLeads": False,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/bbb-business-scraper').call({
    startUrls: [{ url: 'https://www.bbb.org/search?find_country=USA&find_text=Lawyers&find_loc=Dallas%2C+TX&page=1' }],
    scrapeDetails: true,
    maxItems: 5,
    enrichLeads: false,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~bbb-business-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://www.bbb.org/search?find_country=USA&find_text=Lawyers&find_loc=Dallas%2C+TX&page=1"}],"scrapeDetails":true,"maxItems":5,"enrichLeads":false}'
```

### 💡 What you can use BBB business data for

- Building **B2B lead lists** of accredited, well-rated local businesses by category and city.
- **Vendor and contractor vetting** using BBB rating, complaint counts and years in business.
- **Competitor research** across a category: ratings, accreditation and review volume.
- **Reputation monitoring** with scheduled runs that flag new or changed businesses.
- **Sales outreach** using the website, phone, contacts and optional employee emails.

Sales teams, agencies, market researchers and procurement teams use this data across legal, home services, finance, healthcare and many other industries.

### ⚠️ Limitations & known issues for the BBB scraper

- **Search results depend on BBB**: BBB decides which businesses a search page returns, so results for a location may include businesses from nearby or other regions.
- **Leads need a website**: employee contacts are looked up from the business website, so businesses without one return an empty `leads` array.
- **Fewer details in listing-only mode**: with Scrape business details off, only the fields shown on the search cards are saved.

### ❓ Frequently asked questions

#### Can I scrape the Better Business Bureau legally?

This actor only collects data already publicly visible on bbb.org: no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with the site's Terms of Service and applicable laws such as GDPR and CCPA, especially when personal data like contact names or emails is involved.

#### What data does the BBB scraper return?

Each record includes the business name, categories, BBB rating, accreditation, phone, address, website, contacts, complaint and review counts, social links and images. With **Find employee contacts** on, it also adds a `leads` array with names, roles, emails and LinkedIn profiles.

#### How many businesses can I scrape from one BBB search?

`maxItems` limits the number of businesses saved for each start URL, and the actor follows additional search pages until it reaches that number. BBB search results are limited by what BBB shows for the search itself.

#### Do I need a proxy to scrape bbb.org?

Yes use residential proxy to prevent the site from blocking the scraper.

#### How do I scrape BBB with Python?

Use the Python example above: call the actor with your `startUrls` and iterate over the dataset items.

#### Can I run this BBB scraper on a schedule?

Yes, use Apify Schedules. Set the same **Cache project name** on every scheduled run and the actor saves and charges only businesses that are new or changed since the last run, each tagged with `changeType`.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### How are employee contacts found for each BBB business?

The actor takes the domain from the business's website and looks up employee contacts for it. You are charged only for businesses where at least one contact is found.

### 🔗 Other actors you may find useful

| Actor | Description |
| ----- | ----------- |
| [🎯 Decision Maker Email Finder](https://apify.com/confidential_gnat/decision-maker-email-finder) | Find founders and executives with emails, phones and LinkedIn from any website. |
| [🇩🇪 German Imprint (Impressum) Scraper with AI Extraction](https://apify.com/confidential_gnat/german-imprint-scraper) | Extract decision makers and company details from German website Impressum pages. |
| [⛪ Church Finder Scraper](https://apify.com/confidential_gnat/churchfinder-scraper) | Scrape church listings and profiles: address, phone, service times and reviews. |
| [📄 BidNet Direct Open Bid Opportunities Scraper](https://apify.com/confidential_gnat/bidnetdirect-open-bid-opportunities-scraper) | Scrape open government bids and RFPs from BidNet Direct. |
| [🗂️ BidNet Direct Closed Bid Opportunities Scraper](https://apify.com/confidential_gnat/bidnetdirect-closed-bid-opportunities-scraper) | Scrape closed government bids and RFPs with issuing organization and dates. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/bbb-business-scraper/issues/open) or reach out via the [Apify Community Forum](https://community.apify.com/).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

BBB search result pages (bbb.org/search?...) or business profile pages (bbb.org/us/tx/dallas/profile/...).

## `scrapeDetails` (type: `boolean`):

Opens each business profile for contacts, website, complaints, reviews, dates and more. Turn off to save only what the search results list shows (name, phone, address, rating), which is faster and cheaper. Profile URLs are always scraped in full.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new or changed businesses. Businesses already saved with the same name, rating, phone and address are skipped and not charged. Each record gets a changeType: new or updated.

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

Maximum businesses saved for each search URL.

## `enrichLeads` (type: `boolean`):

Looks up each business's website for employee contacts (name, role, email, LinkedIn) and adds them as a 'leads' array. Needs the business to have a website. Adds a separate $0.022 charge per business where at least one contact was found.

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

Not needed: pages are loaded by the Actor's built-in service. Leave proxies off.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bbb.org/search?find_country=USA&find_entity=60075-000&find_latlng=32.78%2C-96.80&find_loc=Dallas%2C+TX&find_text=Lawyers&find_type=Category&page=1"
    }
  ],
  "scrapeDetails": true,
  "maxItems": 5,
  "enrichLeads": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.bbb.org/search?find_country=USA&find_entity=60075-000&find_latlng=32.78%2C-96.80&find_loc=Dallas%2C+TX&find_text=Lawyers&find_type=Category&page=1"
        }
    ],
    "maxItems": 5,
    "enrichLeads": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/bbb-business-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 = {
    "startUrls": [{ "url": "https://www.bbb.org/search?find_country=USA&find_entity=60075-000&find_latlng=32.78%2C-96.80&find_loc=Dallas%2C+TX&find_text=Lawyers&find_type=Category&page=1" }],
    "maxItems": 5,
    "enrichLeads": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/bbb-business-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 '{
  "startUrls": [
    {
      "url": "https://www.bbb.org/search?find_country=USA&find_entity=60075-000&find_latlng=32.78%2C-96.80&find_loc=Dallas%2C+TX&find_text=Lawyers&find_type=Category&page=1"
    }
  ],
  "maxItems": 5,
  "enrichLeads": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call confidential_gnat/bbb-business-scraper --silent --output-dataset

```

## MCP server setup

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