# BBB Scraper 🏢 US Leads by Rating, Complaints & Owners (`tagadanar/bbb-scraper`) Actor

Turn Better Business Bureau into a lead and reputation list: BBB rating, accreditation, complaint and review counts, owner name, phone, website and full address for any business type in any US city. BBB's own developer API is approval-gated; this reads the public profiles. No key.

- **URL**: https://apify.com/tagadanar/bbb-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 5 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 business profile scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 — US Business Leads Filtered by Rating, Accreditation and Complaints

Turn the **Better Business Bureau** (bbb.org) into a qualified US lead list. Give it a business type and a city, or paste profile URLs, and it returns the full BBB record for each business: the A+ to F rating, accreditation status and date, complaint and review counts, the owner or principal, phone, website and full address, all as JSON you can drop straight into a spreadsheet or a pipeline.

**What makes this one different: it filters before it hands you the list.** Ask for *A-rated accredited plumbers in Charlotte* and that is what you get — or invert it and ask for every roofer in the metro that has **complaints on file**. Businesses that do not match are free and do not count toward your `maxResults`, so a run of 100 gives you 100 businesses you actually wanted.

#### How the filters compare

Input options of the eight busiest BBB Actors on the Apify Store, read from their public input schemas on 2026-08-09:

| Filter | This Actor | How many of the other 8 have it |
| --- | :---: | :---: |
| **Only businesses with complaints on file** | ✅ | **0 of 8** |
| Minimum BBB rating (A+ … F) | ✅ | 3 of 8 |
| BBB Accredited only | ✅ | 5 of 8 |
| Non-matching businesses are free and don't use up your limit | ✅ | not offered by any |

#### Reliability

Public 30-day run statistics from the Apify Store API, same source for every row, read 2026-08-09. Run counts differ a lot — they are shown so you can judge the sample yourself:

| Actor | Failed + timed-out runs (30 d) |
| --- | --- |
| **This Actor** | **0.0%** — 0 of 33 |
| Busiest BBB Actor on the Store | 0.0% — 0 of 5,396 |
| Second-busiest | 4.3% — 51 of 1,186 |
| Third-busiest | 5.2% — 35 of 670 |

### What you get per business

| Field | Description |
| --- | --- |
| `businessName` | Business name as listed on BBB |
| `bbbRating` | BBB letter grade, A+ down to F |
| `isAccredited`, `accreditationSince` | BBB Accreditation status and the date it started |
| `yearsInBusiness`, `businessStarted` | Years trading and the start date |
| `reviewCount`, `avgRating` | Customer review count and average star rating |
| `complaintsTotal` | All complaints on file |
| `complaintsLast3Years`, `complaintsLast12Months` | Complaints closed in the last 3 years and 12 months |
| `ownerName`, `ownerTitle` | The principal or owner and their title |
| `contacts` | Named management contacts with their titles |
| `phone`, `email`, `website`, `faxNumber` | Business contact details as published on BBB |
| `streetAddress`, `city`, `state`, `zipCode` | Full address, split into fields |
| `formattedAddress`, `latitude`, `longitude` | One-line address and coordinates |
| `categories` | The BBB categories the business is listed under |
| `numberOfEmployees`, `description` | Company size and the BBB description |
| `isClaimed`, `isOutOfBusiness` | Status flags |
| `latestReviews` | A few recent review snippets when present |
| `profileUrl`, `scrapedAt` | Link to the BBB profile and the run timestamp |

### Who uses it

- **Lead-generation and sales teams** building call lists for a trade in a territory, pre-qualified by BBB rating and accreditation so nobody wastes a dial on an F-rated shop.
- **Reputation and compliance researchers** pulling complaint and review history across a set of companies, or sweeping a metro for the businesses that *have* complaints.
- **Agencies** finding local businesses with a solid BBB record to pitch services to.
- **Data pipelines** that need business directory data as clean JSON, with no API key and no partner agreement.

### Input examples

One trade in one city:

```json
{
  "searchTerm": "plumbers",
  "location": "Charlotte, NC",
  "maxResults": 50
}
```

Only accredited businesses rated A or better, with complaints on file, for reputation research:

```json
{
  "searchTerm": "roofing contractor",
  "location": "Dallas, TX",
  "minRating": "A",
  "accreditedOnly": true,
  "hasComplaints": true,
  "maxResults": 100
}
```

Scrape specific businesses by profile URL:

```json
{
  "businessUrls": [
    "https://www.bbb.org/us/nc/charlotte/profile/heating-and-air-conditioning/morris-jenkins-0473-100291"
  ]
}
```

### Filters

- **Minimum BBB rating**: keep only businesses rated at least A+, A, B and so on down to F.
- **Accredited only**: return only BBB Accredited businesses.
- **Has complaints**: return only businesses with at least one complaint on file.

Filtered-out businesses do not count toward your `maxResults`, so a run of 100 gives you 100 businesses that match. Rating and accreditation are read straight off BBB's search results, so non-matching businesses are skipped before their profile is downloaded.

### Output sample

