# Yelp Review Scraper (`tri_angle/yelp-review-scraper`) Actor

Scrape every review from Yelp business pages, with the rating, date, text, and the owner reply. Filter by language or a date range to see what customers said in a given period, one row each.

- **URL**: https://apify.com/tri_angle/yelp-review-scraper.md
- **Developed by:** [Tri⟁angle](https://apify.com/tri_angle) (Apify)
- **Categories:** Travel
- **Features:** Limited permissions
- **Stats:** 1,553 total users, 199 monthly users, 99.7% runs succeeded, 31 bookmarks
- **User rating**: 2.23 out of 5 stars

## Pricing

from $1.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Yelp Reviews Scraper

Extract every review from any Yelp business page — review text, star rating, date, reviewer details,
attached photos and the owner's public reply — and download it as JSON, CSV or Excel.

Paste one or more Yelp business URLs, run it, and get one clean row per review.

### What you can do with it

- **Monitor your own reputation** — pull every review for your locations and track ratings over time.
- **Watch competitors** — see what customers praise or complain about at nearby businesses.
- **Research a market** — collect reviews across many businesses and analyse sentiment or themes at scale.
- **Feed dashboards and AI tools** — export straight to your BI tool, spreadsheet or an LLM for summarising.

### Features

- **Every review, not just the first page** — pagination is handled for you.
- **All languages, or just one** — leave the language empty to collect reviews in every language a business has, or pick a single one.
- **Filter by date** — collect only reviews from a period you care about.
- **Owner replies included** — the business's public response to each review, when there is one.
- **Photos included** — direct image links for photos attached to reviews.
- **Any Yelp domain works** — `yelp.com`, `yelp.co.uk`, `yelp.ca`, `yelp.com.au`, `yelp.cz` and the rest.
- **No setup** — no proxy configuration, no login, no browser.

### How to use it

1. Open the business page you want on Yelp and copy its URL.
2. Paste it into **Start URLs**. Add as many businesses as you like.
3. Optionally set a review cap, a language, or a date range.
4. Click **Start** and wait for the run to finish.
5. Download your results from the **Storage** tab as JSON, CSV, Excel or XML — or grab them through the API.

### Input

| Field | Required | Description |
| --- | --- | --- |
| **Start URLs** | Yes | Yelp business page URLs, e.g. `https://www.yelp.com/biz/bar-54-new-york-2`. |
| **Max reviews per business** | No | Stop after this many reviews for each business. Leave empty for all of them. |
| **Language** | No | Pick one language, or leave it on **All** to collect every language the business has reviews in. |
| **Start Date** | No | Only reviews posted on or after this date. |
| **End Date** | No | Only reviews posted on or before this date. |

You can set all of this in the visual input form — the JSON below is just what it looks like underneath.

```json
{
    "startUrls": [{ "url": "https://www.yelp.com/biz/bar-54-new-york-2" }],
    "maxReviewsPerUrl": 30,
    "language": "en",
    "dateFrom": "2024-01-01"
}
```

### Output

One row per review. Example:

```json
{
    "id": "8xL2mJqR3vTnQ1wZ",
    "businessId": "kO5Yj9pQfLmXnR2tV8sHwA",
    "businessName": "Bar 54",
    "businessUrl": "https://www.yelp.com/biz/bar-54-new-york-2",
    "businessAddress": "135 W 45th St, New York, NY 10036, United States",
    "overallRating": 3.5,
    "reviewCount": 1284,
    "date": "2024-08-14T18:32:07Z",
    "rating": 5,
    "text": "Great rooftop views and the cocktails were excellent.",
    "language": "en",
    "reactionHelpfulCount": 4,
    "reactionThanksCount": 1,
    "reactionLove_thisCount": 0,
    "reactionOh_noCount": 0,
    "reviewerName": "Jamie L.",
    "reviewerUrl": "https://www.yelp.com/user_details?userid=nQ7vB2xK",
    "reviewerReviewCount": 87,
    "reviewerLocation": "Brooklyn, NY",
    "photoUrls": ["https://s3-media0.fl.yelpcdn.com/bphoto/abc123/o.jpg"],
    "ownerResponse": "Thanks for visiting, Jamie!",
    "ownerResponseDate": "2024-08-16T09:11:44Z"
}
```

Notes on a few fields:

- `rating` is the reviewer's stars for this review; `overallRating` and `reviewCount` describe the business as a whole.
- `businessUrl` always repeats the URL you entered, so results are easy to match back to your input list.
- `ownerResponse` and `ownerResponseDate` are empty when the business never replied.
- `reactionHelpfulCount`, `reactionThanksCount`, `reactionLove_thisCount` and `reactionOh_noCount` are the
  Helpful / Thanks / Love this / Oh no reactions other Yelp users left on the review.

In the Storage tab, switch from **Overview** to **All fields** to see every column.

### Tips

- Start with a small **Max reviews per business** to check the output looks right, then re-run without it.
- Two URLs that point at the same business share one review budget, so duplicates in your input list won't double-count.
- Popular businesses can have thousands of reviews. A date range or a review cap keeps runs short and cheap.
- Reviews come newest first, so a **Start Date** filter finishes quickly — it stops as soon as it passes your cut-off.

### FAQ

**Do I need a proxy or a Yelp account?**
No. Everything is handled for you.

**Can I scrape search results or a whole city?**
Not with this Actor — it takes business page URLs. To collect business listings first, use a Yelp
business/search scraper, then feed those URLs in here.

**Why did I get fewer reviews than the business shows?**
Check your date range and language filter. Yelp also keeps some reviews behind a "not recommended"
section that isn't part of the main review feed.

**Is scraping Yelp legal?**
Collecting publicly available information is generally accepted, but reviews contain personal data
such as reviewer names. You are responsible for using the data lawfully, including under GDPR and
similar rules. If you're unsure, take legal advice.

**Something looks broken.**
Yelp changes its site from time to time. Open an issue on the Actor's **Issues** tab and it'll be looked at.

# Actor input Schema

## `startUrls` (type: `array`):

Provide Yelp business URLs, e.g., https://www.yelp.com/biz/bar-54-new-york-2.

## `maxReviewsPerUrl` (type: `integer`):

Set the maximum number of reviews to extract for each business.

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

Select the language of the reviews.

## `dateFrom` (type: `string`):

Select the starting date in format YYYY-MM-DD. Only reviews created on or after this date will be included.

## `dateTo` (type: `string`):

Select the end date in format YYYY-MM-DD. Only reviews created on or before this date will be included.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.yelp.com/biz/la-degustation-boh%C3%AAme-bourgeoise-praha"
    }
  ],
  "maxReviewsPerUrl": 30,
  "language": ""
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.yelp.com/biz/la-degustation-boh%C3%AAme-bourgeoise-praha"
        }
    ],
    "maxReviewsPerUrl": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("tri_angle/yelp-review-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 = {
    "startUrls": [{ "url": "https://www.yelp.com/biz/la-degustation-boh%C3%AAme-bourgeoise-praha" }],
    "maxReviewsPerUrl": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("tri_angle/yelp-review-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 '{
  "startUrls": [
    {
      "url": "https://www.yelp.com/biz/la-degustation-boh%C3%AAme-bourgeoise-praha"
    }
  ],
  "maxReviewsPerUrl": 30
}' |
apify call tri_angle/yelp-review-scraper --silent --output-dataset

```

## MCP server setup

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