# BBB Scraper: Business Ratings, Complaints, Reviews and Phones (`themineworks/bbb-scraper`) Actor

Scrape BBB (Better Business Bureau) businesses by search term and city in the US and Canada: name, BBB rating, accreditation, phone, address, categories, complaint counts, review rating and count. Optional profile details: years in business, website. No login. Pay per business.

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

## Pricing

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

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

## BBB Scraper: Business Ratings, Complaints, Reviews and Phones

[![200 BBB businesses in 126 seconds, each with complaint counts, review stars, BBB rating and phone](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/bbb-scraper-hero.png)](https://console.apify.com/actors/kzgsWVruPiVpgIaXA/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

### Why choose this actor?

- **Complaint counts and review stars on every row, at no extra charge.** Each business comes with its BBB complaint total for the last 3 years, the complaints of the last 12 months, the split by status (resolved, answered, unanswered) and by type, plus its customer review count and average stars. We checked them against BBB's own profile page: Abacus Plumbing in Austin showed 10 complaints, 4 in the last 12 months, 145 reviews and 4.74 stars, and so did our rows. In our proof run **200 Austin plumbers came back in 126 seconds**, with complaint and review numbers on all 200.
- **More than the 225 businesses BBB shows per search.** BBB stops a search after 15 pages. When you ask for more, the actor also reads the same search A to Z, Z to A, by rating grade and accredited only, and keeps only businesses it has not delivered yet: **999 of 2,545 plumbers in Austin** in our test. A business listed twice at the same address is delivered once and charged once.
- **US and Canada, by search term and city, no login.** Type a category or a business name and a city and state, a ZIP code, or a Canadian city and province. Leave the location empty to search all of BBB. Searches BBB cannot place, empty searches and links that are not BBB pages are never charged.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/kzgsWVruPiVpgIaXA/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Company and business data family:** [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [EU VAT Checker (VIES)](https://apify.com/themineworks/eu-vat-vies-validator?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Tech Stack Detector](https://apify.com/themineworks/tech-stack-detector?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this input and press Start. It returns 10 plumbers in Austin, Texas, with phone, address, BBB rating, accreditation, complaint counts and review stars, in about 20 seconds:

```json
{
  "queries": ["plumber"],
  "location": "Austin, TX",
  "maxResults": 10
}
```

Uses the same input fields as other popular BBB scrapers, so you can switch without changing your input. You can tell the actor what to read in two ways:

- **Search terms** in `queries` (a category such as `plumber` or `roofing contractors`, or a business name such as `Roto-Rooter`), with one `location` for all of them: `Austin, TX`, a ZIP code such as `78701`, `Toronto, ON` or a Canadian postal code. Empty means all of BBB, US and Canada.
- **BBB links** in `startUrls`: a search link copied from bbb.org (its filters and sort order are kept), a category link such as `https://www.bbb.org/us/tx/houston/category/roofing-contractors`, or a business profile link. When links are given, the search terms are not run.

Apify's free plan includes $5 of credit every month, which covers about 1,400 results at this actor's price.

#### Copy to your AI assistant

```text
themineworks/bbb-scraper on Apify. Searches BBB (Better Business Bureau, bbb.org) for businesses by search term and location in the US and Canada, or reads BBB search, category and business profile links, with no login, and returns one row per BBB listing with name, profileUrl, query, location, rating (BBB letter grade or NR), snippet, phone, phones, street, city, state, postalCode, country, categories, accredited, ratingScore, latitude, longitude, logoUrl, serviceAreas, complaintsTotal (last 3 years), complaintsLast12Months, complaintsByStatus, complaintsByType, reviewCount and reviewRating; with includeDetails also accreditedSince, businessStarted, yearsInBusiness, website, otherPhones, otherWebsites, email, entityType, description, licenses and ratingReasons. Call ApifyClient("TOKEN").actor("themineworks/bbb-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: queries (array of search terms, default ["plumber"]). Optional: location (default "", all of BBB; for example "Austin, TX", "78701", "Toronto, ON"), maxResults (per search, default 10, 10 to 1000), accreditedOnly (default false), includeComplaintsAndReviews (default true), includeDetails (default false, charged as an extra profile-details event per row), startUrls (BBB search, category or profile links; replaces queries). Skip rows that have a _type field (info or summary rows, never charged); the run report is the key-value store record OUTPUT. Full spec: GET https://api.apify.com/v2/acts/themineworks~bbb-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **38 fields per business** from BBB's own search data and its public complaint and review lists: 31 present on every row of our 230 row sample, plus street, logo and review stars where BBB has them, and 13 more profile fields when you switch on profile details.
- **Complaints and reviews without opening each profile**: complaint totals by status and type, the last 12 months, review count and the exact average of every review's stars, read from BBB's public complaint and review lists. A national chain that shows up several times in one search is read once.
- **Up to 1,000 businesses per search, up to 100 searches per run.** BBB's 225 per search order is the floor, not the ceiling: the actor walks BBB's other views of the same search until it has what you asked for.
- **Filters**: BBB Accredited only, and the filters and sort order of any BBB search link you paste (we tested rating grade, category, state and the Rating and A to Z orders).
- **Profile details on request**: years in business, business start date, accredited since, website, other phones and websites, business email when BBB lists one, type of entity, number of employees when listed, description, licences with agency and expiry date, and the reasons BBB gives for the rating.
- **Business profile links in, monitoring out**: give a list of BBB profile links and get the same row for each, so a weekly schedule shows new complaints, rating changes and accreditation changes on the vendors you care about.

### How to use it

#### Basic: one category in one city

```json
{
  "queries": ["plumber"],
  "location": "Austin, TX",
  "maxResults": 100
}
```

#### Several categories at once, in Canada

Each search term is one search with its own `maxResults`. A business found by two of your terms is delivered once.

```json
{
  "queries": ["plumber", "electrician", "roofing contractors"],
  "location": "Toronto, ON",
  "maxResults": 50
}
```

#### Everywhere on BBB, accredited businesses only

```json
{
  "queries": ["roofing contractors"],
  "location": "",
  "maxResults": 200,
  "accreditedOnly": true
}
```

#### From BBB links you already have

Search links keep their filters (here only F rated plumbers near Austin), category links become a search, and profile links give one row each.

```json
{
  "queries": ["plumber"],
  "startUrls": [
    "https://www.bbb.org/search?find_text=plumber&find_loc=Austin%2C%20TX&sort=Rating&filter_ratings=F",
    "https://www.bbb.org/us/tx/houston/category/roofing-contractors",
    "https://www.bbb.org/us/tx/austin/profile/plumbing-and-heating/abacus-plumbing-air-conditioning-electrical-0825-1000193414"
  ],
  "maxResults": 25
}
```

#### Job: screen contractors and vendors before you sign

Paste the BBB profile links of the companies on your shortlist and switch on profile details. Each row tells you the BBB grade and the reasons for it, accreditation and since when, years in business, licences with their expiry dates, complaints in the last 12 months and how they were handled, and the review average.

```json
{
  "queries": ["plumber"],
  "startUrls": [
    "https://www.bbb.org/us/tx/austin/profile/air-conditioning-repair/radiant-plumbing-air-conditioning-electrical-0825-90091011",
    "https://www.bbb.org/us/oh/cincinnati/profile/plumber/roto-rooter-plumbing-water-cleanup-0292-1922"
  ],
  "includeDetails": true
}
```

#### Job: a lead list of local trades with phone numbers

Agencies, suppliers and software companies selling to home services firms use BBB to find established local businesses. Search the trade and the city, keep only accredited businesses if you want firms that pay for their BBB standing, and sort the rows by `reviewCount` or `complaintsTotal` in your sheet.

```json
{
  "queries": ["hvac", "plumber", "electrician"],
  "location": "Denver, CO",
  "maxResults": 300,
  "accreditedOnly": true
}
```

#### Job: weekly complaint watch on your partners

Save an input with the profile links of your partners, franchisees or competitors as a task, and add a weekly schedule. Compare `complaintsLast12Months`, `complaintsByStatus`, `rating` and `accredited` between runs to see new complaints, a grade that dropped or an accreditation that ended.

#### Job: map a market across many ZIP codes

BBB reaches about 1,000 businesses per search in a big city. For full coverage, run the same search term once per ZIP code or suburb (one run per location, or a Make, Zapier or n8n loop) and join the results on `listingId`.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `queries` | array of strings | `["plumber"]` | Business categories or business names to search on BBB, one search per term. Required by the input form; not run when `startUrls` are given. |
| `location` | string | `""` | City and state (`Austin, TX`), ZIP code, or Canadian city and province (`Toronto, ON`) or postal code. Empty searches all of BBB, US and Canada. A state on its own is read by BBB as one city in it. |
| `maxResults` | integer | `10` | Most businesses per search term or search link, 10 to 1,000. |
| `accreditedOnly` | boolean | `false` | Only BBB Accredited businesses. |
| `includeComplaintsAndReviews` | boolean | `true` | Add complaint counts and the customer review count and average stars to each row. No extra charge; off gives the search card fields only, faster. |
| `includeDetails` | boolean | `false` | Also read each business's BBB profile page for years in business, accredited since, website, licences and more. Charged as one `profile-details` event per row that gets them. |
| `startUrls` | array of strings | none | BBB search links, category links or business profile links. When given, `queries` are not run. |

### What data do you get?

One row per BBB listing. A business with several addresses on BBB (a chain, or a firm with branches) can give one row per address; each has its own `listingId`, address and phone, and they share `businessId`.

**The fields other BBB scrapers return, all filled:** `name`, `profileUrl` (the BBB profile, or the branch's own page), `query` (the search term or link it came from), `location` (the place searched, as BBB read it: `chicago` becomes `Chicago, IL`; `US and Canada` when no location was given), `rating` (BBB letter grade A+ to F, or `NR` when BBB has not rated the business) and `snippet` (one line: name, categories, address, grade and accreditation).

**Business:** `businessId`, `bbbId` (the local BBB office), `listingId`, `localBbb`, `category`, `categories`, `accredited`, `ratingScore` (BBB's 0 to 100 score behind the grade), `outOfBusiness`, `logoUrl`.

**Contact and place:** `phone`, `phones`, `street`, `city`, `state`, `postalCode`, `country` (US or CA), `fullAddress`, `latitude`, `longitude`, `serviceAreas`. BBB leaves the street out for some businesses that work at their customers' homes (153 of our 230 sampled rows had one); the city and postal code were on every row we sampled.

**Complaints and reviews** (on by default): `complaintsTotal` (BBB's count for the last 3 years, including complaints whose text BBB keeps private), `complaintsLast12Months`, `complaintsByStatus` (for example `{"answered": 13, "resolved": 5}`), `complaintsByType` (for example `{"serviceorrepair": 16, "billingissues": 2}`), `reviewCount`, `reviewRating` (average stars, two decimals).

**Profile details** (with `includeDetails`): `detailsFetched`, `accreditedSince`, `businessStarted`, `yearsInBusiness`, `website`, `otherWebsites`, `otherPhones`, `email` (only when BBB lists a business email), `entityType`, `employees`, `description`, `licenses` (number, agency, expiry date), `ratingReasons`, `complaintsClosedLast3Years`.

**Run context:** `position` (rank in the search), `searchTotal` (how many businesses BBB lists for the search), `source` (`search` or `profile_url`), `scraped_at`.

#### Stable fields for automations

These fields were present on every one of the 230 rows we sampled (Austin and Toronto searches, complaint and review counts on), and their names will not change:

| Field | What it holds |
|---|---|
| `name` | Business name as BBB lists it |
| `profileUrl` | Link to the BBB profile of this listing |
| `query` | Search term or link the row came from |
| `location` | Place searched, as BBB read it |
| `rating` | BBB letter grade, or NR |
| `snippet` | One line summary |
| `businessId` | BBB business id |
| `listingId` | BBB listing id, unique per address |
| `city` | City |
| `state` | State or province code |
| `postalCode` | ZIP or postal code |
| `country` | US or CA |
| `categories` | BBB categories |
| `accredited` | true or false |
| `complaintsTotal` | Complaints in the last 3 years (with complaints and reviews on) |
| `reviewCount` | Customer reviews on BBB (with complaints and reviews on) |
| `scraped_at` | When the row was read |

#### Output examples

A search row (plumbers in Austin, complaints and reviews on). Real row from our run on 8 October 2026:

```json
{
  "name": "Stan's Heating, Air and Plumbing",
  "profileUrl": "https://www.bbb.org/us/tx/austin/profile/air-conditioning-contractor/stans-heating-air-and-plumbing-0825-48113",
  "query": "plumber",
  "location": "Austin, TX",
  "rating": "A+",
  "snippet": "Stan's Heating, Air and Plumbing. Air Conditioning Contractors, Plumber, Electrical Contractors, Air Duct Cleaning. 6016 Dillard Circle, Austin, TX 78752-4415. BBB rating A+, BBB Accredited.",
  "businessId": "48113",
  "bbbId": "0825",
  "listingId": "0825_48113_164436",
  "phone": "(512) 677-7096",
  "phones": ["(512) 677-7096"],
  "street": "6016 Dillard Circle",
  "city": "Austin",
  "state": "TX",
  "postalCode": "78752-4415",
  "country": "US",
  "fullAddress": "6016 Dillard Circle, Austin, TX 78752-4415",
  "category": "Air Conditioning Contractors",
  "categories": ["Air Conditioning Contractors", "Plumber", "Electrical Contractors", "Air Duct Cleaning"],
  "accredited": true,
  "ratingScore": 97,
  "latitude": 30.326017379760746,
  "longitude": -97.7174530029297,
  "logoUrl": "https://m.bbb.org/prod/ProfileImages/2026/4e74d3fb-caf9-44e7-840c-602b35924ca8.png",
  "serviceAreas": ["Travis County, TX", "Williamson County, TX", "Austin, TX", "Georgetown, TX"],
  "localBbb": "BBB Heart of Texas",
  "outOfBusiness": false,
  "position": 9,
  "searchTotal": 2545,
  "source": "search",
  "complaintsTotal": 18,
  "complaintsLast12Months": 10,
  "complaintsByStatus": { "answered": 13, "resolved": 5 },
  "complaintsByType": { "serviceorrepair": 16, "billingissues": 2 },
  "reviewCount": 211,
  "reviewRating": 4.55,
  "detailsFetched": false,
  "scraped_at": "2026-10-07T20:36:48.657Z"
}
```

A Canadian row (plumbers in Toronto), trimmed: the business lists 12 phone numbers and 26 service areas.

```json
{
  "name": "John The Plumber",
  "profileUrl": "https://www.bbb.org/ca/on/north-york/profile/plumber/john-the-plumber-0107-1405070/addressId/125516",
  "query": "plumber",
  "location": "Toronto, ON",
  "rating": "A",
  "snippet": "John The Plumber. Plumber, Drainage Contractors, Heating Contractors, Plumbing Renovation. 984 Caledonia Rd, North York, ON M6B 3Y8. BBB rating A, BBB Accredited.",
  "businessId": "54599",
  "listingId": "0117_54599_178514_336441",
  "phone": "(613) 801-6875",
  "street": "984 Caledonia Rd",
  "city": "North York",
  "state": "ON",
  "postalCode": "M6B 3Y8",
  "country": "CA",
  "accredited": true,
  "ratingScore": 94,
  "localBbb": "Better Business Bureau of Greater Ottawa",
  "position": 6,
  "searchTotal": 1303,
  "complaintsTotal": 13,
  "complaintsLast12Months": 4,
  "complaintsByStatus": { "answered": 8, "resolved": 5 },
  "complaintsByType": { "serviceorrepair": 10, "billingissues": 1, "order": 1, "productissues": 1 },
  "reviewCount": 50,
  "reviewRating": 4.02,
  "detailsFetched": false
}
```

A profile link with profile details on, trimmed (the description and two licences shortened out):

```json
{
  "name": "Radiant Plumbing, Air Conditioning & Electrical",
  "profileUrl": "https://www.bbb.org/us/tx/austin/profile/air-conditioning-repair/radiant-plumbing-air-conditioning-electrical-0825-90091011",
  "query": "https://www.bbb.org/us/tx/austin/profile/air-conditioning-repair/radiant-plumbing-air-conditioning-electrical-0825-90091011",
  "location": "Austin, TX",
  "rating": "A",
  "phone": "(737) 258-4385",
  "fullAddress": "901 Reinli St, Austin, TX 78751-1506",
  "accredited": true,
  "source": "profile_url",
  "complaintsTotal": 24,
  "complaintsLast12Months": 4,
  "complaintsByStatus": { "answered": 18, "resolved": 6 },
  "reviewCount": 51,
  "reviewRating": 3.45,
  "detailsFetched": true,
  "accreditedSince": "2011-03-11",
  "businessStarted": "1999-09-29",
  "yearsInBusiness": 27,
  "website": "https://radiantplumbing.com/austin/?utm_source=bbb&utm_medium=businesslisting&utm_campaign=atx-brand_bbb_1123&utm_content=atx-brand",
  "otherPhones": ["(512) 263-9988", "(210) 444-9418", "(210) 593-7612"],
  "entityType": "Corporation",
  "licenses": [
    { "number": "TACLB00034827C", "agency": "Texas Department of Licensing & Regulation", "expires": "2027-01-24" },
    { "number": "45619", "agency": "Texas State Board of Plumbing Examiners", "expires": "2026-10-31" }
  ],
  "ratingReasons": ["24 complaint(s) filed against business"],
  "complaintsClosedLast3Years": 24
}
```

### Pricing

Pay per event: you pay for the business rows you receive, plus a flat $0.005 per run, whatever memory you choose. Complaint counts and reviews are included in the row price.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `business` | Once per business row saved to your dataset | $3.49 per 1,000 | $3.19 per 1,000 | $2.79 per 1,000 | $2.49 per 1,000 |
| `profile-details` | Only with `includeDetails` on: once per row that got its profile page details | $5.99 per 1,000 | $5.49 per 1,000 | $4.99 per 1,000 | $4.49 per 1,000 |
| `run-start` | Once per run, when it starts | $0.005 | $0.005 | $0.005 | $0.005 |

The price per single row is the price per 1,000 divided by 1,000. Two search terms at 10 businesses each are 20 `business` events.

Never charged:

- searches with no results, locations BBB cannot place, links that are not BBB pages, and profile links BBB has no listing for;
- a business found again by another of your search terms or links, and a business BBB lists twice at the same address;
- profile details that could not be read (the row is still delivered, and charged as a `business` row only);
- the search pages, complaint and review lists the actor reads, and retries from other IP addresses;
- info and summary rows and the `OUTPUT` run report.

If you set a maximum cost for the run in Apify, the actor delivers rows only while the run's total stays below it, then stops and ends as succeeded, with a status message that starts "Partial result: the max cost of this run", one summary row with `complete` false and `stopped_by_max_cost` true, and every row delivered so far. Raise the maximum and run again for the rest.

### FAQ

#### What is BBB, and what does this actor read?

BBB (Better Business Bureau, bbb.org) keeps public profiles of businesses in the United States and Canada, with a letter grade from A+ to F, accreditation, contact details, categories, complaints and customer reviews. The actor reads BBB's own search, the public complaint and review lists of each business and, when you ask for profile details, the business profile page.

#### How many businesses can I get per search?

Up to 1,000 per search term or search link. BBB shows 15 pages of 15 businesses for one search order. When you ask for more, the actor reads the same search A to Z, Z to A, by each rating grade, accredited only, by rating and by distance, and keeps only businesses it has not delivered. In our test that reached 999 of the 2,545 businesses BBB lists for "plumber" in Austin, TX, in 148 seconds without complaint and review counts. For full coverage of a big city, run one search per ZIP code or suburb.

#### What happens when I leave the location empty, or search in Canada?

An empty location searches all of BBB, US and Canada together ("plumber" gave 88,553 businesses). Canadian searches work with a city and province (`Toronto, ON`, `Vancouver, BC`) or a postal code. A state or province on its own is read by BBB as one city in it (`TX` became Houston, TX; `Ontario` became Ontario, California), so give a city. A location BBB cannot place at all returns no rows, a clear message, and no charge.

#### How are the complaint counts and the review stars worked out?

From BBB's public complaint and review lists for each business. `complaintsTotal` is BBB's own total for the last 3 years, which includes complaints whose text BBB keeps private. `complaintsLast12Months` counts the complaints BBB dates within the last 12 months; with profile details on it is BBB's own count of complaints closed in the last 12 months, which can differ by one or two. `reviewRating` is the average of every review's stars, the same number BBB shows (we checked 145 reviews: 4.74 on both). For the few businesses with more than 510 reviews, or more than 400 complaints a year, the review average or the 12 month count is left out unless profile details are on, rather than guessed.

#### Why do some rows have no street address or no review stars?

BBB hides the street for some businesses that serve customers at home; the city and postal code are still there. A business with no customer reviews has `reviewCount` 0 and no `reviewRating`.

#### Why does one business sometimes give several rows?

BBB lists each address of a business separately, with its own phone and profile page, so a chain such as Roto-Rooter can show up several times in one city. Each address is one row; `businessId` tells you which rows belong to one business. When BBB lists the same business twice at the same address and phone, you get it once.

#### What do profile details add, and why do they cost extra?

Years in business, business start date, accredited since, website, other phones and websites, a business email when BBB lists one, type of entity, number of employees when listed, the business description, licences and the reasons for the rating. These are only on the profile page, which takes an extra, slower request per business, so they are an option with their own event. Leave it off when you only need the search fields, complaints and reviews.

#### Do I need a BBB account, cookies or an API key?

No. The actor reads public BBB pages and data with no login and no cookies of yours.

#### How fresh is the data?

Every run reads BBB live, so rows are as current as bbb.org at the time of the run. `scraped_at` records when each row was read.

#### Can I track businesses over time?

Yes. Save your input as a task with BBB profile links or a fixed search and add a schedule (weekly suits complaint monitoring). Compare `rating`, `accredited`, `complaintsLast12Months`, `complaintsByStatus` and `reviewCount` between runs.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server:

- Connector URL: https://mcp.apify.com/?tools=themineworks/bbb-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http bbb-scraper "https://mcp.apify.com/?tools=themineworks/bbb-scraper"`

#### Is it legal to use this data?

The actor reads only public pages and returns business listings as BBB publishes them. Some listings are sole traders; their rows hold only what BBB shows for the business. You are responsible for how you use the data, including BBB's terms and data protection and marketing laws such as GDPR, CCPA and CASL.

### Integrations

- **Google Sheets**: send each run's rows to a sheet with Apify's Google Sheets integration, or import the dataset's CSV link.
- **Make, Zapier and n8n**: start the actor and read its dataset with the Apify apps and nodes, for example "new complaints on our vendors to Slack every Monday".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above). Export as JSON, CSV, Excel, XML, RSS or an HTML table.
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [EU VAT Checker (VIES)](https://apify.com/themineworks/eu-vat-vies-validator?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Tech Stack Detector](https://apify.com/themineworks/tech-stack-detector?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Bundesanzeiger Scraper](https://apify.com/themineworks/germany-bundesanzeiger-monitor?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Domain to LinkedIn URL Resolver](https://apify.com/themineworks/domain-to-linkedin-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [US Import Records](https://apify.com/themineworks/us-import-supplier-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Y Combinator Scraper](https://apify.com/themineworks/y-combinator-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Norway Company Register](https://apify.com/themineworks/norway-brreg-entity-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search or a business that comes back wrong, or a field that looks off? Open an issue in the Issues tab with your input and the run ID, and we will look at it. For a new source or a field you need, email dmineworks@gmail.com.

*Search BBB by trade and city, or paste the profiles you care about, and get every business with its grade, accreditation, phone, address, complaint counts and review stars, in the US and Canada.*

# Actor input Schema

## `queries` (type: `array`):

Business categories or business names to search on BBB, one per line, for example "plumber", "roofing contractors" or "Roto-Rooter". Each term is one search.

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

Where to search: a city and state ("Austin, TX"), a ZIP code ("78701"), or a Canadian city and province ("Toronto, ON") or postal code. Leave empty to search all of BBB (US and Canada). A state on its own is read by BBB as one city in it.

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

Most businesses to return for each search term (and each search link), 10 to 1,000. BBB shows 225 businesses per search order; for bigger searches the actor also reads BBB's other views of the same search (A to Z, Z to A, by rating grade, accredited only), which reached 999 of 2,545 plumbers in Austin in our test. For full coverage of a big area, run it per ZIP code or city.

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

Return only businesses that are BBB Accredited.

## `includeComplaintsAndReviews` (type: `boolean`):

For each business, add its BBB complaint counts (total over the last 3 years, last 12 months, by status and by type) and its customer review count and average star rating. No extra charge; turn off for a faster run with the search card fields only.

## `includeDetails` (type: `boolean`):

Also read each business's BBB profile page for years in business, business start date, accredited since, website, other phones and websites, business email when listed, type of entity, description, licences and rating reasons. Each row that gets these details is charged one profile-details event on top of the business row.

## `startUrls` (type: `array`):

Optional. BBB search links (https://www.bbb.org/search?find_text=plumber\&find_loc=Austin%2C%20TX, filters and sort kept), category links (https://www.bbb.org/us/tx/austin/category/plumber) or business profile links (https://www.bbb.org/us/tx/austin/profile/plumber/calixto-plumbing-0825-1000223803). When links are given, the search terms above are not run.

## Actor input object example

```json
{
  "queries": [
    "plumber"
  ],
  "location": "",
  "maxResults": 10,
  "accreditedOnly": false,
  "includeComplaintsAndReviews": true,
  "includeDetails": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "plumber"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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 = { "queries": ["plumber"] }

# Run the Actor and wait for it to finish
run = client.actor("themineworks/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 '{
  "queries": [
    "plumber"
  ]
}' |
apify call themineworks/bbb-scraper --silent --output-dataset

```

## MCP server setup

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