People asking for a Better Business Bureau API usually want one of two things: to check one business before trusting it, or to pull many businesses into a list. BBB has an answer for the first and a gated one for the second.
An API exists, behind an approval
BBB runs an API at developer.bbb.org. Its page says it covers accreditation status, business ratings and information, and complaints and reviews, on nearly 5 million businesses in the US and Canada. Two conditions come attached: access requires approval, with each request vetted, and complaint and review data is "for internal use only" and cannot be displayed externally.
So there is no open, self-serve BBB data API. If your use case qualifies for BBB's approval, that is the route with BBB's blessing, and it is the first thing to try. This project has not applied, so what the approval actually requires and costs is not something this guide can tell you.
The four surfaces BBB serves
| Surface | Reach | robots.txt |
|---|---|---|
| Search (and its JSON endpoint) | 225 per query; 450 sweeping A-Z and Z-A | Disallowed: uses a query string |
| Category pages | 15 per page, up to 225 per query | Page 1 allowed; ?page=N disallowed |
| Profile pages | One business, ~76 fields | Allowed, explicitly, even with parameters |
| Profile sitemaps | 575 files × 10,000 ≈ 5.75 million URLs | Declared in robots.txt |
BBB's robots.txt, as fetched on 10 October 2026, carries the same three rules for every user agent that matter here:
Disallow: /business-reviews/*
Disallow: /*?
Allow: /us/*/*/profile/*/*?
Allow: /ca/*/*/profile/*/*?The Allow lines exist because /*? would otherwise block profile URLs carrying parameters. Somebody wrote them on purpose, which is the clearest statement BBB makes about what it wants crawled: profiles yes, search no.
Why the search box is the wrong sample
Measured on 18 September 2026, the two routes into BBB describe two different markets:
| Measure | Search, n=1,411 | General sitemap, n=200 |
|---|---|---|
| Accredited | 96.7% | 0% |
| Rated A+ | 90.8% | 47.5% |
| Not rated (NR) | — | 45% |
| Any complaint closed in 3 years | — | 8.5% |
The 0% is partly structural: accredited businesses have their own sitemap of 39 files, so the general one samples almost none. That is also the cheapest accreditation filter there is — pick the index. But the search figure is the one that misleads. Accreditation is paid, and BBB's standards require an accredited business to keep at least a B rating, so a list built from search tells you every plumber in town is A+ and accredited.
The BBB Scraper uses category pages when you give it a trade and a place, and the sitemaps otherwise, because only the sitemap reaches the whole directory.
Filters BBB ignores, and the ones that work
The accredited parameter does nothing. BBB's search endpoint accepts it and returns the same results. The Actor's onlyAccredited reads BBB's accredited listings instead; on Austin plumbers it narrowed 2,409 businesses to 505.
A+ returns zero. BBB's rating filter accepts single letters, each covering its family, so A returns A+, A and A-. Asking for A+ returns nothing even though 90.8% of search results carry it, so the input only offers A to F and an exact A+ cut belongs after the run.
City filters are strict only where BBB has a city page. When a trade has none —landscaping was one — search is used instead, and BBB's search covers the metro area. Every row carries city, state and coordinates.
What a profile adds over a search result
Of up to 76 fields, 35 exist only on the profile page. On 120 profiles sampled from six sitemap files: phone 97.5%, address 87.5%, business start date 82.5%, owners and officers 71.7%, website 53.3%, incorporation date 35%, alternate names 18.3%. Complaint counts, review counts, years in business and entity type were present on all 120. Four fields BBB returns were empty on every measured row and are not shipped — a column that is always null is not a feature, which is the argument of publishing fill rates rather than field lists.
What is deliberately not in the data
Review and complaint text. Counts and the average star rating only. The text is written by identifiable consumers, and BBB's robots.txt disallows /business-reviews/*.
Email addresses. BBB obfuscates them to stop harvesting. The row carries has_email, and the obfuscation is not reversed. Email is a recurring gap across local sources — Google Maps has the same one.
Owners are included, with a warning. principals carries names and titles as BBB publishes them, on 71.7% of profiles. People acting in a professional capacity are still personal data in the EU and UK.
What BBB's robots.txt and terms say
BBB's terms of use grant a license to use the site "solely for your direct use and not for sale, republication, or aggregation", and prohibit using it to compile data for a service that performs substantially the same function as BBB. Reselling a BBB-derived directory is the use those clauses are written against.
On robots.txt, the sitemap and profile routes are inside what BBB allows. The search mode and paginated category pages use query strings that Disallow: /*? covers. The Actor does not filter its requests by robots.txt, so choosing mode: "sitemap" is how you stay on the allowed routes. Where the personal data in principals is processed under GDPR, Article 14 sets out what the people concerned must be told.
What a substitute costs to run
$0.003 per business, plus $0.006 when the profile is fetched (on by default), plus a start event and taxonomy rows at the platform minimum of $0.00001. A thousand businesses with profiles cost $9; without, $3. One measured run delivered 1,000 businesses in 120 seconds at concurrency 6, with 0 blocks across 1,007 requests. The same data side by side with Thumbtack and EnergySage is in the cluster overview.
