Piotr VassevPiotr Vassev

How to Export BBB Businesses for a Local Contractor Shortlist

The BBB Advanced Scraper returns business listings for a search term, location, and distance. I maintain the Actor. Here the task is to assemble roofing contractors around Austin for further review, using BBB categories and profile links to check that each business fits.

The output includes BBB ratings and accreditation-related fields, but it does not replace reading the business report or confirming that a contractor serves your address.

How to Scrape BBB Business Listings

Limit the search geographically

The deployed input has three controls: search, location, and distance. Distance is in miles. There is no maxItems field, so a narrow trade and radius are your main input controls for run size. Adding a made-up result cap to JSON will not provide a dependable budget limit.

Use a trade name rather than a broad word like services. Enter a city and state or postal code so that similarly named places are not confused. The example searches roofing contractors within 25 miles of Austin.

This produces a discovery list, not a list of all licensed roofers. A BBB listing and its accreditation flags should be recorded as source facts rather than treated as your own endorsement.

Budget for the sample

Pricing as of September 6, 2026. The active price is $0.002 for each result written to the dataset. One hundred returned businesses would cost $0.20. No separate detail event appears in the active pricing configuration. A pricing change is scheduled for 2026-09-15; recheck the rate before a later run or recurring schedule. Check current Actor pricing and the run charge breakdown; these calculations describe Actor events, and separately billed platform or proxy resources may also apply.

Run a local contractor search

Open the Actor on Apify. In Input, switch to the JSON editor and paste:

{
  "search": "roofing contractor",
  "location": "Austin, TX",
  "distance": 25
}

Click Start, then open the completed run’s output dataset.

After the run, review the first few categories values and addresses. If the results cover unrelated home-improvement trades, tighten the search before expanding the distance. Look at the actual dataset size and charge breakdown before repeating a broad search.

Do not assume that the search radius is the business's service radius. A business location near Austin and a promise to serve your property are different facts.

Read the returned fields

FieldHow to use it
businessNameBusiness name
ratingBBB rating
bbbMemberAccreditation flag
phonePublished phone values
categoriesBBB categories
reportUrlProfile path

The documented sample has phone as an array and reportUrl as a relative path. Preserve every phone value you need; do not cast the whole array into one malformed phone number. Prefix relative report paths with https://www.bbb.org when building review links.

rating is the displayed BBB letter rating. ratingScore and score are separate fields and should not be repurposed as customer-review stars. The sample also has bbbMember: true while accreditationStatus is null. A missing descriptive field does not negate the separate flag.

Historical bbb advanced scraper output

Make a shortlist that someone can review

Export JSON to retain the phone and category arrays, or export CSV and explicitly choose how to flatten them. Keep businessName, address components, categories, rating, bbbMember, and reportUrl. Add review status, service-area confirmation, and the date checked.

Deduplicate by normalized report URL before counting businesses. If two branches share a name, retain separate addresses until you know whether they represent the same service location. Store postal codes as text so leading zeros survive spreadsheet import.

Filter to roof-related categories, then open each shortlisted BBB report. Check the business identity, current status, and any information relevant to your decision. The listing output is not a detailed complaint-history export, even if a broad product description mentions complaints.

Create a final table with one row per candidate and a short reason to retain or exclude it. Mark missing phone numbers as missing; do not infer contact information. For an outreach workflow, keep the business purpose and contact relevance clear and verify details before using them.

When the search returns too much or too little

Too many results calls for a smaller distance or more specific trade. For empty results, check the same location and term on BBB and try a nearby postal code or less specific trade. The Actor has no separate detail switch that will reveal missing contact fields.

If a report link fails, check whether it is a relative path before assuming the business disappeared. If service-area fields are null, confirm coverage from the report or the business directly rather than calculating it from straight-line distance.

For a second local-business source, use the Yelp business guide and match identities carefully before combining records.

For exporting a local BBB search, see the Node.js example. Use the current input fields above if the example differs.

Frequently asked questions

Can I set a maximum number of results?

The current input has no result-limit field. Search term, location, and distance control the scope.

Are BBB report links absolute URLs?

The documented output includes relative reportUrl paths. Prefix those with https://www.bbb.org before opening or exporting them as links.

Does a nearby address confirm service coverage?

No. The business location and its service area are different facts. Confirm coverage for the address you need.

Piotr Vassev

Piotr Vassev

Founder of FalconScrape. Building production-grade web scraping systems and data automation pipelines for businesses worldwide.

Connect on LinkedIn