# Yelp Reviews Scraper (`piotrv1001/yelp-reviews-scraper`) Actor

The Yelp Reviews Scraper extracts customer reviews from any Yelp business page, capturing full review text, star ratings, dates, review photos, and reviewer profiles with location and Elite status — plus optional business details — ideal for reputation monitoring and competitor research.

- **URL**: https://apify.com/piotrv1001/yelp-reviews-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Automation, Developer tools, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🚀 Yelp Reviews Scraper

Extract **customer reviews from any Yelp business page** — with the **full review text**, star rating, date, reviewer profile and review photos. Paste one or more Yelp business URLs, choose how many reviews you want, and get clean structured data you can download as JSON, CSV or Excel, or pull straight from the [Apify API](https://docs.apify.com/api/v2).

Reviews are collected newest first by default, and pagination goes all the way back through a business's history — so you can pull the latest 20 for monitoring or the entire back catalogue for analysis. You can also sort by rating or Elite reviewers, and filter to a single review language.

### ✨ Features

- 💬 **Complete review text** — the whole review, with paragraph breaks preserved, not a truncated snippet.
- ⭐ **Ratings and dates** — star rating and review date on every record, ready for trend analysis.
- 👤 **Reviewer profiles** — reviewer name, profile link, home city, Elite status and badge year, plus their total review and photo counts.
- 📸 **Review photos** — direct image URLs for the photos attached to each review.
- 🏢 **Optional business details** — name, overall rating, total review count, categories, address, phone and opening hours, in one record per business.
- 🔀 **Sorting** — newest first, oldest first, highest or lowest rated first, or Elite reviewers first.
- 🌍 **Language filter** — collect only the reviews written in a given language, and get a language code on every record.
- 🔁 **Deep pagination** — pull the newest handful of reviews or thousands going back years, controlled by a single limit.
- 🧱 **Reliable at scale** — built-in retries and rotation, so runs finish instead of returning half-empty datasets.

### 💡 Why use Yelp Reviews Scraper?

- **Reputation monitoring** — schedule a run every morning and get alerted to new 1- and 2-star reviews on your own locations.
- **Competitor research** — see exactly what customers praise and complain about at every rival within a market.
- **Location benchmarking** — compare ratings and review sentiment across dozens or hundreds of your own branches.
- **Market and product research** — mine thousands of real customer opinions about a category before you enter it.
- **AI and sentiment analysis** — feed full review text into an LLM or sentiment model instead of scraping it yourself.

### 🛠️ How to use Yelp Reviews Scraper

1. **Add Yelp business URLs** — paste one or more links like `https://www.yelp.com/biz/gary-danko-san-francisco`. You can add as many as you want.
2. **Set the review limit** — choose how many reviews to collect per business (50 by default).
3. **Pick a sort order** — newest first by default; switch to lowest rated first to triage complaints, or oldest first to walk the full history.
4. **Optionally filter by language** — enter a code like `es` or `zh` to collect only reviews written in that language.
5. **Optionally include business details** — turn this on if you also want each business's rating, address, phone and hours.
6. **Run the Actor** — start it from the Console, on a schedule, or via the API.
7. **Download your data** — export the dataset as JSON, CSV, Excel or XML, or send it straight to Google Sheets, Slack, Zapier, Make or your own webhook.

### 📥 Input

| Field                    | Type    | Description                                                                                        |
| ------------------------ | ------- | -------------------------------------------------------------------------------------------------- |
| `businessUrls`           | array   | **Required.** Yelp business page URLs to scrape reviews from.                                      |
| `maxReviewsPerBusiness`  | integer | Maximum reviews to collect per business. Default `50`.                                             |
| `sortBy`                 | string  | `date_desc` (default), `date_asc`, `rating_desc`, `rating_asc`, `elites_desc` or `relevance_desc`. |
| `language`               | string  | Two-letter code, e.g. `en`, `es`, `zh`. Empty collects all languages.                              |
| `includeBusinessDetails` | boolean | Also emit one record per business with its profile data. Default `false`.                          |

Example input:

```json
{
    "businessUrls": [{ "url": "https://www.yelp.com/biz/gary-danko-san-francisco" }],
    "maxReviewsPerBusiness": 50,
    "sortBy": "date_desc",
    "language": "",
    "includeBusinessDetails": false
}
```

### 📊 Sample output data

Each review is one dataset item. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
[
    {
        "type": "review",
        "businessUrl": "https://www.yelp.com/biz/gary-danko-san-francisco",
        "businessName": "Gary Danko",
        "reviewId": "0VwlqozA-cz0Dzj9phfTgQ-Aug 8, 2026",
        "userId": "0VwlqozA-cz0Dzj9phfTgQ",
        "author": "Minny Defends D.",
        "authorUrl": "https://www.yelp.com/user_details?userid=0VwlqozA-cz0Dzj9phfTgQ",
        "authorLocation": "San Francisco, CA",
        "isElite": false,
        "eliteBadge": null,
        "authorReviewCount": null,
        "authorPhotoCount": 7,
        "rating": 5,
        "date": "Aug 8, 2026",
        "language": "en",
        "text": "Absolutely loved our experience here. It is one of those upscale restaurants that you wouldn't mind going back again.\n\nThe restaurant and vibe is fabulous. You definitely feel special once you walk in, and we felt pampered with the service. The food was excellent.",
        "photos": ["https://s3-media0.fl.yelpcdn.com/bphoto/zJQi-VIQLMVcmC4itungcw/348s.jpg"]
    }
]
```

With **Include business details** enabled, each business also produces one record like this:

```json
[
    {
        "type": "business",
        "url": "https://www.yelp.com/biz/gary-danko-san-francisco",
        "name": "Gary Danko",
        "rating": 4.5,
        "reviewCount": 6137,
        "priceRange": "$$$$",
        "phone": "(415) 749-2060",
        "address": "800 N Point St, San Francisco, CA, 94109",
        "city": "San Francisco",
        "state": "CA",
        "postalCode": "94109",
        "country": "US",
        "categories": ["Restaurants", "New American"],
        "openingHours": ["Monday 17:00-22:00", "Thursday 17:00-22:00"],
        "image": "https://s3-media0.fl.yelpcdn.com/bphoto/5dbjkeTld05HumeToIAhRQ/l.jpg"
    }
]
```

### 📋 Data fields

#### Review records

| Field               | Type    | Description                                  |
| ------------------- | ------- | -------------------------------------------- |
| `businessName`      | string  | Name of the reviewed business                |
| `businessUrl`       | string  | Yelp URL of the business                     |
| `reviewId`          | string  | Stable identifier for the review             |
| `author`            | string  | Reviewer's display name                      |
| `authorUrl`         | string  | Link to the reviewer's Yelp profile          |
| `userId`            | string  | Yelp user ID of the reviewer                 |
| `authorLocation`    | string  | Reviewer's home city and state               |
| `isElite`           | boolean | Whether the reviewer holds Yelp Elite status |
| `eliteBadge`        | string  | Elite badge label, e.g. `Elite 26`           |
| `authorReviewCount` | number  | How many reviews the reviewer has written    |
| `authorPhotoCount`  | number  | How many photos the reviewer has posted      |
| `rating`            | number  | Star rating, 1–5                             |
| `date`              | string  | Date the review was posted                   |
| `text`              | string  | Full review text                             |
| `language`          | string  | Language code of the review, e.g. `en`, `zh` |
| `photos`            | array   | Image URLs of photos attached to the review  |

#### Business records (optional)

| Field                                              | Type   | Description                      |
| -------------------------------------------------- | ------ | -------------------------------- |
| `name`                                             | string | Business name                    |
| `rating`                                           | number | Overall star rating              |
| `reviewCount`                                      | number | Total number of reviews on Yelp  |
| `categories`                                       | array  | Yelp categories for the business |
| `priceRange`                                       | string | Price level, e.g. `$$$$`         |
| `phone`                                            | string | Phone number                     |
| `address`                                          | string | Full street address              |
| `street`, `city`, `state`, `postalCode`, `country` | string | Address components               |
| `openingHours`                                     | array  | Opening hours per day            |
| `image`                                            | string | Main business photo              |

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

This Actor uses **pay per event** pricing, so you only pay for the data you actually receive:

| Event                    | Price      |
| ------------------------ | ---------- |
| Review scraped           | **$0.003** |
| Business profile scraped | **$0.005** |

That works out to about **$0.30 per 100 reviews** and **$3 per 1,000 reviews**. A daily reputation check on 10 locations pulling the 20 newest reviews each costs roughly **$0.60 per day**.

New Apify accounts include **$5 in free usage** every month on the free plan, which is enough for around 1,600 reviews before you pay anything.

### ⚙️ Tips and advanced options

- **Keep the limit tight for monitoring.** For daily checks, `maxReviewsPerBusiness` of 20–30 with the default newest-first sort is plenty — you pay nothing for history you already have.
- **Sort to find what you're looking for.** `rating_asc` puts the complaints first, so a 20-review run surfaces every recent 1-star review instead of a random mix. `date_asc` walks a business's history from its very first review.
- **Filtering by language shrinks the bill.** With `language` set, only reviews in that language are collected and charged — a business with 5,000 English and 16 Chinese reviews costs 16 reviews, not 5,000.
- **Batch your businesses.** Put every location into one run rather than starting a run per URL; pages are fetched in parallel, so a batch finishes far faster than a queue of separate runs.
- **Leave business details off unless you need them.** The review records already carry the business name and URL, so the extra profile record is only worth it when you want address, phone or hours.
- **Schedule it.** Use [Apify Schedules](https://docs.apify.com/platform/schedule) to run the Actor every morning and route new reviews to Slack, a Google Sheet or your own webhook via [integrations](https://docs.apify.com/platform/integrations).
- **Raise the run timeout for very large pulls.** Businesses with thousands of reviews take a while; the default 1-hour timeout covers most runs, but a full multi-thousand-review pull may need more.

### ❓ FAQ

**Is scraping Yelp reviews legal?**
This Actor collects only publicly available information — reviews that anyone can read on Yelp without logging in. Web scraping of public data is generally legal, but how you *use* the data matters. Do not use it in ways that breach applicable privacy laws such as GDPR or CCPA, and consult a lawyer if you plan to process personal data. See [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) for a longer discussion.

**How many reviews can I get from one business?**
Yelp exposes a business's full review history, so you can page back through thousands of reviews, all the way to the earliest ones. Set `maxReviewsPerBusiness` to whatever you need.

**In what order do reviews come back?**
Newest first by default, which is what you want for monitoring: a run with a limit of 50 gives you the 50 most recent reviews. Use `sortBy` to switch to oldest first, highest or lowest rated first, or Elite reviewers first — the order is kept all the way through pagination. Pages are fetched in parallel for speed, so rows in the dataset are close to that order but not exactly in it; sort by the `date` field if you need it exact.

**Can I filter reviews by language?**
Yes — set `language` to a two-letter code such as `es`, `zh` or `fr` and only reviews written in that language are collected. Every record also carries a `language` field.

**Can I filter reviews by rating or keyword?**
There is no rating or keyword filter, but sorting gets you most of the way: `rating_asc` returns the lowest-rated reviews first, so a small run captures the negative ones. For keywords, collect the reviews and filter the dataset afterwards — every record carries the full text.

**Why is `authorReviewCount` sometimes empty?**
Yelp does not show reviewer statistics on every review card. Core fields — rating, date, review text, reviewer name and location — are present on every record.

**Can I get reviews for many businesses at once?**
Yes. Add as many business URLs as you like to `businessUrls`; they are all processed in the same run and written to the same dataset.

**Something is not working or I need a different field.**
Report it on the **Issues** tab of this Actor and it will be looked at. If you need a tailored version or a different Yelp dataset, [custom solutions](https://apify.com/custom-solutions) are available.

Start pulling real customer feedback from Yelp today! 🚀

# Actor input Schema

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

Yelp business pages to scrape reviews from, e.g. https://www.yelp.com/biz/gary-danko-san-francisco

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

Maximum number of reviews to scrape for each business.

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

Order in which reviews are collected. Newest first is best for monitoring; oldest first walks the full history from the beginning.

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

Only collect reviews written in this language, as a two-letter code such as en, es, zh, fr or de. Leave empty to collect reviews in all languages.

## `includeBusinessDetails` (type: `boolean`):

Also add one record per business with its name, overall rating, total review count, categories, address, phone and opening hours.

## Actor input object example

```json
{
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/gary-danko-san-francisco"
    }
  ],
  "maxReviewsPerBusiness": 50,
  "sortBy": "date_desc",
  "language": "",
  "includeBusinessDetails": false
}
```

# Actor output Schema

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

No description

# 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": [
        {
            "url": "https://www.yelp.com/biz/gary-danko-san-francisco"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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": [{ "url": "https://www.yelp.com/biz/gary-danko-san-francisco" }] }

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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": [
    {
      "url": "https://www.yelp.com/biz/gary-danko-san-francisco"
    }
  ]
}' |
apify call piotrv1001/yelp-reviews-scraper --silent --output-dataset

```

## MCP server setup

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