extracto.cloud

Yelp Reviews Scraper

Collect public Yelp business reviews with ratings, review text and business references.

Current pricing: $0.000489 / 1 review ยท minimum 10 credits/run. Review the estimate before running.

yelp-reviews

Endpoint

Method
POST
URL
https://extracto.cloud/api/v1/parsers/yelp-reviews
Result delivery
Add webhook_url and optional webhook_secret to receive the saved result. Webhook setup and signatures โ†’
Auth
X-API-KEY: ext_...

Response

{
  "success": true,
  "tool": "yelp-reviews",
  "parser": "yelp-reviews",
  "count": 0,
  "data": []
}

Documentation

# Yelp Reviews Scraper (`web_wanderer/yelp-reviews-scraper`) parser

Easily extract Yelp business reviews at scale. This Yelp Reviews Scraper collects ratings, review text, reviewer details, timestamps, photos, and business info. Export data in JSON, CSV, Excel, or via API.

- **URL**: https://Extracto.com/web\_wanderer/yelp-reviews-scraper.md
- **Developed by:** [Billy](https://Extracto.com/web_wanderer) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 857 total users, 239 monthly users, 100.0% runs succeeded, 17 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$0.30 / 1,000 reviews

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

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

## What's an Extracto parser?

An parser is a serverless cloud program that runs on the Extracto platform. It has two run modes.
In Batch mode, an parser 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 parser provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an parser?

If asked about integration, you help developers integrate parsers 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://Extracto.com/agents.md: the Extracto MCP server, Agent Skills with the Extracto 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 parser'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.Extracto.com/api/client/js/docs.md) (`npm install Extracto-client`) and [Python](https://docs.Extracto.com/api/client/python/docs.md) (`pip install Extracto-client`).

# README

## Yelp Reviews Scraper

Extract structured reviews from any Yelp business, in any country, at scale. Feed it business URLs, business IDs, or whole search result pages, and the parser returns clean JSON ready for analysis.

### Why use it

- One parser, three input types: paste business URLs, paste business IDs, or hand it a Yelp search URL and let it expand.
- Works on every regional Yelp domain, from `yelp.com` to `yelp.com.tr` to `ja.yelp.co.jp`.
- Filter reviews by rating, language, or keyword, and translate them on the fly.
- Privacy switch nullifies all reviewer fields by default so you stay on the safe side of GDPR and CCPA.

### What you get

Every row in the dataset is one review with the originating business already attached. No joins required.

Always present:

- Review identifiers, position, full text, rating, language, translated text, and review date.
- Reactions (Helpful, Thanks, Love this, Oh no), check-in count, prior-reviews-by-this-author count, payment and reservation flags, public owner reply, photos and videos.
- Business identifiers, alias, name, primary photo, root category list, overall rating, total reviews, rating distribution, and language counts.

Optional (`include_personal_data`):

- Reviewer display name, profile photo, friend count, review count, location, elite status. Disabled fields are returned as `null`, never removed, so the schema stays the same.

### Example input

```json
{
  "biz_urls": [
    "https://www.yelp.com/biz/mcgrath-elmhurst-toyota-elmhurst-2"
  ],
  "biz_ids": [],
  "search_urls": [],
  "search_location": "New York",
  "domain": "www.yelp.com",
  "reviews_limit": 40,
  "reviews_sort": "newest",
  "reviews_language": "en",
  "include_personal_data": false
}
```

### Example output

```json
{
  "review_position": 1,
  "encid": "_GCdHSPxqgjGlJFHwea6sw",
  "alias": "mcgrath-elmhurst-toyota-elmhurst-2",
  "businessUrl": "https://www.yelp.com/biz/mcgrath-elmhurst-toyota-elmhurst-2",
  "name": "McGrath Elmhurst Toyota",
  "primaryPhoto": "https://s3-media0.fl.yelpcdn.com/bphoto/ZrLpn8ghBiTAJNXNyGunvg/60s.jpg",
  "businessRating": 3,
  "reviewEncid": "yCNiHGzfWNtAPhBBl_ig0A",
  "reviewUrl": "https://www.yelp.com/biz/mcgrath-elmhurst-toyota-elmhurst-2?hrid=yCNiHGzfWNtAPhBBl_ig0A",
  "text": "Good experience overall. Would come here again for sure.... Asha is a good sales person.",
  "language": "en",
  "translatedText": null,
  "rating": 4,
  "reviewDate": "2026-02-20T10:47:10-06:00",
  "userSpecifiedTimeOfExperience": null,
  "checkInCount": 0,
  "isFirstReviewer": false,
  "reviewOfTheDay": null,
  "expertRecognition": null,
  "hasPaidThroughYelp": false,
  "hasPurchasedDeal": false,
  "hasPlacedReservation": false,
  "reservationProvider": null,
  "publicReply": null,
  "author": {
    "name": null,
    "review_count": null,
    "friend_count": null,
    "photo_count": null,
    "profile_photo": null,
    "currentTruncatedEliteYear": null,
    "elite_years": [],
    "isEliteAllStar": null
  },
  "photos": [],
  "videos": [],
  "feedback": [
    { "type": "HELPFUL", "count": 1, "displayText": "Helpful" },
    { "type": "THANKS", "count": 0, "displayText": "Thanks" },
    { "type": "LOVE_THIS", "count": 0, "displayText": "Love this" },
    { "type": "OH_NO", "count": 0, "displayText": "Oh no" }
  ],
  "totalReviews": 304,
  "ratingDetail": { "5_star": 127, "4_star": 26, "3_star": 5, "2_star": 17, "1_star": 129 },
  "reviewsCountByLanguage": [{ "language": "en", "count": 304 }],
  "scrapedAt": "2026-04-21T09:12:33Z"
}
```

When `include_personal_data` is enabled, the same row's `author` object fills in:

```json
"author": {
  "name": "Rajarshi R.",
  "review_count": 6,
  "friend_count": 1,
  "photo_count": 0,
  "profile_photo": "https://s3-media0.fl.yelpcdn.com/photo/M8pxN3JLuXo9qA7yVWAU1A/180s.jpg",
  "currentTruncatedEliteYear": null,
  "elite_years": [],
  "isEliteAllStar": false
}
```

### Use cases

- Brand and reputation monitoring for chains and franchises.
- Competitor benchmarking with rating distribution and review velocity.
- Sentiment analysis and topic modelling on long-form text.
- Local SEO audits, NAP consistency checks, and listing quality tracking.
- Lead lists for agencies, with filterable price tier, features, and location.
- Academic research on consumer feedback at city or category scale.

### Privacy and personal information

Reviewer details (display name, photo, location, friend count, Yelp user ID, elite status) are personal data under GDPR (EU) and CCPA (California). The parser sets all of those fields to `null` by default. Set `include_personal_data` to `true` only when you have a documented lawful basis or explicit user consent. The output structure is identical either way, so downstream pipelines do not need to branch.

### Your responsibility

You are the data controller for any data this parser returns. Make sure your use case complies with Yelp's Terms of Service, the data protection law in your jurisdiction, and the rights of the people whose reviews you collect. Do not republish personal information without consent. Do not use the data for spam, harassment, automated decision-making against individuals, or any unlawful purpose.

### Tips

- Keep `reviews_limit` aligned with what you actually need. The default sort is "recommended", which surfaces Yelp's own ranking first.
- Use `reviews_keywords` (up to 5) to fan out the same business across multiple text filters in a single run.
- For broad discovery, drop a Yelp search results URL into `search_urls` and set `search_limit` to the number of result pages to expand.
- Translate non-English reviews on the fly with `reviews_translate` (e.g. `en`, `fr`, `de`).

### Support

Found a bug, missing a field, or want a new filter? Open an issue on the parser's issues page or reach out via Extracto support.

# parser input Schema

## `biz_urls` (type: `array`):

Direct Yelp business page URLs to extract data from.

## `biz_ids` (type: `array`):

Yelp business `EncBizId` to scrape (e.g., 'cOcFMN\_0nCqHHJ4KZhe5vA').

## `include_personal_data` (type: `boolean`):

If checked the parser will return author personal information such as author name, reviews, profile photo, friend count etc.

## `reviews_limit` (type: `integer`):

Number of reviews to crawl per business. Leave blank to retrieve all available reviews.

## `reviews_sort` (type: `string`):

Select how to sort reviews.

## `date_from` (type: `string`):

Select date in format YYYY-MM-DD or {number} {unit} (e.g. 30 days, 2 months, 1 year)

## `reviews_rating` (type: `array`):

Select review ratings to filter by.

## `reviews_language` (type: `string`):

Filter reviews by language (e.g., 'en' for English, 'fr' for French). Leave empty to include all languages.

## `reviews_keywords` (type: `array`):

Enter keywords to filter reviews by their text content
.Maximum of 5 keywords can be added. Reviews must contain at least one of the keywords to be included.

## `reviews_translate` (type: `string`):

Translate reviews to a specific language (e.g., 'fr' for French, 'de' for German). Leave empty to keep original language.

## `domain` (type: `string`):

Select the Yelp regional domain to use.

## `search_urls` (type: `array`):

Yelp search result pages to crawl (e.g., coffee shops in a city).

## `search_location` (type: `string`):

Enter a city/zip or area name to search within.

## `search_limit` (type: `integer`):

Number of pages to crawl per search or business start point.

## `search_sort` (type: `string`):

Select how to sort search results.

## `search_price` (type: `array`):

Select price ranges to filter by. You can select multiple.

## `search_features` (type: `array`):

Select business feature filters to include (e.g., WiFi.free, DogsAllowed). You can select multiple.

## parser input object example

```json
{
  "biz_urls": [
    "https://www.yelp.com/biz/bor%C3%A9al-coffee-shop-z%C3%BCrich"
  ],
  "biz_ids": [
    "zLOmLckX_sNmhUwMW6yQMg",
    "7VuF3aaSF1xZaWrkFCBmcg"
  ],
  "include_personal_data": false,
  "reviews_sort": "recommended",
  "reviews_language": "en",
  "reviews_keywords": [],
  "domain": "www.yelp.com",
  "search_location": "NY",
  "search_limit": 1,
  "search_sort": "recommended"
}
```

# parser output Schema

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

No description

# API

You can run this parser 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 'Extracto-client';

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

// Prepare parser input
const input = {
    "biz_urls": [
        "https://www.yelp.com/biz/bor%C3%A9al-coffee-shop-z%C3%BCrich"
    ],
    "biz_ids": [
        "zLOmLckX_sNmhUwMW6yQMg",
        "7VuF3aaSF1xZaWrkFCBmcg"
    ]
};

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

// Fetch and print parser results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`๐Ÿ’พ Check your data here: https://console.Extracto.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.Extracto.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the parser input
run_input = {
    "biz_urls": ["https://www.yelp.com/biz/bor%C3%A9al-coffee-shop-z%C3%BCrich"],
    "biz_ids": [
        "zLOmLckX_sNmhUwMW6yQMg",
        "7VuF3aaSF1xZaWrkFCBmcg",
    ],
}

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

# Fetch and print parser results from the run's dataset (if there are any)
print(f"๐Ÿ’พ Check your data here: https://console.Extracto.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.Extracto.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "biz_urls": [
    "https://www.yelp.com/biz/bor%C3%A9al-coffee-shop-z%C3%BCrich"
  ],
  "biz_ids": [
    "zLOmLckX_sNmhUwMW6yQMg",
    "7VuF3aaSF1xZaWrkFCBmcg"
  ]
}' |
Extracto call web_wanderer/yelp-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "Extracto": {
            "type": "http",
            "url": "https://mcp.Extracto.com/?tools=fetch-parser-details,web_wanderer/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 Extracto Console (https://console.Extracto.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.Extracto.com/v2/parsers/zzaj8C9vahbUG3T0U/builds/Cxcy0hdAdrO9QOllN/openapi.json

Request Body

{
  "input": {
    "biz_urls": [
        "https://www.yelp.com/biz/bor%C3%A9al-coffee-shop-z%C3%BCrich"
    ],
    "biz_ids": [
        "zLOmLckX_sNmhUwMW6yQMg",
        "7VuF3aaSF1xZaWrkFCBmcg"
    ],
    "include_personal_data": false,
    "reviews_sort": "recommended",
    "reviews_language": "en",
    "reviews_keywords": [],
    "domain": "www.yelp.com",
    "search_location": "NY",
    "search_limit": 1,
    "search_sort": "recommended",
    "reviews_limit": 100
}
}

cURL

curl -X POST https://extracto.cloud/api/v1/parsers/yelp-reviews \
  -H "X-API-KEY: ext_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"input":{"biz_urls":["https://www.yelp.com/biz/bor%C3%A9al-coffee-shop-z%C3%BCrich"],"biz_ids":["zLOmLckX_sNmhUwMW6yQMg","7VuF3aaSF1xZaWrkFCBmcg"],"include_personal_data":false,"reviews_sort":"recommended","reviews_language":"en","reviews_keywords":[],"domain":"www.yelp.com","search_location":"NY","search_limit":1,"search_sort":"recommended","reviews_limit":100}}'