# BBB Scraper 🏢 (ratings, complaints, contacts) (`tagadanar/bbb-scraper`) Actor

Turn Better Business Bureau into a clean 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. No API key, no subscription, one flat price per profile.

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

## Pricing

from $1,743.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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: Business Ratings, Complaints, Reviews and Owner Contacts

Turn the Better Business Bureau into a clean, structured dataset. 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.

Most BBB scrapers make you choose: cheap but shallow (a rating and a phone) or complete but slow and flaky. This one aims for both, the complete record at a fair price, so a lead list and a reputation check come out of the same run.

### 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 rating and accreditation.
- **Reputation and compliance researchers** pulling complaint and review history across a set of companies.
- **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.

### Pricing

You pay per business profile returned. Businesses that fail to load or are filtered out are free.

| Event | Price |
| --- | --- |
| Business profile | $2.49 each |
| Actor start | $0.001 per run |

The tiny start fee covers runs that return nothing; on any normal search it is noise next to the per-profile price. This undercuts the complete-record scrapers and gives you more than the cheap ones for close to their price. Apify platform usage (compute and US residential proxy) is billed separately to your run at Apify's rates.

### 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.

## 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tagadanar/bbb-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "BBB Scraper 🏢 (ratings, complaints, contacts)",
        "description": "Turn Better Business Bureau into a clean 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. No API key, no subscription, one flat price per profile.",
        "version": "0.1",
        "x-build-id": "3MvMR9HZtLfn5Ir5n"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tagadanar~bbb-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tagadanar-bbb-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/tagadanar~bbb-scraper/runs": {
            "post": {
                "operationId": "runs-sync-tagadanar-bbb-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/tagadanar~bbb-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-tagadanar-bbb-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchTerm": {
                        "title": "Business type or name",
                        "type": "string",
                        "description": "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": {
                        "title": "Location",
                        "type": "string",
                        "description": "City and state (<code>Charlotte, NC</code>), a ZIP code, or a metro area to search in. Used with the business type above."
                    },
                    "businessUrls": {
                        "title": "BBB profile URLs (optional)",
                        "type": "array",
                        "description": "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.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minRating": {
                        "title": "Minimum BBB rating",
                        "enum": [
                            "A+",
                            "A",
                            "A-",
                            "B+",
                            "B",
                            "B-",
                            "C+",
                            "C",
                            "C-",
                            "D+",
                            "D",
                            "D-",
                            "F"
                        ],
                        "type": "string",
                        "description": "Only return businesses rated at least this well. Leave empty to return every rating."
                    },
                    "accreditedOnly": {
                        "title": "BBB Accredited businesses only",
                        "type": "boolean",
                        "description": "Return only businesses that are BBB Accredited.",
                        "default": false
                    },
                    "hasComplaints": {
                        "title": "Only businesses with complaints",
                        "type": "boolean",
                        "description": "Return only businesses that have at least one complaint on file. Useful for reputation research.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max business profiles",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "How many business profiles to return across your search. Profiles filtered out by the options above do not count toward this limit.",
                        "default": 100
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
