BBB Business Reviews Scraper

What customers filed
on the record.

Paste the customer-reviews URL from a business's BBB profile and the reviews come back as a table - the business, who wrote it, a rating, the date, the review text, and an id that stays put. Eight columns, one row per review.

one-time 500 free rows$0.002 per row afterone row per reviewCSV · JSON · Excel
How it works

A profile URL,
and how far back to go.

One required field and three controls, one of which decides which end of the history you get.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the BBB Business Reviews Scraper.
  3. STEP 3Paste the bbb.org/…/customer-reviews URL for each business, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. STEP 4Set a limit per query if you want one. It takes a minimum of 1, and leaving it empty fetches all - there is no default here.
  5. STEP 5Pick a sort - Most recent, Highest rating or Lowest rating - and tick From (oldest) if you want to start at the far end of the history.
  6. STEP 6Click Start scraping and download as CSV, JSON or Excel.

The limit is per query, so a list of businesses multiplies. Leaving it empty on a long-established business can be a lot of rows.

Why it is useful

Complaints with
a paper trail.

BBB reviews behave differently from the ones on a marketplace, and the export reflects that.

An id that stays put

review_id is stable, which is what makes a second run comparable to the first. It also carries the business's own BBB identifiers, so a file covering several businesses groups cleanly without anyone parsing a URL to work out which review belongs where.

Both ends of the history

Three sorts and a From (oldest) switch. Most review sources only let you walk backwards from today; being able to start at the oldest is how you read a business's early complaints and see whether the same thing is still being filed years later.

A rating you can do arithmetic on

rating arrives as a number rather than a string, and every value we have read is a whole number from 1 to 5. date is equally consistent. Between them you can chart a business's complaint history without writing a parser first.

Read this first

Two things about the text
before you plan around it.

Both are BBB's own doing rather than ours, and both change what this export is good for.

Reviewer names arrive shortened. reviewer holds a given name and a last initial - Matthew W - because that is how BBB publishes them. A few carry two given names or unusual casing, so treat the shape loosely rather than writing a strict parser. What matters is that it is never a full name, which is worth knowing both for matching records and for the legal question further down.

The review text arrives partly redacted, and the redaction is BBB's. Runs of asterisks stand in for names and for profanity, and they appear on a large share of rows. Nothing on our side removes them and nothing can restore them - they are already in the page a visitor sees. That makes this export excellent for reading themes and sentiment and poor for anything that needs the exact words, so plan text analysis with the masking in mind rather than discovering it afterwards.

The rest of the schema is unusually well-behaved, and this is one of the few pages where we can say so from measurement rather than hope. rating is a number, not a string. date matched MM/DD/YYYY on every row of every export we hold, with no exceptions. review_id is composite, and on every row it began with the same identifiers that appear in the profile URL you submitted - so you can group a multi-business file by business without touching the query column at all.

One control deserves a second look before you start. The limit field has no default: leave it empty and you fetch everything. On a long-established business that can be a great many rows, and the limit applies per query, so a list of businesses multiplies it. Set a small limit for the first run, look at what comes back, and open it up once you know what you are dealing with.

What you get

Eight columns,
and formats we measured.

The names are the service's own declared list and the header row of every export we hold. The formats below were read from real rows rather than copied from a specification.

query
The customer-reviews URL you submitted, echoed onto every row that came from it - including a ?page= suffix if you used one. The scraper writes it, so group by it whenever a file covers more than one business.
business
The business the review is about, as BBB names it. Repeats down the file.
reviewer
Who wrote the review, as a given name and a last initial - that is how BBB publishes it, not a truncation of ours. A few carry two given names or unusual casing, so match on it loosely.
rating
The star rating as a number, not a string. Every value we have read is a whole number between 1 and 5, which means you can average and chart it without cleaning it first.
date
When the review was filed. Every row of every export matched MM/DD/YYYY - US-style month first. Worth setting explicitly when you import, since a spreadsheet left to guess may read the first two digits as a day.
review
The review text. Arrives with BBB's own redaction already applied - runs of asterisks in place of names and profanity, on a large share of rows. Nothing on our side adds or removes them.
review_id
A stable id for the review, in three underscore-separated parts. On every row we have read it begins with the same identifiers that appear in the profile URL, so it doubles as a business key - and being stable, it is what makes a re-run comparable to the last one.

