Yelp Reviews Scraper: Reviews, Ratings and Owner Replies avatar

Yelp Reviews Scraper: Reviews, Ratings and Owner Replies

Pricing

from $0.90 / 1,000 reviews

Go to Apify Store
Yelp Reviews Scraper: Reviews, Ratings and Owner Replies

Yelp Reviews Scraper: Reviews, Ratings and Owner Replies

Scrape Yelp reviews by business link, alias or name and city: text, stars, date, reviewer, photos and the owner reply, newest first, with star and date filters. Plus one row per business with rating, review count, stars breakdown, categories and address. No login, no browser.

Pricing

from $0.90 / 1,000 reviews

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

500 Yelp reviews from 5 businesses in 28 seconds, with stars, reviewer and owner reply

From The Mine Works, makers of Google Maps Email Scraper and B2B Leads Finder, with over 245,000 runs across 280+ public actors.

Yelp Reviews Scraper returns Yelp reviews with text, stars, date, reviewer, photos and the owner's reply, plus one profile row per business with its rating and star breakdown, for businesses, agencies and analysts who track reputation, complaints and competitors on Yelp.

Updated 27 Oct 2026: first release. Yelp business links, aliases, ids, or a business name with its city; one profile row per business with rating, review count and the count per star; its reviews newest first with text, stars, date, reviewer, photos, reactions and the owner's public reply. Bookmark this Actor on its Store page so it is one click away next time.

What it does not include: phone numbers, websites, opening hours and claimed status are not in the output, and it does not search Yelp by keyword or category. Bring the businesses you want to track, by link or by name and city.

Why choose this actor?

  • Reviews and the business in one run. Every business gets a profile row with its rating, total reviews and the number of 5, 4, 3, 2 and 1 star reviews, then its reviews as rows you can sort and filter. Each review row repeats the business id, name and link, so the review rows work on their own in a sheet.
  • The owner reply next to the review. has_owner_reply, the reply text, its date and who replied (for example CUSTOMER_SERVICE). In our test of 500 reviews from 5 businesses, 107 had a public reply. Useful to see which complaints a business answers and how fast.
  • Pay per row, nothing for errors. Links that are not Yelp businesses, names Yelp does not know, duplicates and the summary row are never charged. No Yelp account, cookies, API key or browser.

Run it on Apify

Part of The Mine Works Marketing, SEO and reviews family: Facebook Ad Library Scraper, Google Ads Transparency Scraper, Similarweb Scraper, Google News Scraper, Trustpilot Reviews Scraper, Google Trends Scraper.

Guide and FAQs: Yelp Reviews Scraper on themineworks.com.

Try it in one minute

Paste this into the input (JSON view) and press Start. It returns the profile of Prince Street Pizza in New York and its 20 newest reviews. It took 5 seconds in our test run:

{
"businessUrls": ["https://www.yelp.com/biz/prince-street-pizza-new-york-2"],
"maxReviewsPerBusiness": 20
}

Put several links on separate lines to read several businesses at once, or put "Name, City" lines in businessNames. A business you give twice is read and charged once.

Apify's free plan includes $5 of credit every month, which covers about 2,700 reviews at this actor's price.

Copy to your AI assistant

