Yelp Review Scraper - fails instead of billing empty
Pricing
from $1.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
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:
| Situation | What happens | You pay |
|---|---|---|
| Business does not exist (typo in the URL) | Run succeeds, dataset empty, reason explained | Nothing (pay per result) |
| Business has zero reviews | Run succeeds, reason explained | Nothing |
| Your language / rating filter matches nothing | Run succeeds, reason explained | Nothing |
| Yelp blocked us, changed its API, or returned nonsense | Run fails loudly | Nothing |
| Reviews found | Run succeeds with data | Per 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"] }}
| Field | Meaning |
|---|---|
startUrls | Yelp business URLs, or bare aliases like gary-danko-san-francisco |
maxReviewsPerBusiness | Hard cap per business (default 100) |
sortBy | RELEVANCE_DESC, DATE_DESC, DATE_ASC, RATING_DESC, RATING_ASC, ELITES_DESC |
ratings | Empty = all. [1, 2] = negative reviews only |
languageCode | Review language, default en |
proxyConfiguration | Use 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_DRIFTrather than returning nothing; the fix is a version bump, andreviewFeedDocumentIdlets you patch it yourself in the meantime. - Only publicly visible reviews. Nothing behind a login, no private data.
Tests
npm installnpm 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.
- My other Actors: https://apify.com/marekhartmann
- Code and test suites: https://github.com/marekhartmann-creator
Tell me the site and what you need out of it.