# Yelp Reviews Scraper - Ratings, Owner Replies & Photos (`topapi/yelp-reviews-scraper`) Actor

Scrape every public Yelp review of any business by URL, alias, id or Yelp search: star rating, full text, date, reviewer, reactions, owner reply, photos and the business. All languages, keyword, date and star filters, monitor mode. No login. $0.047 per 1,000 reviews.

- **URL**: https://apify.com/topapi/yelp-reviews-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.05 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Yelp Reviews Scraper do?

**Yelp Reviews Scraper** extracts Yelp reviews from any business on yelp.com and turns business URLs, aliases, business ids or a Yelp search into structured rows: one review per row with the star rating, full text, date, reviewer, reactions, the owner's reply, photos and the business it belongs to. Built for reputation managers, agencies, franchise owners and analysts who need every review of a business in a spreadsheet or pipeline without copying them by hand.

Yelp review scraper · Yelp reviews API · Yelp review extractor · Yelp review export

<a href="https://console.apify.com/actors/O1OYven34yg1al4gv"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/yelp-reviews-scraper-source.png" alt="Yelp reviews page that Yelp Reviews Scraper turns into rows (reviewer details blurred)" style="width:70%"></a>

- **Every review of a business:** paste a Yelp business URL from any Yelp domain, an alias or a business id and get all of its reviews, 30 per request, newest first or in any of Yelp's six sort orders
- **Search-to-reviews in one run:** give a search term and a location (or paste a Yelp search URL) and the actor reviews the businesses the search returns (Businesses per search, default 10, up to Yelp's 240; sponsored results skipped)
- **All languages:** walks every language a business has reviews in, or just the one you pick, with Yelp's own translation on request
- **Filters Yelp applies itself:** for recommended reviews, star ratings (except in keyword searches), language and keyword search run on Yelp's side; date window, photos-only and owner-reply-only are applied to each review. Not-recommended reviews are matched against your star ratings and keywords by the actor; the language pick does not apply to them
- **Owner replies, reactions and legacy votes:** the business's public reply with its date, Helpful/Thanks/Love this/Oh no reactions and the older Useful/Funny/Cool votes (votes on recommended reviews read without a keyword search or a proxy)
- **Not-recommended reviews too:** optionally adds the reviews Yelp's software filters out, marked `isRecommended: false`
- **Monitor mode:** on a schedule, return only reviews posted since the last run (plus, with not-recommended reviews on, any not-recommended review not delivered before); a review is never delivered twice through the same store
- **No login, cookies or Yelp API key:** you pass URLs or a search; nothing else
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets; the Apify API and MCP server for AI agents

### What data can you get from Yelp reviews?

<table>
<tr>
<td>⭐ Star rating (<code>rating</code>)</td>
<td>📝 Full review text (<code>text</code>)</td>
<td>📅 Review date, local and UTC</td>
</tr>
<tr>
<td>🔗 Review link (<code>reviewUrl</code>)</td>
<td>🌐 Language + Yelp translation</td>
<td>👤 Reviewer name, location, profile link</td>
</tr>
<tr>
<td>🏅 Elite badge and expert badge</td>
<td>📊 Reviewer review, friend and photo counts</td>
<td>👍 Helpful, Thanks, Love this, Oh no</td>
</tr>
<tr>
<td>🗳️ Useful, Funny, Cool votes</td>
<td>💬 Owner reply text, date, role</td>
<td>📷 Review photos (full size) and videos</td>
</tr>
<tr>
<td>🔁 Reviewer's earlier reviews of the business</td>
<td>✅ Check-ins, first-reviewer, paid/reserved via Yelp</td>
<td>🚫 Not-recommended flag</td>
</tr>
<tr>
<td>🏪 Business name, id, alias, URL</td>
<td>⭐ Business rating, total reviews, stars breakdown</td>
<td>🏷️ Categories, city, region, neighborhoods</td>
</tr>
</table>

On a 1,000-review platform run of one business, every row had a review id, link, rating, text, language, date, reviewer name and the business fields; 50% had photos and 48% an expert badge.

### How to scrape Yelp reviews with Yelp Reviews Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) — $5 of monthly credit, no card needed.
2. Open [Yelp Reviews Scraper](https://apify.com/TopApi/yelp-reviews-scraper) and click **Try for free**.
3. Paste Yelp business URLs into **Businesses** (or fill **Search terms** + **Search location**) and set **Max reviews per business**.
4. Pick a sort order, star ratings, language or keywords if you need them.
5. Click **Start**. Reviews stream into the dataset as they are read.
6. Open the **Storage** tab and **Export** as JSON, CSV or Excel — or save the input as a task and schedule it.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `businesses` | List | Business URLs from any Yelp domain (`https://www.yelp.com/biz/franklin-barbecue-austin`, `https://www.yelp.de/biz/...`), aliases (`franklin-barbecue-austin`), business ids (`MGzro82Fi4LYvc86acoONQ`) or Yelp search URLs. Mix freely. |
| `searchTerms` | List | Find businesses with a Yelp search, e.g. `pizza`, `dentist`. Needs `searchLocation`. |
| `searchLocation` | Text | City, ZIP or neighborhood for the search terms, e.g. `Austin, TX`. |
| `maxBusinessesPerSearch` | Integer | Businesses each search adds (sponsored results skipped). Default `10`, Yelp shows at most 240. |
| `searchSort` | Select | Recommended, Highest rated or Most reviewed businesses first. Default: recommended |
| **🎯 Filters** (applied by Yelp to recommended reviews; the actor applies star ratings in keyword searches) | | |
| `reviewsSort` | Select | Newest first, Oldest first, Yelp Sort, Highest rated, Lowest rated, Elites first. Default: newest |
| `reviewRatings` | Multi-select | Only these star ratings. Default: all |
| `reviewLanguage` | Select | `all` (every language the business has, largest first) or one language. Does not apply to not-recommended reviews. Default: `all` |
| `keywords` | List | Yelp's own review search, one search per keyword (max 10), e.g. `parking`. Not-recommended reviews are kept only when their text contains one of the keywords. |
| `translateTo` | Select | Adds Yelp's translation of each review to `translatedText`. Default: none |
| **✂️ Refine results** | | |
| `reviewsNewerThan` / `reviewsOlderThan` | Text | Date window: `2026-09-01` or relative `30 days`, `6 months`. |
| `withPhotosOnly` | Boolean | Keep only reviews with photos or videos. Default `false` |
| `withOwnerReplyOnly` | Boolean | Keep only reviews the business answered. Default `false` |
| **➕ Extra data** | | |
| `includePersonalData` | Boolean | Reviewer name, profile, location, counts, Elite and expert badges, and the reviewer's earlier reviews of the business. Off = those fields are `null`. Default `true` |
| `includeNotRecommended` | Boolean | Also scrape Yelp's not-recommended reviews (`isRecommended: false`). The review-language pick does not apply to not-recommended reviews, and those rows carry no language, reactions, Useful/Funny/Cool votes or review tags (null), and no translation, photos or expert badge. Default `false` |
| **🔁 Monitoring** | | |
| `monitorMode` | Boolean | Return only reviews posted since the newest one earlier runs saw with the same filters, plus (with `includeNotRecommended`) any not-recommended review not delivered before. A review is never delivered twice through the same store. Pair with a schedule. |
| `monitorStoreName` | Text | Named store that remembers what was delivered. One name per schedule. Changing the language, star-rating, keyword or not-recommended settings starts a new baseline; reviews already delivered through the store are still skipped. |
| **📦 Output** | | |
| `maxReviewsPerBusiness` | Integer | Default `100`; `0` = every review Yelp lists. |
| `maxReviews` | Integer | Run-wide limit across all businesses. `0` = none. |
| `compact` | Boolean | Core fields only, sized for AI agents and MCP: `author` keeps only `name`, `publicReply` only `text`. |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | Proxy | Used only if Yelp stops answering direct requests; a named proxy group is used from the first request. Useful/funny/cool votes are left empty on proxied pages. |

#### Input JSON

```json
{
  "businesses": ["https://www.yelp.com/biz/franklin-barbecue-austin"],
  "maxReviewsPerBusiness": 200,
  "reviewsSort": "newest",
  "reviewsNewerThan": "90 days",
  "reviewRatings": ["1", "2"]
}
```

#### Paste the business page URL, not a review link

Any `/biz/` address works, from any Yelp country site, with or without `?osq=` or `?hrid=` parameters. **Do:** `https://www.yelp.com/biz/home-slice-pizza-austin` · **Don't:** a Google Maps link or the business's own website (the run log lists lines it could not read; nothing is charged for them).

#### Use a search to cover a whole category

`searchTerms: ["auto repair"]` with `searchLocation: "Los Angeles, CA"` and `maxBusinessesPerSearch: 20` reviews the first 20 organic results. For price or feature filters, filter the search on yelp.com and paste the search URL into **Businesses**.

#### Combine Newest first with a date window

With `reviewsSort: "newest"` and `reviewsNewerThan: "30 days"` the run stops reading each review language as soon as it reaches older reviews, so a 6,000-review business costs one or two requests per language it has reviews in, plus one page to look up its id when you give a URL or alias. Franklin Barbecue has reviews in 7 languages, so our test run made 7 review requests. Add `reviewLanguage: "en"` to read English reviews only.

### ⬆️ Output

Every review becomes one dataset item. Here is the table view of a platform run for the search `pizza` in `Austin, TX` (5 businesses × 20 newest reviews):

<a href="https://console.apify.com/actors/O1OYven34yg1al4gv"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/yelp-reviews-scraper-output.png" alt="Yelp Reviews Scraper output table (reviewer names blurred)" style="width:70%"></a>

And one row as JSON (shortened):

```json
{
  "review_position": 1,
  "reviewEncid": "Q1kUFPnl5j3_0xrsLfLRYg",
  "reviewUrl": "https://www.yelp.com/biz/franklin-barbecue-austin?hrid=Q1kUFPnl5j3_0xrsLfLRYg",
  "rating": 5,
  "text": "Finally got back to Franklin bbq. Was here last year for a conference...",
  "language": "en",
  "reviewDate": "2026-10-03T19:58:20-05:00",
  "reviewDateUtc": "2026-10-04T00:58:20.000Z",
  "isRecommended": true,
  "author": { "name": "Mike S.", "location": "Yucca Valley, CA", "review_count": 168, "isElite": true },
  "helpfulCount": 0, "thanksCount": 0, "loveThisCount": 0, "ohNoCount": 0,
  "usefulCount": 0, "funnyCount": 0, "coolCount": 0,
  "publicReply": null,
  "photos": [{ "url": "https://s3-media0.fl.yelpcdn.com/bphoto/qpFcPpcLCuQDbaHM0F2nrQ/o.jpg", "caption": "Brisket closeup" }],
  "expertRecognition": "BBQ",
  "encid": "MGzro82Fi4LYvc86acoONQ",
  "name": "Franklin Barbecue",
  "businessRating": 4.5,
  "totalReviews": 6489,
  "ratingDetail": { "5_star": 4661, "4_star": 1031, "3_star": 391, "2_star": 209, "1_star": 199 },
  "categories": ["Barbeque"],
  "businessCity": "Austin"
}
```

#### Fields

| Field | Type | What it is | Fill on test runs |
|---|---|---|---|
| `reviewEncid`, `reviewUrl` | string | Yelp's review id and a direct link to the review | 100% |
| `rating` | number | Stars the reviewer gave, 1-5 | 100% |
| `text`, `language` | string | Full review text and its language code (`language` null on not-recommended reviews) | 100% (recommended reviews) |
| `translatedText` | string | Yelp's translation (with `translateTo`) | when requested |
| `reviewDate`, `reviewDateUtc` | string | Review date in the business's local time and in UTC | 100% |
| `author` | object | Reviewer name, encid, profile URL, location, review/friend/photo counts, profile photo, Elite badge | 100% (photo 72-75%) |
| `feedback`, `helpfulCount` … `ohNoCount` | array, number | Yelp reactions on the review (null on not-recommended reviews) | 100% (recommended reviews) |
| `usefulCount`, `funnyCount`, `coolCount` | number | Legacy votes (null in keyword searches, on not-recommended reviews and on pages read through a proxy, e.g. when you pick a proxy group) | 100% (recommended reviews, no keywords, no proxy) |
| `publicReply` | object | The business's reply: text, date, dateUtc, authorName, authorRole | when the business replied (9 of 30 on a tire shop) |
| `photos`, `videos` | array | Media attached to the review (full-size photo URL + thumbnail) | 44-50% |
| `expertRecognition` | string | Reviewer's Yelp expert badge for this kind of place (`null` with `includePersonalData` off) | 48-61% |
| `previousReviews` | array | The reviewer's earlier reviews of the same business (`null` with `includePersonalData` off) | 2-3% |
| `checkInCount`, `isFirstReviewer`, `hasPaidThroughYelp`, `hasPurchasedDeal`, `hasPlacedReservation`, `reservationProvider` | mixed | Review tags Yelp shows (null on not-recommended reviews) | 100% (recommended reviews; provider when booked) |
| `isRecommended` | boolean | `false` for Yelp's not-recommended reviews | 100% |
| `encid`, `alias`, `businessUrl`, `name`, `primaryPhoto` | string | The business | 100% |
| `businessRating`, `totalReviews`, `ratingDetail`, `reviewsCountByLanguage` | mixed | Business rating summary | 100% |
| `categories`, `businessCity`, `businessRegion`, `neighborhoods` | mixed | Business categories and location | 100% (neighborhoods 80-100%) |
| `input`, `searchTerm`, `searchLocation`, `review_position`, `scrapedAt` | mixed | Where the row came from | 100% (search fields for searches) |

Fill measured on two platform runs: 100 reviews from a 5-business search and 1,000 reviews of one business.

### How can I use Yelp reviews data?

- 🏪 **Franchise and multi-location owners** — pull every location's reviews weekly and compare ratings by city
- 📣 **Reputation and review-management agencies** — watch new 1- and 2-star reviews with monitor mode and route them to Slack
- 🔎 **Market researchers** — read what customers say about a whole category in a city with one search
- 🤖 **AI and data teams** — feed `text`, `rating` and `reviewDate` to sentiment models or LLM summaries
- 🧭 **Competitor analysts** — track a rival's review velocity and owner-reply rate over time
- 🏗️ **Product teams** — use `keywords` to find every review mentioning "parking", "wait" or a dish

### How much does it cost to scrape Yelp reviews?

Yelp Reviews Scraper is pay-per-result: **$0.047 per 1,000 reviews** ($0.000047 per review), no start fee.

| Reviews | Cost |
|---:|---:|
| 100 | $0.0047 |
| 1,000 | $0.047 |
| 10,000 | $0.47 |
| 100,000 | $4.70 |

There is nothing else to pay: Apify platform usage is included in these prices. Measured at the default 256 MB: 100 reviews from a 5-business search in 5.6 s, 1,000 reviews of one business in 32.5 s.

### Integrations, API, scheduling & MCP

- **Schedules:** run Yelp Reviews Scraper daily or weekly from the **Schedules** tab; with `monitorMode` each run returns only new reviews.
- **Webhooks:** fire a URL when a run finishes — push reviews to your CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable, Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client` — code on the [API tab](https://apify.com/TopApi/yelp-reviews-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/TopApi/yelp-reviews-scraper/api/mcp) and ask for Yelp reviews in plain language.

### More review and local-business scrapers

<table>
<tr>
<td>📍 <a href="https://apify.com/TopApi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a> — the same business's Google reviews</td>
<td>💬 <a href="https://apify.com/TopApi/facebook-comments-scraper">Facebook Comments Scraper</a> — comments on a brand's posts</td>
<td>🔎 <a href="https://apify.com/TopApi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a> — public posts that mention a business</td>
<td>🧰 <a href="https://apify.com/TopApi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Reviews per business:** every review Yelp lists can be read, 30 per request; 1,000 reviews of one business took 32.5 s.
- **Searches:** Yelp shows at most 240 businesses per search; use several locations or terms to cover more.
- **Keyword searches** come in Yelp's relevance order; star ratings are then applied to each review, and the legacy Useful/Funny/Cool votes are empty.
- **Not-recommended reviews** are read 10 per page, more slowly, lowest rating first. The review-language pick does not apply to not-recommended reviews, and those rows carry no language, reactions, Useful/Funny/Cool votes or review tags (null). With `keywords`, a not-recommended review is kept only when its text contains one of the keywords.
- **Empty dataset:** the inputs matched no business, your filters removed every review, or (in monitor mode) nothing is new. The status line says which.
- **Not in the rows:** Review of the Day and the reviewer's date of visit were empty on all 1,100 test reviews, and Yelp sends the Elite All-Star flag empty on every review, so none of them is shipped; business phone, website and opening hours are not part of review rows.

### FAQ

#### How many reviews can Yelp Reviews Scraper collect in one run?

All of them. Set `maxReviewsPerBusiness` to `0` and the run reads every review Yelp lists for each business, 30 per request. A 1,000-review business took 32.5 seconds on a platform test.

#### Can I get only new Yelp reviews on a schedule?

Yes. Turn on `monitorMode`, keep the same `monitorStoreName`, and schedule the task. The first run delivers up to your per-business limit; later runs with the same filters return only reviews posted since then. A run that stops early (at `maxReviews`, your maximum charge, its time limit, an abort or a Yelp error) keeps the old bookmark, so the next run first picks up the older reviews it did not reach. A review delivered through the store is never delivered or charged again by a later run on that store, even after you change a filter or abort a run. Changing the language, star-rating, keyword or not-recommended settings starts a new baseline for the new settings (up to your per-business limit, skipping reviews already delivered). With `includeNotRecommended`, each run also delivers any not-recommended review that no earlier run delivered, whatever its date. An empty check took under 6 seconds in testing.

#### Does Yelp Reviews Scraper get reviews in every language?

Yes. With `reviewLanguage: "all"` (the default) it walks every language the business has reviews in, largest first. Pick one language to get only that one, and use `translateTo` for Yelp's own translation. Not-recommended reviews carry no language, so the language pick does not apply to them.

#### Can Yelp Reviews Scraper search reviews for a keyword?

Yes. `keywords` runs Yelp's own review search for each word, so only matching recommended reviews are read. With `includeNotRecommended`, the not-recommended reviews are read in full and kept only when their text contains one of the keywords.

#### Can I scrape Yelp reviews from a search instead of URLs?

Yes. Give `searchTerms` and `searchLocation`, or paste a Yelp search URL with your filters into `businesses`.

#### Can I use Yelp Reviews Scraper with the Apify API?

Yes. The API lets you start runs, fetch datasets and manage schedules. Use `apify-client` for [Node.js](https://apify.com/TopApi/yelp-reviews-scraper/api/javascript) or [Python](https://apify.com/TopApi/yelp-reviews-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Yelp Reviews Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/TopApi/yelp-reviews-scraper/api/mcp), connect your MCP client (Claude Desktop, Cursor and others) and ask for Yelp reviews in plain language. Turn on `compact` for smaller rows.

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

No. Yelp Reviews Scraper reads only what Yelp shows publicly; you pass business URLs, ids or a search.

#### Why did my Yelp reviews run return no results?

Most often the input was not a Yelp business address (the log lists skipped lines), the filters removed every review (the run summary counts them per filter), or monitor mode found nothing new.

#### Is it legal to scrape Yelp reviews?

Yelp Reviews Scraper reads public reviews only and does not log in. Reviews and reviewer names are personal data, so you are responsible for using them lawfully, including under GDPR and CCPA; `includePersonalData: false` empties every field about the reviewer: name, profile link, location, review/friend/photo counts, profile photo, Elite and expert badges, and their earlier reviews of the business. The review itself, its tags and the business's reply stay.

#### Your feedback

We keep improving Yelp Reviews Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/TopApi/yelp-reviews-scraper/issues/open).

# Actor input Schema

## `businesses` (type: `array`):

One per line: a business URL from any Yelp domain (https://www.yelp.com/biz/franklin-barbecue-austin), an alias (franklin-barbecue-austin), a business id (MGzro82Fi4LYvc86acoONQ) or a Yelp search URL.

## `searchTerms` (type: `array`):

Find businesses with a Yelp search and scrape their reviews, e.g. "pizza", "dentist", "auto repair". Needs a search location.

## `searchLocation` (type: `string`):

City, ZIP or neighborhood for the search terms, e.g. "Austin, TX", "10001", "Mission, San Francisco".

## `maxBusinessesPerSearch` (type: `integer`):

How many businesses each search adds (sponsored results skipped). Yelp shows at most 240 per search.

## `searchSort` (type: `string`):

Which businesses a search picks first. For price or feature filters, paste a Yelp search URL into Businesses instead.

## `reviewsSort` (type: `string`):

The order Yelp returns reviews in. Date limits stop early with Newest first. Keyword searches always come in Yelp's relevance order.

## `reviewRatings` (type: `array`):

Only reviews with these star ratings. Empty = all ratings.

## `reviewLanguage` (type: `string`):

All languages walks every language the business has reviews in, largest first. Pick one to get only that language. Does not apply to not-recommended reviews (they carry no language).

## `keywords` (type: `array`):

Only reviews that mention these words, searched by Yelp itself, e.g. "parking", "wait time". One search per keyword (max 10). Not-recommended reviews are kept only when their text contains one of the keywords.

## `translateTo` (type: `string`):

Adds Yelp's own translation of each review in translatedText.

## `reviewsNewerThan` (type: `string`):

Only reviews posted after this date: "2026-09-01" or a relative "30 days", "6 months". Pairs with Newest first.

## `reviewsOlderThan` (type: `string`):

Only reviews posted before this date: "2025-12-31" or "1 year".

## `withPhotosOnly` (type: `boolean`):

Keep only reviews that include photos or videos.

## `withOwnerReplyOnly` (type: `boolean`):

Keep only reviews the business answered publicly.

## `includePersonalData` (type: `boolean`):

Reviewer name, Yelp profile link, location, review/friend/photo counts, profile photo, Elite and expert badges, and the reviewer's earlier reviews of the business. Off = those fields are null.

## `includeNotRecommended` (type: `boolean`):

Also scrape the reviews Yelp does not recommend (isRecommended: false; own per-business limit). The review-language pick does not apply to not-recommended reviews, and those rows carry no language, reactions, Useful/Funny/Cool votes or review tags (null). Keywords: kept if the text has one.

## `monitorMode` (type: `boolean`):

Return only reviews posted since the newest one earlier runs saw with the same filters (same store name), plus any not-recommended review not delivered before. A review is never delivered twice through one store. The first run delivers up to Max reviews per business.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers delivered reviews. Use one name per schedule. Changing the language, star-rating, keyword or not-recommended settings starts a new baseline; reviews already delivered through the store are still skipped.

## `maxReviewsPerBusiness` (type: `integer`):

Stop each business after this many reviews. 0 = every review Yelp lists (some businesses have 10,000+).

## `maxReviews` (type: `integer`):

Stop the whole run after this many reviews across all businesses. 0 = no run-wide limit.

## `compact` (type: `boolean`):

Core fields only (review id, URL, rating, text, date, reviewer name, owner reply, business) - sized for AI agents and MCP. author keeps only name and publicReply only text.

## `proxyConfiguration` (type: `object`):

The actor connects directly first and switches to this proxy only if Yelp stops answering. A named proxy group is used from the first request. Useful/funny/cool votes are left empty on proxied pages.

## Actor input object example

```json
{
  "businesses": [
    "https://www.yelp.com/biz/franklin-barbecue-austin"
  ],
  "searchTerms": [],
  "maxBusinessesPerSearch": 10,
  "searchSort": "recommended",
  "reviewsSort": "newest",
  "reviewRatings": [],
  "reviewLanguage": "all",
  "keywords": [],
  "translateTo": "none",
  "withPhotosOnly": false,
  "withOwnerReplyOnly": false,
  "includePersonalData": true,
  "includeNotRecommended": false,
  "monitorMode": false,
  "monitorStoreName": "yelp-reviews-monitor",
  "maxReviewsPerBusiness": 20,
  "maxReviews": 0,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

The dataset of Yelp reviews (one item per review).

## `summary` (type: `string`):

Per-business counts (read, filtered, already delivered, delivered), status of every input, requests made and egress used.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "businesses": [
        "https://www.yelp.com/biz/franklin-barbecue-austin"
    ],
    "maxReviewsPerBusiness": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/yelp-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "businesses": ["https://www.yelp.com/biz/franklin-barbecue-austin"],
    "maxReviewsPerBusiness": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/yelp-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "businesses": [
    "https://www.yelp.com/biz/franklin-barbecue-austin"
  ],
  "maxReviewsPerBusiness": 20
}' |
apify call topapi/yelp-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/yelp-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/O1OYven34yg1al4gv/builds/Me7HshBzz3H9hlsDa/openapi.json