themineworks/yelp-reviews-scraper on Apify. Reads Yelp businesses you name and returns one profile row per business (rating, review count, count per star, categories, street, city, state, price range) and its reviews (text, stars, date, reviewer, photos, reactions, owner reply), with no login. It has no phone, website, opening hours or claimed status, and no keyword search. Call ApifyClient("TOKEN").actor("themineworks/yelp-reviews-scraper").call(run_input={"businessUrls": ["https://www.yelp.com/biz/prince-street-pizza-new-york-2"], "maxReviewsPerBusiness": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give businessUrls (Yelp business links, aliases such as prince-street-pizza-new-york-2, or 22 character business ids) and/or businessNames ("Business name, City, ST", the first comma splits name and place); up to 2000 businesses per run. Optional: maxReviewsPerBusiness (default 20, 0 to 10000, 0 = profile row only), sortBy (newest default, oldest, relevance, highest, lowest), reviewsNewerThan (date YYYY-MM-DD, reads newest first and stops at the first older review), starRatings (list of "1" to "5"), reviewLanguage (all default, or a two letter code). Every data row has record_type "business" or "review". Business rows carry business_id, alias, name, url, categories, address, city, state, price_range, rating, review_count, stars_5, stars_4, stars_3, stars_2, stars_1, reviews_by_language, photo_url, input, matched_by, name_match_score, scraped_at. Review rows carry review_id, business_id, business_alias, business_name, business_url, review_url, rating, text, language, date, local_date, reviewer_id, reviewer_name, reviewer_location, reviewer_review_count, reviewer_friend_count, reviewer_photo_count, reviewer_elite_year, reviewer_url, reviewer_photo_url, photos_count, photo_urls, videos_count, reactions_helpful, reactions_thanks, reactions_love_this, reactions_oh_no, check_in_count, is_first_review_of_business, is_review_of_the_day, previous_reviews_count, has_owner_reply, owner_reply_text, owner_reply_date, owner_reply_name, owner_reply_role, position, sort_by, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when rows were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~yelp-reviews-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • Links, aliases, ids or names. A Yelp business link from any Yelp country site, the mobile site, or a link to one review, photo page or menu of the business; the alias after /biz/; the 22 character business id; or "Name, City". Up to 2,000 businesses per run.
  • Name and city lookups. Each "Name, City" line goes through Yelp's own business suggestions for that place and the closest name is taken. name_match_score says how close (1 means every word you gave is in Yelp's name). When nothing is close, the error row lists the businesses Yelp offered, so you can pick the right one.
  • Newest first, or the order you choose. Newest, oldest, Yelp's own relevance order, highest or lowest rated first. Up to 10,000 reviews per business, read up to 49 at a time.
  • Only new reviews on a schedule. Set reviewsNewerThan and each business stops at its first older review, so a weekly run fetches and charges only that week's reviews.
  • Star filter on Yelp's side. Pick 1 and 2 stars to collect complaints only. The filter runs before the reviews are sent, so you pay only for matching reviews.
  • Every language. By default English reviews come first, then each other language the business has, from most to fewest reviews; reviews_by_language on the profile row has the counts. Or pick one language.
  • Stops cleanly. 8 failed requests in a row end the run; the run stops before its time limit and keeps every row. The summary row says why it stopped.

How to use it

Reputation report for your locations

{
"businessUrls": [
"https://www.yelp.com/biz/katzs-delicatessen-new-york",
"https://www.yelp.com/biz/franklin-barbecue-austin"
],
"maxReviewsPerBusiness": 200
}

The profile rows give rating and the star breakdown per location; the review rows give the text to read. Filter on has_owner_reply: false and rating 1 or 2 to find complaints nobody answered.

Find businesses from a list of names

{
"businessNames": ["Katz's Delicatessen, New York, NY", "Franklin Barbecue, Austin, TX", "Roto-Rooter, Denver, CO"],
"maxReviewsPerBusiness": 0
}

Paste a column from your CRM or spreadsheet. With maxReviewsPerBusiness at 0 you get only the profile rows: Yelp link, rating, review count, stars breakdown, categories, street, city and price range. Each row keeps your original line in input and the match quality in name_match_score.

Weekly new reviews

{
"businessUrls": ["https://www.yelp.com/biz/prince-street-pizza-new-york-2"],
"maxReviewsPerBusiness": 500,
"reviewsNewerThan": "2026-10-20"
}

Run it on a schedule and move the date each week (or use a task per location). The business stops at the first review older than the date.

Complaints only, across competitors

{
"businessUrls": ["prince-street-pizza-new-york-2", "katzs-delicatessen-new-york"],
"starRatings": ["1", "2"],
"maxReviewsPerBusiness": 100
}

Up to 100 one and two star reviews per business, newest first, for complaint themes and service gaps.

Input parameters

ParameterTypeDefaultWhat it does
businessUrlsarray of stringsemptyYelp business links, aliases or 22 character business ids.
businessNamesarray of stringsempty"Business name, City, ST" lines, matched through Yelp's business suggestions.
maxReviewsPerBusinessinteger20Most reviews per business, 0 to 10,000. 0 returns the profile row only.
sortBystringnewestnewest, oldest, relevance, highest or lowest.
reviewsNewerThandatenoneOnly reviews on or after this date; reads newest first.
starRatingsarrayallStar ratings to include, "1" to "5".
reviewLanguagestringallall, or a two letter code such as en, es, fr.

Give businessUrls, businessNames or both. Up to 2,000 businesses per run.

What data do you get?

Two kinds of data rows, told apart by record_type: one business row per business, then its review rows. Data rows have no _type field; the summary, info and error rows do, so a filter on _type separates them.

Not included: phone number, website, opening hours, claimed status, amenities, menus and business photos beyond the main one. Yelp shows those on its business pages, which this actor does not open. It also does not search Yelp by keyword, category or area. For phone numbers and websites of local businesses use Google Maps Email Scraper.

Business rows (record_type: "business"):

FieldWhat it is
business_id, alias, name, urlThe business on Yelp
categoriesYelp categories, e.g. Barbeque
address, city, stateStreet, city and state or province code (street is empty for service area businesses)
price_rangee.g. $$$
rating, review_countRating out of 5 and total reviews
stars_5, stars_4, stars_3, stars_2, stars_1Number of reviews per star
reviews_by_languageRecommended reviews per language, e.g. {"en": 6480, "es": 8}
photo_urlMain business photo
input, matched_by, name_match_scoreYour original value, how it was found (link, alias, business_id, name) and the name match score for name lookups

Review rows (record_type: "review"):

FieldWhat it is
review_id, review_urlThe review and a link that opens it on Yelp
business_id, business_alias, business_name, business_urlThe business it is about
rating, text, languageStars (1 to 5), the full text and its language
date, local_dateWhen it was posted, in UTC and in the business time zone
reviewer_id, reviewer_name, reviewer_location, reviewer_url, reviewer_photo_urlThe reviewer as Yelp shows them, e.g. Mike S., Yucca Valley, CA
reviewer_review_count, reviewer_friend_count, reviewer_photo_count, reviewer_elite_yearHow active the reviewer is on Yelp, and their latest Elite year
photos_count, photo_urls, videos_countPhotos and videos attached to the review
reactions_helpful, reactions_thanks, reactions_love_this, reactions_oh_noReactions from other Yelp users
check_in_count, is_first_review_of_business, is_review_of_the_day, previous_reviews_countReview tags; previous_reviews_count above 0 means the reviewer updated an earlier review
has_owner_reply, owner_reply_text, owner_reply_date, owner_reply_name, owner_reply_roleThe business's public reply
position, sort_by, scraped_atPlace in the order you chose, the order, when the row was written

Summary row (_type: "summary", never charged): businesses_requested, businesses_found, businesses_not_found, duplicates_skipped, invalid_inputs, businesses_delivered, reviews_delivered, charged_businesses, charged_reviews, review_pages_read, http_requests, http_megabytes, stopped_by_max_cost, stopped_by_block_guard, shortfall_reason when the run stopped early, and per_business, one entry per business with reviews_available, reviews_delivered and why it stopped. The same summary is saved as the OUTPUT record of the run.

Error rows (_type: "error", never charged): one per input that could not be read, with error_type (invalid_input, not_found, no_close_match, blocked, fetch_error), identifier, reason, and candidates for a name with no close match.

Stable fields for automations

These were present in every row of their kind in our test runs (5 businesses, 500 reviews), and their names will not change:

FieldWhat it is
record_typebusiness or review
business_idThe business key, on both row kinds
name, url, rating, review_countBusiness rows
stars_5 to stars_1Business rows
review_idThe review key
rating, text, dateReview rows
reviewer_name, reviewer_locationReview rows
photos_count, has_owner_replyReview rows
scraped_atWhen the row was written

Optional, present only when Yelp has a value: address (empty for service area businesses), price_range, reviewer_elite_year (255 of 500 test reviews), reviewer_photo_url (400 of 500), the owner_reply_* fields (107 of 500), name_match_score (name lookups only).

Output examples

A business row (test run, 27 Oct 2026):

{
"record_type": "business",
"business_id": "MGzro82Fi4LYvc86acoONQ",
"alias": "franklin-barbecue-austin",
"name": "Franklin Barbecue",
"url": "https://www.yelp.com/biz/franklin-barbecue-austin",
"categories": ["Barbeque"],
"address": "900 E 11th St",
"city": "Austin",
"state": "TX",
"price_range": "$$$",
"rating": 4.5,
"review_count": 6494,
"stars_5": 4667,
"stars_4": 1030,
"stars_3": 391,
"stars_2": 209,
"stars_1": 199,
"reviews_by_language": { "en": 6480, "es": 8, "de": 3, "ja": 2, "da": 2, "tr": 1 },
"input": "https://www.yelp.com/biz/franklin-barbecue-austin",
"matched_by": "link"
}

A review row with the owner's reply (same day, trimmed):

{
"record_type": "review",
"review_id": "sWlBAGzmZVs5pskECtWLzQ",
"business_name": "Prince Street Pizza",
"review_url": "https://www.yelp.com/biz/prince-street-pizza-new-york-2?hrid=sWlBAGzmZVs5pskECtWLzQ",
"rating": 4,
"text": "I was told to try this place out by a friend & I was not disappointed! ...",
"language": "en",
"date": "2026-09-24T10:40:48Z",
"reviewer_name": "Rebecca C.",
"reviewer_location": "San Antonio, TX",
"reviewer_review_count": 150,
"reviewer_elite_year": 2026,
"photos_count": 1,
"has_owner_reply": true,
"owner_reply_text": "Thank You Rebecca",
"owner_reply_date": "2026-10-04T02:10:04Z",
"owner_reply_name": "Edgar T.",
"owner_reply_role": "CUSTOMER_SERVICE",
"position": 10,
"sort_by": "newest"
}

The summary row of the 5 business test run, trimmed:

{
"_type": "summary",
"businesses_requested": 5,
"businesses_found": 5,
"businesses_delivered": 5,
"reviews_delivered": 500,
"charged_businesses": 5,
"charged_reviews": 500,
"review_pages_read": 15,
"http_requests": 25,
"per_business": [
{ "input": "https://www.yelp.com/biz/katzs-delicatessen-new-york", "name": "Katz's Delicatessen", "reviews_available": 16913, "reviews_delivered": 100, "stopped": "max_reviews_reached" }
]
}

An error row for a name Yelp does not know (nothing charged):

{ "_type": "error", "error_type": "not_found", "identifier": "Joes Plumbing Supreme, Austin, TX", "reason": "Yelp has no business called \"Joes Plumbing Supreme\" near \"Austin, TX\"." }

Pricing

Pay per event: you pay for the reviews and business rows you receive, plus a flat $0.001 per run, whatever memory you choose.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
review-scrapedOnce per review row stored in your dataset$1.80 per 1,000$1.35 per 1,000$1.13 per 1,000$0.90 per 1,000
business-scrapedOnce per business profile row stored in your dataset$1.80 per 1,000$1.35 per 1,000$1.13 per 1,000$0.90 per 1,000
run-startOnce per run, after the first row is stored$0.001$0.001$0.001$0.001

The price of one row is the price per 1,000 divided by 1,000.

Never charged:

  • inputs that are not Yelp businesses, and businesses or names Yelp does not know (each gets an error row);
  • a business you give twice in the same run (two links, or a link and a name);
  • reviews past your maxReviewsPerBusiness, older than reviewsNewerThan, or outside your starRatings;
  • the summary, info and error rows;
  • a run that stores no row: the start fee is charged only after the first one;
  • anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

Run it on a schedule

  1. Open the actor in Apify Console, set your input and click Save as a new task.
  2. In the task, open Schedules, click Add schedule and pick how often (every Monday at 08:00, every day and so on).
  3. Set reviewsNewerThan to the date of the last run, or compare runs on review_id to keep only new reviews; compare rating and review_count on the business rows to track a location over time.
  4. Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.

FAQ

What does this actor read?

Yelp's public review and rating data for the businesses you give, as anyone sees it without logging in. It does not log in, does not open Yelp's business pages and does not read anything behind a sign in.

Why are phone, website and opening hours missing?

Yelp shows them on its business pages, which this actor does not open, so they are not in the output. The profile row has what Yelp's review data carries: name, categories, street, city, state, price range, rating, review count and the star breakdown. For phones and websites of local businesses, run the business names through Google Maps Email Scraper.

Can I search Yelp for "plumbers in Austin"?

No. This actor reads the businesses you name, by link, alias, id or name and city. Build the list first (from your CRM, Google Maps, or Yelp in your browser), then paste it in.

How does the name and city lookup choose a business?

It asks Yelp for the businesses it suggests for that name near that place and takes the first one whose name contains your words; name_match_score is the share of your words found. A chain gives the location Yelp ranks first for that place (Roto-Rooter, Denver, CO returned the Lakewood branch in our test), so for a specific branch paste its link instead.

Which reviews are included?

The reviews Yelp recommends and shows on the business page, in every language unless you pick one. Reviews Yelp lists as "not currently recommended" are not included.

How many reviews can I get?

Up to 10,000 per business and 2,000 businesses per run. Yelp serves them 49 at a time; 100 reviews take 3 pages. In our test, 5 businesses with 100 reviews each took 28 seconds.

How long does a run take?

In our tests: 5 seconds for the "Try it" input (1 business, 20 reviews), 28 seconds for 5 businesses with 100 reviews each, and 11 seconds for 5 profile rows only. The default time limit is 3,600 seconds; the actor stops before it and keeps every row.

Do I need a Yelp account, cookies or an API key?

No. The actor reads public data over Apify Proxy, which is included.

Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/yelp-reviews-scraper

  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http yelp-reviews-scraper "https://mcp.apify.com/?tools=themineworks/yelp-reviews-scraper"

Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has three ready views: Reviews, Businesses, and Reviewers and replies. In CSV and Excel, categories, photo_urls and reviews_by_language are flattened into columns such as categories/0.

The actor reads only reviews and ratings that anyone can see on Yelp without logging in. Reviewer names are shown as Yelp shows them (first name and last initial) and are personal data under laws such as the GDPR and CCPA: keep only what you need and use it for a legitimate purpose. You are responsible for how you use the data and for Yelp's terms. This is general information, not legal advice. Yelp is a trademark of Yelp Inc.; this actor is independent and not affiliated with it.

Integrations

  • Google Sheets: send each run's rows to a sheet with Apify's Google Sheets integration; filter on record_type to split businesses and reviews into two tabs.
  • Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "new 1 and 2 star Yelp reviews every morning to Slack".
  • Clay and AI agents: call it once per business with one link or one "Name, City" line; the profile row comes back first.
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
  • MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

More from The Mine Works

Marketing, SEO and reviews

Social media and video

Leads and business directories

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

E-commerce and marketplaces

Food and local services

Developer and AI tools

More tools

Support

Found a business the actor could not read, or a review field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

Give Yelp business links or names and get each business back as one row with rating and star breakdown, then its reviews newest first with text, reviewer, photos and the owner's reply, no login.