# BBB Scraper: Business Leads, Ratings & New Reviews (`tenfoldfleet/bbb-scraper-leads-reviews`) Actor

Find businesses on the Better Business Bureau by category and city, with phone, address, BBB rating and accreditation, and get BBB reviews with business replies. Monitor mode returns only new reviews. $1 per 1,000 businesses or reviews; failed searches are free.

- **URL**: https://apify.com/tenfoldfleet/bbb-scraper-leads-reviews.md
- **Developed by:** [Tenfold Fleet](https://apify.com/tenfoldfleet) (community)
- **Categories:** Lead generation, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 businesses

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

### What does BBB Scraper do?

**BBB Scraper** pulls **business leads and customer reviews from the Better Business Bureau** (bbb.org). Type a category such as `plumber` and a city such as `Austin, TX`, and get one row per business with its **name, business phone, address, BBB rating (A+ to F), accreditation status, categories and map coordinates**. Turn on reviews to also get **BBB reviews** with star rating, date, text and the company's reply.

It works like a **BBB API**: it reads the same public JSON that bbb.org uses for its own search and review pages, over plain HTTP. No browser, no login, no residential proxy.

**Monitor mode** remembers which reviews it has already returned, so a scheduled run gives you **only the new BBB reviews** for your own company or your competitors.

Not affiliated with, endorsed or sponsored by the Better Business Bureau or the International Association of Better Business Bureaus.

### Why use it?

- **Local lead lists**: plumbers, roofers, dentists, auto shops, lawyers or any other BBB category, city by city, with phone numbers ready for a CRM.
- **Vetting suppliers and contractors**: check BBB rating and accreditation for a list of companies before you sign.
- **Reputation monitoring**: a scheduled run returns each new BBB review on your profile, or on a competitor's, once.
- **Market research**: compare ratings and review sentiment across a category or region.
- **AI agents and apps**: feed live BBB data into lead scoring, due-diligence or customer-service tools.

Runs on the Apify platform, so you also get an **API**, scheduling, webhooks and integrations with Make, Zapier, n8n and Google Sheets.

### What data can it extract?

**Business rows** (`type: "business"`)

| Field | Example |
|---|---|
| `businessName`, `primaryCategory`, `categories[]` | `Calixto Plumbing`, `Plumber`, `["Plumber", "Commercial Plumber"]` |
| `rating`, `ratingScore`, `accredited` | `A+`, `98.49`, `true` |
| `phone`, `phones[]` | `(512) 945-3143` (business phone numbers only) |
| `address`, `city`, `state`, `postalCode`, `country` | `8410 Georgian Dr # B`, `Austin`, `TX`, `78753-6003`, `USA` |
| `latitude`, `longitude` | `30.3`, `-97.76` |
| `profileUrl`, `reviewsUrl`, `logoUrl` | links to the BBB profile, its reviews and logo |
| `localBbb`, `businessId`, `bbbId` | `BBB Heart of Texas`, `1000223803`, `0825` |
| `reviewCount` | total BBB reviews (when reviews are on) |
| `searchTerm`, `searchLocation`, `position` | which search found it and where it ranked |

**Review rows** (`type: "review"`)

| Field | Example |
|---|---|
| `reviewId`, `stars`, `date` | `0292_1922_163715`, `1`, `2026-10-24` |
| `reviewerName` | `Misty I` (first name and initial, as bbb.org shows it) |
| `text` | full review text |
| `businessResponse`, `businessResponseDate` | the company's public reply and its date |
| `replies[]` | the whole back-and-forth: business, customer and BBB replies |
| `businessName`, `profileUrl` | which business the review belongs to |

### How to scrape BBB business leads and reviews

1. Open the Actor and enter one or more **categories or keywords** (`plumber`, `roofing contractors`).
2. Add **locations** as `City, ST`, `City, Province` (Canada) or ZIP codes, and pick the country.
3. Set **Max businesses per search** (bbb.org shows at most 225 per search).
4. Optional: tick **Include BBB reviews**, or paste **BBB profile URLs** to get reviews for specific companies.
5. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the API.

To **monitor new reviews**, paste the profile URLs, tick **Only new reviews**, and add a daily or weekly schedule.

### How much does it cost?

Pay per result:

- **$1 per 1,000 businesses** ($0.001 each)
- **$1 per 1,000 reviews** ($0.001 each)
- plus a tiny start fee of $0.00005 per run

**Free:** searches with no results, locations bbb.org does not recognise, invalid URLs, failed requests and duplicates (a business found by several searches is saved and charged once). On the Apify free plan, the $5 monthly credit covers about **5,000 businesses or reviews**. Set a **maximum cost per run** and the Actor stops when it reaches it.

A monitor run that finds no new reviews costs almost nothing.

### Input

```json
{
    "searchTerms": ["plumber", "electrician"],
    "locations": ["Austin, TX", "Dallas, TX", "78701"],
    "country": "USA",
    "maxResultsPerSearch": 100,
    "accreditedOnly": false,
    "includeReviews": true,
    "maxReviewsPerBusiness": 20
}
```

Review monitor:

```json
{
    "profileUrls": ["https://www.bbb.org/us/oh/cincinnati/profile/plumber/roto-rooter-plumbing-water-cleanup-0292-1922"],
    "onlyNewReviews": true,
    "monitorStoreName": "my-competitors"
}
```

### Output

```json
{
    "type": "business",
    "businessName": "Calixto Plumbing",
    "accredited": true,
    "rating": "A+",
    "ratingScore": 98.49,
    "primaryCategory": "Plumber",
    "phone": "(512) 945-3143",
    "address": "8410 Georgian Dr # B",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78753-6003",
    "latitude": 30.3,
    "longitude": -97.76,
    "profileUrl": "https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803",
    "reviewCount": 1
}
```

```json
{
    "type": "review",
    "reviewId": "0825_1000223803_517929",
    "stars": 1,
    "date": "2025-07-08",
    "reviewerName": "Karey R",
    "text": "This company charged me $2800 to replace a water heater. That was outrageous!",
    "businessResponse": null,
    "businessName": "Calixto Plumbing",
    "profileUrl": "https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803"
}
```

Download the dataset as JSON, CSV, Excel or HTML, or filter it by `type` to split businesses from reviews.

### Tips

- **More than 225 results?** bbb.org stops each search at 15 pages of 15. Split big areas into several cities or ZIP codes; duplicates across searches are removed for free.
- **Monitoring**: use profile URLs rather than searches, so each run only pays for new reviews. Keep one **Monitor name** per list you track.
- **Accredited only** skips non-accredited businesses at no charge.
- Datacenter proxy (the default) is enough for bbb.org.

### FAQ

#### Does it scrape BBB complaints?

No. It returns business listings and customer reviews only.

#### Does it return emails or personal phone numbers?

No. Phones are the business numbers listed on bbb.org. Reviewer names are shown the way bbb.org shows them (first name and last initial).

#### Does it work for Canada?

Yes. Set **Country** to Canada and use locations like `Toronto, ON`.

#### How fresh is the data?

Every run reads bbb.org live, and reviews come newest first.

#### Is it legal to scrape BBB?

The Actor reads only public pages and does not log in. Business listings can still contain personal data (for example sole traders), which may be protected by GDPR, CCPA and similar laws. Use the data only for legitimate purposes and check with your lawyer if you are unsure.

# Actor input Schema

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

What to search for on bbb.org, e.g. "plumber", "roofing contractors", "dentist" or a company name. Each term is searched in every location below.

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

Cities as "City, ST" (e.g. "Austin, TX"), "City, Province" for Canada (e.g. "Toronto, ON") or ZIP codes. bbb.org shows at most 225 businesses per search, so for big lists add more cities instead of one large area. Leave empty to search without a location.

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

USA or Canada.

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

Most businesses to save for each term + location pair (bbb.org caps a search at 225). Each saved business is one charged result ($0.001). On the Apify free plan, the $5 monthly credit covers about 5,000 businesses or reviews.

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

Keep only BBB Accredited Businesses. Skipped businesses are not charged.

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

Also fetch customer reviews for every business found by the search (one row per review, $0.001 each) and add the review count to each business row.

## `profileUrls` (type: `array`):

Business profile links from bbb.org, e.g. https://www.bbb.org/us/oh/cincinnati/profile/plumber/roto-rooter-plumbing-water-cleanup-0292-1922. The Actor returns the reviews for each one. Use it with "Only new reviews" to monitor your own business or competitors.

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

Newest reviews first. Each review is one charged result ($0.001).

## `onlyNewReviews` (type: `boolean`):

Return only reviews posted since the previous run with the same monitor name. The first run returns the newest reviews and remembers them. Schedule the Actor daily or weekly to catch new BBB reviews. Turns on review fetching.

## `monitorStoreName` (type: `string`):

Name of the key-value store in your Apify account that keeps the review IDs already seen. Use a different name for each separate monitor.

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

Parallel requests to bbb.org. Keep it low to avoid rate limits.

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

Apify datacenter proxy works for bbb.org. Residential proxy is not needed.

## Actor input object example

```json
{
  "searchTerms": [
    "plumber"
  ],
  "locations": [
    "Austin, TX"
  ],
  "country": "USA",
  "maxResultsPerSearch": 30,
  "accreditedOnly": false,
  "includeReviews": false,
  "maxReviewsPerBusiness": 20,
  "onlyNewReviews": false,
  "monitorStoreName": "bbb-review-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": [
        "plumber"
    ],
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/bbb-scraper-leads-reviews").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": ["plumber"],
    "locations": ["Austin, TX"],
}

# Run the Actor and wait for it to finish
run = client.actor("tenfoldfleet/bbb-scraper-leads-reviews").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": [
    "plumber"
  ],
  "locations": [
    "Austin, TX"
  ]
}' |
apify call tenfoldfleet/bbb-scraper-leads-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tenfoldfleet/bbb-scraper-leads-reviews"
        }
    }
}
```

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/VTBe0sLOqSecv2PNW/builds/rV3n6ZrUpyl81bZ6x/openapi.json
