# Better Business Bureau Scraper (`kawsar/better-business-bureau-scraper`) Actor

Scrapes BBB business listings, ratings, contact details, and complaint records from bbb.org so you can build lead lists or check a company's standing before working with them.

- **URL**: https://apify.com/kawsar/better-business-bureau-scraper.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Better Business Bureau business scraper

Searches bbb.org and returns structured records for matching businesses — ratings, accreditation status, contact details, complaint history, owner info, and more. Works for any US or Canadian city.

The BBB (Better Business Bureau) is one of the most established business trust platforms in North America. It rates businesses from A+ to F, tracks complaint history, and verifies accreditation. If you need to research a company, find local service providers, or build a lead list with trust signals already baked in, this is the data source.

### What data you get

Two levels of data depending on your settings:

**Search page only** (faster, `scrapeDetails: false`): business name, BBB rating, accreditation badge, phone number, address, and business categories. About 10 results per page.

**Full profile** (default, `scrapeDetails: true`): everything above plus website, entity type (LLC, Corporation, Sole Proprietorship), accreditation date, years in business, business start date, owner or manager name, complaint count, star rating from customer reviews, payment methods accepted, and social media links.

The full profile run takes longer since it visits each business's BBB page individually, but the data is far richer.

### What BBB ratings mean

BBB grades businesses on a scale from A+ (highest) to F (lowest), based on how the business responds to complaints, its transparency, and its track record. Some businesses show "NR" (Not Rated) if BBB doesn't have enough information yet.

A business can be rated without being accredited. Accreditation means the business applied, paid a fee, and agreed to BBB's standards. A non-accredited business with an A+ rating is still a good sign — it just means they haven't paid for the badge.

### How to use

1. Enter a **search query**. A business category works best — "Plumbers", "HVAC Contractors", "Roofing", "Restaurants". You can also search by business name (use `searchType: Name`) or phone number (`searchType: Phone`).
2. Enter a **location**. City and state ("Chicago, IL") or a zip code both work. The BBB searches near the location you provide.
3. Set a **maxItems** limit and run.

Records appear in the dataset as they come in — no need to wait for the full run to finish before using the data.

### Input example

```json
{
  "searchQuery": "Roofing Contractors",
  "location": "Dallas, TX",
  "country": "USA",
  "searchType": "Category",
  "scrapeDetails": true,
  "maxItems": 150
}
````

Search by business name:

```json
{
  "searchQuery": "Home Depot",
  "location": "Atlanta, GA",
  "searchType": "Name",
  "scrapeDetails": true,
  "maxItems": 20
}
```

Canada search:

```json
{
  "searchQuery": "Electricians",
  "location": "Toronto, ON",
  "country": "CAN",
  "searchType": "Category",
  "scrapeDetails": true,
  "maxItems": 100
}
```

### Output example

```json
{
  "businessName": "Riccardo's Plumbing Co.",
  "bbbRating": "A+",
  "isAccredited": true,
  "accreditedSince": "3/15/2018",
  "yearsInBusiness": 22,
  "phone": "(312) 555-0180",
  "website": "https://riccardosplumbing.com",
  "address": {
    "street": "450 N Wabash Ave",
    "cityStateZip": "Chicago IL 60611"
  },
  "addressRaw": "450 N Wabash Ave Chicago IL 60611",
  "primaryCategory": "Plumbers",
  "categories": ["Plumbers", "Drain Cleaning"],
  "entityType": "Corporation",
  "businessManagement": "Mr. R. Rossi, Owner",
  "businessStarted": "1/1/2003",
  "businessIncorporated": "6/15/2005",
  "bbbFileOpened": "4/2/2008",
  "numberOfReviews": 31,
  "numberOfComplaints": 0,
  "starRating": 4.8,
  "paymentMethods": ["Credit Card", "Check", "Cash"],
  "socialMedia": ["https://www.facebook.com/riccardosplumbing"],
  "logoUrl": "https://m.bbb.org/prod/ProfileImages/abc123.jpeg",
  "bbbProfileUrl": "https://www.bbb.org/us/il/chicago/profile/plumber/riccardos-plumbing-0654-12345678",
  "scrapedAt": "2026-04-30T10:00:00.000000+00:00"
}
```

### Output fields explained

| Field | Description |
|---|---|
| `businessName` | Official business name as listed on BBB |
| `bbbRating` | Letter grade: A+, A, B+, B, C+, C, D+, D, F, or NR (Not Rated) |
| `isAccredited` | True if the business is a BBB Accredited Business |
| `accreditedSince` | Date accreditation was granted (accredited businesses only) |
| `yearsInBusiness` | How long the business has been operating |
| `phone` | Primary phone number |
| `website` | Business website URL |
| `address` | Structured object with `street` and `cityStateZip` |
| `addressRaw` | Full address as a single string |
| `primaryCategory` | Main business category |
| `categories` | All categories the business is listed under |
| `entityType` | Legal structure — Corporation, LLC, Sole Proprietorship, etc. |
| `businessManagement` | Owner or manager name and title |
| `businessStarted` | Date the business started operations |
| `businessIncorporated` | Date of incorporation (if applicable) |
| `bbbFileOpened` | Date BBB first created a file for this business |
| `numberOfReviews` | Total customer reviews on BBB |
| `numberOfComplaints` | Total complaints filed through BBB |
| `starRating` | Average star rating from customer reviews (1–5) |
| `paymentMethods` | Payment types accepted (Credit Card, Check, Cash, etc.) |
| `socialMedia` | Social media profile URLs listed on the BBB profile |
| `logoUrl` | Business logo image URL from BBB |
| `bbbProfileUrl` | Direct link to the full BBB business profile |
| `scrapedAt` | ISO 8601 timestamp of when the record was collected |

### Input fields

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQuery` | string | Yes | — | Business type, keyword, or name (e.g., "Restaurants", "HVAC") |
| `location` | string | Yes | — | City and state or zip code (e.g., "New York, NY", "90210") |
| `country` | string | No | USA | USA or CAN |
| `searchType` | string | No | Category | Category, Name, or Phone |
| `scrapeDetails` | boolean | No | true | Visit each profile page for full data |
| `maxItems` | integer | No | 100 | Max listings to collect (up to 1000) |
| `requestTimeoutSecs` | integer | No | 30 | Per-request timeout in seconds |

