# Yelp Business Review Scraper (`maximedupre/yelp-business-reviews`) Actor

Collect full-text reviews from public Yelp businesses. Use URLs, aliases, IDs, or one search query and location, then save ratings, dates, source links, vote counts, and photos. Leave the per-business limit blank to collect all available reviews until the source is exhausted.

- **URL**: https://apify.com/maximedupre/yelp-business-reviews.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Marketing, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 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?

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

### ⭐ Read Yelp Business Reviews as Structured Data

Researchers, marketers, and business teams can collect public Yelp business reviews in a structured dataset. Each saved row gives you the full review text, star rating, posting date, language, source links, vote counts, and photos, so you can study customer feedback without copying pages by hand.

**Use cases**

- Collect public reviews with **[Yelp Reviews](https://apify.com/maximedupre/yelp-business-reviews/examples/yelp-reviews)**.
- Collect reviews for a named business with **[Yelp Business Reviews](https://apify.com/maximedupre/yelp-business-reviews/examples/yelp-business-reviews)**.
- Find complaint-focused review text with **[Yelp Reviews Complaints](https://apify.com/maximedupre/yelp-business-reviews/examples/yelp-reviews-complaints)**.
- Check public review pages with **[How Do I See Yelp Reviews](https://apify.com/maximedupre/yelp-business-reviews/examples/how-do-i-see-yelp-reviews)**.
- Keep direct review links for follow-up with **[Yelp Review Link](https://apify.com/maximedupre/yelp-business-reviews/examples/yelp-review-link)**.

#### 📄 Yelp Review Rows You Can Analyze

**Returned data**

Each dataset row is one review found for a selected public Yelp business. The row includes full text, a 1 to 5 rating, the posting date, an ISO 639-1 language code, business and review IDs, direct Yelp links, useful, funny, and cool counts, and review photos. If requested, it can also include reviewer profile details. An owner reply is included when one is available.

This Actor collects Yelp review data only. It does not add general business profile fields such as hours, phone numbers, or categories.

#### ▶️ Find a Yelp Business and Collect Its Reviews

**How to run**

Choose one Target: Business URLs, Business aliases, Business IDs, or Search by query and location. Add values only to the fields for that Target. For search, enter one query and one location. Set any review options, start the run, and open the dataset link in the output.

**Source choice**

Use a public Yelp URL, alias, or ID for a known business. Use Search by query and location when you want the Actor to find businesses first. The Actor then collects reviews for the businesses it finds.

**Wait less**

Set a smaller Maximum reviews per business when you need a quick sample. Leave it blank to collect all available reviews until the source is exhausted.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Select one source mode: `businessUrls`, `businessAliases`, `businessIds`, or `queryLocation`. |
| `businessUrls` | array of objects | When Target is Business URLs, add one or more objects with a public Yelp business URL. |
| `businessAliases` | array of strings | When Target is Business aliases, add one or more Yelp business aliases. |
| `businessIds` | array of strings | When Target is Business IDs, add one or more Yelp business IDs. |
| `searchQuery` | string | When Target is Search by query and location, enter the business type or name to find. |
| `searchLocation` | string | When Target is Search by query and location, enter the city, region, or country to search. |
| `maxReviewsPerBusiness` | integer | Optional per-business cap. Leave it empty to collect all available reviews until the source is exhausted. |
| `reviewLanguage` | string | Optional two-letter ISO 639-1 language code, or leave it empty to include every language. |
| `reviewOrder` | string | Choose `newest`, `yelpOrder`, or `rating` for the order of returned reviews. |
| `eliteOnly` | boolean | When on, include only reviews from Yelp Elite members. |
| `includeReviewerProfile` | boolean | When on, add reviewer name, location, profile link, activity counts, and Elite status when available. |

**Successful input example**

This example is copied from a successful run on the current beta build.

```json
{
  "target": "businessUrls",
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/joes-pizza-new-york-148"
    }
  ],
  "maxReviewsPerBusiness": 10
}
```

#### 🧾 Output

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | Link to the review records saved by the run. |

**Review record fields**

| Field | Type | What it does |
| --- | --- | --- |
| `businessName` | string | Name of the Yelp business. |
| `businessId` | string | Stable Yelp ID for the business. |
| `businessUrl` | string | Direct link to the Yelp business page. |
| `reviewId` | string | Stable Yelp ID for the review. |
| `reviewUrl` | string | Direct link to the Yelp review. |
| `reviewText` | string | Full text of the review. |
| `reviewRating` | number | Star rating given in the review, from 1 to 5. |
| `reviewDate` | string | Date and time when the review was posted. |
| `reviewLanguage` | string | ISO 639-1 language code for the review. |
| `usefulCount` | integer | Number of useful votes for the review. |
| `funnyCount` | integer | Number of funny votes for the review. |
| `coolCount` | integer | Number of cool votes for the review. |
| `photos` | array of objects | Photos attached to the review. This array can be empty. |
| `photos.url` | string | Direct link to an attached review photo. |
| `photos.caption` | string | Caption for an attached review photo when available. |
| `reviewerProfile` | object | Reviewer details when reviewer profiles are requested. |
| `reviewerProfile.name` | string | Name shown on the Yelp reviewer profile. |
| `reviewerProfile.location` | string | Location shown on the Yelp reviewer profile. |
| `reviewerProfile.profileUrl` | string | Direct link to the Yelp reviewer profile. |
| `reviewerProfile.reviewCount` | integer | Number of reviews shown on the reviewer profile. |
| `reviewerProfile.friendCount` | integer | Number of friends shown on the reviewer profile. |
| `reviewerProfile.photoCount` | integer | Number of photos shown on the reviewer profile. |
| `reviewerProfile.isElite` | boolean | Whether the reviewer is a Yelp Elite member. |
| `ownerReply` | object | Business owner reply when one is available. |
| `ownerReply.ownerName` | string | Name shown for the business owner reply. |
| `ownerReply.text` | string | Full text of the business owner reply. |
| `ownerReply.date` | string | Date and time when the owner reply was posted. |

**Successful review row**

This unshortened row is copied from a successful current-beta run. It shows optional photos and reviewer profile data.

```json
{
  "businessName": "Joe's Pizza",
  "businessId": "KEEXuHCYhsQJ-zpJhu98bA",
  "businessUrl": "https://www.yelp.com/biz/joes-pizza-new-york-148",
  "reviewId": "THgmarArbiRyVvZxuZSR-Q",
  "reviewUrl": "https://www.yelp.com/biz/joes-pizza-new-york-148?hrid=THgmarArbiRyVvZxuZSR-Q",
  "reviewText": "We shared individual slices of the Supreme, White with spinach & garlic, and Caprese.\n\nWhile Joe's Pizza is a famous chain always packed with tourists, it's honestly a solid NYC slice that everyone should try at least once. The crust has that perfect crispy yet chewy texture, the toppings are great, and because it's constantly busy, you know you're getting fresh pizza right out of the oven.\n\nService was fast with no issues. Just keep in mind that it's a small, high-traffic spot, so expect the floors and dining counters to be a bit messy.",
  "reviewRating": 5,
  "reviewDate": "2026-08-20T08:41:18Z",
  "reviewLanguage": "en",
  "usefulCount": 0,
  "funnyCount": 0,
  "coolCount": 0,
  "photos": [
    {
      "url": "https://s3-media0.fl.yelpcdn.com/bphoto/2jrYOKcN5ww1-YXDEPDIqw/o.jpg"
    },
    {
      "url": "https://s3-media0.fl.yelpcdn.com/bphoto/VK2mNFtmJpZgqCaTdluE4Q/o.jpg"
    },
    {
      "url": "https://s3-media0.fl.yelpcdn.com/bphoto/M9vO1cy_zvZD0ACb7QeEpw/o.jpg"
    }
  ],
  "reviewerProfile": {
    "name": "Cody E.",
    "location": "Brooklyn, NY",
    "profileUrl": "https://www.yelp.com/user_details?userid=xSwFF3fl8Tn1u21Sv4xwsQ",
    "reviewCount": 4,
    "friendCount": 10,
    "photoCount": 2,
    "isElite": false
  }
}
```

#### 💳 Pricing

**Event charged**

One event covers each full-text review returned with its rating and posting date. The price shown for this event is $0.0009. There is no separate one-time event in the pricing panel.

#### 🔌 Integrations

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

**Dataset access**

Use the output dataset link to read the rows in Apify. You can export the dataset as JSON or CSV, or read it through the Apify API.

#### ❓ FAQ

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

No. The Actor works with public Yelp business pages and does not require a Yelp API key or Yelp account setup.

##### Can I use a URL, alias, ID, or search?

Yes. Choose one Target and fill in its fields. Use a business URL, alias, or ID for a known business. Use Search by query and location to find businesses first, then collect their reviews.

##### Can I collect all available reviews?

Yes. Leave Maximum reviews per business empty to collect all available reviews until the source is exhausted. A numeric value limits the number collected for each business.

##### Can I filter or sort the reviews?

Yes. Set a two-letter ISO 639-1 language code, choose Newest first, Yelp order, or Highest rating first, and turn on Elite reviews only when needed.

##### What reviewer and owner details can I get?

Turn on Include reviewer profiles to request reviewer names, locations, profile links, activity counts, and Elite status. An owner reply appears when Yelp provides one.

##### Does this collect Google Maps reviews?

No. This Actor is limited to Yelp review collection.

##### Can I export the data?

Yes. Open the dataset from the run output and export the structured rows as JSON or CSV, or read them through the Apify API.

#### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~yelp-business-reviews/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[Facebook Reviews Scraper](https://apify.com/maximedupre/facebook-reviews-scraper)**: Compare public Facebook recommendations with Yelp review data.
- **[DoorDash Reviews Scraper](https://apify.com/maximedupre/doordash-reviews-scraper)**: Check public DoorDash review previews for restaurant feedback.
- **[Google Maps List Scraper: 30+ Fields Per Place](https://apify.com/maximedupre/google-maps-shared-list-scraper)**: Compare place ratings and review counts from public Google Maps shared lists.
- **[Yelp Business Review Scraper](https://apify.com/beatanalytics/yelp-business-review-scraper)**: Compare another Yelp-focused source for full-text review collection.
- **[Yelp Business & Review Scraper](https://apify.com/technicaldost/yelp-business-review-scraper)**: Build a broader Yelp business and review dataset.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose how to add the Yelp businesses whose reviews you want.

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

Choose Business URLs as Target, then add one or more public Yelp business URLs.

## `businessAliases` (type: `array`):

Choose Business aliases as Target, then add one or more Yelp business aliases.

## `businessIds` (type: `array`):

Choose Business IDs as Target, then add one or more Yelp business IDs.

## `searchQuery` (type: `string`):

Choose Search by query and location as Target, then enter the business type or name to find.

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

Enter the city, region, or country to search.

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

Optional limit for each business. Leave this blank to collect all available reviews until the source is exhausted.

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

Optional ISO 639-1 language code, such as en. Leave this blank to include reviews in every language.

## `reviewOrder` (type: `string`):

Choose the order for reviews in the results.

## `eliteOnly` (type: `boolean`):

Turn this on to include only reviews from Yelp Elite members.

## `includeReviewerProfile` (type: `boolean`):

Turn this on to include reviewer names, locations, profile links, activity counts, and Elite status.

## Actor input object example

```json
{
  "target": "businessUrls",
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/joes-pizza-new-york-148"
    }
  ],
  "searchQuery": "coffee shops",
  "searchLocation": "Austin, Texas",
  "maxReviewsPerBusiness": 100,
  "reviewLanguage": "en"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Link to the review records from this run.

# 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 = {
    "target": "businessUrls",
    "businessUrls": [
        {
            "url": "https://www.yelp.com/biz/joes-pizza-new-york-148"
        }
    ],
    "maxReviewsPerBusiness": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/yelp-business-reviews").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 = {
    "target": "businessUrls",
    "businessUrls": [{ "url": "https://www.yelp.com/biz/joes-pizza-new-york-148" }],
    "maxReviewsPerBusiness": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/yelp-business-reviews").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 '{
  "target": "businessUrls",
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/joes-pizza-new-york-148"
    }
  ],
  "maxReviewsPerBusiness": 10
}' |
apify call maximedupre/yelp-business-reviews --silent --output-dataset

```

## MCP server setup

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

```

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/ptON2pdlkp59OjFNg/builds/8L4PX8C08VKjhIasM/openapi.json
