# BBB Scraper - Better Business Bureau Data (`parsebird/bbb-scraper`) Actor

Scrape Better Business Bureau (BBB.org) business listings by keyword and location. Get BBB rating, accreditation, address, phone, categories, and — with detail mode — complaints, reviews, owner, licenses, and social media. USA and Canada. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/bbb-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 search 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?

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)

Extract business listings from **[Better Business Bureau (BBB.org)](https://www.bbb.org)** by keyword and location. The **BBB Scraper** returns the BBB letter-grade rating, accreditation status, contact details, and categories for every business — and, with detail mode, the full profile: complaints, customer reviews, owner name, license numbers, social media, business start date, and employee count. Covers the **United States and Canada**.

<table><tr>
<td style="border-left:4px solid #00457C;padding:12px 16px;font-weight:600">
Turn any BBB.org search into a structured vendor list — rating, accreditation, phone, address, and categories in search mode; complaints, reviews, licenses, owner, and social media in detail mode — ready for lead lists, vendor vetting, and risk scoring.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/bbb-scraper (Apify). Scrapes business listings from bbb.org (Better Business Bureau), USA + Canada.
Call with ApifyClient:
  client.actor("parsebird/bbb-scraper").call(run_input={
    "keyword": "roofing contractor",       # business type / profession / company name
    "location": "Dallas, TX",               # city+state, state, or ZIP / postal code
    "country": "USA",                       # USA | CAN
    "sort": "Relevance",                    # Relevance | Rating | Distance | Name
    "accreditedOnly": false,                # only BBB Accredited businesses
    "scrapeDetails": false,                 # true = open each profile for complaints/reviews/owner/licenses/social
    "searchUrls": [],                       # optional: pre-built https://www.bbb.org/search?... URLs
    "maxResults": 100,
    "maxPages": 10,                         # BBB caps at 15 pages (~225 results) per search
    "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}
  })
Output per business: businessName, profileUrl, bbbId, bbbRating, isAccredited, accreditationSince, address, city,
  state, zipCode, phone, email, website, categories[], serviceAreas[], yearsInBusiness, businessStartDate,
  businessType, numberOfEmployees, ownerName, licenseNumbers[], complaintsTotal, complaintsLast3Yrs,
  complaintsLast12Mo, reviewCount, averageReviewRating, socialMedia{}, governmentActions, description,
  searchKeyword, searchLocation, scrapedAt.  (detail fields are null unless scrapeDetails=true)
API docs: https://apify.com/parsebird/bbb-scraper/api  |  Token: https://console.apify.com/account/integrations
```

### What is the BBB Scraper?

The **BBB Scraper** is a data-extraction tool for **BBB.org**, the Better Business Bureau directory of accredited and non-accredited North American businesses. BBB has no public data API, so this actor is a **BBB API alternative**: give it a business type and a place and it returns a clean dataset of matching businesses with their **BBB rating** and **accreditation status**.

- **Search mode** (default, fast) pulls the rating, accreditation flag, phone, address, and categories for every business in the search results.
- **Detail mode** opens each BBB business profile and adds complaints history, customer review stats, owner / management contact, registered license numbers, social media links, business start date, employee count, and the full street address.

### What can the BBB Scraper do?

- 🔎 Search BBB by **business type, profession, or company name** and by **city, state, or ZIP / postal code**.
- 🇺🇸🇨🇦 Cover the **United States and Canada** (the `country` input drives BBB's `find_country`).
- ⭐ Get the **BBB letter grade** (A+ … F, or NR) and **BBB Accreditation** status for every result.
- 🔗 Feed it **pre-built BBB search URLs** to reuse curated queries and filters.
- 🧾 **Detail mode**: complaints (all-time, last 3 years, last 12 months), review count and average rating, owner name, license numbers, social media, government actions, and the "About this business" description.
- ✅ Filter to **BBB Accredited only**, and sort by relevance, rating, distance, or name.
- ⏱️ Run on a **schedule**, call it by **API**, and export to **JSON, CSV, Excel, HTML, or XML**.

### What data can you extract from BBB.org?

| Field | Description |
|-------|-------------|
| `businessName` | Company / DBA name as displayed by BBB |
| `profileUrl` | Canonical BBB profile URL |
| `bbbId` | BBB's stable business identifier |
| `bbbRating` | Letter grade — A+, A, A-, B+, B, B-, C+, C, C-, D+, D, D-, F, or NR |
| `isAccredited` | `true` if "BBB Accredited Business since…", `false` if "Not BBB Accredited", `null` if undetermined |
| `accreditationSince` | Accreditation start date *(detail mode)* |
| `address` / `city` / `state` / `zipCode` | Business address as reported to BBB |
| `phone` / `email` / `website` | Contact details (obfuscated emails are decoded) *(email/website: detail mode)* |
| `categories` | BBB business categories |
| `serviceAreas` | Cities / regions the business reports serving *(detail mode)* |
| `yearsInBusiness` / `businessStartDate` | Time in operation *(detail mode)* |
| `businessType` | Legal structure — LLC, Corporation, Inc, Sole Proprietorship, Partnership, LP, LLP *(detail mode)* |
| `numberOfEmployees` | Employee count as printed on BBB *(detail mode)* |
| `ownerName` | Owner / principal / management contact *(detail mode)* |
| `licenseNumbers` | License numbers registered with BBB *(detail mode)* |
| `complaintsTotal` / `complaintsLast3Yrs` / `complaintsLast12Mo` | BBB complaints closed *(detail mode)* |
| `reviewCount` / `averageReviewRating` | Customer review count and 1–5 average *(detail mode)* |
| `socialMedia` | `{ facebook, linkedin, twitter, instagram }` — the business's own accounts *(detail mode)* |
| `governmentActions` | Summary of government / regulatory actions on the profile *(detail mode)* |
| `description` | "About this business" narrative *(detail mode)* |
| `searchKeyword` / `searchLocation` / `scrapedAt` | Provenance |

### How to scrape BBB.org

1. Open the **BBB Scraper** and go to the **Input** tab.
2. Enter a **Keyword** (e.g. `plumber`, `HVAC`, `home builder`) and a **Location** (`Dallas, TX`, `California`, `90210`, `Toronto, ON`).
3. Choose **Country** (USA or CAN) and a **Sort order**.
4. *(Optional)* Turn on **BBB Accredited only**.
5. *(Optional)* Turn on **Scrape details** to enrich every result with complaints, reviews, owner, licenses, and social media. Detail mode needs the run to have **2 GB memory** and a proxy.
6. Set **Max results** and **Max pages** (BBB returns at most ~225 businesses per search).
7. Click **Start** and download the results as JSON, CSV, or Excel from the **Output** tab.

#### Using pre-built search URLs

Run a search on bbb.org, copy the `https://www.bbb.org/search?...` URL, and paste it into **Search URLs**. Each URL is walked page by page; `keyword`, `location`, `country`, and `sort` are taken from the URL.

### BBB Rating Reference

BBB issues one letter-grade rating per business on a 13-point scale plus a "not rated" bucket. The grade is computed from complaint history, transparency of the business, time in operation, government action, advertising practices, and licensing. **Accreditation and rating are independent** — a business can be A+ and not accredited (never applied), or B- and accredited (passed the standards review despite mixed complaints). Score risk with both `bbbRating` and `isAccredited`.

**Investment-grade (low risk, default vendor whitelist)**

| Rating | Meaning |
|--------|---------|
| A+ | Top score — clean complaint history, transparent, tenured |
| A | Excellent — minor blemishes, all resolved |
| A- | Very good — a small number of unresolved items |

**Sub-investment (still operating, vet manually)**

| Rating | Meaning |
|--------|---------|
| B+ / B / B- | Above average — review complaint themes before engagement |
| C+ / C / C- | Average — a pattern of complaints or limited transparency |
| D+ / D / D- | Poor — recurring unresolved complaints, government action, or short history |

**Distressed (high risk, recommend exclude)**

| Rating | Meaning |
|--------|---------|
| F | Worst rating — unresolved complaints, fraud allegations, or refusal to engage with BBB |
| NR | Not Rated — insufficient information or business too new |

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

This actor uses **pay-per-event** pricing with two events:

| Event | What it is | Free | Bronze | Silver | Gold |
|-------|-----------|------|--------|--------|------|
| Search result | one business from search mode | **$0.99 / 1,000** | $0.89 | $0.79 | $0.69 |
| Business detail | one fully enriched profile (detail mode) | **$3.99 / 1,000** | $3.49 | $2.99 | $2.49 |

A 500-business search-mode run costs about **$0.50** on the Free plan. Enriching those 500 profiles costs about **$2.00**. Apify's free monthly usage credits cover thousands of records.

### Input

```json
{
  "keyword": "roofing contractor",
  "location": "Dallas, TX",
  "country": "USA",
  "sort": "Relevance",
  "accreditedOnly": false,
  "scrapeDetails": false,
  "maxResults": 100,
  "maxPages": 10,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

### Output example

Search-only record (`scrapeDetails: false`):

```json
{
  "businessName": "Skyline Roofing & Solar",
  "profileUrl": "https://www.bbb.org/us/tx/dallas/profile/roofing-contractors/skyline-roofing-solar-0875-90719612",
  "bbbId": "90719612",
  "bbbRating": "A+",
  "isAccredited": true,
  "accreditationSince": null,
  "address": null,
  "city": "Dallas",
  "state": "TX",
  "zipCode": "75254",
  "phone": "+1 214 555 0142",
  "email": null,
  "website": null,
  "categories": ["Roofing Contractors", "Solar Energy Contractors"],
  "serviceAreas": null,
  "searchKeyword": "roofing contractor",
  "searchLocation": "Dallas, TX",
  "scrapedAt": "2026-05-16T14:22:11.401Z"
}
```

Fully enriched record (`scrapeDetails: true`):

```json
{
  "businessName": "Northstar HVAC Services LLC",
  "profileUrl": "https://www.bbb.org/us/az/phoenix/profile/heating-and-air-conditioning/northstar-hvac-services-1126-99999001",
  "bbbId": "99999001",
  "bbbRating": "A",
  "isAccredited": true,
  "accreditationSince": "3/14/2014",
  "address": "2400 W Camelback Rd Ste 210",
  "city": "Phoenix",
  "state": "AZ",
  "zipCode": "85015",
  "phone": "+1 602 555 0188",
  "email": "service@northstar-hvac.example",
  "website": "https://northstar-hvac.example",
  "categories": ["Heating and Air Conditioning", "Air Duct Cleaning", "Furnace Repair"],
  "serviceAreas": ["Phoenix, AZ", "Scottsdale, AZ", "Tempe, AZ", "Mesa, AZ"],
  "yearsInBusiness": 17,
  "businessStartDate": "1/1/2008",
  "businessType": "LLC",
  "numberOfEmployees": "25",
  "ownerName": "Ms. Maria S. Alvarez",
  "licenseNumbers": ["ROC 99999", "ROC 99998"],
  "complaintsTotal": 12,
  "complaintsLast3Yrs": 7,
  "complaintsLast12Mo": 2,
  "reviewCount": 184,
  "averageReviewRating": 4.6,
  "socialMedia": {
    "facebook": "https://www.facebook.com/northstarhvacaz",
    "linkedin": "https://www.linkedin.com/company/northstar-hvac",
    "instagram": "https://www.instagram.com/northstar.hvac/"
  },
  "governmentActions": null,
  "description": "Full-service residential and commercial HVAC contractor serving the Phoenix metro since 2008.",
  "searchKeyword": "HVAC",
  "searchLocation": "Phoenix, AZ",
  "scrapedAt": "2026-05-16T14:25:48.117Z"
}
```

### Use cases

- 🧰 **Vendor & supplier vetting** — pull a rated shortlist of contractors before you engage.
- 📇 **Lead generation** — build local B2B lists filtered to a minimum BBB grade or accreditation.
- 🛡️ **Risk & compliance** — flag vendors with F ratings, government actions, or spikes in recent complaints.
- 📊 **Market research** — measure accreditation rates and complaint volume by industry and metro.
- 🏗️ **Sales prospecting** — target accredited businesses in a category and city with owner names and phones.

### How it works

1. In search mode the actor queries BBB's public search endpoint and reads the businesses page by page (BBB serves up to 15 pages of 15).
2. Each result is mapped to the output schema with rating, accreditation, address, phone, and categories.
3. In detail mode a stealth browser opens each BBB profile (BBB profiles sit behind Cloudflare), and the structured profile state is parsed for complaints, reviews, owner, licenses, social media, and firmographics.
4. Rows are pushed to the dataset. You are charged one **search-result** event per row, or one **business-detail** event per enriched row.

### FAQ

**Does it cover Canada?**
Yes. Set `country` to `CAN` and use a Canadian location like `Toronto, ON` or a postal code.

**Why does BBB only return ~225 results per search?**
BBB's search is capped at 15 pages of 15. For larger jobs, narrow the keyword or location, or supply several `searchUrls` covering different areas.

**What's the difference between accreditation and rating?**
They are independent. `isAccredited` means the business applied and met BBB's accreditation standards; `bbbRating` is the letter grade computed from complaint history and other factors. See the BBB Rating Reference above.

**Why are `email`, `website`, and complaint counts null in my results?**
Those come from the business profile page. Turn on **Scrape details** to collect them. In search mode only the fields BBB exposes in search results are filled.

**Do I need a proxy?**
Search mode works without one. Detail mode opens Cloudflare-protected profile pages, so a proxy (Residential, US) is required and pre-selected.

**How current is the data?**
It is scraped live from BBB.org on each run. Use Apify [scheduling](https://docs.apify.com/platform/schedules) to keep a dataset fresh.

**Something looks wrong or missing.**
Open the **Issues** tab on the actor page with an example input and we will take a look.

### API usage examples

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("parsebird/bbb-scraper").call(run_input={
    "keyword": "electrician",
    "location": "Austin, TX",
    "country": "USA",
    "accreditedOnly": True,
    "maxResults": 200,
})

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

**JavaScript**

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

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

const run = await client.actor('parsebird/bbb-scraper').call({
    keyword: 'HVAC',
    location: 'Phoenix, AZ',
    country: 'USA',
    scrapeDetails: true,
    maxResults: 50,
    proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'], apifyProxyCountry: 'US' },
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((it) => console.log(it.businessName, it.bbbRating, it.complaintsTotal));
```

### Related actors

- [Yellow Pages Scraper](https://apify.com/parsebird/yellowpages-scraper) — US business directory listings.
- [Google Maps scrapers on Apify Store](https://apify.com/store?search=google%20maps) — place data and reviews.
- [Ebay Kleinanzeigen Scraper](https://apify.com/parsebird/ebay-kleinanzeigen-scraper) — German classifieds.

### Legal and compliance

This actor collects information that BBB.org publishes publicly and does not log in or bypass access controls beyond rendering a page as an ordinary browser would. Ratings, complaint counts, and reviews are BBB's own published data; business names, owner names, and contact details may be personal data, and if you store or process them you must comply with the GDPR, CCPA, and other applicable law. You use this actor at your own responsibility. It is not affiliated with, endorsed by, or connected to the Better Business Bureau or the International Association of Better Business Bureaus.

# Actor input Schema

## `searchUrls` (type: `array`):

Pre-built BBB search URLs (https://www.bbb.org/search?...). When provided, keyword / location / country / sort are ignored and each URL is walked through Max pages.

## `keyword` (type: `string`):

Business type, profession, or company name. Examples: plumber, HVAC, home builder, electrician, moving company, auto repair, dentist.

## `location` (type: `string`):

City + state, state only, or ZIP / postal code. Examples: Dallas, TX / California / 90210 / Toronto, ON.

## `country` (type: `string`):

USA for the United States, CAN for Canada.

## `sort` (type: `string`):

Sort order for search results.

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

Only return listings that are BBB Accredited.

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

Open every business profile page and fill complaints, reviews, owner, license numbers, social media, business start date, employee count, and full address. Adds a few seconds per business and requires 2 GB memory.

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

Hard cap on total businesses saved. 0 means unlimited (up to what BBB returns).

## `maxPages` (type: `integer`):

Maximum search pages walked per query. BBB serves at most 15 pages (~225 results) per search — narrow the query or add more Search URLs for larger jobs.

## `requestDelay` (type: `integer`):

Delay between requests. Values above 2000 ms are capped.

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

Parallel profile workers when Scrape details is on. Capped at 2.

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

Proxy settings. Search works without a proxy. Detail mode needs a proxy — Residential (US) is recommended — because BBB profile pages are behind Cloudflare.

## Actor input object example

```json
{
  "searchUrls": [],
  "keyword": "roofing contractor",
  "location": "Dallas, TX",
  "country": "USA",
  "sort": "Relevance",
  "accreditedOnly": false,
  "scrapeDetails": false,
  "maxResults": 50,
  "maxPages": 10,
  "requestDelay": 500,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchUrls": [],
    "keyword": "roofing contractor",
    "location": "Dallas, TX",
    "country": "USA",
    "sort": "Relevance",
    "maxResults": 50,
    "maxPages": 10,
    "requestDelay": 500,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "searchUrls": [],
    "keyword": "roofing contractor",
    "location": "Dallas, TX",
    "country": "USA",
    "sort": "Relevance",
    "maxResults": 50,
    "maxPages": 10,
    "requestDelay": 500,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "searchUrls": [],
  "keyword": "roofing contractor",
  "location": "Dallas, TX",
  "country": "USA",
  "sort": "Relevance",
  "maxResults": 50,
  "maxPages": 10,
  "requestDelay": 500,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call parsebird/bbb-scraper --silent --output-dataset

```

## MCP server setup

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