Yelp Review Scraper - fails instead of billing empty avatar

Yelp Review Scraper - fails instead of billing empty

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Yelp Review Scraper - fails instead of billing empty

Yelp Review Scraper - fails instead of billing empty

Scrape Yelp business reviews with ratings, dates, authors, owner replies and reaction counts. Returns an error instead of an empty, billable dataset when Yelp blocks or changes.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Marek Hartmann

Marek Hartmann

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Yelp Review Scraper

Scrape Yelp business reviews — star rating, full review text, review date, author profile stats, owner replies and reaction counts — from any Yelp business page.

Built around one rule the alternatives break:

An empty result is a failure, not an invoice.

Why this Actor exists

Yelp's review feed answers HTTP 200 even when the query did not work. A scraper that trusts the status code will quietly hand you an empty dataset and charge you for the run. This Actor treats every unexplained empty result as its own bug and fails the run instead.

It also tells apart whose problem it is:

SituationWhat happensYou pay
Business does not exist (typo in the URL)Run succeeds, dataset empty, reason explainedNothing (pay per result)
Business has zero reviewsRun succeeds, reason explainedNothing
Your language / rating filter matches nothingRun succeeds, reason explainedNothing
Yelp blocked us, changed its API, or returned nonsenseRun fails loudlyNothing
Reviews foundRun succeeds with dataPer result

Your typo never fails a run, so it never dents this Actor's success rate — and our bug never turns into your invoice.

Input

{
"startUrls": ["https://www.yelp.com/biz/gary-danko-san-francisco"],
"maxReviewsPerBusiness": 100,
"sortBy": "DATE_DESC",
"ratings": [],
"languageCode": "en",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["UNBLOCKER"] }
}
FieldMeaning
startUrlsYelp business URLs, or bare aliases like gary-danko-san-francisco
maxReviewsPerBusinessHard cap per business (default 100)
sortByRELEVANCE_DESC, DATE_DESC, DATE_ASC, RATING_DESC, RATING_ASC, ELITES_DESC
ratingsEmpty = all. [1, 2] = negative reviews only
languageCodeReview language, default en
proxyConfigurationUse UNBLOCKER. Verified live: residential proxy returns HTTP 403 even with a browser fingerprint

Output

One row per review:

{
"reviewId": "O3-ogBbIo1nuz0W5gSylkQ",
"url": "https://www.yelp.com/biz/gary-danko-san-francisco?hrid=O3-ogBbIo1nuz0W5gSylkQ",
"businessAlias": "gary-danko-san-francisco",
"businessName": "Gary Danko",
"rating": 5,
"text": "Full review text, not truncated.",
"language": "en",
"publishedAt": "2026-08-16T22:41:32-07:00",
"publishedDate": "2026-08-16",
"authorName": "Jane D.",
"authorId": "78eKGjfH17lXvnvRS-3Odg",
"authorLocation": "San Francisco, CA",
"authorReviewCount": 42,
"authorFriendCount": 7,
"authorIsElite": true,
"authorPhotoUrl": "https://s3-media0.fl.yelpcdn.com/photo/.../30s.jpg",
"photoUrls": [],
"helpfulCount": 3,
"thanksCount": 0,
"loveThisCount": 0,
"ohNoCount": 0,
"ownerReply": null,
"ownerReplyAt": null,
"isFirstReview": false,
"scrapedAt": "2026-08-19T17:00:00.000Z"
}

Every run also writes a RUN_REPORT record to the key-value store: what was requested, what came back, and — if something went wrong — which side it was on.

Speed

The Actor pulls 40 reviews per request (Yelp's own page does 10) and builds pagination cursors itself, so 100 reviews cost 3 requests instead of 10. Fewer requests also means less proxy burn.

Use cases

  • Reputation monitoring for a restaurant, dentist, salon or hotel
  • Competitor review analysis and sentiment scoring
  • Feeding review text into an LLM for theme extraction
  • Lead generation from businesses with poor recent ratings
  • Academic and market research on local business reviews

Limits and honesty

  • Yelp sits behind DataDome. Measured on live runs: a datacenter IP fails, and so does a US residential IP with a full browser fingerprint (HTTP 403). Apify's UNBLOCKER proxy gets through — 100 reviews in 39 seconds. This is a cost line, not a checkbox.
  • Yelp rotates the hash of its persisted GraphQL query from time to time. When that happens this Actor fails with API_DRIFT rather than returning nothing; the fix is a version bump, and reviewFeedDocumentId lets you patch it yourself in the meantime.
  • Only publicly visible reviews. Nothing behind a login, no private data.

Tests

npm install
npm test

28 tests, no network needed: input parsing, cursor maths, blocked-page detection, GraphQL error classification, and every branch of the "whose fault is it" decision.

Need a scraper for something else?

I build custom Apify Actors and browser automation the same way this one is built: a verified result or an explicit failure, never an empty dataset sold as a success.

Tell me the site and what you need out of it.