BBB Business Search Scraper avatar

BBB Business Search Scraper

Pricing

Pay per event

Go to Apify Store
BBB Business Search Scraper

BBB Business Search Scraper

Search public BBB business listings by keyword, US location, radius, or direct search URL. Export ratings, accreditation, phones, categories, addresses, coordinates, and profile links.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Search public Better Business Bureau business listings by keyword and US location, then export normalized lead, rating, accreditation, contact, category, and location data.

Use BBB Business Search Scraper when you need repeatable BBB directory results rather than individual review text or complaint histories. One run can process a normal keyword/location search, one or more existing BBB search URLs, or both.

What does BBB Business Search Scraper do?

The Actor requests BBB search-result pages through stable US residential sessions and reads the server-rendered business data already present in those pages.

It can:

  • search by business keyword or category;
  • target a city/state, ZIP code, or other US location accepted by BBB;
  • apply an optional radius from 1 to 250 miles;
  • paginate through search results;
  • accept direct bbb.org/search URLs;
  • combine several searches into one dataset;
  • deduplicate businesses by canonical BBB profile URL;
  • stop at a user-defined global result limit;
  • export normalized JSON, CSV, Excel, XML, or RSS through Apify datasets.

The Actor does not open business profiles in v1. It does not extract individual reviews, complaint narratives, or fields that are not present in public search results.

Who is it for?

Lead-generation agencies

Build prospect lists for local trades and services. Use categories, phone numbers, ratings, and accreditation flags for prioritization before enrichment or outreach.

Local-market researchers

Compare the businesses BBB returns for a category across cities, ZIP codes, or radii. Schedule the same inputs to refresh market snapshots.

Vendor-risk and compliance teams

Collect public BBB rating and accreditation signals alongside profile URLs for later review. Treat these as source signals, not as a complete risk decision.

Reputation and directory platforms

Refresh normalized BBB search records for matching, monitoring, or source-linking workflows without manually copying listings.

Why use this Actor?

  • Search-focused: the output is one clean row per business, not a mixture of businesses, reviews, and complaints.
  • Useful source context: every row includes the exact search, location, radius, page, and URL that produced it.
  • Anti-blocking controls: sticky residential sessions, explicit Cloudflare challenge detection, bounded retries, and session rotation are built in.
  • Fail-closed behavior: a challenge page is never reported as a valid empty search.
  • Cost control: maxResults and maxPages prevent an unexpectedly broad crawl.
  • Integration-ready: the default dataset works directly with the Apify API, webhooks, Make, Zapier, Google Sheets, and MCP clients.

What BBB business data can I extract?

FieldMeaning
businessNameBusiness name shown in BBB search
address, city, state, postalCodePublic address components when present
categories, primaryCategoryBBB category labels
bbbRating, ratingScoreBBB letter rating and exposed numeric score
isBbbAccredited, isBbbMemberAccreditation/member flags exposed by search
phonesPublic phone numbers shown in the result
profileUrlCanonical absolute BBB profile URL
bbbOfficeBBB office associated with the listing
latitude, longitudeCoordinates supplied in the search response
requestAQuoteUrlBBB quote-request URL when available
leaveReviewUrlBBB leave-a-review URL when available
outOfBusinessStatusOut-of-business status when BBB supplies one
sourceQuerySearch text, location, radius, page, and source URL
scrapedAtISO 8601 collection timestamp

Fields can be null when BBB does not publish them for a particular result. Arrays can be empty.

How to scrape BBB business search results

  1. Open the Actor in Apify Console.
  2. Enter both Business keyword or category and Location.
  3. Optionally set a radius in miles.
  4. Keep maxResults small for your first run.
  5. Click Start.
  6. Open the Dataset tab to inspect results.
  7. Export the dataset or connect it to your workflow.

A tested starter input is:

{
"search": "Home Improvement",
"location": "Los Angeles, CA",
"distance": 25,
"maxResults": 25,
"maxPages": 5
}

Input parameters

