BBB Scraper - Business Ratings, Reviews, Complaints & B2B Leads avatar

BBB Scraper - Business Ratings, Reviews, Complaints & B2B Leads

Pricing

from $1.20 / 1,000 business results

Go to Apify Store
BBB Scraper - Business Ratings, Reviews, Complaints & B2B Leads

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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

FieldDescription
Modesearch (term + location) or url (paste BBB links).
Business termsKeyword terms to search (search mode). Each is combined with the location.
LocationCity + state/province or ZIP code. Leave empty for nationwide.
CountryUSA or CAN.
Sort orderRelevance, Rating, Distance, or AToZ. Applied by BBB itself.
Search radius (miles)Limit results within N miles of the location.
Accredited businesses onlyOnly return BBB-accredited businesses.
BBB URLsPaste BBB search or business-profile URLs (url mode). Auto-detected and mixed.
Max businessesRun's cap on how many business profiles to return. Default 20; 0 = unlimited.
Max pages per search / URLResult pages walked per term/URL (15 per page). Empty = unlimited — stops at Max businesses or end of results.
Scrape customer reviewsAlso pull each business's reviews (adds the reviews & complaints surcharge).
Scrape complaintsAlso pull each business's complaints (adds the reviews & complaints surcharge).
Max review pages per businessCap on review pages (default 5).
Max complaint pages per businessCap on complaint pages (default 5).
Resume from a previous runContinue one specific previous run/dataset — businesses already collected there are skipped.
Incremental changes for scheduled runsDaily/recurring monitoring. First run returns everything as NEW; later runs return only changes.
State keyOptional name for a monitoring campaign. Auto-derived from your search settings when left empty.
Emit unchanged businessesAlso return unchanged businesses, marked UNCHANGED. Bills extra rows.
Emit expired businessesAlso return businesses no longer found, marked EXPIRED. Bills extra rows.
ProxyApify Proxy — residential recommended for maximum reliability.
Pipe results into your appsOptional MCP connectors — see below.
Notion parent pageNotion page under which item pages are created (Notion connector only).
Max items to export per connectorCap 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:

FieldDescription
changeTypeNEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED
changedFieldsTop-level fields that changed since last seen
firstSeenAtWhen this business was first observed by this monitoring campaign
lastSeenAtWhen 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.

  1. In Apify, open Settings → API & Integrations and authorize a connector (Notion, Linear, Airtable, or Apify).
  2. Select it under mcpConnectors in this actor's input.
  3. For Notion, also set notionParentPageUrl to 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.
  4. Use maxNotifyListings to 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.

FieldDescription
mcpConnectorsConnectors to send results to. Empty = skip.
notionParentPageUrlParent Notion page for created item pages. Notion only.
maxNotifyListingsMax businesses written per connector per run (default 50).

Pricing

Three charge events:

EventDescription
apify-actor-startOne unit charged at startup (billed per GB of memory).
apify-default-dataset-itemOne unit per business profile returned.
detail-enrichmentOne 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. Use stateKey to 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.