```json
{
  "businessName": "Morris-Jenkins",
  "bbbRating": "A+",
  "isAccredited": true,
  "accreditationSince": "1963-12-01",
  "yearsInBusiness": 67,
  "reviewCount": 874,
  "avgRating": 4.77,
  "complaintsTotal": 39,
  "complaintsLast3Years": 39,
  "complaintsLast12Months": 12,
  "ownerName": "Mr. Dewey Jenkins",
  "ownerTitle": "Owner",
  "phone": "(704) 357-0484",
  "email": "service@morrisjenkins.com",
  "website": "https://morrisjenkins.com/",
  "streetAddress": "13725 S Ridge Dr",
  "city": "Charlotte",
  "state": "NC",
  "zipCode": "28273-7279",
  "categories": [
    "Heating and Air Conditioning",
    "Air Conditioning Contractor",
    "Plumber"
  ],
  "profileUrl": "https://www.bbb.org/us/nc/charlotte/profile/heating-and-air-conditioning/morris-jenkins-0473-3000123",
  "scrapedAt": "2026-08-05T09:14:22.317Z"
}
```

### Pricing

You pay per business profile returned. Businesses that fail to load, or that your rating, accreditation or complaint filters rule out, are free.

| Event | Price |
| --- | --- |
| Business profile | **$0.0025 each** ($2.50 per 1,000) |
| Actor start | $0.001 per run |

So 500 profiles costs **$1.25** plus the start fee. The tiny start fee covers runs that return nothing; on any normal search it is noise next to the per-profile price. Apify platform usage (compute and the US residential proxy this Actor uses to reach bbb.org) is billed separately to your run at Apify's rates.

**The rating and accreditation filters now run on the search listing, before a profile is ever fetched.** BBB's own search results already state each business's rating and accreditation, so a run with `minRating` or `accreditedOnly` set skips the businesses that cannot match instead of downloading them and throwing them away. That is your platform-usage bill, so the filters are now close to free to use rather than something you pay for twice.

### Known limits

Stated up front so you can judge the fit before you spend anything:

- **United States only.** BBB's Canadian businesses are not covered.
- **Throughput.** Profiles are fetched five at a time, which comfortably completes a few thousand businesses inside the default one-hour run timeout. `maxResults` is capped at 5,000 for that reason, and each search term + location combination reaches about 600 businesses, so wide jobs want several terms or several cities rather than one huge number.
- **`hasComplaints` is the one filter that cannot be answered from the search listing** — BBB's search results carry no complaint count, so this filter still has to open each profile to check. If almost nothing in your search has complaints on file, the run stops early and tells you so in its status message rather than grinding through thousands of businesses you will not be charged for anyway.

### FAQ

**Do I need an API key or a BBB partner account?** No. The actor brings everything it needs, so there is nothing to sign up for.

**Which countries?** United States businesses, where BBB has the deepest coverage. Search by city and state or by ZIP code.

**How do I search many cities?** Run the actor once per city, or set up a task per territory. Paste profile URLs when you already know the exact businesses.

**Do I get an email address?** BBB lists a phone, website and address for most businesses and an email for some. The `email` field is filled when BBB publishes one; otherwise use the `website` field to enrich emails downstream.

**Is the owner name always there?** BBB publishes a principal or management contact for most established businesses. When none is listed, `ownerName` is null rather than a guess.

**Why is a business missing?** Very new or unlisted businesses may not have a BBB profile, and businesses can be filtered out by your rating, accreditation or complaint options.

***

### Something missing?

If you need an extra field, complaint detail text, or another directory, open an issue on this Actor and describe it. I read every request and small additions usually ship within days. More lead generation Actors are on [my profile](https://apify.com/tagadanar).

*BBB scraper, Better Business Bureau scraper, BBB business profiles, BBB rating scraper, business complaints data, business reviews, accredited business list, lead generation, business directory scraper, owner contact data, reputation research.*

# Actor input Schema

## `searchTerm` (type: `string`):

What to look for on BBB, e.g. <code>plumbers</code>, <code>roofing contractor</code>, or a business name. Use this together with a location below. Leave empty if you paste profile URLs instead.

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

City and state (<code>Charlotte, NC</code>), a ZIP code, or a metro area to search in. Used with the business type above.

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

Paste one or more BBB profile URLs to scrape those businesses directly, e.g. <code>https://www.bbb.org/us/nc/charlotte/profile/heating-and-air-conditioning/morris-jenkins-0473-100291</code>. Use this instead of a search when you already know the businesses.

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

Only return businesses rated at least this well. Leave empty to return every rating.

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

Return only businesses that are BBB Accredited.

## `hasComplaints` (type: `boolean`):

Return only businesses that have at least one complaint on file. Useful for reputation research.

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

How many business profiles to return across your search. Profiles filtered out by the options above do not count toward this limit, and you are never charged for them. Each search term + location combination can reach about 600 businesses, so raise this together with more terms or more locations.

## Actor input object example

```json
{
  "searchTerm": "plumbers",
  "location": "Charlotte, NC",
  "businessUrls": [],
  "accreditedOnly": false,
  "hasComplaints": false,
  "maxResults": 20
}
```

# Actor output Schema

## `profiles` (type: `string`):

One item per business 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 = {
    "searchTerm": "plumbers",
    "location": "Charlotte, NC",
    "businessUrls": [],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = {
    "searchTerm": "plumbers",
    "location": "Charlotte, NC",
    "businessUrls": [],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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 '{
  "searchTerm": "plumbers",
  "location": "Charlotte, NC",
  "businessUrls": [],
  "maxResults": 20
}' |
apify call tagadanar/bbb-scraper --silent --output-dataset

```

## MCP server setup

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