# BBB Scraper (`aurenic/bbb-scraper`) Actor

Extract Better Business Bureau business profiles, ratings, complaints, and B2B leads from bbb.org. Search by keyword and location across the US, Canada, and Mexico.

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

## Pricing

from $1.40 / 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.

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

## BBB Scraper

Extract Better Business Bureau business profiles, ratings, complaints, and B2B leads from bbb.org — the largest business trust directory in North America.

### What does BBB Scraper do?

Scrape BBB.org in two modes:

- **Search businesses** — pass keywords and locations, get every matching business with name, BBB letter rating, accreditation status, categories, address, phone, website, complaint count, and review average.
- **Fetch business profiles** — pass BBB business URLs, get the full profile: business management, years in business, employee count, customer complaints text, social links, and images.

Covers all BBB regions: **United States, Canada, and Mexico**. Pagination handled automatically up to BBB's 15-page cap per search.

BBB embeds all listing and profile data in an inline `webDigitalData` JSON blob inside a `<script>` tag — the actor reads this directly instead of parsing HTML tables.

### Output fields

#### Search results

| Field | Description |
|---|---|
| businessId | BBB entity ID |
| name | Business name |
| url | BBB profile URL |
| bbbRating | BBB letter rating (A+, A, B, F, …) |
| accreditationStatus | Whether the business is BBB-accredited |
| categories | Business categories |
| address / city / state / postalCode / country | Full address |
| phone | Business phone |
| websiteUrl | Business website |
| yearsInBusiness | Years in operation |
| complaintCount | Total complaints on file |
| reviewCount | Total customer reviews |
| reviewAverage | Average review score |
| searchTerm / searchLocation | The query that produced this result |

#### Business profile (full)

Adds `email`, `accreditedSince`, `businessStarted`, `businessManagement`, `numberOfEmployees`, `complaintCountLast3Years`, `customerComplaints`, `description`, `images`, `socialLinks`.

### Who is it for?

- **B2B sales teams** building prospect lists filtered by BBB rating and accreditation
- **Lead generation agencies** sourcing verified businesses by category and region
- **Compliance and risk teams** monitoring complaint volume across vendors
- **Market researchers** analyzing business density and reputation by metro area
- **Reputation managers** tracking BBB ratings for competitor sets
- **Data analysts** building North American business directories

### Pricing

**$2.80 per 1,000 results.** No subscription.

| Results | Cost |
|---|---|
| 100 | $0.28 |
| 1,000 | $2.80 |
| 10,000 | $28.00 |

### How to use it

1. Pick a **Mode** — search or fetch profiles by URL.
2. For search: enter **Search Terms** and **Locations**.
3. Set **Max Businesses** (default 100) and **Max Pages per Search** (default 5).
4. Optionally enable **Fetch Full Business Profiles** for richer records.
5. Click **Start**.

### Output example

```json
{
  "recordType": "search-result",
  "businessId": "1234567",
  "name": "ABC Home Builders Inc",
  "url": "https://www.bbb.org/us/ca/los-angeles/profile/home-builders/abc-home-builders-1216-1234567",
  "bbbRating": "A+",
  "accreditationStatus": "Accredited",
  "categories": ["Home Builders", "General Contractors"],
  "address": "1234 Main St",
  "city": "Los Angeles",
  "state": "CA",
  "postalCode": "90001",
  "country": "US",
  "phone": "(555) 123-4567",
  "websiteUrl": "https://abchomebuilders.example",
  "yearsInBusiness": 18,
  "complaintCount": 3,
  "reviewCount": 42,
  "reviewAverage": 4.7,
  "searchTerm": "Home Builders",
  "searchLocation": "Los Angeles, CA",
  "scrapedAt": "2026-09-21T10:00:00.000Z"
}
```

### Technical details

- Built with **Cheerio + got-scraping** (HTTP-only, no browser by default)
- BBB embeds listings and profiles as an inline `webDigitalData` JSON blob — the actor reads it directly, no HTML table parsing
- **Datacenter IPs tried first.** If you see `HTTP 403 (Cloudflare challenge)` in the logs, enable **Use Residential Proxy** in the input
- Automatic backoff on 429 and Cloudflare 403
- Pagination up to BBB's 15-page cap per search, with a configurable `maxPagesPerSearch`

### Known limits

- **BBB caps searches at 15 pages.** For deeper coverage, split searches by neighborhood, ZIP code, or subcategory.
- **Cloudflare protection is inconsistent.** Some IPs clear it, others don't. If datacenter IPs fail, residential proxy is pre-configured and one click away.
- **Detail mode adds one request per business.** Full profiles are 3–5× slower than search-only runs.
- **BBB content is user-submitted.** Ratings and complaints reflect reported data, not independently verified facts.

### FAQ

**Do I need a proxy?** Try without first. If you see HTTP 403 in the logs, enable Use Residential Proxy.

**How many businesses can I get per search?** BBB displays up to 15 pages per query. Result count per page varies by category and location.

**Does this include complaints text?** Only in detail mode (enable Fetch Full Business Profiles). Search results include the complaint count.

**Does this cover Canada and Mexico?** Yes. Pass Canadian or Mexican locations in the Locations field.

**How do I export data?** After a run, go to Storage → Export as JSON, CSV, Excel.

### Support

Open an issue on the Actor's page for bugs or feature requests.

# Actor input Schema

## `mode` (type: `string`):

What to scrape from BBB.

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

Business categories or keywords (e.g. 'Home Builders', 'Roofing Contractors').

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

Cities or regions to search in (e.g. 'Los Angeles, CA', 'New York, NY'). Leave empty for nationwide search.

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

Paste full BBB search URLs (e.g. https://www.bbb.org/search?find\_text=Home+Builders\&find\_loc=Los+Angeles%2C+CA).

## `businessUrls` (type: `array`):

BBB business profile URLs. Used only in details mode.

## `maxBusinesses` (type: `integer`):

Hard cap on businesses per run.

## `maxPagesPerSearch` (type: `integer`):

BBB caps pagination at 15 pages per search. Search results per page vary by category.

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

Open each business profile for the full record (email, employees, complaints, reviews). Slower — one extra request per business.

## `useResidentialProxy` (type: `boolean`):

Try datacenter first. If you see HTTP 403 in the logs, enable this.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "Home Builders"
  ],
  "locations": [
    "Los Angeles, CA"
  ],
  "startUrls": [],
  "businessUrls": [],
  "maxBusinesses": 100,
  "maxPagesPerSearch": 5,
  "includeDetails": false,
  "useResidentialProxy": false
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "Home Builders"
    ],
    "locations": [
        "Los Angeles, CA"
    ],
    "startUrls": [],
    "businessUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurenic/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": ["Home Builders"],
    "locations": ["Los Angeles, CA"],
    "startUrls": [],
    "businessUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("aurenic/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": [
    "Home Builders"
  ],
  "locations": [
    "Los Angeles, CA"
  ],
  "startUrls": [],
  "businessUrls": []
}' |
apify call aurenic/bbb-scraper --silent --output-dataset

```

## MCP server setup

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