BBB Scraper: Ratings, Accreditation, Complaints, Reviews avatar

BBB Scraper: Ratings, Accreditation, Complaints, Reviews

Pricing

from $1.50 / 1,000 businesses

Go to Apify Store
BBB Scraper: Ratings, Accreditation, Complaints, Reviews

BBB Scraper: Ratings, Accreditation, Complaints, Reviews

Search bbb.org (US and Canada) by keyword and city, state or ZIP, or paste BBB profile URLs. Get BBB rating, accreditation date, phone, website, years in business, complaint and review counts. Optional review and complaint text. Status rows are free.

Pricing

from $1.50 / 1,000 businesses

Rating

0.0

(0)

Developer

Dottti

Dottti

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

Get Better Business Bureau (bbb.org) data for businesses in the United States and Canada. Search by category or keyword and a city, state or ZIP code. You can also paste BBB profile links. Each business comes back as one flat row with its BBB letter grade, accreditation status, categories, phone numbers, address, map position, and the number of public complaints and customer reviews.

You can also add the public customer reviews and complaints of each business. They come as separate rows at a lower price.

You need no BBB account and no API key.

Who uses it

  • Lead generation teams who build lists of local contractors, dentists, lawyers or shops with phone numbers and addresses.
  • Due diligence and vendor checks. See a supplier's BBB grade, accreditation and complaint history before you sign.
  • Insurance, lending and risk teams who score small businesses with BBB grades and complaint counts.
  • Agencies and reputation managers who track BBB ratings and complaints for their clients on a schedule.
  • Researchers who compare complaint types across a category or a city.

What you can do

  • Search many terms in many locations in one run. Each term runs in each location.
  • Paste BBB profile URLs. Review and complaint sub-page links work too.
  • Keep only accredited businesses, or only businesses with a minimum BBB grade (for example A- or better).
  • Get the number of complaints and reviews for every business, and the average stars when a business has 15 reviews or fewer.
  • Add customer reviews (stars, date, text, business reply) and complaints (type, status, date, text, business response).
  • Canadian locations such as Toronto, ON or M4S 2N4 switch the search to Canada on their own.

Input examples

Roofers in two Texas cities, accredited only:

{
"searchTerms": ["roofing"],
"locations": ["Austin, TX", "Dallas, TX"],
"accreditedOnly": true,
"maxResultsPerSearch": 100
}

Plumbers and electricians in three ZIP codes, A- or better:

{
"searchTerms": ["plumber", "electrician"],
"locations": ["10001", "60614", "94103"],
"minRating": "A-",
"maxResultsPerSearch": 50
}

Check a list of known businesses, with their newest complaints:

{
"profileUrls": [
"https://www.bbb.org/us/tx/austin/profile/roofing-contractors/fiducia-roofing-restoration-0825-90019908",
"https://www.bbb.org/ca/on/toronto/profile/dentist/central-dental-group-0107-1374844"
],
"includeComplaints": true,
"maxComplaintsPerBusiness": 30
}

With empty input the actor runs a small example: 10 roofing businesses in Austin, TX.

Output

Every row has a type field: business, review, complaint, search or status.

A business row (real data from bbb.org, 3 November 2026):

{
"type": "business",
"name": "Stevan Buren Roofing, Windows, and Flooring",
"bbbRating": "A+",
"accredited": true,
"primaryCategory": "Roofing Contractors",
"categories": ["Roofing Contractors", "Siding Contractors", "Windows", "Window Installation"],
"phone": "(817) 558-6997",
"additionalPhones": ["(210) 686-1425", "(214) 432-2593", "(512) 275-6159"],
"street": "108 Wild Basin Rd Suite 250",
"city": "Austin",
"state": "TX",
"postalCode": "78746",
"country": "US",
"latitude": 30.30679702758789,
"longitude": -97.8266830444336,
"complaintsTotal": 1,
"reviewRating": 5,
"reviewsCount": 2,
"localBbb": "BBB Heart of Texas",
"profileUrl": "https://www.bbb.org/us/tx/cleburne/profile/roofing-contractors/stevan-buren-roofing-windows-and-flooring-0825-235975973",
"bbbId": "0825",
"businessId": "235975973",
"detailLevel": "search",
"searchTerm": "roofing",
"searchLocation": "Austin, TX"
}

A complaint row:

{
"type": "complaint",
"businessName": "RR Plumbing Roto-Rooter",
"complaintType": "Billing Issues",
"complaintStatus": "Answered",
"date": "2026-10-22",
"text": "I used this company to deal with water damage in my basement due to burst pipe. ...",
"businessResponse": "We have received the complaint and will review ...",
"responses": [{ "from": "business", "date": "2026-10-23", "text": "..." }],
"profileUrl": "https://www.bbb.org/us/oh/cincinnati/profile/plumber/roto-rooter-plumbing-water-cleanup-0292-1922"
}

A review row has stars, date, text, businessResponse and businessResponseDate. Reviewer names are left out on purpose. BBB already masks personal details inside complaint and review text.

Each search gets one free search row. It shows how many results BBB has, how many were delivered, how many your filters skipped, and a status: ok, no_results, location_not_found or blocked. A bad or missing profile URL gets a free status row (invalid_input, not_found or blocked).

reviewRating is filled only when it is exact: the business has 15 reviews or fewer, so every star is counted.

Full profile fields (experimental). Turn on includeProfileDetails to also try each profile page for website, accreditation date, years in business, entity type, social links and closed-complaint counts (last 3 years and 12 months). bbb.org often refuses these pages to cloud servers. When that happens the row keeps the search data, detailLevel stays search, and after 3 refusals the run stops trying. When a page is read, detailLevel is full.

The run summary (key-value store, RUN_SUMMARY) lists every input, profile pages read or refused, requests, kB used and the proxy tier used.

How to schedule

Save your input as a task in Apify Console, then add a schedule (for example every Monday). Use the dataset API or an integration (Google Sheets, Slack, webhooks) to send the rows where you need them.

Pricing

You pay per result row. Platform usage is included in the price.

  • Business row: one charge per business delivered.
  • Review or complaint row: one charge per row, at a lower price. Only charged when you turn these on.
  • Search and status rows are free. You never pay for a blocked page, a bad URL, a location BBB does not know, or a business your filters skipped.

You can set a maximum cost per run in Apify Console. The actor stops cleanly when it reaches that limit.

Limits

  • BBB shows at most 225 results (15 pages) per search. For bigger areas, split by city or ZIP code, or use narrower terms.
  • If BBB does not recognise a location, it shows a nationwide list. The actor then returns a free location_not_found row and delivers nothing for that search.
  • The same business found by two searches is delivered once.
  • Accreditation flags in Canadian search results can be incomplete.
  • Website, years in business and accreditation date come only from profile pages, which bbb.org often refuses to cloud servers (see above).
  • The actor reads public BBB pages only. It never logs in and never collects the names of reviewers or complainants.