Yelp Reviews Scraper — Full History & Incremental Updates avatar

Yelp Reviews Scraper — Full History & Incremental Updates

Pricing

from $0.30 / 1,000 reviews

Go to Apify Store
Yelp Reviews Scraper — Full History & Incremental Updates

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

astravalabs

Maintained by Community

Actor 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:

  • date is 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, previousVersionCount and previousReviewIds show when a reviewer has rewritten their review. text is always the current version.
  • authorIsElite and authorEliteYear match the "Elite 26" badge on the reviewer's profile. authorIsEliteAllStar is the extra "All-Star" badge some Elite reviewers also carry.
  • reactions lists only the reactions a review actually received.
  • photos link to the full-size originals, not thumbnails.
  • ownerReply and 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

InputDefaultDescription
startUrlsrequired1–1,000 Yelp business URLs or aliases
sortByDATE_DESCNewest first, most relevant, oldest first, highest or lowest rated, or Elite reviewers first
ratingsallOnly collect these star ratings, e.g. ["1", "2"] for complaints
sincenoneOnly reviews posted on or after this date, e.g. 2026-06-01. Requires newest-first sorting
maxItemsPerTargetnoneMost reviews to collect from each business
maxTotalItemsnoneMost reviews to collect in the whole run
siteUSOnly 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 since date 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 since gives 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.