InputTypeDefaultDescription
searchstringprefilledBusiness keyword or category. Requires location.
locationstringprefilledUS city/state, ZIP code, or BBB-supported location. Requires search.
distanceintegeroptionalRadius from 1 to 250 miles.
startUrlsarray[]Public bbb.org/search URLs whose filters should be preserved.
maxResultsinteger100Maximum unique business rows across the run.
maxPagesinteger20Maximum result pages processed per search.
maxRequestRetriesinteger3Retries for blocked or transiently failed pages.
proxyConfigurationobjectUS residentialAdvanced proxy override.

Provide either a keyword/location pair or at least one direct search URL. If you provide both, all searches contribute to one deduplicated dataset.

Only BBB search URLs are accepted in startUrls; profile and review URLs are rejected because they are outside this Actor's contract.

Output example

A current Los Angeles search produced a record with this shape:

{
"businessName": "Buildda, Inc.",
"address": null,
"city": "Culver City",
"state": "CA",
"postalCode": "90230-4933",
"categories": ["Home Improvement"],
"primaryCategory": "Home Improvement",
"bbbRating": "A-",
"ratingScore": 93.17,
"isBbbAccredited": true,
"isBbbMember": true,
"phones": ["(310) 266-5744"],
"profileUrl": "https://www.bbb.org/us/ca/culver-city/profile/home-improvement/buildda-1216-1000038952",
"bbbOffice": "BBB of Los Angeles & Silicon Valley",
"latitude": 34.04,
"longitude": -118.3,
"requestAQuoteUrl": "https://www.bbb.org/losangelessiliconvalley/quote/request-buildda-1000038952",
"leaveReviewUrl": "https://www.bbb.org/us/ca/culver-city/profile/home-improvement/buildda-1216-1000038952/leave-a-review",
"outOfBusinessStatus": null,
"sourceQuery": {
"search": "Home Improvement",
"location": "Los Angeles, CA",
"distance": 1,
"page": 1,
"url": "https://www.bbb.org/search?find_country=USA&find_text=Home+Improvement&find_loc=Los+Angeles%2C+CA&find_radius=1&page=1"
},
"scrapedAt": "2026-01-15T12:00:00.000Z"
}

Public source values can change between runs as BBB updates its directory.

How much does it cost to scrape BBB business results?

The Actor uses pay-per-event pricing:

  • $0.005 per run start;
  • $0.000041071 per saved business on the FREE tier;
  • volume discounts reduce the per-business price through BRONZE, SILVER, GOLD, PLATINUM, and DIAMOND tiers.

At FREE-tier pricing, approximate Actor charges are:

Saved businessesApproximate charge
25about 0.006 USD
100about 0.009 USD
1,000about 0.046 USD

These examples include the run-start event and round to three decimals. Your active tier can be cheaper. A duplicate, rejected record, failed request, or empty result is not charged as a business result. Apify displays the exact charge in each run.

Search and pagination tips

  • Begin with 25–100 results to validate category and location quality.
  • Prefer a specific trade such as Roofing Contractors over a broad word such as Services.
  • Use direct BBB search URLs when you need to reproduce filters selected in the BBB interface.
  • Use several startUrls to build multi-market exports in one run.
  • Keep maxPages bounded; BBB can rank or repeat businesses across neighboring areas.
  • Deduplication uses the canonical BBB profile URL across every search in the run.
  • maxResults is global, so earlier searches can consume the limit before later searches run.

Anti-bot behavior and retries

BBB currently challenges direct data-center HTTP traffic. The default configuration therefore uses a US residential proxy and keeps one proxy session while paginating.

On a verified challenge or transient response, the Actor rotates to a fresh session and retries with exponential backoff. After maxRequestRetries is exhausted, the run fails with a clear error instead of returning a misleading empty dataset.

Disabling the proxy is an advanced choice and can cause HTTP 403 responses. There is no hidden automatic browser fallback, which keeps runtime and pricing predictable.

Workflow and integration ideas

Scheduled local-lead refresh

Run weekly with the same category and city. Deliver the dataset to Google Sheets or a CRM, then match by profileUrl to detect new or changed businesses.

Accreditation-aware prospect scoring