This is one of the pages where we can describe formats rather than decline to. We hold five run exports for this service carrying real BBB reviews, and every statement above was read from every row of every one of them - rating a number from 1 to 5, date matching MM/DD/YYYY without exception, review_id beginning with the identifiers from the URL on every single row. The column list is dependable twice over: the service declares it, and all five exports agree on it exactly. Two honest limits. The export also carries business_response, which makes eight rather than the seven described above - it was empty on every row we hold, so rather than describe a column we have never seen carry anything we mention it here and leave it out of the table. BBB does let a business reply to a review, so this may simply be a business that never did. And all five of our runs were pointed at the same business, so while the shape of the export is well established, nothing here claims how it behaves across a wide spread of different businesses. Run one of your own on the free tier before you build on it.

Use cases

Three jobs people
run this for.

All of them start from a profile URL you can copy out of bbb.org.

Diligence

Check a company before you sign with them

A BBB profile is where dissatisfied customers go when they want a record rather than an audience. Sort by Lowest rating, read the text, and the recurring complaint usually surfaces in the first page - which is a faster read on a supplier or a contractor than any marketing site.

Procurement · Risk
Reputation

Watch your own profile on a schedule

Re-run the same URL weekly and review_id makes the comparison exact - new ids are new reviews, and nothing is double-counted. That is a cleaner monitoring signal than a star average that moves for reasons you cannot see.

Marketing · Support
History

Read the oldest complaints first

Tick From (oldest) and start at the beginning of a business's record. Comparing the earliest filings against the recent ones tells you whether a problem was fixed or simply kept happening - the question a star rating cannot answer.

Research · QA
Pricing

Pay per review row,
nothing else.

No subscription, no minimum, no per-seat licence. Your first 500 rows are on us - after that it is pay-as-you-go.

Free

500 rows

For every new account, one time. No credit card. All scrapers unlocked - and enough to pull one business's history and see the shortened names and the masked text for yourself before you plan around them.

One-time · No card
Pay as you go

$0.002 per row

Roughly $2 per 1,000 reviews, the same flat rate as every other scraper on the platform. The limit is per query and has no default, so a list of businesses with the field left empty can add up - worth a small first run.

Credits never expire
Enterprise

Custom - a portfolio, on a schedule

Volume pricing, SLAs, dedicated workers and tailored onboarding for teams monitoring many businesses rather than checking one. Tell us your numbers and we will quote.

Talk to sales
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

The same business,
somewhere else.

A BBB record is one view of a company. These are the others, each with its own schema.

Legal

Is it legal to scrape
BBB reviews?

Short answer: these are public filings on a public profile - and BBB has already shortened the names before you see them.

Everything in these columns is shown to any visitor on a public BBB profile page, signed in or not. No login is used, no paywall is crossed and no account is touched, and the run goes through our proxy pool rather than your own address. Collecting publicly visible information for research and due diligence is long-settled practice.

The reviewer column is still personal data, even shortened. A given name and a last initial is less identifying than a full name, and it is BBB's own choice rather than ours - but combined with a named business and a dated complaint it can still point at a person. If you store it you are handling personal data, and the GDPR and similar regimes apply to you regardless of where you got it. Reading complaints to assess a company is an easy case; building a file on the people who filed them is not, and this service is not intended for it.

The masking in the review text is worth understanding for the same reason: BBB redacts names and profanity before publishing, so what you receive is already what a visitor sees. Do not treat a gap in the asterisks as an invitation to reconstruct what was removed. BBB's terms govern automated access to their site; read them before you scale. We run no third-party trackers on the data layer, and your exports self-delete after 30 days.

livescraper.app · principles
Public BBB profile pages only
No logins, no paywalls
Reviewer names are shortened by BBB - still personal data!
No third-party trackers on the data layer
Exports self-delete (30 days)
The same reviews any visitor sees on the profile.
FAQ

Things people ask before signing up.

The questions we hear most. Something else? Talk to us - humans write the answers, not bots.

