---
title: "How to Scrape Yelp Reviews (2026 Guide) | Scrape.ly"
description: "Scrape Yelp reviews for any business: full text, stars, dates and owner replies, filtered by keyword or date. A real run, its cost, and API and MCP code."
url: https://scrape.ly/blog/scrape-yelp-reviews
markdown: https://scrape.ly/blog/scrape-yelp-reviews.md
---

[Tutorials](https://scrape.ly/blog/category/tutorials.md)

# How to Scrape Yelp Reviews and Business Data

Scrape Yelp reviews for any business URL: full text, stars, dates, photos, reactions and the owner's reply, with keyword, star and date filters. Plus business details from the same page. A real run, its cost, and code for curl, Python, Node.js and AI agents.

[Corner Ledger Actor publisher on the Scrape.ly Store](https://scrape.ly/blog/author/cornerledger.md)

- Published

  Oct 23, 2026

- Reading time

  10 min read

![Pixel-art robot with an orange >\_ on its terminal head pulls a review card with five red rating squares out of a shop front with a striped awning and the red Yelp burst logo on its sign, and drops it into a crate](https://scrape.ly/media/scrape-yelp-reviews.png?w=1080)

To scrape Yelp reviews, give a review scraper one or more Yelp business URLs and save every public review as a row: the full text, the star rating, the date, photos, reactions and the owner's reply, together with the business it belongs to. The fastest way is the Yelp Reviews Scraper on Scrape.ly: paste a link, set how many reviews you want, filter by keyword, stars or date, and pay $1.40 per 1,000 reviews.

This guide covers the no-code route, the API (curl, Python, Node.js and AI agents over MCP), the cost and the pitfalls, plus how to get the business details (phone, hours, price range, amenities) from the same page. Everything below comes from real runs on 23 October 2026 on Prince Street Pizza in New York: the exact input, output, log and charge.

## What data you can get from Yelp reviews

The [Yelp Reviews Scraper](https://scrape.ly/store/cornerledger/yelp-reviews-scraper.md) writes one row per review, and every row also carries the business, so an exported row still makes sense on its own:

| Field                                                                                         | What it holds                                        |
| --------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| `text`, `language`                                                                            | The full review as written and its language          |
| `rating`, `date`                                                                              | Stars from 1 to 5 and the exact posting time in UTC  |
| `photoUrls`                                                                                   | Full-size photos attached to the review              |
| `reactionHelpfulCount`, `reactionThanksCount`, `reactionLove_thisCount`, `reactionOh_noCount` | Yelp's reaction counts                               |
| `ownerResponse`, `ownerResponseDate`, `ownerResponseBy`                                       | The business's public reply, when there is one       |
| `reviewerName`, `reviewerUrl`, `reviewerLocation`, `reviewerReviewCount`, `reviewerElite`     | The reviewer's public profile summary                |
| `businessName`, `businessAddress`, `businessUrl`, `businessId`                                | The business                                         |
| `overallRating`, `reviewCount`                                                                | The business's overall rating and total review count |
| `id`, `reviewUrl`                                                                             | Yelp's review ID and a direct link                   |

Empty fields mean Yelp has nothing there: `ownerResponse` is `null` when the business didn't reply, and `photoUrls` is an empty list for a text-only review. Reviews Yelp marks as "not recommended" are not part of the public feed and not included.

For the business itself, the companion [Yelp Scraper](https://scrape.ly/store/cornerledger/yelp-scraper.md) returns one row per business: name, address, phone, website, rating, review count, price range, categories, opening hours per day, amenities, highlights, the "about" section and claim status.

## How to scrape Yelp reviews without code

1. Open the [Yelp Reviews Scraper](https://scrape.ly/store/cornerledger/yelp-reviews-scraper.md) in the Scrape.ly Store.
2. Pick a ready-made input. We used the preset [Prince Street Pizza reviews about crust, 10 reviews](https://scrape.ly/store/cornerledger/yelp-reviews-scraper/presets/review-search-query.md). "Try this input" opens it in the console.
3. Paste your own business URL. This is the exact input of our run:

```json
{
  "startUrls": [{ "url": "https://www.yelp.com/biz/prince-street-pizza-new-york-2" }],
  "maxReviewsPerUrl": 10,
  "searchQuery": "crust",
  "language": "",
  "sortBy": "newest",
  "minRating": 1,
  "maxRating": 5
}
```

4. Click **Start**. Ten reviews take about 20 seconds, including Yelp's one-time bot check.
5. Export the reviews as JSON, CSV, Excel or XML.

The fields that matter most:

- `startUrls`: Yelp business pages (`/biz/...`), including Yelp domains in other countries. Search pages are skipped with a warning.
- `maxReviewsPerUrl`: reviews per business. Default 20; `0` means every public review.
- `sortBy`: `newest` (the default), `oldest`, `relevance`, `highest`, `lowest` or `elites`.
- `minRating`, `maxRating`: keep a star range, for example `1` to `2` for complaints.
- `searchQuery`: only reviews that mention a word or phrase, such as "parking" or "vegan".
- `dateFrom`, `dateTo`: a posting window as `YYYY-MM-DD`. With `newest` or `oldest`, date filters also make the run faster.
- `language`: one language such as `es`, or empty for all (English first). The preset [Spanish reviews, 3+ stars, 15 reviews](https://scrape.ly/store/cornerledger/yelp-reviews-scraper/presets/language-rating-date-filters.md) shows it with a star filter.

Scrape.ly Store Yelp Reviews Scraper Every public review of any Yelp business: text, stars, date, photos, reactions and the owner's reply, filtered by keyword, stars, language or date. $1.40 per 1,000 reviews.

[Try it free](https://scrape.ly/store/cornerledger/yelp-reviews-scraper.md) [Browse the Store](https://scrape.ly/store.md)

## How to scrape Yelp reviews with the API

Create an API token in the dashboard under **Settings → API & Integrations**, then export it as `SCRAPELY_TOKEN`.

Our run finished in 21 seconds, so the synchronous endpoint fits: it starts the run, waits up to 45 seconds and returns the reviews as a JSON array. Add `?format=csv` for CSV.

```shell
curl -X POST "https://api.scrape.ly/v2/actors/cornerledger~yelp-reviews-scraper/run-sync-get-dataset-items"
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
  -H "Content-Type: application/json"
  -d '{"startUrls": [{"url": "https://www.yelp.com/biz/prince-street-pizza-new-york-2"}], "maxReviewsPerUrl": 10, "searchQuery": "crust"}'
```

For thousands of reviews a run takes minutes, and the call answers `408` after 45 seconds while the run keeps going. Don't call it again (that starts a second run); use a client, which waits as long as the run takes.

Python (`pip install scrapely-client-python`), here collecting this year's one- and two-star reviews and the share the owner answered:

```python
import os
from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("cornerledger/yelp-reviews-scraper").call(
    run_input={
        "startUrls": [{"url": "https://www.yelp.com/biz/prince-street-pizza-new-york-2"}],
        "maxReviewsPerUrl": 0,
        "sortBy": "newest",
        "minRating": 1,
        "maxRating": 2,
        "dateFrom": "2026-01-01",
    }
)
print(run.status)  # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
reviews = list(client.dataset(run.default_dataset_id).iterate_items())
answered = sum(1 for r in reviews if r.get("ownerResponse"))
print(f"{len(reviews)} low-star reviews, {answered} answered by the owner")
for r in reviews[:5]:
    print(r["date"][:10], r["rating"], r["text"][:80])
```

Node.js (`npm install scrapely-client`):

```javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('cornerledger/yelp-reviews-scraper').call({
  startUrls: [{ url: 'https://www.yelp.com/biz/prince-street-pizza-new-york-2' }],
  maxReviewsPerUrl: 10,
  searchQuery: 'crust',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => [r.date, r.rating, r.photoUrls.length, Boolean(r.ownerResponse)]));
```

To let an AI agent do it, add the Scrape.ly MCP server. In Cursor, put this in `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://api.scrape.ly/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}
```

In Claude Code, run `claude mcp add --transport http scrapely https://api.scrape.ly/mcp` and sign in with `/mcp`. Then ask in plain words: "Use scrapely to run cornerledger/yelp-reviews-scraper on Prince Street Pizza, 100 newest reviews, and tell me what people say about the crust and the wait." The agent finds the Actor, reads its input schema, runs it and reads the rows. See the [MCP docs](https://scrape.ly/docs/mcp.md) for other clients. If you want a ready endpoint, the [Yelp API](https://scrape.ly/api/yelp-api.md) page shows the same data as an API product.

## A real run: Prince Street Pizza reviews about the crust

We ran the "Prince Street Pizza reviews about crust, 10 reviews" preset on 23 October 2026. It returned 10 reviews in 21 seconds and was charged $0.0151. The business has a 4.3 rating from 5,727 reviews; the keyword filter kept only those that mention "crust". The first five:

| Reviewer      | Stars | Posted     | Review (start)                                                                                               | Photos | Owner reply         |
| ------------- | ----- | ---------- | ------------------------------------------------------------------------------------------------------------ | ------ | ------------------- |
| \[reviewer 1] | 5     | 2026-09-18 | "SO GOOD we came back for a second time one our weekend trip. The naughty pie hits hard with the hot honey…" | 2      | Thank-you note      |
| \[reviewer 2] | 2     | 2026-08-11 | "I tried the spicy pepperoni, it was mid at best, kinda dry crust. I saw a long line and got excited…"       | 0      | Apology, asks to DM |
| \[reviewer 3] | 5     | 2026-09-17 | "It was SO good. This was our 2nd favorite food on our NYC trip! It's the best pizza we had…"                | 1      | none                |
| \[reviewer 4] | 5     | 2026-08-05 | "Prince street pizza is a stop that should definitely be on your bucket list!…"                              | 3      | Thank-you note      |
| \[reviewer 5] | 4     | 2026-07-26 | "Prince Street Pizza opened in 2012, taking over the legendary 27 Prince Street location…"                   | 4      | Thank-you note      |

Reviewers are private people, so we show them as `[reviewer 1]` to `[reviewer 5]`. What the full ten show:

- **Keyword results follow Yelp's order.** With a `searchQuery`, Yelp ranks matches by its own relevance, so the ten span November 2025 to September 2026 rather than running newest first. Use `dateFrom` when you need a strict time window.
- **The crust splits opinion.** Four reviews gave five stars, four gave four, one three and one two, an average of 4.1 against the business's 4.3. The two-star review called it "kinda dry crust", the three-star one praised the crust and faulted the service, and a four-star reviewer found it "not soggy but not that crispy".
- **The owner answers almost everything.** Nine of the ten had a reply from the same business account: short thank-you notes, and an apology with an invitation to send a direct message on the two critical reviews.
- **Photos are common.** Six reviews carried photos, 13 in total. One reviewer was Yelp Elite.

We also read the business page itself with the Yelp Scraper (one business, 14 seconds, $0.0040). It returned the address (27 Prince St), phone, website, price range "Under $10", categories Restaurants and Pizza, opening hours per day (10:00 AM to 3:00 AM Sunday to Tuesday, to midnight on Wednesday, to 5:00 AM Thursday to Saturday), 37 amenities, six highlights such as "Kitchen open late", the year established (2012), and `claimed: true`.

The review run's log, without the platform's start-up lines:

```plaintext
20261023T03:03:08.595Z [scrapely.actor] INFO  Challenge solver source: platform.
20261023T03:03:08.635Z [scrapely.actor] INFO  [Status message]: Scraping 1 business pages
20261023T03:03:22.134Z [scrapely.actor] INFO  Prince Street Pizza: 10 reviews.
20261023T03:03:22.140Z [scrapely.actor] INFO  Saved 10 reviews from 1 businesses. Browser checks: 1. Seconds: {'solve': 7.2, 'page': 9.9, 'feed': 3.1, 'proxy': 0.0, 'total': 13.5}.
20261023T03:03:22.764Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false
```

The log breaks the time down: 7.2 seconds to clear Yelp's bot check once, then 3.1 seconds in Yelp's review feed. After the check, the Actor reads 40 reviews per request, which is why the README measures about 1,000 reviews in 35 seconds.

## What it costs

The Yelp Reviews Scraper charges one event, $0.0014 per review saved, which is $1.40 per 1,000 reviews. There is no start fee. Platform usage (compute and proxy) is billed on top.

For our run: 10 reviews × $0.0014 = $0.014 in review fees. The run was charged $0.0151 in total, because it also used $0.0007 of compute and $0.0004 of datacenter proxy traffic. Reviews that your keyword, star or date filter drops are not saved and not charged.

At scale the review fee dominates: 1,000 reviews cost $1.40 in fees and 10,000 reviews $14, plus usage the README puts at about $0.003 per 1,000. The Yelp Scraper costs $0.0018 per business ($1.80 per 1,000); our one-business run was $0.0040 with usage. The Free plan's $5 of monthly credit covers more than 3,500 reviews in review fees. Set **Max cost per run** and the run stops cleanly at your cap.

## What to watch out for

- **"Not recommended" reviews are not public.** Yelp's total count includes them and reviews in other languages, so you may get fewer rows than the counter shows. Choose all languages to cover every language the business has.
- **Keyword search ignores the sort.** Yelp returns keyword matches in its own relevance order. Combine `searchQuery` with `dateFrom` and `dateTo` for a time window.
- **Huge businesses and Elite sorting.** Yelp itself times out sorting very large businesses by Elite reviewers; those fall back to Yelp's default sort and the status message names them.
- **Blocking.** Yelp blocks a lot of automated traffic, which is where most DIY scrapers stall. The Actors clear its check with the platform's solver, start on datacenter proxies, and the business scraper switches to residential for long runs. If Yelp refuses every connection for one business, that business is skipped and the rest of the run continues.
- **Search pages go to the other Actor.** The reviews Actor takes business URLs only. To find businesses by term and city (up to about 240 per search), use the Yelp Scraper first and pass its `directUrl` values.
- **Personal data.** Reviewer names, profile links and hometowns identify private people, and owner replies often greet reviewers by first name. Keep only what you need.

## Is it legal to scrape Yelp reviews?

The Actors read reviews and business pages that anyone can see without logging in, and they never sign in or post. That doesn't settle every question. [Yelp's Terms of Service](https://terms.yelp.com/tos/en_us/20260101_en_us/) (last updated October 1, 2025) say users may not "use any robot, spider, Service search/retrieval application, or other automated device, process or means to access, retrieve, copy, scrape, or index any portion of the Service", except as Yelp expressly permits. How those terms bind you depends on where you are and what you do with the data.

Privacy law matters more for reviews than for business listings. A reviewer's name, profile and location are personal data under the GDPR and the CCPA, and review text can mention staff or other customers. Collect only what you need, keep it secure, have a lawful basis, and don't use reviewer details to contact or profile individuals. Review text is the reviewer's writing: analyze and summarize it rather than republishing it. This is not legal advice: if Yelp data feeds a product, ask a lawyer about your case.

## Why Scrape.ly for Yelp reviews

- **Every review, not three.** Yelp's own [reviews endpoint](https://docs.developer.yelp.com/reference/v3_business_reviews) "returns up to three review excerpts for a given business ordered by Yelp's default sort order." Prince Street Pizza has 5,727 reviews; with `maxReviewsPerUrl: 0` the Actor pages through every public one, full text included.
- **Filters before you pay.** Keyword, star range, language and dates are applied before a row is saved, so filtered-out reviews cost nothing, and a maximum charge per run caps the bill.
- **No bot check to fight.** Python tutorials for this query reverse-engineer Yelp's search and review endpoints and still warn that requests get blocked. Here the solver and proxy are built in, and the log shows the check took 7.2 seconds.
- **Built for monitoring.** Schedule a daily run with `sortBy: "newest"` and a `dateFrom` of yesterday, then send new one- and two-star reviews to Slack or email with [automations](https://scrape.ly/docs/automations.md) or hand the job to an AI agent over MCP.

## FAQ

### Can you scrape Yelp reviews for free?

The Scrape.ly Free plan includes $5 of usage credit every month with no credit card, which covers more than 3,500 reviews in review fees at $1.40 per 1,000. Our 10-review run cost $0.0151.

### How do I scrape Yelp with Python?

Install `scrapely-client-python`, call `cornerledger/yelp-reviews-scraper` with business URLs (or `cornerledger/yelp-scraper` with a search term and city), and iterate over the dataset, as in the example above. The client waits for the run, including the bot check.

### Does the Yelp API return all reviews?

No. Yelp's reviews endpoint returns up to three review excerpts per business in Yelp's default order. For complete review text and history, scrape the public reviews with the Actor and call it from your own code with the same token.

### Can I scrape only new or negative Yelp reviews?

Yes. Set `sortBy` to `newest` with a `dateFrom`, and `minRating`/`maxRating` to `1` and `2` for negative reviews. Schedule it daily and each run only saves, and charges for, what's new.

### Can I scrape Yelp reviews without reviewer names?

Every row includes the public reviewer summary Yelp shows, so leave it out when you read the data: the dataset endpoint takes an `omit` parameter, for example `https://api.scrape.ly/v2/actor-runs/RUN_ID/dataset/items?format=csv&omit=reviewerName,reviewerUrl,reviewerLocation`. You keep text, stars, dates and replies.

### How does this compare with Google Maps reviews?

The workflow is the same: a URL in, one row per review out. Our guide on [how to scrape Google Maps reviews](https://scrape.ly/blog/scrape-google-maps-reviews.md) covers the Google side, and running both gives you one review feed per location.

Scrape.ly Store Scrape Yelp reviews Run the Prince Street Pizza preset as-is, or paste your own business URLs. Full text, stars, dates and owner replies at $1.40 per 1,000 reviews.

[Try it free](https://scrape.ly/store/cornerledger/yelp-reviews-scraper.md) [Browse the Store](https://scrape.ly/store.md)

About the author

[Corner Ledger](https://scrape.ly/blog/author/cornerledger.md) Actor publisher on the Scrape.ly Store

The businesses on every corner and in every register: map listings, local directories, company registries and customer reviews. For sales teams and market researchers. A Scrapely studio.

- [Website](https://scrape.ly/users/cornerledger.md)

Keep reading

## More in Tutorials

- [![Pixel-art robot with an orange >\_ on its terminal head pulls a product card with a photo and a green price out of a shop front with a green-striped awning and the green Shopify bag logo on its sign, and drops it into a crate](https://scrape.ly/media/scrape-shopify-stores.png?w=750)](https://scrape.ly/blog/scrape-shopify-stores.md)
  ### [How to Scrape Any Shopify Store: Products, Prices and Variants](https://scrape.ly/blog/scrape-shopify-stores.md)
  [Scrape any public Shopify store from a store, collection or product URL and get one row per product with every variant, price, sale price, stock status, SKU, weight and image. A real run on Allbirds, its cost, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-shopify-stores.md)
- [![Pixel-art robot with an orange >\_ on its terminal head lifts a search result off a results page headed by the blue Bing logo and a search box, and drops it into a crate](https://scrape.ly/media/scrape-bing-search-results.png?w=750)](https://scrape.ly/blog/scrape-bing-search-results.md)
  ### [How to Scrape Bing Search Results: Rankings, Related Searches and News](https://scrape.ly/blog/scrape-bing-search-results.md)
  [Scrape Bing search results in any of 38 markets and get every results page as JSON: organic rankings with titles, URLs and dates, related searches, People Also Ask and the top news story. A real run, the cost per page, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-bing-search-results.md)
- [![Pixel-art robot with an orange >\_ on its terminal head pulls a product card with a photo and an orange price off a market stall with a striped awning, handmade goods on its counter and the orange Etsy logo on its sign, and drops it into a crate](https://scrape.ly/media/scrape-etsy.png?w=750)](https://scrape.ly/blog/scrape-etsy.md)
  ### [How to Scrape Etsy Data: Products, Prices and Shops](https://scrape.ly/blog/scrape-etsy.md)
  [Scrape Etsy by keyword or paste shop, category and listing URLs, and get each product as a row: price, sale price, shop name and rating, favorites, variations, photos and related searches. A real run, its cost, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-etsy.md)

## The internet is full of data. Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

[Get Started Free](https://my.scrape.ly/register) [Chat with Support](mailto:support@scrape.ly?subject=Question%20about%20Scrape.ly\&body=Hi%2C%20I%20have%20a%20question%20about%20Scrape.ly.)

No credit card. No setup calls.