Combine bbbRating, isBbbAccredited, categories, and location with your own firmographic enrichment. Do not treat accreditation alone as proof of suitability.

Multi-city market comparison

Pass multiple search URLs for the same category, group rows by sourceQuery.location, and compare result counts, rating distribution, and category mix.

Human vendor review queue

Send records with a low or missing rating to an internal review workflow and retain profileUrl so an analyst can inspect the public source.

Use the Apify API

Replace APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~bbb-business-search-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"search":"Plumber","location":"Dallas, TX","distance":25,"maxResults":100}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/bbb-business-search-scraper').call({
search: 'Plumber',
location: 'Dallas, TX',
distance: 25,
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/bbb-business-search-scraper").call(run_input={
"search": "Plumber",
"location": "Dallas, TX",
"distance": 25,
"maxResults": 100,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

For synchronous API calls, use run-sync-get-dataset-items when the expected run fits the endpoint timeout.

Use BBB search with MCP

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/bbb-business-search-scraper"

Claude Desktop, Cursor, and VS Code setup

Desktop and editor clients can use this HTTP MCP configuration in Claude Desktop, Cursor, or VS Code:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/bbb-business-search-scraper"
}
}
}

Example prompts:

  • “Find up to 100 BBB-listed roofing contractors around Phoenix and return phone, rating, accreditation, and profile URL.”
  • “Collect plumbers from my three BBB search URLs and group them by source location.”
  • “Run this BBB search weekly and highlight new profile URLs.”

Responsible use and legality

This Actor collects public business-search data without a BBB login. You are responsible for your use of the output.

  • Review BBB's terms and applicable laws for your use case.
  • Respect privacy, marketing, telemarketing, and anti-spam rules before outreach.
  • Do not use BBB ratings as the sole basis for consequential decisions.
  • Avoid excessive collection and retain only data needed for a legitimate purpose.
  • Do not attempt to use the Actor for authenticated, private, or restricted content.

The Actor is not affiliated with or endorsed by the Better Business Bureau.

Limitations

  • V1 exports search-result fields only; it does not scrape profile details, complaints, or individual reviews.
  • Search ranking, result availability, fields, and category labels are controlled by BBB and can change.
  • Some addresses, phones, coordinates, ratings, and action URLs are absent and return null or an empty array.
  • BBB anti-bot controls can change. Exhausted challenge retries fail the run.
  • Search results may include businesses near, rather than strictly inside, the text location according to BBB's matching logic.
  • The radius applies only when BBB honors the find_radius filter.
  • A successful no-result search produces an empty dataset; a challenge does not.

Troubleshooting

Why did my run return no businesses?

Open the source URL recorded in the logs and confirm BBB itself returns results for that keyword/location combination. Try a broader category, larger radius, or a direct search URL from BBB.

Why did my run fail with a challenge error?

Keep the default US residential proxy enabled and leave retries at 3 or 4. If BBB is experiencing a temporary protection spike, retry later rather than raising concurrency.

Why was my direct URL rejected?

startUrls accepts only public BBB /search URLs. Profile, complaint, and review URLs belong to different workflows.

Why are some fields null?

BBB does not expose every field for every listing. Nulls represent missing source data, not parser placeholders.

Use BBB Business Search Scraper when BBB rating, accreditation, and source profile links are central to the workflow. Use the related actors when broader discovery or enrichment is the main job.

FAQ

Does the Actor require a BBB account?

No. It accesses public BBB search pages anonymously.

Can it extract BBB reviews or complaints?

No. Individual reviews and complaints are intentionally outside v1 scope.

Can I search several cities in one run?

Yes. Add direct BBB search URLs for each city. You can also combine one keyword/location pair with those URLs.

Will the Actor save duplicate businesses?

No. Results with the same canonical BBB profile URL are saved once per run.

Can I export CSV or Excel?

Yes. Use the dataset export controls in Apify Console or the dataset API.

Can I schedule recurring runs?

Yes. Use Apify Schedules and optionally connect a webhook or integration to process the refreshed dataset.

Is a BBB rating a recommendation?

No. It is a source-provided signal. Validate businesses using criteria appropriate to your workflow.