BBB Scraper: Leads, Reviews and Complaints by City
Pricing
$4.00 / 1,000 results
BBB Scraper: Leads, Reviews and Complaints by City
Scrapes Better Business Bureau (bbb.org) search results for the USA and Canada past the 225-result cap, with optional customer reviews and complaints, complaint themes, a 0-100 lead score, change monitoring and an HTML report.
Pricing
$4.00 / 1,000 results
Rating
0.0
(0)
Developer
Sankov Vadim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
BBB Scraper: Better Business Bureau Leads, Reviews and Complaints
Search bbb.org by category and city, get clean business records with phone, rating, accreditation and a lead score, and optionally pull the full review and complaint texts.
It runs on plain HTTP requests without a browser, works around BBB's 225-result cap, and can flag what changed since your last run.
🚀 Quick start
- Open the Actor and keep the prefilled input: search term
plumber, locationAustin, TX, countryUnited States. - Click Start. The prefill runs without the 225-limit split and without reviews or complaints, so it finishes fast.
- Open the Overview or Leads view of the dataset, or open
REPORTin the key-value store for the HTML report. Export to CSV, Excel or JSON.
To get a whole market instead of the first 225 results, turn on Get past the 225-result limit. To read what customers say, turn on Include customer reviews and Include complaints.
💡 Use cases
- Lead generation for B2B sellers and agencies. Build lists of local contractors and service companies with phone, address, category, BBB rating and a 0-100 lead score to sort by.
- Contractor and vendor checks. Look up a specific company by exact name and see its rating, accreditation, complaint history and how often it answers complaints.
- Reputation and competitor analysis. Pull complaint texts and company replies for a whole category, grouped by theme (refund/billing, quality, delivery/delay, customer service, fraud/misleading).
- Monitoring. Re-run the same search on a schedule and get only the businesses that are new or changed (rating, accreditation, complaints).
✨ Why this Actor
| Feature | What you get |
|---|---|
| HTTP only | Reads three open JSON endpoints on bbb.org, so it needs neither a browser nor a login. |
| Search by category or name | Category/keyword plus city, state or ZIP. searchByName for exact company lookups. US and Canada. |
| 225-result workaround | Splits a capped search by sub-category, then by nearby ZIP codes sorted by distance, then by sort order. Duplicates removed by businessId. |
| Coverage report | COVERAGE in the key-value store shows, for every query, how many results BBB reports and how many you collected. |
| Reviews and complaints | Texts, stars, dates, status and company replies. Counts by status and type cover all complaints on file, not only the saved ones. |
| Complaint themes | Each complaint is tagged: refund/billing, quality, delivery/delay, customer service, fraud/misleading, other. |
| Lead score | One 0-100 number built from rating, accreditation, reviews, complaint handling and phone. |
| Monitor mode | Marks each business NEW, CHANGED or UNCHANGED against your previous run. |
| HTML report | Self-contained page with sorting, filters and CSV download. |
| Reliable runs | Retries with backoff, spending limit respected, collected data saved on timeout or migration. |
In one smoke run for plumber in Austin, TX, BBB reported 2544 results for the search and showed 225. With splitting on, the Actor collected 1048 unique businesses.
⚙️ Input
| Field | Type | Default | Description |
|---|---|---|---|
searchTerms | list | plumber (prefill) | Categories (roofing contractors) or business names. Each term runs in every location. |
locations | list | Austin, TX (prefill) | City, ST, a ZIP code, or a Canadian city with province (Toronto, ON). |
country | USA / CAN | USA | BBB covers the United States and Canada. |
startUrls | list | empty | Optional bbb.org search URLs or category URLs. |
searchByName | boolean | false | BBB matches terms loosely. Turn on to look up a company by its name. |
sort | select | Relevance | Relevance, Distance, Rating, AToZ, ZToA. |
maxItems | integer | 1000 (prefill 20) | Total unique businesses to save across all searches. |
maxItemsPerQuery | integer | 0 | Limit per term + location pair. 0 means no limit. |
autoSplit | boolean | true (prefill false) | Get past BBB's 225-result cap. |
maxSplitRequests | integer | 300 | Cap on extra search pages used for splitting. Each page holds 15 results. |
accreditedOnly | boolean | false | Keep only BBB Accredited Businesses. |
minRating | select | any | Drop businesses rated below this grade (A+ to F). Not-rated businesses are dropped when a grade is set. |
strictMatch | boolean | false | Keep only businesses whose name or categories contain every word of the term. |
includeReviews | boolean | false | Fetch review texts, stars and business replies. |
maxReviewsPerBusiness | integer | 30 | Newest reviews first. |
includeComplaints | boolean | false | Fetch complaint texts, type, status and business responses. |
maxComplaintsPerBusiness | integer | 30 | Most recently closed first. Counts by status and type always cover all complaints. |
monitorMode | boolean | false | Compare with the previous run under the same monitor name. |
monitorKey | string | default | Runs with the same name share one snapshot. |
onlyChanges | boolean | false | With monitoring on, unchanged businesses are not saved and not charged. |
buildReport | boolean | true | Save the HTML report as REPORT. |
maxConcurrency | integer | 4 | Parallel requests, 1 to 10. Higher is faster but may hit rate limits. |
proxyConfiguration | object | no proxy | Usually not needed. Turn on if the log shows blocking warnings. |
Example input:
{"searchTerms": ["plumber"],"locations": ["Austin, TX"],"country": "USA","maxItems": 500,"autoSplit": true,"includeComplaints": true}
📦 Output
One row per business. The dataset has three views: Overview, Leads (contact and location fields) and Complaints (complaint stats per business).
| Field | Description |
|---|---|
businessId, bbbId, searchId | BBB identifiers. businessId is used for deduplication. |
businessName, primaryCategory, categories | Name and categories. |
address, city, state, postalCode, country | Location. |
phone, phones | First phone and all phones. |
latitude, longitude | Coordinates. |
rating, ratingScore | BBB letter grade and numeric score. |
isAccredited, bbbOffice | Accreditation flag and local BBB office. |
profileUrl, requestAQuoteUrl, leaveReviewUrl, logoUrl | Links. |
outOfBusinessStatus, isCharity, charitySeal | Status flags. |
serviceAreasSummary, hasServiceArea, serviceAreaDescription | Service area. |
leadScore, leadScoreBreakdown | 0-100 score and its components. |
searchTerm, searchLocation, splitPath, scrapedAt | Where and when the row was found. |
reviewsCount, reviewsAvgStars, reviewsBusinessResponseRate | Review stats (with reviews on). |
reviews[] | id, stars, author, date, text, businessResponse, businessResponseDate, businessRebuttal, customerResponse. |
complaintsCount, complaintsHidden | Complaints on file and hidden ones (with complaints on). |
complaints[] | id, type, status, date, text, businessResponse, consumerResponse, category. |
complaintsByStatus, complaintsByType | Counts across all complaints on file. |
complaintsResponseShare, complaintsResolvedShare | Share of complaints answered and resolved. |
complaintCategories, topComplaintCategory | Theme counts and the most common theme. |
monitorStatus, changedFields, newComplaints | Monitor results (with monitoring on). |
yearsInBusiness | Always null in v1. See Limits. |
detailsError | Set when reviews or complaints could not be fetched. The business row is still saved. |
Real row from a run on the Apify platform (plumber in Austin, TX, reviews and complaints on; texts and lists shortened):
{"businessId": "90006300","bbbId": "0825","businessName": "EC Design Builds Inc","address": null,"city": "Austin","state": "TX","postalCode": "78731","country": "USA","phone": "(512) 363-3576","rating": "A+","ratingScore": 100,"isAccredited": true,"primaryCategory": "General Contractor","primaryCategoryId": "10035-000","categories": [{"id": "10035-000","name": "General Contractor"},{"id": "10126-000","name": "Roofing Contractors"},{"id": "10032-000","name": "Concrete Contractors"}],"profileUrl": "https://www.bbb.org/us/tx/austin/profile/general-contractor/ec-design-builds-inc-0825-90006300","isCharity": false,"outOfBusinessStatus": null,"hasServiceArea": true,"serviceAreasSummary": ["Bastrop County, TX","Blanco County, TX","Guadalupe County, TX","Travis County, TX","Williamson County, TX"],"yearsInBusiness": null,"searchTerm": "plumber","searchLocation": "Austin, TX","splitPath": null,"scrapedAt": "2026-10-03T07:23:57+00:00","reviewsCount": 3,"reviewsFetched": 3,"reviewsAvgStars": 5,"reviewsBusinessResponseRate": 0,"reviewIssueCategories": {},"reviews": [{"id": "0825_90006300_586722","stars": 5,"author": "Phil D","date": "2026-07-30","text": "******* and ***** were absolutely great from the first phone call through project completion. They helped us navigate both our insurance claim and supplement...","businessResponse": null,"businessResponseDate": null,"businessRebuttal": null,"customerResponse": null,"issueCategory": null}],"complaintsCount": 1,"complaintsHidden": 0,"complaintsFetched": 1,"complaintsByStatus": {"answered": 1},"complaintsByType": {"serviceorrepair": 1},"complaintsResolvedShare": 0,"complaintsResponseShare": 1,"complaintCategories": {"fraud_misleading": 0,"refund_billing": 0,"delivery_delay": 0,"quality": 0,"customer_service": 0,"other": 1},"topComplaintCategory": "other","lastComplaintId": "0825_90006300_24526559","complaints": [{"id": "0825_90006300_24526559","type": "Service or Repair Issues","status": "Answered","date": "2026-02-17","text": "We expect bathroom work to be completed as per contract","businessResponse": "EC Design Builds Inc. respectfully disputes the customers version of events and the assertion that contracted work was not completed. This project involved m...","consumerResponse": "Complaint: 24526559 I am rejecting this response because: The Contractor is not complete with work. I have attached a pdf with additional information as rebu...","responseCount": 4,"category": "other"}],"detailsError": null,"leadScore": 93,"leadScoreBreakdown": {"rating": 100,"accreditation": 100,"reviews": 68.8,"complaints": 95,"contact": 100}}
With complaints on, each business also gets complaintsCount, complaintsByStatus, complaintsResponseShare, complaintCategories, topComplaintCategory and a complaints[] list in the shape listed above.
📊 Report and coverage
When buildReport is on, the key-value store gets two records:
REPORT: one HTML file with no external scripts. It shows totals, accredited count, average lead score, coverage, rating distribution, top categories and cities, top complaint themes, and a table you can sort by clicking headers and filter by rating, accreditation, city and minimum lead score. A button downloads the table as CSV.COVERAGE: JSON with, for each source query, the total BBB reports, how many you collected, how many splits were used and the shortfall. The log warns when more than 20% is missing.
🎯 Lead score
leadScore is a weighted average on a 0-100 scale. A component that is not available drops out, and its weight is not counted against the business.
| Component | Weight | Score |
|---|---|---|
| BBB rating | 0.35 | ratingScore if present, otherwise A+ = 100 down to F = 0. Not rated: left out. |
| Accreditation | 0.20 | 100 if accredited, otherwise 0. |
| Reviews | 0.20 | Average stars scaled to 0-100, pulled toward 50 when there are few reviews. Only with reviews on. |
| Complaint handling | 0.15 | 100 if no complaints, otherwise the answered share minus a penalty that grows with the number of complaints. Only with complaints on. |
| Phone | 0.10 | 100 if a phone number exists, otherwise 0. |
A business marked out of business gets a score of 0. leadScoreBreakdown shows each component for every row.
🔔 Monitoring
Turn on monitorMode and give the watch list a monitorKey. Each run compares against the saved snapshot for that name:
NEW: not seen in earlier runs.CHANGED: something differs.changedFieldslists what (rating, accreditation, complaints and so on), andnewComplaintsshows the increase.UNCHANGED: nothing moved.
Set onlyChanges to save only new and changed businesses. Unchanged ones are not saved and not charged. Schedule the Actor in Apify Console for daily or weekly checks. The snapshot is merged, not replaced, so a business missing from a later partial search is not marked as gone.
💳 Pricing
Pay per result. See the Pricing tab for current rates.
⚠️ Limits
- You will not get owner names, emails, websites or years in business. bbb.org profile pages sit behind Cloudflare and the Actor reads only the public JSON endpoints.
yearsInBusinessis alwaysnull. - Big markets need a split budget. Coverage depends on
maxSplitRequestsand on how BBB filters the query. CheckCOVERAGEto see what was missed, and raise the cap if needed. - Complaint themes are a heuristic. Keyword rules, not a language model. Expect misclassified edge cases. BBB's own complaint
typeis kept next to it. - Search is loose. BBB matches terms broadly. Use
searchByNameorstrictMatchwhen you need precision. - The Actor covers the USA and Canada only.
- Blocking is possible. If the log shows Cloudflare warnings, enable the proxy.
❓ FAQ
Do I need a proxy? Usually not. Search, reviews and complaints loaded without one in our tests. Enable it if the log warns about blocking.
Why does BBB show only 225 results?
BBB caps every search at 225 results. With autoSplit on, the Actor repeats the search by sub-category, by nearby ZIP code and by sort order, then removes duplicates.
How do I find one specific company?
Put the company name in searchTerms, set a location and turn on searchByName.
Can I scrape Canada?
Yes. Set country to CAN and use locations like Toronto, ON.
Are all complaints included in the counts?
Yes. Status and type counts cover every complaint on file. The complaints[] list is limited by maxComplaintsPerBusiness.
What happens if the run times out or hits my spending limit? The Actor stops sending new requests, saves what it has and writes the report.
📝 Changelog
- 1.0 (2026-10): First release. Search, 225-limit split, reviews, complaints, complaint themes, lead score, monitor mode, HTML report.
💬 Support
Found a bug or need a field? Open an issue on the Actor's Issues tab in Apify Console. Include the run link and your input.
This Actor collects publicly available business information from bbb.org. You are responsible for using the data in line with the law and the site's terms in your jurisdiction.