BBB Scraper - Business Ratings, Reviews, Complaints & B2B Leads
Pricing
from $1.20 / 1,000 business results
BBB Scraper - Business Ratings, Reviews, Complaints & B2B Leads
Scrape bbb.org (Better Business Bureau, USA & Canada) business profiles: BBB rating, accreditation, contact and lead-gen data (decoded email, phone, website, socials, owner), address + coordinates, business type, years in business, licenses, hours, plus opt-in customer reviews and complaints..
Pricing
from $1.20 / 1,000 business results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
BBB.org Business Profile Scraper — Ratings, Reviews, Complaints & B2B Leads
Scrape business profiles from the Better Business Bureau (bbb.org) across the USA and Canada. Every business is one record: BBB rating, accreditation, contact and lead-gen data (decoded email, phone, website, social profiles, owner), address with coordinates, business type, years in business, licenses, hours, and category tree — plus opt-in customer reviews and complaints.
What you can do
- Search by business term + location — e.g. "plumber" in "Los Angeles, CA" or "Toronto, ON" — with filters for accredited-only and distance.
- Paste BBB URLs — mix business profile pages
(
https://www.bbb.org/us/ca/los-angeles/profile/plumber/fords-plumbing-1216-100081178) and search result pages in one list. - Scrape reviews & complaints — optional per-business surcharge to also pull customer reviews (rating, author, text, date, response) and complaints (type, status, date, resolution), independently paginated.
- Resume & recurring updates — turn on Incremental mode to get only NEW,
UPDATED, and REAPPEARED businesses on every scheduled run, or resume one
specific interrupted crawl with
resumeFromRunId.
Input
| Field | Description |
|---|---|
| Mode | search (term + location) or url (paste BBB links). |
| Business terms | Keyword terms to search (search mode). Each is combined with the location. |
| Location | City + state/province or ZIP code. Leave empty for nationwide. |
| Country | USA or CAN. |
| Sort order | Relevance, Rating, Distance, or AToZ. Applied by BBB itself. |
| Search radius (miles) | Limit results within N miles of the location. |
| Accredited businesses only | Only return BBB-accredited businesses. |
| BBB URLs | Paste BBB search or business-profile URLs (url mode). Auto-detected and mixed. |
| Max businesses | Run's cap on how many business profiles to return. Default 20; 0 = unlimited. |
| Max pages per search / URL | Result pages walked per term/URL (15 per page). Empty = unlimited — stops at Max businesses or end of results. |
| Scrape customer reviews | Also pull each business's reviews (adds the reviews & complaints surcharge). |
| Scrape complaints | Also pull each business's complaints (adds the reviews & complaints surcharge). |
| Max review pages per business | Cap on review pages (default 5). |
| Max complaint pages per business | Cap on complaint pages (default 5). |
| Resume from a previous run | Continue one specific previous run/dataset — businesses already collected there are skipped. |
| Incremental changes for scheduled runs | Daily/recurring monitoring. First run returns everything as NEW; later runs return only changes. |
| State key | Optional name for a monitoring campaign. Auto-derived from your search settings when left empty. |
| Emit unchanged businesses | Also return unchanged businesses, marked UNCHANGED. Bills extra rows. |
| Emit expired businesses | Also return businesses no longer found, marked EXPIRED. Bills extra rows. |
| Proxy | Apify Proxy — residential recommended for maximum reliability. |
| Pipe results into your apps | Optional MCP connectors — see below. |
| Notion parent page | Notion page under which item pages are created (Notion connector only). |
| Max items to export per connector | Cap on items written to each connector per run. Does not affect the dataset. |
Output
One record per business profile. Example:
{"name": "Example Plumbing Co.","alternateNames": ["Example Plumbing Co., LLC"],"businessId": "0825-1000223803","bbbId": "0825","bbbOfficeName": "BBB Heart of Texas","profileUrl": "https://www.bbb.org/us/tx/austin/profile/plumber/example-plumbing-co-0825-1000000000","bbbRating": "A+","isAccredited": true,"accreditedDate": "2024-01-16","bbbFileOpenedDate": "2024-01-16","phone": "(555) 010-0100","additionalPhones": null,"email": "info@example.com","additionalEmails": null,"website": "https://www.example.com/","ownerName": "Jane Doe","ownerTitle": "Owner/Manager","streetAddress": "100 Example St","city": "Austin","stateCode": "TX","zipCode": "78701","formattedAddress": "100 Example St, Austin, TX 78701","countryCode": "US","latitude": 30.27,"longitude": -97.74,"serviceAreas": ["Travis County, TX", "Williamson County, TX"],"primaryCategory": "Plumber","categories": ["Plumber", "Plumbing Renovation", "Commercial Plumber"],"categoryTree": [{"name": "Plumber", "url": "https://www.bbb.org/us/tx/austin/category/plumber"}],"businessType": "Limited Liability Company (LLC)","yearsInBusiness": 3,"businessStartDate": "2023-03-14","incorporatedDate": "2023-03-14","numberOfEmployees": null,"isOutOfBusiness": false,"licenses": [{"licenseNumber": "44648","expirationDate": "2026-11-30","agencyName": "Texas State Board of Plumbing Examiners","agencyPhone": "800-8456584"}],"hours": [{"day": "M", "hours": [{"opens": "07:00", "closes": "16:00"}], "note": null}],"reviewsTotal": 1,"averageReviewRating": 1.0,"complaintsTotal": 0,"complaintsClosedLast3Years": 0,"complaintsClosedLast12Months": 0,"complaintResolutionRate": null,"socialProfiles": null,"reviews": null,"complaints": null,"logoUrl": "https://m.bbb.org/prod/ProfileImages/2024/1f7a8bd4-fdd2-45ca-8963-5c246e1d3b85.png","reviewsUrl": "https://www.bbb.org/us/tx/austin/profile/plumber/example-plumbing-co-0825-1000000000/customer-reviews","complaintsUrl": "https://www.bbb.org/us/tx/austin/profile/plumber/example-plumbing-co-0825-1000000000/complaints","scrapedAt": "2026-01-01T00:00:00Z","changeType": "NEW","changedFields": [],"firstSeenAt": "2026-01-01T00:00:00Z","lastSeenAt": "2026-01-01T00:00:00Z"}
email is returned ready to use: BBB publishes addresses in a scrambled form to
deter harvesting, and this scraper returns the plain address. It is null when
the business has not published one — a third party's address that happens to
appear on the page is never returned in its place.
complaintResolutionRate is complaintsClosedLast3Years / complaintsTotal —
BBB publishes closed-complaint counts, not a separate "resolved" figure. It is
null when a business has no complaints on file.
With scrapeReviews / scrapeComplaints on, reviews and complaints carry
the full items:
{"reviews": [{"id": "0825_10000000_000000","author": "J. D.","rating": 1.0,"date": "2026-07-24","text": "…","businessResponse": null,"businessResponseDate": null}],"complaints": [{"id": "0825_10000000_000001","type": "Billing Issues","status": "Resolved","date": "2026-07-07","text": "…","responses": [{"type": "business", "date": "2026-07-09", "text": "…"}],"responseCount": 1}]}
Incremental mode fields:
| Field | Description |
|---|---|
changeType | NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED |
changedFields | Top-level fields that changed since last seen |
firstSeenAt | When this business was first observed by this monitoring campaign |
lastSeenAt | When this business was last observed |
Reviews & complaints enrichment
When scrapeReviews or scrapeComplaints is on, each business carries a
reviews and/or complaints array, paginated up to your page caps (BBB serves
about 10 per page, and the walk stops at the last page BBB reports).
The detail-enrichment surcharge is one unit per business whose review / complaint pages were actually fetched and returned. A business that is suppressed by incremental mode (UNCHANGED with Emit unchanged off) is never charged, and neither is one whose detail pages could not be read.
Send results into your apps (MCP connectors)
Businesses can be pushed straight into the tools you already use, over the Model Context Protocol — no glue code and no separate integration run.
- In Apify, open Settings → API & Integrations and authorize a connector (Notion, Linear, Airtable, or Apify).
- Select it under
mcpConnectorsin this actor's input. - For Notion, also set
notionParentPageUrlto the page (URL or id) the business pages should be created under — the Notion export stays off until this is filled in. Other connectors ignore it. - Use
maxNotifyListingsto cap how many businesses are written to each connector per run (default 50).
Notion receives a rich page per business; the other connectors get a
best-effort write or digest. The export runs after the crawl, never changes the
dataset, and never changes what you are billed — leave mcpConnectors empty to
skip it entirely.
| Field | Description |
|---|---|
mcpConnectors | Connectors to send results to. Empty = skip. |
notionParentPageUrl | Parent Notion page for created item pages. Notion only. |
maxNotifyListings | Max businesses written per connector per run (default 50). |
Pricing
Three charge events:
| Event | Description |
|---|---|
apify-actor-start | One unit charged at startup (billed per GB of memory). |
apify-default-dataset-item | One unit per business profile returned. |
detail-enrichment | One unit per business when reviews and/or complaints are scraped. |
Tiered pricing: FREE / BRONZE / SILVER / GOLD / PLATINUM / DIAMOND.
Proxy
BBB requires a browser-grade connection. A residential Apify Proxy session is recommended for maximum reliability. A datacenter connection may work for a small subset of requests but will have significantly lower reliability. The scraper automatically handles session management and rotation.
Resume & recurring updates
resumeFromRunId— paste a previous run ID or dataset ID to continue that interrupted crawl. Businesses already in that run are skipped and not billed again.incrementalMode— turn on for scheduled daily monitoring. The actor remembers the previous run's state (keyed by your search settings) and returns only changes. UsestateKeyto name a campaign; leave empty to auto-derive.
The two fields target different workflows: Resume recovers one broken run; Incremental mode powers recurring monitoring without you pasting IDs every time.