# Yelp Reviews Scraper - All Reviews, Owner Replies, Photos (`cirkit/yelp-reviews-scraper`) Actor

Scrape every Yelp review for any business: rating, full text, date, reviewer profile and Elite status, reactions, photos, the owner's reply and earlier review versions. Sort newest, oldest, by rating or Elite, filter by stars, language or date. No login, no browser.

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

## Pricing

$0.20 / 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 is Yelp Reviews Scraper?

**Yelp Reviews Scraper** lets you extract every review from any Yelp business page, helping you track your reputation, benchmark competitors, and feed real customer language into sentiment analysis, AI models and market research. Paste one or a thousand Yelp business links and get one clean row per review, ready to export to Excel, CSV, JSON or Google Sheets.

- ⭐ **Monitor your reputation:** pull new reviews every day with a date cutoff, so scheduled runs only pay for reviews you have not seen yet.
- 🔍 **Find out what customers complain about:** filter to 1 and 2 star reviews and get the full text, the date and whether the owner replied.
- 🏆 **Benchmark competitors:** compare ratings, review velocity, Elite reviewer share and owner response rates across every business in a market.
- 💬 **Measure owner response:** every row carries the business's public reply, who wrote it and when.
- 🌍 **Get every language, not just English:** Yelp shows English by default and hides the rest behind a language switch. This scraper collects all of them.
- 🧠 **Train and ground AI models:** thousands of real, dated, rated customer opinions with reviewer context, in a few minutes.

Yelp's official Fusion API returns at most 3 reviews per business. Yelp Reviews Scraper returns all of them, with no API key, no login and no headless browser.

### What data does Yelp Reviews Scraper extract?

Every review comes back as one row with these fields:

- ⭐ Star rating, 1 to 5 (`rating`)
- 📝 Full review text and its language (`text`, `language`)
- 📅 Date and time the review was posted (`publishedAt`)
- 🔗 Review ID and a direct link to the review (`reviewId`, `reviewUrl`)
- 👤 Reviewer name, profile link, location and photo (`reviewerName`, `reviewerUrl`, `reviewerLocation`, `reviewerImageUrl`)
- 📊 Reviewer's review, friend and photo counts (`reviewerReviewCount`, `reviewerFriendCount`, `reviewerPhotoCount`)
- 🏅 Yelp Elite status, Elite year and Elite All Star flag (`reviewerIsElite`, `reviewerEliteYear`, `reviewerIsEliteAllStar`)
- 🎓 Expert badge earned on the review, for example "Pizza" (`reviewerExpertBadge`)
- 👍 Helpful, Thanks, Love this and Oh no reaction counts
- 📸 Every photo attached to the review, full size, with caption (`photos`)
- 🎬 Review videos with thumbnails (`videos`)
- 💬 The owner's public reply, its author, role and date (`ownerReplyText`, `ownerReplyAuthor`, `ownerReplyRole`, `ownerReplyDate`)
- ❤️ Whether the owner marked the review as appreciated (`ownerAppreciated`)
- 🔁 Earlier versions of an updated review, with their rating, text and date (`previousReviews`)
- ✅ Check-in count, first-to-review, Review of the Day and booked-through-Yelp flags
- 🏪 Business name, ID, URL, overall rating, total review count, city, state, neighborhoods, categories and 1 to 5 star rating distribution

Fields that every review has (ID, rating, text, date, reviewer) are always filled. Photos, owner replies and Elite badges are filled when the review has them.

### How to use Yelp Reviews Scraper

1. Click **Try for free** and open the actor in Apify Console.
2. Paste one or more Yelp business links into **Yelp business URLs**.
3. Set **Max reviews per business** (0 collects every review) and, if you like, a sort order, star filter, language or date cutoff.
4. Click **Start** and wait. A few hundred reviews take seconds.
5. Download the results as Excel, CSV, JSON or HTML, or read them through the API.

### Input

```json
{
    "businessUrls": [
        "https://www.yelp.com/biz/katzs-delicatessen-new-york",
        "https://www.yelp.co.uk/biz/dishoom-london",
        "pink-onion-san-francisco"
    ],
    "maxReviewsPerBusiness": 500,
    "sortBy": "newest",
    "starRatings": ["1", "2"],
    "language": "all",
    "reviewsNewerThan": "90 days",
    "maxItems": 2000
}
```

- **Yelp business URLs:** full links from any Yelp country site, URL slugs, or Yelp business IDs. Duplicates are read once.
- **Max reviews per business:** default 100. Set 0 for every review.
- **Sort reviews by:** newest, oldest, Yelp Sort (relevance), highest rated, lowest rated, or Elite reviewers first.
- **Star ratings:** any combination of 1 to 5 stars.
- **Review language:** `all` (default) or one code such as `en`, `es`, `fr`, `de` or `ja`.
- **Only reviews newer than:** a date (`2026-01-31`) or a period (`7 days`, `6 months`). Reading stops at the cutoff, so you are not charged for older reviews.
- **Max reviews in total:** a hard cap on rows, and so on cost.