### Common uses

**Lead generation** — search a business category in a target city, get a ready-to-use list with phone numbers, websites, and contact names. Filter by accreditation or rating after export.

**Vendor vetting** — before signing a contract with a local service provider, pull their BBB profile. Check complaint count, how long they've been in business, and whether they're accredited. Takes 30 seconds instead of manual searching.

**Competitor research** — map out who else operates in your category in a given market. See their ratings, years in business, and customer review scores side by side.

**Local SEO audits** — check whether businesses in a niche have consistent NAP data (name, address, phone) on BBB versus other directories.

**Business verification** — confirm a company's legal entity type, owner name, and business start date before doing due diligence.

### Performance tips

- Set `scrapeDetails: false` for quick runs when you only need the search-page basics. It's 10x faster since it skips the individual profile pages.
- BBB returns roughly 10 businesses per search results page. A run for 100 businesses with `scrapeDetails: true` visits around 110 pages total.
- For large markets, BBB may return thousands of results. Use `maxItems` to cap the run size.
- Increase `requestTimeoutSecs` to 60 if you get timeout errors on slow connections.

### Notes

BBB coverage is strongest in the US and Canada. Businesses that have never sought BBB accreditation or had a complaint filed often have minimal profile data — just the name and address. Non-accredited businesses still appear in search results and have ratings, just thinner profile pages.

Some businesses appear in multiple search results if they have multiple locations. Each location gets its own record with its own address and profile URL.

# Actor input Schema

## `searchQuery` (type: `string`):

Business type, keyword, or business name to search on BBB (e.g., "Restaurants", "Plumbers", "HVAC Contractors").

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

City and state, or zip code, to search near (e.g., "New York, NY", "Los Angeles, CA", "90210").

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

Country to search in.

## `searchType` (type: `string`):

How the search query is interpreted.

## `scrapeDetails` (type: `boolean`):

Visit each business's BBB profile page to collect extended data: website, entity type, accreditation date, owner name, complaint counts, operating hours, and more. Disable for faster runs when only basic listing data is needed.

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

Maximum number of business listings to collect per run.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "searchQuery": "Restaurants",
  "location": "New York, NY",
  "country": "USA",
  "searchType": "Category",
  "scrapeDetails": false,
  "maxItems": 5,
  "requestTimeoutSecs": 60
}
```

# 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 = {
    "searchQuery": "Restaurants",
    "location": "New York, NY",
    "maxItems": 5,
    "requestTimeoutSecs": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/better-business-bureau-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 = {
    "searchQuery": "Restaurants",
    "location": "New York, NY",
    "maxItems": 5,
    "requestTimeoutSecs": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("kawsar/better-business-bureau-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 '{
  "searchQuery": "Restaurants",
  "location": "New York, NY",
  "maxItems": 5,
  "requestTimeoutSecs": 60
}' |
apify call kawsar/better-business-bureau-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kawsar/better-business-bureau-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Better Business Bureau Scraper",
        "description": "Scrapes BBB business listings, ratings, contact details, and complaint records from bbb.org so you can build lead lists or check a company's standing before working with them.",
        "version": "0.0",
        "x-build-id": "hdSfRiQAi0vRmso3O"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~better-business-bureau-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-better-business-bureau-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/kawsar~better-business-bureau-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-better-business-bureau-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/kawsar~better-business-bureau-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-better-business-bureau-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",
                "required": [
                    "searchQuery",
                    "location"
                ],
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Business type, keyword, or business name to search on BBB (e.g., \"Restaurants\", \"Plumbers\", \"HVAC Contractors\")."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City and state, or zip code, to search near (e.g., \"New York, NY\", \"Los Angeles, CA\", \"90210\")."
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "USA",
                            "CAN"
                        ],
                        "type": "string",
                        "description": "Country to search in.",
                        "default": "USA"
                    },
                    "searchType": {
                        "title": "Search type",
                        "enum": [
                            "Category",
                            "Name",
                            "Phone"
                        ],
                        "type": "string",
                        "description": "How the search query is interpreted.",
                        "default": "Category"
                    },
                    "scrapeDetails": {
                        "title": "Scrape full business profiles",
                        "type": "boolean",
                        "description": "Visit each business's BBB profile page to collect extended data: website, entity type, accreditation date, owner name, complaint counts, operating hours, and more. Disable for faster runs when only basic listing data is needed.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of business listings to collect per run.",
                        "default": 100
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Per-request timeout in seconds.",
                        "default": 60
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
