Yelp Reviews Scraper — Full History & Incremental Updates
Pricing
from $0.30 / 1,000 reviews
Yelp Reviews Scraper — Full History & Incremental Updates
Turn Yelp business URLs into structured review records: rating, full text, date, reviewer, photos, reactions, edit history and owner replies. Filter by star rating, or collect only new reviews with a since date.
Pricing
from $0.30 / 1,000 reviews
Rating
0.0
(0)
Developer
astravalabs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
Turn Yelp business URLs into one clean row per review: star rating, full text, date, reviewer, photos and videos, reactions, edit history and the owner's public reply. Collect a business's complete review history, or only what's new since your last run. Proxies and retries are handled for you.
Use it for reputation monitoring, sentiment analysis, competitor research, customer-service benchmarking and recurring review datasets.
Quick start
{"startUrls": ["https://www.yelp.com/biz/aji-kiji-san-francisco","hotel-zetta-san-francisco-san-francisco-3"],"sortBy": "DATE_DESC","maxItemsPerTarget": 200}
startUrls takes full Yelp business URLs or the bare alias, which is the part
after /biz/. Duplicates are removed before the run starts. Anything that isn't
a Yelp business is skipped and listed in the run report, so one bad entry
doesn't fail the batch.
What you get
Each row in the default dataset is one review. The example below is illustrative: the reviewer and ids are invented, but the shape is exact.
{"reviewId": "q3Xr0bQe9vTnL1kZpA7mWg","url": "https://www.yelp.com/biz/aji-kiji-san-francisco?hrid=q3Xr0bQe9vTnL1kZpA7mWg","businessAlias": "aji-kiji-san-francisco","businessId": "SIIBwgrR7Rl71mE_mVzdIQ","businessName": "Aji Kiji","rating": 4,"date": "2026-09-08T11:27:00-07:00","text": "Glad they moved to FiDi so I could finally try this place...","language": "en","authorName": "Jordan M.","authorId": "u8Kd2LmQx0RbT5vYcN1oZw","authorProfileUrl": "https://www.yelp.com/user_details?userid=u8Kd2LmQx0RbT5vYcN1oZw","authorPhotoUrl": "https://s3-media0.fl.yelpcdn.com/photo/.../180s.jpg","authorLocation": "Daly City, CA","authorReviewCount": 412,"authorFriendCount": 87,"authorPhotoCount": 230,"authorIsElite": true,"authorEliteYear": "26","authorIsEliteAllStar": false,"photoCount": 1,"photos": [{"url": "https://s3-media0.fl.yelpcdn.com/bphoto/.../o.jpg","caption": "Chirashi bowl","width": 1536,"height": 2048,"uploadedAt": "2026-09-08T18:27:00Z"}],"videoCount": 0,"videos": [],"checkInCount": 2,"isFirstReviewer": false,"isReviewOfTheDay": false,"hasPaidThroughYelp": false,"hasPurchasedDeal": false,"hasPlacedReservation": false,"reservationProvider": null,"reactions": { "HELPFUL": 3, "THANKS": 1, "LOVE_THIS": 1 },"previousVersionCount": 0,"hasBeenEdited": false,"previousReviewIds": [],"ownerReply": "Thanks so much for visiting, Jordan!","ownerReplyDate": "2026-09-10T09:02:11-07:00","ownerReplyAuthor": "Ken S.","ownerReplyAuthorRole": "MANAGER","expertTopic": "Sushi","scrapedAt": "2026-10-01T21:57:42Z"}
A few fields need explaining:
dateis the time the review was posted, in the business's local time with its UTC offset, exactly as Yelp states it. It is not converted to UTC, because a review posted on the evening of the 13th in San Francisco should still read as the 13th.hasBeenEdited,previousVersionCountandpreviousReviewIdsshow when a reviewer has rewritten their review.textis always the current version.authorIsEliteandauthorEliteYearmatch the "Elite 26" badge on the reviewer's profile.authorIsEliteAllStaris the extra "All-Star" badge some Elite reviewers also carry.reactionslists only the reactions a review actually received.photoslink to the full-size originals, not thumbnails.ownerReplyand its date, author and role are filled only when the business has replied publicly.
The Output tab shows the data in three tables: Reviews, Reviewers, and Photos and videos. You can export it as JSON, CSV, Excel, XML, RSS or JSONL.
Inputs
| Input | Default | Description |
|---|---|---|
startUrls | required | 1–1,000 Yelp business URLs or aliases |
sortBy | DATE_DESC | Newest first, most relevant, oldest first, highest or lowest rated, or Elite reviewers first |
ratings | all | Only collect these star ratings, e.g. ["1", "2"] for complaints |
since | none | Only reviews posted on or after this date, e.g. 2026-06-01. Requires newest-first sorting |
maxItemsPerTarget | none | Most reviews to collect from each business |
maxTotalItems | none | Most reviews to collect in the whole run |
site | US | Only yelp.com is supported today |
Rating filter. Yelp applies ratings on its side, so the reviews you filter
out are never downloaded and never charged.
Limits. maxItemsPerTarget caps each business and maxTotalItems caps the
whole run. For example, maxItemsPerTarget: 100 with maxTotalItems: 1000
means no business contributes more than 100 rows and the run never stores more
than 1,000. The Actor also respects the maximum cost per run you set on Apify.
Incremental runs: only new reviews
Set since to the date of your last run and keep sortBy at newest first. The
Actor walks each business from its newest review and stops as soon as it
reaches reviews older than your date, so a daily or weekly schedule only
collects and charges for what's new.
One caveat: when a reviewer edits an older review, Yelp keeps its original
date, so an incremental run won't see the edit. To catch edits, run without
since every so often and compare by reviewId.
Pricing
You pay only for the reviews saved to your dataset. Proxies, retries and everything else needed to reach Yelp are included.
Speed
Up to eight businesses are scraped in parallel. The Actor calls Yelp's own review feed directly, without a browser, so it runs on little memory. On the Apify platform, one business's full history of 331 reviews took 16 seconds in one run and 61 seconds in another; times depend on Yelp's and the proxy's response latency.
Run report
The key-value store record RUN_REPORT explains what happened to every
business you submitted:
- outcome, such as ok, business not found, or network error
- reviews and pages collected, and Yelp's stated total
- stopReason: the history ended, a limit was reached, the
sincedate was passed, or the run's time limit was near - identityConfirmed: the reviews really belong to the business you asked for. Yelp states this on every page and the Actor checks it.
It also lists any inputs that were skipped and why. A business that fails is reported and the run carries on. The run only fails when none of the businesses could be scraped.
If a run gets close to its timeout, it stops early, keeps every review already
collected and records timeLimited: true. That's better than being cut off
with no report. Raise the timeout or split the list if this happens.
API example
curl -X POST \"https://api.apify.com/v2/acts/astravalabs~yelp-reviews-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":["https://www.yelp.com/biz/aji-kiji-san-francisco"],"maxItemsPerTarget":100}'
For large batches, start the Actor asynchronously and read the dataset after the run succeeds.
Use cases
- Reputation monitoring: a scheduled run with
sincegives you a feed of new reviews across all your locations. - Complaint triage: use
ratings: ["1", "2"]to collect only negative reviews, along with whether the business replied. - Sentiment and topic analysis: full review text and ratings, ready for an LLM or a classifier.
- Competitor research: compare ratings, review volume and owner response habits across businesses in one run.
- Reviewer analysis: see how much weight a review carries from the reviewer's review count, Elite status and expert topic.
Personal data
Yelp reviews are public, but they are written by people. Each row includes the reviewer's display name, which is usually a first name and last initial, plus their profile link, profile photo and location. Data like this can count as personal data under the GDPR, the CCPA and similar laws.
Only collect and keep personal data if you have a legitimate reason to, and
handle it in line with the laws that apply to you. If you only need the review
content, you can drop the author* columns from your export. If you are unsure,
consult a lawyer. This Actor collects only what Yelp shows publicly, without
logging in.
FAQ
Why did a business return fewer reviews than its Yelp page says?
Yelp's stated count is often slightly higher than the number of reviews it
actually serves; one business stating 332 served 331. Yelp's
"not currently recommended" reviews aren't in the public feed, so they aren't
collected either. Check RUN_REPORT for the stop reason.
Are non-English reviews included?
Not yet. Yelp serves each language as a separate list, and the Actor collects the English one, which on US businesses is the large majority. At the Golden Gate Bridge, for example, 2,035 of 2,113 reviews are in English; the other 78 (about 4%, mostly German) are not collected.
Does it work for Yelp sites outside the US?
Not yet. Only yelp.com is supported, and URLs from other Yelp sites are skipped and listed in the run report.
Can I scrape a specific review?
Each row's url is the review's permalink. The Actor itself works per
business, so collect the business and filter by reviewId.
Unofficial. Not affiliated with, endorsed by, or sponsored by Yelp Inc. "Yelp" is a trademark of Yelp Inc., used here descriptively.