### Output

One row per review. Trimmed example:

```json
{
    "position": 1,
    "reviewId": "Gsv2FG6MFoOp3UTKNRhrhg",
    "reviewUrl": "https://www.yelp.com/biz/katzs-delicatessen-new-york?hrid=Gsv2FG6MFoOp3UTKNRhrhg",
    "rating": 5,
    "text": "Yeah fine that was a pretty good sammy... Got the pastrami reuben and it was all ...",
    "language": "en",
    "publishedAt": "2026-10-04T19:42:17-04:00",
    "reviewerName": "Patrick Z.",
    "reviewerLocation": "New York, NY",
    "reviewerReviewCount": 244,
    "reviewerIsElite": true,
    "reviewerEliteYear": "2026",
    "reviewerExpertBadge": "Sandwich",
    "helpfulCount": 0,
    "photoCount": 1,
    "photos": [{ "url": "https://s3-media0.fl.yelpcdn.com/bphoto/207SbvpC7ivLkbPGHaCSuQ/o.jpg", "caption": "Pastrami Reuben", "width": 1500, "height": 2000 }],
    "ownerReplyText": null,
    "businessName": "Katz's Delicatessen",
    "businessRating": 4.1,
    "businessReviewCount": 17112,
    "businessCity": "New York",
    "businessRatingDistribution": { "1": 1072, "2": 957, "3": 1907, "4": 4423, "5": 8758 },
    "sortBy": "newest",
    "scrapedAt": "2026-10-06T13:40:00.000Z",
    "noResults": false,
    "notice": null
}
```

