# BBB Scraper – Business Ratings & Accreditation (`unnoted/bbb-business-search`) Actor

Search BBB (Better Business Bureau) by keyword and city: business name, BBB rating, rating score, accreditation, categories, address, coordinates, service area and profile link. US and Canada, accredited-only filter. Export JSON, CSV or Excel. No login needed. Unofficial.

- **URL**: https://apify.com/unnoted/bbb-business-search.md
- **Developed by:** [Unnoted](https://apify.com/unnoted) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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 – Business Ratings & Accreditation do?

BBB Scraper collects the businesses BBB (Better Business Bureau) lists for your search terms and locations: name, BBB letter rating and score, accreditation, categories, address, coordinates, service area and profile link, with an accredited-only filter, as clean rows you can export or call by API.

Unofficial, not affiliated with BBB.

**Main features:** search by keyword, up to 100,000 businesses per run, no login needed, export to JSON, CSV or Excel, and full API and scheduling support on Apify.

### What data can you get from BBB?

Each business is one row with these fields:

| Field | Description |
|---|---|
| `businessId` | BBB business id (shared by all locations of one business within a local BBB) (always filled) |
| `name` | Business name (always filled) |
| `profileUrl` | Link to the business profile on BBB (always filled) |
| `listingId` | BBB listing id, one per business location (local BBB id, business id and location id) |
| `bbbId` | Id of the local BBB that keeps the profile (e.g. 0825) |
| `bbbName` | Name of the local BBB (e.g. BBB Heart of Texas) |
| `primaryCategory` | Main business category on BBB (e.g. Plumber) |
| `categories` | All BBB categories of the business |
| `address` | Street address |
| `city` | City |
| `state` | State or province code (e.g. TX, ON) |
| `postalCode` | ZIP or postal code |
| `country` | US or CA |
| `lat` | Latitude (some are rounded to 2 decimals by BBB) |
| `lng` | Longitude (some are rounded to 2 decimals by BBB) |
| `bbbRating` | BBB letter rating, A+ to F; empty when BBB shows no rating |
| `ratingScore` | BBB rating score behind the letter, 0 to 100 |
| `isAccredited` | True for BBB Accredited businesses |
| `isCharity` | True when BBB lists the business as a charity |
| `outOfBusiness` | True when BBB marks the business as out of business |
| `serviceArea` | Area the business serves, as listed on BBB (e.g. Travis County, TX; Williamson County, TX) |
| `logoUrl` | Business logo |
| `searchTerm` | The search term that found it |
| `searchLocation` | The location searched (empty for a search of all of BBB) |
| `position` | Position in the results (1 = first result) |
| `scrapedAt` | When the business was collected (ISO 8601) |

### How to scrape BBB with BBB Scraper – Business Ratings & Accreditation

1. Open BBB Scraper – Business Ratings & Accreditation on Apify and go to the **Input** tab.
2. In **Search terms**, enter `plumber`.
3. In **Locations**, enter `Austin, TX`.
4. In **Max businesses**, enter `20`.
5. Click **Start** and wait for the run to finish. A small run like this one takes under a minute.
6. Open the **Output** tab to see the results, or download them as JSON, CSV, Excel or HTML.

### Input

See the **Input** tab for every option. The fields:

| Field | Name | What it does | Default |
|---|---|---|---|
| `searchTerms` | Search terms | What to search for on BBB, one per line: a category, a service or a business name (e.g. plumber, roofing, Home Depot). Each term is searched in every location. |  |
| `locations` | Locations | Where to search, one per line: "City, ST" (e.g. Austin, TX), a ZIP code (78701) or a Canadian city or postal code (Toronto, ON). Leave empty to search all of BBB. |  |
| `accreditedOnly` | BBB Accredited only | Return only BBB Accredited businesses (the site's own filter). | `false` |
| `maxItems` | Max businesses | Maximum number of businesses in total, across all searches. You pay only for businesses saved. | `100` |

Example input:

```json
{
  "searchTerms": [
    "plumber"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxItems": 20
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. One real result:

```json
{
  "listingId": "0825_1000223803_405686",
  "businessId": "1000223803",
  "bbbId": "0825",
  "bbbName": "BBB Heart of Texas",
  "name": "Calixto Plumbing",
  "primaryCategory": "Plumber",
  "categories": [
    "Plumber",
    "Plumbing Renovation",
    "Commercial Plumber",
    "Plumbing Plan"
  ],
  "address": "8410 Georgian Dr # B",
  "city": "Austin",
  "state": "TX",
  "postalCode": "78753-6003",
  "country": "US",
  "lat": 30.3,
  "lng": -97.76,
  "bbbRating": "A+",
  "ratingScore": 98.49,
  "isAccredited": true,
  "isCharity": false,
  "outOfBusiness": false,
  "serviceArea": "Bell County, TX; Burnet County, TX; Lee County, TX; Milam County, TX; Travis County, TX; Williamson County, TX",
  "profileUrl": "https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803",
  "logoUrl": "https://m.bbb.org/prod/ProfileImages/2024/1f7a8bd4-fdd2-45ca-8963-5c246e1d3b85.png",
  "searchTerm": "plumber",
  "searchLocation": "Austin, TX",
  "position": 1,
  "scrapedAt": "2026-10-08T20:33:42.066Z"
}
```

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

BBB Scraper – Business Ratings & Accreditation uses pay-per-event pricing: **$4.00 per 1,000 businesses** (Business). You pay only for businesses saved to the dataset; platform usage is included in the price. Each run also has Apify's standard start fee of a fraction of a cent.

| Businesses | Price |
|---|---|
| 100 | $0.40 |
| 1,000 | $4.00 |
| 10,000 | $40.00 |

Set **Max items** (and the run's maximum cost in the run options) to cap what a run can spend. The run stops when either limit is reached.

### Use cases

- **Lead lists:** build lists of plumbers, roofers, electricians or any trade in a city, with their BBB standing.
- **Vetting and due diligence:** check the BBB rating and accreditation of many contractors or vendors at once.
- **Market research:** compare how many businesses of a kind a city has, and how they rate.
- **Directory and comparison sites:** enrich your listings with BBB ratings and profile links.
- **Monitoring:** run a search on a schedule and catch new businesses, rating changes and closures.

### Tips

- Use the category words BBB uses (plumber, roofing contractors, auto repair) for the most complete lists.
- Each search term × location gives up to a few hundred businesses. For more, add nearby cities or ZIP codes as extra locations.
- Turn on **BBB Accredited only** to get only accredited businesses; it is the site's own filter, so you don't pay for the rest.
- Canadian locations work too: write them as "City, Province" (e.g. Toronto, ON) or as a postal code.
- Businesses found by more than one search are saved once, so overlapping searches don't cost twice.

### FAQ

#### Is it legal to scrape BBB?

BBB Scraper – Business Ratings & Accreditation collects only data that BBB shows publicly to every visitor, and it leaves out personal data such as private profiles and contact details. Our Actors are ethical and do not extract private user data. Results could still contain personal data in titles or descriptions written by uploaders. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. You are responsible for how you use the data.

#### Can I use it through an API?

Yes. Every Apify Actor has an API: start runs, pass input and read results over HTTP, or use the JavaScript and Python clients. See the **API** tab on the Actor page for ready-made examples.

#### Can I schedule runs and connect other apps?

Yes. Use Apify **Schedules** to run BBB Scraper – Business Ratings & Accreditation every hour, day or week, and integrations (Make, Zapier, Google Sheets, webhooks and more) to send the results where you need them.

#### Why did I get fewer results than expected?

The run stops at **Max items** or at the run's maximum cost, whichever comes first. BBB may also return fewer results for rare search terms. Duplicates across search terms are saved once. Check the run's `RUN_SUMMARY` record in the key-value store for the inputs that returned nothing.

#### What if it stops working?

Sites change. We run a daily check of our own and fix breakages quickly. If something looks wrong, open an issue in the **Issues** tab with the run link and we'll look at it.

#### What do the ratings mean?

BBB rates businesses from A+ (highest) to F (lowest), based on things like complaint history, time in business and transparency. ratingScore is the number behind the letter (0 to 100). An empty rating means BBB shows none.

#### Why does one business appear more than once?

A business with several offices has one listing per location, each with its own listingId and address. businessId is the same for all of them within a local BBB.

#### Are results only from the city I searched?

BBB also returns businesses that serve the area from nearby towns, so some rows have a different city or state. Filter on city or state in your export if you need an exact match.

#### Can I get phone numbers, reviews or complaints?

No. This Actor collects business data only: no phone numbers, owner or contact names, customer reviews or complaints.

### Not included

No personal data: phone numbers, owner, principal and contact names, emails, customer reviews and complaints are not collected. Sole traders may trade under their own name, which then appears as the business name.

### More Actors from us

- [AliExpress Search Scraper – Products & Prices](https://apify.com/unnoted/aliexpress-product-search)
- [Bilibili Scraper – Video Search & Stats API](https://apify.com/unnoted/bilibili-video-scraper)
- [Bumeran Jobs Scraper – LATAM Job Listings](https://apify.com/unnoted/bumeran-job-listings)
- [Foundit Jobs Scraper – India Job Listings API](https://apify.com/unnoted/foundit-job-listings)
- [Google Jobs Scraper – Job Listings API](https://apify.com/unnoted/google-jobs-listings)
- [Google Play Reviews Scraper – App Reviews API](https://apify.com/unnoted/google-play-reviews-scraper)
- [Google Trends Scraper – Interest & Related Queries](https://apify.com/unnoted/google-trends-data)
- [Idealo Scraper – Price Comparison Data](https://apify.com/unnoted/idealo-price-search)
- [Kleinanzeigen Scraper – Listings & Prices](https://apify.com/unnoted/kleinanzeigen-listings-scraper)
- [Mercari Japan Scraper – Listings & Prices API](https://apify.com/unnoted/mercari-japan-search)
- [Resident Advisor Scraper – RA Event Listings](https://apify.com/unnoted/resident-advisor-events)
- [Sainsbury's Scraper – UK Grocery Prices](https://apify.com/unnoted/sainsburys-grocery-search)
- [Tokopedia Scraper – Product Search & Prices](https://apify.com/unnoted/tokopedia-product-search)
- [Workday Jobs Scraper – Any Careers Site](https://apify.com/unnoted/workday-jobs-scraper)
- [Yandex Maps Scraper – Places & Business Data](https://apify.com/unnoted/yandex-maps-places)

# Actor input Schema

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

What to search for on BBB, one per line: a category, a service or a business name (e.g. plumber, roofing, Home Depot). Each term is searched in every location.

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

Where to search, one per line: "City, ST" (e.g. Austin, TX), a ZIP code (78701) or a Canadian city or postal code (Toronto, ON). Leave empty to search all of BBB.

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

Return only BBB Accredited businesses (the site's own filter).

## `maxItems` (type: `integer`):

Maximum number of businesses in total, across all searches. You pay only for businesses saved.

## Actor input object example

```json
{
  "searchTerms": [
    "plumber"
  ],
  "locations": [
    "Austin, TX"
  ],
  "accreditedOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `results` (type: `string`):

One item per business.

## `runSummary` (type: `string`):

Items saved, inputs done, and how complete each field was.

# 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"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("unnoted/bbb-business-search").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"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("unnoted/bbb-business-search").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"
  ],
  "maxItems": 20
}' |
apify call unnoted/bbb-business-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unnoted/bbb-business-search"
        }
    }
}
```

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/HsUO9KFy0Ozeg76Z9/builds/cAkUl9zvbWjToBnWE/openapi.json
