Skip to content

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.

Published
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
In this article
  1. What data you can get from Yelp reviews
  2. How to scrape Yelp reviews without code
  3. How to scrape Yelp reviews with the API
  4. A real run: Prince Street Pizza reviews about the crust
  5. What it costs
  6. What to watch out for
  7. Is it legal to scrape Yelp reviews?
  8. Why Scrape.ly for Yelp reviews
  9. FAQ
  10. Can you scrape Yelp reviews for free?
  11. How do I scrape Yelp with Python?
  12. Does the Yelp API return all reviews?
  13. Can I scrape only new or negative Yelp reviews?
  14. Can I scrape Yelp reviews without reviewer names?
  15. How does this compare with Google Maps reviews?

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 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 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 in the Scrape.ly Store.
  2. Pick a ready-made input. We used the preset Prince Street Pizza reviews about crust, 10 reviews. "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
}
  1. Click Start. Ten reviews take about 20 seconds, including Yelp's one-time bot check.
  2. 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 shows it with a star filter.

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 for other clients. If you want a ready endpoint, the Yelp API 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:

Text
2026-10-23T03:03:08.595Z [scrapely.actor] INFO  Challenge solver source: platform.
2026-10-23T03:03:08.635Z [scrapely.actor] INFO  [Status message]: Scraping 1 business pages
2026-10-23T03:03:22.134Z [scrapely.actor] INFO  Prince Street Pizza: 10 reviews.
2026-10-23T03: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}.
2026-10-23T03: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.

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 (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 "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 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 covers the Google side, and running both gives you one review feed per location.

  • yelp
  • reviews
  • local business
  • reputation monitoring
  • python
  • api

About the author

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.

//Keep reading\\

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.

No credit card. No setup calls.