The dataset has three ready-made table views: **Reviews** (the overview), **Reviewers** (profile, Elite status and activity) and **Owner replies** (review next to the business's response).

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

Yelp Reviews Scraper uses flat pay-per-result pricing: **$0.20 per 1,000 reviews**, with no monthly rental and no per-run start fee.

| Reviews | Cost |
|---|---|
| 1,000 | $0.20 |
| 10,000 | $2.00 |
| 100,000 | $20.00 |

The most used Yelp review scraper on the Store charges $0.30 per 1,000. Apify's free plan includes $5 of monthly credit, enough for about 25,000 reviews.

### Measured coverage

Measured on 1,769 reviews from 7 businesses in the US and UK during testing (October 2026):

| Field | Filled |
|---|---|
| Review ID, rating, text, date, language | 100% |
| Reviewer name, location, review count | 100% |
| Business rating, city, review count | 100% |
| Reviewer photo | 73% (the rest have no photo on Yelp) |
| Expert badge | 40% |
| At least one review photo | 40% |
| At least one Helpful reaction | 36% |
| Elite reviewer | 25% |
| Earlier review versions | 4% |
| Owner reply | 2% (varies widely by business) |

A full run of all 1,440 reviews of one San Francisco restaurant took about one minute.

### Limits

- Reviews are read from Yelp's public review list. Reviews Yelp files under "not currently recommended" live on a separate page and are not collected.
- With **Review language** set to `all`, reviews are grouped by language (largest first), and the sort order applies within each language.
- A Yelp link to a business that has closed or been merged may point to a listing with no reviews. You get a notice row for it rather than an error.
- Search pages (`/search?find_desc=...`) are not accepted. Use [Yelp Business Scraper](https://apify.com/cirkit/yelp-business-scraper) to find businesses first, then pass their URLs here.

### FAQ

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

Yelp reviews are public: anyone can read them without an account. Yelp Reviews Scraper reads only that public data and never logs in. Reviews do contain reviewers' display names, so if you store or publish them, make sure you have a lawful basis under the rules that apply to you (for example GDPR or CCPA). You are responsible for how you use the data. If unsure, ask a lawyer.

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

$0.20 per 1,000 reviews. 10,000 reviews cost $2.00. Each row in the dataset is one charge; nothing is charged for the run itself.

#### Can I get every review, not just the first page?

Yes. Set **Max reviews per business** to 0 and the scraper reads every page Yelp has, in parallel. Businesses with tens of thousands of reviews work.

#### How do I collect only new reviews on a schedule?

Set **Only reviews newer than** to a period such as `1 day` or `7 days` and schedule the actor in Apify Console. Each run stops at the cutoff, so you pay only for new reviews.

#### Can I use Yelp Reviews Scraper as an API?

Yes. Every run can be started and read through the [Apify API](https://docs.apify.com/api/v2). Run the actor synchronously and get the reviews back in the same HTTP call, or start it and fetch the dataset when it finishes.

#### Can I use this in Python?

Yes, with the `apify-client` package:

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("cirkit/yelp-reviews-scraper").call(run_input={"businessUrls": ["https://www.yelp.com/biz/katzs-delicatessen-new-york"], "maxReviewsPerBusiness": 200})
reviews = list(client.dataset(run["defaultDatasetId"]).iterate_items())
```

#### Can I integrate Yelp Reviews Scraper with other apps?

Yes. Send results to Google Sheets, Slack, Airtable, HubSpot, Zapier, Make or any webhook through Apify integrations. A common setup posts every new 1 or 2 star review to a Slack channel.

#### Why did I get fewer reviews than the business page shows?

Three usual reasons: a star, language or date filter excluded some; **Max reviews per business** stopped the run (the default is 100); or a review was posted or removed between Yelp counting and the run reading the list.

#### What is the notice row in my results?

When a business has no reviews matching your settings, or a URL is not a Yelp business, you get one row with `noResults: true` and a `notice` explaining why, instead of a silent empty result.

#### Does it need a Yelp account, cookies or an API key?

No. Nothing to set up beyond the business links.

#### Can I get a field that is not listed?

Open an issue on the actor's Issues tab and describe the field. If Yelp shows it publicly on the review, it can usually be added.

### You might also like

- [Yelp Business Scraper](https://apify.com/cirkit/yelp-business-scraper): find businesses by keyword and city, with phone, website, hours and ratings.
- [Tripadvisor Reviews Scraper](https://apify.com/cirkit/tripadvisor-reviews-scraper): reviews for hotels, restaurants and attractions.
- [Google Play Reviews Scraper](https://apify.com/cirkit/google-play-reviews-scraper): Android app reviews with developer replies.
- [App Store Reviews Scraper](https://apify.com/cirkit/app-store-reviews-scraper): iPhone and iPad app reviews.

### Changelog

- **0.1** (October 2026): first release. Every page of reviews, all languages, owner replies, photos, reactions, Elite status, star, language and date filters.

# Actor input Schema

## `businessUrls` (type: `array`):

Yelp business pages to collect reviews from, one per line. Paste the link from your browser (https://www.yelp.com/biz/katzs-delicatessen-new-york), the URL slug alone (katzs-delicatessen-new-york) or a Yelp business ID. Any Yelp country site works.

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

Upper limit of reviews collected for each business. Set 0 to collect every review the business has, across every page.

## `sortBy` (type: `string`):

Order Yelp returns the reviews in. Newest first is best for monitoring; Yelp Sort (relevance) matches what visitors see by default.

## `starRatings` (type: `array`):

Only collect reviews with these star ratings. Leave all five selected for every review, or pick 1 and 2 to pull complaints only.

## `language` (type: `string`):

Two letter language code (en, es, fr, de, ja ...) to collect reviews in one language only, or "all" for every language. Yelp itself shows only English by default; "all" also collects the reviews it hides behind the language switch.

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

Stop at reviews older than this. Give a date (2026-01-31) or a period (7 days, 4 weeks, 6 months, 1 year). Reviews are then read newest first, so scheduled runs only pay for new reviews.

## `maxItems` (type: `integer`):

Hard cap on rows across every business, and therefore on what the run can cost. Leave empty for no cap.

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

Apify Proxy is used by default and works with the standard datacenter pool. You normally do not need to change this.

## Actor input object example

```json
{
  "businessUrls": [
    "https://www.yelp.com/biz/katzs-delicatessen-new-york"
  ],
  "maxReviewsPerBusiness": 50,
  "sortBy": "newest",
  "starRatings": [
    "5",
    "4",
    "3",
    "2",
    "1"
  ],
  "language": "all",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every review collected, one row per review, with reviewer, reactions, photos and the owner's reply.

## `resultsAll` (type: `string`):

The same reviews with all fields, including photo and earlier review arrays.

## `resultsCsv` (type: `string`):

The overview columns as a downloadable CSV file.

## `replies` (type: `string`):

Reviews alongside the business's public replies, for response-rate tracking.

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

Per business counts, pages read and why each business stopped.

# 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 = {
    "businessUrls": [
        "https://www.yelp.com/biz/katzs-delicatessen-new-york"
    ],
    "maxReviewsPerBusiness": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/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 = {
    "businessUrls": ["https://www.yelp.com/biz/katzs-delicatessen-new-york"],
    "maxReviewsPerBusiness": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/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 '{
  "businessUrls": [
    "https://www.yelp.com/biz/katzs-delicatessen-new-york"
  ],
  "maxReviewsPerBusiness": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/yelp-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/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/DNXEKAStUWiFgbXs6/builds/ULjIwx93ukxKYUMtu/openapi.json