What do I submit?+
The customer-reviews URL from a business's BBB profile - the form's own example is a bbb.org/…/customer-reviews link. One per line, and you can upload a CSV, XLSX, TXT or Parquet file instead of pasting. A ?page= suffix on the URL works too if you want to start partway through.
What columns will the export contain?+
Eight: query, business, reviewer, rating, date, review, business_response and review_id. That is the service's own declared list, and it matches the header row of every export we hold.
What format is the rating and the date?+
rating is a number rather than a string, and every value we have read is a whole number between 1 and 5. date is a string, and every row of every export we hold matched MM/DD/YYYY - month first, US style. It is worth setting that explicitly when you import, because a spreadsheet left to guess may read the first two digits as a day.
Why is the review text full of asterisks?+
Because BBB redacts it before publishing. Runs of asterisks stand in for names and for profanity, and they appear on a large share of rows. That is already how the text looks to any visitor on the page - nothing on our side adds or removes them, and nothing can restore the original wording. It makes the export good for themes and sentiment and poor for anything needing exact quotes.
Do I get the reviewer's full name?+
No, and that is BBB's choice rather than a truncation of ours. The reviewer column holds a given name and a last initial, such as Matthew W. A few carry two given names or unusual casing, so match on it loosely rather than writing a strict parser.
Why is business_response empty?+
It was empty on every row of every export we hold, so we have never seen it carry anything and have left it out of the data dictionary rather than describe a column we cannot vouch for. BBB does allow a business to reply to a review, so this may simply be a business that never did. Check it on your own first run.
How does the limit work?+
It takes a minimum of 1 and has no default - leaving it empty fetches everything, which the form says in its own hint. It applies per query rather than per run, so a list of businesses multiplies it. On a long-established business that can be a lot of rows, so set a small limit for a first look.
What does it cost?+
The first 500 rows on a new account are free and one-time; after that it is $0.002 per row - about $2 per 1,000 - pay-as-you-go with no subscription. Credits do not expire and there is no monthly reset.

Pull one profile,
oldest first.

It is the quickest way to see how far back a business's record goes. Your first 500 rows are free.

Export BBB customer reviews as rows

The BBB Business Reviews Scraper turns a Better Business Bureau profile into a spreadsheet. You submit the bbb.org/…/customer-reviews URL for each business - one per line, or uploaded as a CSV, XLSX, TXT or Parquet file - choose a sort and optionally a limit, and each review comes back as a row: the business, who wrote it, the star rating, the date it was filed, the review text and a stable id. Eight columns, one row per review, downloadable as CSV, Excel or JSON. The service's own description puts it plainly: it returns reviews from a list of businesses.

Two characteristics of the text are BBB's own and shape what the export is good for. Reviewer names are published shortened - a given name and a last initial, such as Matthew W - so you never receive a full name. And the review body arrives with BBB's redaction already applied, runs of asterisks standing in for names and profanity on a large share of rows. Neither is something this service does or can undo; both are already visible to anyone reading the page. The practical consequence is that this data is strong for themes, sentiment and recurrence, and weak for anything that depends on exact wording.

The rest of the schema is unusually consistent, and because our exports are populated we can say so from measurement rather than assumption. rating arrives as a number rather than a string, and every value read was a whole number from 1 to 5, so it can be averaged and charted without cleaning. date matched MM/DD/YYYY on every row without exception - month first, which is worth setting explicitly on import. review_id is a stable composite that begins, on every row we have read, with the same identifiers found in the profile URL, so it doubles as a business key and makes a re-run exactly comparable to the last one: new ids are new reviews.

The controls are worth a moment before a first run. Three sorts are offered - Most recent, Highest rating and Lowest rating - alongside a From (oldest) switch that most review sources do not give you, and which is how you read a business's earliest filings and check whether the same complaint is still arriving years later. The limit field has no default: leave it empty and it fetches everything, and since it applies per query a list of businesses multiplies it. On the legal side, everything collected is public and BBB has already shortened the names, but reviewer remains personal data - reading complaints to assess a company is straightforward, building a file on the people who filed them is not. BBB's terms govern automated access; read them before you scale. Start free: your first 500 rows cost nothing and need no credit card, and after that it is $0.002 per row, flat. See pricing for current rates.