# Yelp Scraper API - Businesses, Emails, Reviews & Leads (`pro100chok/yelp-scraper`) Actor

Scrape Yelp business data without the Yelp API: 60+ fields per listing with e-mails and social profiles pulled from the business website, plus reviews, menus, Q\&A, photos, hours, amenities, licences and health scores. One row per business. Export to CSV, JSON or Excel.

- **URL**: https://apify.com/pro100chok/yelp-scraper.md
- **Developed by:** [Raven](https://apify.com/pro100chok) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 business profiles

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

## Yelp Scraper API — Extract Yelp Business Data, Emails, Reviews & Menus

Scrape Yelp business listings without the Yelp API — **from $4.00 per 1,000 businesses on paid plans** ($6.00 on the free plan). Get **60+ fields per business**: name, categories, phone, website, full address with coordinates, opening hours, amenities, verified licences, health inspection scores, photos, menus and Q\&A — plus the **e-mail address and social profiles pulled from the business's own website**, and **reviews nested in the same row**. No login, no API key, no code, no proxies to configure.

![Yelp scraper extracting Yelp business data, e-mail addresses, reviews and menus into JSON](https://raw.githubusercontent.com/PRO100CHOK/apify-readme-assets/main/yelp-scraper/hero.png)

<table>
<tr>
<td colspan="4" style="padding:10px 14px;background:#D32323;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">Raven &middot; Local & lead-gen suite</span>
<span style="color:#FBD5D5;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Yelp, Google Maps, website contacts, TripAdvisor</span>
</td>
</tr>
<tr>
<td style="background:#FBDCDC;padding:10px 12px;border:1px solid #E4E4E7;border-right:none;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-hf4D1qFJHmE95F7CJ-RY2uuz4TKQ-d1bd47be-4326-4676-abbf-14ae992405db.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/yelp-scraper" style="color:#AF1C1C;text-decoration:none;font-weight:700;font-size:13px">Yelp&nbsp;Scraper</a></span><br>
<span style="color:#AF1C1C;font-size:11px;font-weight:600">&#10148; You are here</span>
</td>
<td style="background:#FDF0F0;padding:10px 12px;border:1px solid #E4E4E7;border-right:none;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-w0yugQzf3ETbRbAC2-ehi6JwVR72-ae55cffc-cd6e-481f-bb22-f89a349f7287.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/google-maps-scraper" style="color:#18181B;text-decoration:none;font-weight:700;font-size:13px">Google&nbsp;Maps</a></span><br>
<span style="color:#71717A;font-size:11px">Places, emails, reviews</span>
</td>
<td style="background:#FDF0F0;padding:10px 12px;border:1px solid #E4E4E7;border-right:none;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-1X9ZSt3urlN5pptAO-Nyu91cUNLw-9d50dd18-fb66-400e-85c7-413263018bd8.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/extract-emails" style="color:#18181B;text-decoration:none;font-weight:700;font-size:13px">Website&nbsp;Contacts</a></span><br>
<span style="color:#71717A;font-size:11px">Emails, phones, socials</span>
</td>
<td style="background:#FDF0F0;padding:10px 12px;border:1px solid #E4E4E7;border-top:none;vertical-align:top;width:25%">
<span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-caoIAzJRQpPYIg12M-tRWDnGB6Xs-7d9d7a8f-dbff-412c-b8ee-789318d445f2.png" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/pro100chok/tripadvisor-all-in-one" style="color:#18181B;text-decoration:none;font-weight:700;font-size:13px">TripAdvisor&nbsp;Scraper</a></span><br>
<span style="color:#71717A;font-size:11px">Hotels, restaurants, reviews</span>
</td>
</tr>
</table>

**Contents:** [What it does](#what-does-this-yelp-scraper-do) · [Why use it](#why-use-this-scraper) · [Data you get](#what-data-can-you-extract-from-yelp) · [Step by step](#how-to-scrape-yelp-step-by-step) · [Past the 240 limit](#how-to-get-more-than-240-results-from-yelp) · [E-mail lookup](#how-the-e-mail-lookup-works) · [Reviews](#reviews-nested-or-flat-your-choice) · [Input parameters](#input-parameters) · [Input recipes](#ready-to-paste-input-recipes) · [Output examples](#output-examples) · [Pricing](#how-much-does-it-cost-to-scrape-yelp) · [Integrations](#integrations) · [AI agents / MCP](#use-with-ai-agents-mcp) · [Real-time API](#real-time-api-standby-mode) · [Use cases](#popular-use-cases) · [Legality](#is-it-legal-to-scrape-yelp) · [Troubleshooting](#troubleshooting) · [FAQ](#faq)

### What does this Yelp Scraper do?

This actor is a **Yelp API alternative**: it reads the same public pages a visitor sees and hands you clean, flat records. Yelp's official Fusion API is restrictive — its reviews endpoint returns "up to three review excerpts for a business" ([Yelp's own docs](https://docs.developer.yelp.com/docs/fusion-intro)) and it needs an approved developer app. This scraper has no key, no quota of its own, and no 3-review ceiling.

Two modes, one input form:

| Mode | What a dataset row is | Use it for |
|---|---|---|
| **Businesses** (default) | One row per business, with its reviews, menu, Q\&A and photos **nested inside** | Lead lists, market maps, competitor sets, enrichment |
| **Reviews** | One row per review (flat) | Sentiment analysis, NLP pipelines, review dashboards |

Feed it any combination of:

- **Search terms × locations** — `"plumber"` in `"San Francisco, CA"`, every pair runs as its own search
- **Yelp category aliases** — `plumbers`, `restaurants`, `dentists`, matching Yelp's own category pages
- **Yelp business URLs, aliases or business IDs** — `https://www.yelp.com/biz/sotto-mare-san-francisco-4`, `sotto-mare-san-francisco-4`, or the encrypted id
- **Yelp search URLs** — paste a filtered search straight from your browser and every result in it is scraped

### Why use this scraper?

- ✅ **E-mails and socials nobody else gives you.** The actor opens the business's own website and extracts e-mail addresses plus Facebook, Instagram, X, LinkedIn, YouTube, TikTok and Telegram links. Yelp never publishes an e-mail — this is what turns a listing into a contactable lead.
- ✅ **60+ fields per business**, including the ones most scrapers skip: verified trade licences, health inspection results **with the individual violations**, service areas, neighbourhoods, timezone, "people also searched", and Yelp's own one-line editorial summary.
- ✅ **Businesses and their reviews in one run.** Reviews arrive nested in the business row, so you never join two datasets or pay for two actors.
- ✅ **Reviews Yelp hides.** Optionally collect the "not recommended" reviews that never count towards the visible rating — useful when auditing a business's real feedback.
- ✅ **Full menus with prices** for restaurants and food businesses: section, item, price, description, photo and per-item review count.
- ✅ **27 output languages.** The same listing comes back as `["Specialty Food", "Delis"]`, `["Spezialitäten", "Deli"]` or `["Żywność specjalistyczna"]` — and every URL in the output is still a canonical `www.yelp.com` link.
- ✅ **Predictable row counts.** 20 businesses means 20 rows, not 420. Everything that belongs to a business lives inside its row.
- ✅ **You never pay for failures.** A listing that cannot be extracted returns a row explaining why, free of charge, and add-ons are skipped entirely when Yelp has nothing to give.
- ✅ **Set a hard budget.** Give the run a maximum cost and it stops cleanly at your limit, keeping everything already collected.

| | Official Yelp Fusion API | Typical Yelp scrapers | **This actor** |
|---|---|---|---|
| API key / approved app | Required | Not required | **Not required** |
| Reviews per business | Up to 3 excerpts | Usually a separate actor | **Full text, nested in the same row** |
| E-mail addresses | Not available | Rarely | **From the business website** |
| Social profiles | Not available | Rarely | **7 networks** |
| Menus with prices | Not available | Sometimes | **Yes** |
| Community Q\&A | Not available | Rarely | **Yes, with answers** |
| Health inspections | Not available | Score only, if at all | **Score + every violation** |
| "Not recommended" reviews | Not available | No | **Yes, optional** |
| Output languages | English-centric | Usually one | **27** |
| Export | JSON only | Varies | **JSON, CSV, Excel, XML, API** |

### What data can you extract from Yelp?

#### Business record — 60+ fields

The dataset schema documents **101 fields** across both record types. A rich listing fills 50–60 of them; a sparse one fewer, because Yelp simply has less. Empty fields are omitted, never returned as `null`.

| Group | Fields |
|---|---|
| **Identity** | `name`, `alias`, `businessId`, `url`, `alternateNames`, `categories`, `priceRange`, `summary` |
| **Contacts** ⭐ | `phone`, `website`, `email`, `emails`, `facebook`, `instagram`, `twitter`, `linkedin`, `youtube`, `tiktok`, `telegram` |
| **Location** | `address`, `addressLine1`–`addressLine3`, `city`, `state`, `postalCode`, `countryCode`, `neighborhoods`, `latitude`, `longitude`, `timezone`, `serviceArea` |
| **Ratings** | `rating`, `reviewCount`, `reviewHighlights`, `reviewSnippet` |
| **Hours** | `hours` (one line per weekday), `specialHours`, `isClosed` |
| **Amenities** | `amenities` (localised labels), `attributes` (stable aliases → true/false), `highlights` |
| **Trust signals** | `isClaimed`, `isAdvertiser`, `yelpGuaranteed`, `verifiedLicenses`, `healthInspections`, `infoLastVerified` |
| **From the owner** | `aboutHistory`, `yearEstablished`, `specialties`, `ownerName`, `ownerBio` |
| **Media** | `photos`, `photoCount`, `primaryPhoto`, `videos` |
| **Menu** | `menu` (section, name, price, description, photo, review count), `menuUrl`, `externalMenuUrl` |
| **Q\&A** | `questions` (with answers, authors, helpful votes), `questionCount` |
| **Reviews** | `reviews`, `notRecommendedReviews` |
| **Search context** | `searchTerm`, `searchLocation`, `searchRank`, `isAd`, `peopleAlsoSearched`, `searchAppearances`, `popularityNote` |

#### Review record — 25 fields

`reviewId`, `rating`, `text`, `language`, `publishedAt`, `experienceDate`, `authorName`, `authorId`, `authorPhotoUrl`, `authorLocation`, `authorReviewCount`, `authorFriendCount`, `authorPhotoCount`, `authorIsElite`, `reactions` (Helpful / Thanks / Love this / Oh no), `checkInCount`, `isFirstReview`, `photos`, `ownerReplyText`, `ownerReplyDate`, `url`, plus the business it belongs to.

#### Which fields are always there?

Yelp only has what owners and reviewers give it, so some fields are conditional. Rather than make you find out the hard way:

| Field | Availability | Depends on |
|---|---|---|
| `name`, `alias`, `businessId`, `url`, `categories`, `rating`, `reviewCount` | ✅ Always | — |
| `address`, `city`, `countryCode`, `hours`, `amenities`, `attributes` | ✅ Almost always | Present on virtually every claimed listing |
| `latitude`, `longitude` | ⚠️ Usually | Businesses with a street address; service-area businesses have no map |
| `phone`, `website`, `priceRange` | ⚠️ Usually | The owner having entered them |
| `email`, `emails`, socials | ⚠️ Sometimes | The business having a website that publishes an address |
| `menu` | ⚠️ Sometimes | Food businesses with a Yelp-hosted menu |
| `healthInspections` | ⚠️ Sometimes | Regions where authorities publish inspections |
| `verifiedLicenses` | ⚠️ Sometimes | Trades and contractors |
| `yearEstablished`, `specialties`, `ownerName`, `ownerBio` | ⚠️ Sometimes | The owner filling in "From the business" |
| `questions` | ⚠️ Sometimes | The listing having community Q\&A |

Empty fields are **omitted rather than returned as `null`**, which keeps CSV exports free of dead columns. All 101 possible fields are documented on the **Output** tab.

**Not supported:** Yelp user profiles, Yelp Collections and lists, and the Yelp events directory. This actor covers businesses, their reviews, menus, photos and Q\&A.

### How to scrape Yelp step by step

1. **Click Try for free** at the top of this page. A new Apify account comes with **$5 in free monthly credits** — no card required, enough for roughly **660 businesses with e-mails** or **~7,000 reviews**.
2. **Type a search term and a location** — for example `plumber` and `San Francisco, CA`. Or paste Yelp URLs into **Direct Yelp URLs** instead.
3. **Set Max businesses per search.** Yelp serves at most 240 results per query, so add more cities or postcodes to go wider.
4. **Pick your add-ons.** Leave *Find e-mail addresses* on for lead lists; set *Max reviews* if you want review text; turn on *Include menu items* for restaurants.
5. **Click Start.** Rows appear within seconds and keep arriving — the dataset is never held back until the end.
6. **Export** from the Storage tab as JSON, CSV, Excel, XML or JSONL, or pull it from the API.

### How to get more than 240 results from Yelp

Yelp caps a single search at **240 results** and then stops paginating — that ceiling is Yelp's, not the scraper's, and every Yelp tool hits it. The way around it is to split the search rather than deepen it:

- **Split by neighbourhood or postcode** instead of one big city: `"SoHo, New York, NY"`, `"Williamsburg, Brooklyn, NY"`, `"10001"`, `"10002"` — each one gets its own 240-result budget.
- **Split by category.** `plumbers`, `hvac`, `waterheaterinstallrepair` as separate `categories` entries return overlapping-but-different sets.
- **Split by search term.** `"plumber"`, `"emergency plumber"`, `"drain cleaning"` in the same city surface different businesses.
- Every term × location pair runs as its own search, so `3 terms × 5 postcodes` gives you 15 searches — up to 3,600 businesses — from one run. Duplicates across searches are removed before anything is charged.

### How the e-mail lookup works

Yelp shows a website but never an e-mail. When **Find e-mail addresses** is on, the actor visits the business's own site — the homepage first, then the contact/about pages that page links to — and extracts every valid address it finds, plus social profiles.

- Addresses on the **business's own domain** are ranked first, so `email` is the one worth writing to rather than the web agency's address in the footer; `emails` holds everything found.
- In test runs roughly **half of the listings that have a website** yield at least one address. The rest genuinely publish none.
- Listings with **no website at all cost nothing extra** — the lookup is only charged when there is a site to read.
- Junk is filtered out: `noreply@`, template placeholders, tracking-pixel domains and image filenames never reach your dataset.

### Reviews: nested or flat, your choice

**Businesses mode** nests reviews inside the business row — one row per company, no joins, and the row count always matches the number of businesses you asked for.

**Reviews mode** gives the flat shape instead: one row per review, with the business name and alias attached to every row. Use it when you are feeding a sentiment model or a review dashboard.

Both modes support:

- **6 sort orders** — Yelp's own relevance sort, newest first, oldest first, highest rating, lowest rating, or Elite reviewers first
- **Star filtering** — collect only 1- and 2-star reviews to build a complaint feed
- **"Not recommended" reviews** — the ones Yelp filters out of the main feed, in their own `notRecommendedReviews` array
- **Owner replies** — the business's public response, when there is one

### Input parameters

| Field | Type | Default | What it does |
|---|---|---|---|
| `scrapeType` | select | `search` | `search` = one row per business with reviews nested; `reviews` = one row per review |
| `searchTerms` | array | — | Keywords to search, e.g. `plumber`, `italian restaurant` |
| `locations` | array | — | Cities, regions or postcodes. Required whenever you use search terms or categories |
| `categories` | array | — | Yelp category aliases (`plumbers`, `restaurants`, `dentists`) for exact category matching |
| `maxResults` | integer | `20` | Businesses per term × location pair (Yelp's own ceiling is 240) |
| `directUrls` | array | — | Yelp business URLs, aliases, business IDs, or Yelp search URLs |
| `yelpDomain` | select | `www.yelp.com` | **Results language** — 27 options; does not limit which countries are scraped |
| `includeEmails` | boolean | `true` | Visit each business website and extract e-mails + social profiles |
| `maxPhotos` | integer | `20` | Photo URLs per business (`0` = none) |
| `maxQuestions` | integer | `0` | Community Q\&A with answers, up to 10 |
| `includeMenu` | boolean | `false` | Full Yelp menu with prices for food businesses |
| `includeAds` | boolean | `false` | Also return Yelp's sponsored placements |
| `maxReviews` | integer | `0` | Reviews per business (`0` = none) |
| `reviewsSort` | select | Yelp sort | `DATE_DESC`, `DATE_ASC`, `RATING_DESC`, `RATING_ASC`, `ELITES_DESC` |
| `reviewRatings` | array | all | Keep only these star ratings, e.g. `["1", "2"]` |
| `includeNotRecommendedReviews` | boolean | `false` | Also collect Yelp's hidden "not recommended" reviews |
| `proxyConfiguration` | proxy | Residential | Leave as-is — proxy rotation and anti-bot handling are already built in |

### Ready-to-paste input recipes

**1. Local lead list with e-mails** — the cheapest lead run: contacts only, no photos, no reviews.

```json
{
  "scrapeType": "search",
  "searchTerms": ["dentist", "orthodontist"],
  "locations": ["Chicago, IL", "Houston, TX", "Phoenix, AZ"],
  "maxResults": 240,
  "includeEmails": true,
  "maxPhotos": 0,
  "maxReviews": 0,
  "yelpDomain": "www.yelp.com"
}
```

**2. Restaurants with menus and prices**

```json
{
  "scrapeType": "search",
  "searchTerms": ["italian restaurant"],
  "locations": ["San Francisco, CA"],
  "maxResults": 50,
  "includeMenu": true,
  "maxPhotos": 10,
  "maxReviews": 10,
  "yelpDomain": "www.yelp.com"
}
```

**3. Reputation monitoring — newest 1- and 2-star reviews**

```json
{
  "scrapeType": "search",
  "directUrls": [
    "https://www.yelp.com/biz/molinari-delicatessen-san-francisco",
    "https://www.yelp.com/biz/gary-danko-san-francisco"
  ],
  "maxReviews": 100,
  "reviewsSort": "DATE_DESC",
  "reviewRatings": ["1", "2"],
  "includeNotRecommendedReviews": true,
  "maxPhotos": 0,
  "includeEmails": false
}
```

**4. Flat review table for sentiment analysis**

```json
{
  "scrapeType": "reviews",
  "searchTerms": ["sushi"],
  "locations": ["Los Angeles, CA"],
  "maxResults": 20,
  "maxReviews": 500,
  "reviewsSort": "DATE_DESC",
  "includeEmails": false,
  "maxPhotos": 0
}
```

**5. Scrape a filtered Yelp search URL as-is** — apply the filters in your browser, copy the address bar, paste it here.

```json
{
  "scrapeType": "search",
  "directUrls": [
    "https://www.yelp.com/search?find_desc=coffee&find_loc=Berlin%2C+Germany"
  ],
  "maxResults": 100,
  "yelpDomain": "www.yelp.de",
  "includeEmails": true
}
```

**6. Full audit of one business — everything Yelp has**

```json
{
  "scrapeType": "search",
  "directUrls": ["https://www.yelp.com/biz/sotto-mare-san-francisco-4"],
  "maxReviews": 1000,
  "includeNotRecommendedReviews": true,
  "maxQuestions": 10,
  "includeMenu": true,
  "maxPhotos": 200,
  "includeEmails": true
}
```

**7. Category pages by Yelp alias, across a metro area**

```json
{
  "scrapeType": "search",
  "categories": ["plumbers", "hvac"],
  "locations": ["Austin, TX"],
  "maxResults": 240,
  "includeAds": false,
  "includeEmails": true,
  "maxPhotos": 0
}
```

### Output examples

#### Business row (trimmed — a real record from a live run)

```json
{
  "type": "business",
  "businessId": "8dUaybEPHsZMgr1iKgqgMQ",
  "alias": "sotto-mare-san-francisco-4",
  "name": "Sotto Mare",
  "url": "https://www.yelp.com/biz/sotto-mare-san-francisco-4",
  "rating": 4.3,
  "reviewCount": 5978,
  "priceRange": "$$$",
  "categories": ["Seafood", "Italian", "Bars", "Nightlife", "Restaurants"],
  "phone": "(415) 398-3181",
  "website": "http://www.sottomaresf.com/",
  "email": "sottomare@outlook.com",
  "emails": ["sottomare@outlook.com"],
  "facebook": "https://www.facebook.com/sotto.mare.sf/",
  "instagram": "https://www.instagram.com/explore/locations/57/sotto-mare/",
  "address": "552 Green St, San Francisco, CA 94133, United States",
  "city": "San Francisco",
  "state": "CA",
  "postalCode": "94133",
  "countryCode": "US",
  "neighborhoods": ["North Beach/Telegraph Hill"],
  "latitude": 37.799718,
  "longitude": -122.408342,
  "timezone": "America/Los_Angeles",
  "isClaimed": true,
  "isAdvertiser": true,
  "summary": "Old-school seafood spot known for hearty cioppino and fresh oysters.",
  "hours": [
    { "day": "Mon", "hours": "11:30 AM - 9:00 PM" },
    { "day": "Tue", "hours": "11:30 AM - 9:00 PM" }
  ],
  "amenities": ["Takes reservations", "Offers delivery", "Offers take-out", "Many vegetarian options"],
  "attributes": {
    "RestaurantsReservations": true,
    "RestaurantsDelivery": true,
    "RestaurantsTakeOut": true,
    "num_vegetarian_options": true
  },
  "healthInspections": [
    {
      "score": "Pass",
      "date": "2026-02-20T08:00:00.000Z",
      "violations": ["Standard not met: NO INSECTS, RODENTS, BIRDS OR NONSERVICE ANIMALS"]
    }
  ],
  "photoCount": 7896,
  "questionCount": 75,
  "primaryPhoto": "https://s3-media0.fl.yelpcdn.com/bphoto/o3hIcGLMxV_5ynxEjGWGrw/o.jpg",
  "reviews": [ "..." ],
  "menu": [ "..." ],
  "scrapedAt": "2026-08-19T21:17:58.387Z"
}
```

#### A review, as it appears inside `reviews`

```json
{
  "reviewId": "FrWrh3IW9z-eHsVaqbjwEQ",
  "rating": 5,
  "text": "Really enjoyed the atmosphere & food, service was good as well.\n\n++ for free bread service, which is a dying art at most places.",
  "language": "en",
  "publishedAt": "2026-07-19T14:01:02-07:00",
  "authorName": "Beatriz S.",
  "authorLocation": "Northeast Orlando, Orlando, FL",
  "authorReviewCount": 1,
  "authorFriendCount": 155,
  "authorIsElite": false,
  "checkInCount": 0,
  "url": "https://www.yelp.com/biz/sotto-mare-san-francisco-4?hrid=FrWrh3IW9z-eHsVaqbjwEQ"
}
```

#### Menu items, as they appear inside `menu`

```json
[
  {
    "section": "Appetizers",
    "name": "Oysters on Half Shell",
    "price": "$2.00",
    "photoUrl": "https://s3-media0.fl.yelpcdn.com/bphoto/rRn9hvJb2n8Dvc3XEWhDXg/60s.jpg",
    "reviewCount": 16,
    "itemPath": "/menu/sotto-mare-san-francisco-4/item/oysters-on-half-shell"
  },
  {
    "section": "Appetizers",
    "name": "Clam on Half Shell",
    "price": "$1.50",
    "reviewCount": 3
  }
]
```

#### A question with its answers, as it appears inside `questions`

```json
{
  "questionId": "P7A9MlZSlBXaM5dyapwBQA",
  "question": "How to do the reservation?",
  "askedBy": "David C.",
  "platform": "iphone",
  "answerCount": 4,
  "answers": [
    {
      "answerId": "-ElbFOze65IPFkDqpnwwGw",
      "text": "You have to call them for rezzies. Leave a vmail and they'll return your call.",
      "authorName": "Cherylynn N.",
      "helpfulVotes": 1,
      "publishedAt": "2026-06-04T03:01:27Z"
    }
  ]
}
```

### How much does it cost to scrape Yelp?

Pay per event — no monthly fee, no platform usage charges on top. Prices drop on every paid Apify plan.

| Event | Free plan | Paid plans (from) | When it is charged |
|---|---|---|---|
| **Business profile** | $0.006 | **$0.004** | Per business returned, with all 60+ fields |
| **Review** | $0.0007 | **$0.0004** | Per review returned |
| **E-mail & social lookup** | $0.0015 | **$0.0009** | Only when a business has a website to check |
| **Menu** | $0.006 | **$0.004** | Once per business, covering every menu item |
| **Questions & answers** | $0.003 | **$0.0019** | Once per business, covering every question |
| **Extra photos page** | $0.0045 | **$0.003** | Only beyond the ~40 photos that come with the profile |
| Actor start | $0.001 | $0.0001 | Once per run |

#### What that costs in practice

| Job | Calculation (paid plans) | Free plan | Paid plans |
|---|---|---|---|
| 1,000 businesses, no e-mail lookup | 1,000 × $0.004 | $6.00 | **$4.00** |
| 1,000 businesses + e-mails & socials | 1,000 × ($0.004 + $0.0009) | $7.50 | **$4.90** |
| 1,000 businesses + 20 reviews each | 1,000 × $0.0049 + 20,000 × $0.0004 | $21.50 | **$12.90** |
| 10,000 reviews from 50 businesses | 50 × $0.004 + 10,000 × $0.0004 | $7.30 | **$4.20** |
| 100 restaurants + menus + Q\&A + e-mails | 100 × ($0.004 + $0.0009 + $0.004 + $0.0019) | $1.65 | **$1.08** |

**On the free plan**, Apify's $5 monthly credits cover roughly **660 businesses with e-mails**, **833 businesses** without the lookup, or **~7,000 reviews** — every month, no card required.

**Cheaper than it looks when you want reviews.** Most Yelp tools price business data and review data as two separate actors, so a business plus 20 reviews means two runs and two bills. Here it is one run: a business with 20 reviews costs **$0.012** on a paid plan.

Three things keep the bill honest:

- **Failed rows are never charged.** A listing that cannot be extracted returns a row explaining why, for free.
- **Add-ons are skipped when there is nothing to fetch** — no website means no e-mail charge, no Yelp menu means no menu charge, no Q\&A means no Q\&A charge.
- **Set Max total charge** in the run options and the scraper stops cleanly at your limit, keeping everything already collected.

All of it is all-inclusive: the price above is the whole price.

### Integrations

Connect Yelp data to whatever you already use — no glue code:

- **Google Sheets** — push new rows straight into a spreadsheet
- **Make** and **Zapier** — trigger on run finish and fan out to 5,000+ apps
- **n8n** — self-hosted automation with the Apify node
- **Slack** and **email** — get notified when a run finishes
- **Webhooks** — POST the dataset to your own endpoint the moment a run completes
- **API clients** for [Python](https://docs.apify.com/api/client/python/) and [JavaScript](https://docs.apify.com/api/client/js/) — start runs and read datasets from your own code
- **Schedules** — run the same input hourly, daily or weekly to track ratings and new reviews over time

### Use with AI agents (MCP)

This actor works as a tool for LLM agents through the **Apify MCP server** — point Claude, Cursor, VS Code or any MCP-capable client at `https://mcp.apify.com` and the agent can call it directly.

Then just ask:

> "Find the 20 top-rated plumbers in Austin, TX on Yelp, get their e-mail addresses and phone numbers, and give me a table sorted by rating."

The agent picks the input, runs the actor and reads the dataset back on its own.

### Real-time API (Standby mode)

Need Yelp data inside a request instead of a batch run? The Actor also runs in **Standby mode** — a always-warm HTTP service that answers with JSON directly, no run to start and no dataset to poll. The **Standby** tab on this page renders the full OpenAPI 3 schema and lets you fire requests from the browser.

| Endpoint | What it returns |
|---|---|
| `GET /search?searchTerm=plumber&location=San+Francisco,+CA&limit=10` | Full business profiles for a search |
| `GET /business?url=https://www.yelp.com/biz/sotto-mare-san-francisco-4` | One business by URL, alias or business id |
| `GET /reviews?url=sotto-mare-san-francisco-4&limit=20&sort=DATE_DESC` | A flat list of reviews for one business |
| `GET /` | Service info and the current limits |

Every input option works as a query parameter — `includeEmails`, `maxReviews`, `maxPhotos`, `maxQuestions`, `includeMenu`, `includeNotRecommended`, `sort`, `ratings`, `language`:

```bash
curl "https://pro100chok--yelp-scraper.apify.actor/search?searchTerm=dentist&location=Chicago,+IL&limit=5&includeEmails=true"   -H "Authorization: Bearer $APIFY_TOKEN"
```

```json
{
  "searchTerm": "dentist",
  "location": "Chicago, IL",
  "count": 5,
  "data": [ { "name": "…", "email": "…", "phone": "…", "rating": 4.6 } ]
}
```

Because a Standby call has to answer inside one HTTP request, its limits are lower than a batch run: **50 businesses per search, 200 reviews, 60 photos, 10 questions**, and 270 seconds per request. Anything bigger belongs in a normal run. Pricing is identical — the same pay-per-event charges, so you are never billed twice for the same data.

### Popular use cases

- **Lead generation** — build outbound lists of local businesses with a real e-mail address, phone and website, filtered by category, city and rating
- **Local SEO agencies** — audit which prospects have unclaimed listings, no website or a sub-4.0 rating, and pitch them
- **Reputation management** — track new reviews for your own locations, including the ones Yelp hides, and alert on 1- and 2-star arrivals
- **Restaurant and hospitality intelligence** — menu pricing, popular dishes, health inspection history and amenity coverage across a metro area
- **Competitor benchmarking** — rating, review velocity, price band, amenities and sponsored status for every rival in a category
- **Market research** — category density and price distribution by neighbourhood before choosing a location
- **Data enrichment** — match a CRM list against Yelp by URL or alias and fill in hours, categories, coordinates and contacts
- **Sentiment analysis and NLP** — thousands of full-text reviews with author metadata, ready for a model
- **Academic research** — reproducible review corpora with rating distributions and reviewer profiles

### Is it legal to scrape Yelp?

Scraping publicly available data is generally legal, and this actor only reads pages any visitor can see — no login, no private data, nothing behind an account.

Reviews and reviewer profiles do contain **personal data** (display names, locations, profile photos), which is protected by the **GDPR** in the EU, the **CCPA** in California, and similar rules elsewhere. You should not scrape or store personal data without a legitimate reason, you are the data controller for whatever you collect, and you should keep only the fields you actually need with a sensible retention policy. If you are unsure, take legal advice.

In the United States, the Ninth Circuit's ruling in *hiQ Labs v. LinkedIn* held that scraping data that is publicly accessible — with no login required — does not violate the Computer Fraud and Abuse Act. That is the category this actor operates in, though it is not legal advice and says nothing about how you may then use personal data.

For a fuller picture, read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/).

### Troubleshooting

#### Getting fewer businesses than Max businesses per search?

Yelp serves at most **240 results per search query**, and a narrow term in a small town may have far fewer. Split the search by postcode, neighbourhood, category or keyword — each pair gets its own budget. Duplicates across searches are removed before billing.

#### Getting fewer reviews than the business shows?

The count on the Yelp page includes reviews Yelp filters out of the main feed. Turn on **Include not-recommended reviews** to collect those too. Also check whether **Only these star ratings** is set — it silently narrows the feed.

#### A run returned no results at all

Check that **Locations** is filled in whenever you use search terms or categories — Yelp has no worldwide search, and a term with no location cannot run. If you pasted URLs, make sure they are business or search URLs (`/biz/…` or `/search?…`), not user profiles or collections.

#### Some fields are empty

That is Yelp, not the scraper — see [Which fields are always there?](#which-fields-are-always-there). Empty values are omitted, so a missing key means Yelp published nothing there.

#### The run cost more than expected

Reviews are the usual reason: **Max reviews** applies *per business*, so 100 businesses × 50 reviews is 5,000 review events. Set **Max total charge** in the run options to cap any run, and switch add-ons off in the input if you do not need menus, Q\&A or extra photos.

### FAQ

#### Does Yelp have a public API?

Yes — the Yelp Fusion API — but it is restrictive. It requires an approved developer app, and its reviews endpoint returns "up to three review excerpts for a business" rather than full review text. This actor needs no key and has no 3-review ceiling.

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

No. No key, no login, no cookies. Paste a search term or a URL and run it.

#### Do I need to set up proxies?

No. Proxy rotation and anti-bot handling are built in and included in the price. The default configuration is the right one for almost everyone.

#### How many businesses can I scrape from one search?

Yelp itself serves at most 240 results per search query. To collect more, split the search by neighbourhood, postcode, category or keyword — see [How to get more than 240 results](#how-to-get-more-than-240-results-from-yelp).

#### Can I scrape all reviews of a Yelp business?

Yes. Set **Max reviews** as high as you need; review pages are fetched in parallel, so even a business with several thousand reviews finishes quickly. For very large pulls use **Reviews** mode, which writes one row per review.

#### Can I get Yelp business e-mail addresses?

Yes — this is the actor's main differentiator. It reads the business's own website and extracts e-mail addresses plus seven social networks. Yelp never publishes an e-mail itself, so no Yelp-only scraper can give you one.

#### Why did I get fewer results than the number I asked for?

Three usual reasons: Yelp's 240-per-search ceiling, a business genuinely having fewer reviews than your **Max reviews** value, or a narrow search that Yelp simply has few matches for. Splitting the search by location or category is the fix.

#### Why are some fields empty or missing?

Because Yelp does not have them. Health inspections exist only where authorities publish them, menus only for food businesses, licences mostly for trades, `yearEstablished` only when the owner filled it in. Empty fields are omitted rather than returned as `null`, so CSV exports stay clean.

#### Will I be charged for URLs that return nothing?

No. A listing that cannot be extracted returns a row explaining why and is not charged. Add-ons you enabled are also skipped — and not charged — when Yelp has nothing to give.

#### Can I export Yelp data to CSV or Excel?

Yes. Every run's dataset downloads as CSV, Excel, JSON, JSONL, XML or HTML, or you can read it from the API. Records are flat single-level objects, so a CSV opens in Excel or Google Sheets with no cleanup.

#### Why is the row count different from Max businesses per search?

In **Businesses** mode it is not: 20 businesses means 20 rows, because reviews, menus, photos and Q\&A are nested inside each row. Only **Reviews** mode produces one row per review.

#### Can I scrape Yelp in a language other than English?

Yes — 27 output languages, chosen with **Results language**. Categories, amenities and opening hours come back in that language while the business data itself is unchanged, and every URL stays a `www.yelp.com` link.

#### Can I scrape United States businesses?

Yes, and it is the default. Business data for US listings is the most complete Yelp has: phone in US format, US address, `$`-based price bands, coordinates and health inspections.

#### What is the difference between recommended and "not recommended" reviews?

Yelp's software filters some reviews out of a business's main feed and its visible rating, parking them behind a "not recommended" link. Turn on **Include not-recommended reviews** and they arrive in their own `notRecommendedReviews` array — often the more candid half of the feedback.

#### Can I monitor a business for new reviews automatically?

Yes. Save your input as a task and attach an Apify **Schedule** (hourly, daily, weekly), then use a webhook or the Slack/email integration to be notified. Sort by newest first so each run starts with the latest reviews.

#### Can I scrape a Yelp search URL with filters already applied?

Yes. Apply the filters you want in your browser, copy the URL from the address bar and paste it into **Direct Yelp URLs** — the filters are preserved and every result is scraped.

#### Can I call this as a live API instead of starting a run?

Yes — see [Real-time API (Standby mode)](#real-time-api-standby-mode). The Actor keeps an HTTP server warm and answers `GET /search`, `GET /business` and `GET /reviews` with JSON in the response body. The **Standby** tab on this page documents every parameter and can send test requests for you.

#### Can I use this from Python or JavaScript?

Yes. Start runs and read datasets with the [Apify Python client](https://docs.apify.com/api/client/python/) or the [JavaScript client](https://docs.apify.com/api/client/js/), or call the REST API directly.

### Feedback & support

Found a bug, a missing field, or a filter you need? Open a ticket on the **Issues** tab of this actor — include your run URL and the input you used, and it gets looked at quickly. Feature requests are welcome; several fields in the list above started as user requests.

### More scrapers by Raven

**Local business & reviews**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-w0yugQzf3ETbRbAC2-ehi6JwVR72-ae55cffc-cd6e-481f-bb22-f89a349f7287.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Google Maps Scraper](https://apify.com/pro100chok/google-maps-scraper)** — Places, emails, reviews, photos
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-1X9ZSt3urlN5pptAO-Nyu91cUNLw-9d50dd18-fb66-400e-85c7-413263018bd8.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Website Contact Scraper](https://apify.com/pro100chok/extract-emails)** — Bulk emails, phones, socials
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-lFLILoeJarJWgpyfA-7BP7SUkgSm-50326886-1a52-4c64-bd8d-be2556872aa9.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Trustpilot Scraper](https://apify.com/pro100chok/trustpilot-all-in-one-scraper)** — Reviews, companies, TrustScore
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-caoIAzJRQpPYIg12M-tRWDnGB6Xs-7d9d7a8f-dbff-412c-b8ee-789318d445f2.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[TripAdvisor Scraper](https://apify.com/pro100chok/tripadvisor-all-in-one)** — Hotels, restaurants, reviews
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Jwxb2NnpjBqbwi3JH-4dKwhMiZZZ-5d4c5e15-276d-4891-af28-db4e69ee7c77.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[G2 Scraper](https://apify.com/pro100chok/g2-scraper)** — Software reviews and competitors
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-ndx8v7vE2UZLdaPh3-NC4fnRCqgk-da7cb5e3-a110-4774-9f5a-0672d4a60ccf.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Booking.com Scraper](https://apify.com/pro100chok/booking-all-in-one-scraper)** — Hotels, prices, reviews

**SEO & web intelligence**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-pC8gsptNv2RwJm0QE-W9y7YrikQ2-Gemini_Generated_Image_sweylvsweylvswey.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Ahrefs SEO Scraper](https://apify.com/pro100chok/ahrefs-seo-tools)** — DR, backlinks, keywords
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-9FWL3X6mVI2izVfeJ-4DKlEMxqE4-26ac0cec-e6fd-4020-abbb-d4d8885f3bf1.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Semrush Scraper](https://apify.com/pro100chok/semrush-scraper)** — Traffic, authority, backlinks
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-aqPbs3KeH9aD8b22w-7uDzdHiNaF-9358b53b-cd06-42f2-bc53-6c5ac7d9558c.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[SimilarWeb Scraper](https://apify.com/pro100chok/similarweb-scraper)** — Website traffic and rankings
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-3INlwRjD5teX8k2Xd-7pqry4x2wP-ff4c675d-3247-4187-a7b5-44dde2e01f49.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Google Jobs Scraper](https://apify.com/pro100chok/google-jobs-scraper)** — Salaries, apply links

**Social media & ads**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-7fyOP12UzHR5Zlnc5-j1W3HZr7l6-cba15940-85de-4f61-b150-a2401b420876.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Instagram Scraper](https://apify.com/pro100chok/instagram-scraper-all-in-one)** — Profiles, posts, comments
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-JqqB6QS6amqcpfgE3-BLZ8dE1o0T-5ca2b9db-4363-49b9-839f-c0fc336567a0.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[TikTok Profile Scraper](https://apify.com/pro100chok/tiktok-profile-pro)** — Profiles, contacts, analytics
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-ZgqqqOMdHEIwgTqnj-lmCG4i7xP0-76e561e2-9f4d-44a2-aa6d-922b86e2833f.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[YouTube Scraper](https://apify.com/pro100chok/youtube-scraper-all-in-one)** — Videos, transcripts, comments
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Uj3ZMPy7TF7mva0cS-8PeAb55WaO-f7a3aba8-97a5-40be-b4c0-aa0d29819722.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Reddit Scraper](https://apify.com/pro100chok/reddit-scraper-all-in-one)** — Posts, comments, subreddits
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-ghOKnIbTDC0SWZw8d-u6S7UJLN3o-Gemini_Generated_Image_67uo2167uo2167uo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Threads Scraper](https://apify.com/pro100chok/threads-scraper-usage)** — Posts, profiles, replies
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-whxpPO8sOs8OF6dd0-3xUlLeWRav-92d40d46-7a32-4031-bf05-04b3338d5b30.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Pinterest Scraper](https://apify.com/pro100chok/pinterest-scraper-all-in-one)** — Pins, profiles, boards
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Z01iuGOkBqJUvTaUn-xpWgbgKXLn-8ae33b0d-b338-4184-a1cd-2565a3f82a98.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Facebook Ads Library](https://apify.com/pro100chok/meta-ads-library-scraper)** — Meta and Instagram ad spy

**E-commerce**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-kaoNl8Aod80TyV1eZ-HMK8j1Pfit-6e72a428-ec01-4d5e-b2fa-80fc6313a008.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Amazon Scraper](https://apify.com/pro100chok/amazon-scraper)** — Products, reviews, sellers
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-mBQQG1GlbZlkcetR5-eMoPkpmd5b-71e03f8b-8565-41c8-8fc8-fe73a3dd6f12.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[AliExpress Scraper](https://apify.com/pro100chok/aliexpress-scraper)** — Products, variants, sellers
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-BVortsfndmSNtL0Mq-dikv6hX55m-4b204a93-b28c-4951-aa28-d72b1650900c.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Alibaba Scraper](https://apify.com/pro100chok/alibaba-scraper)** — Products, suppliers, prices
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-FzXXmis0AF2EYyyii-53r5wDrRmH-5ed275b8-951f-4995-a100-189ea3a131d0.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[TikTok Shop Scraper](https://apify.com/pro100chok/tiktok-shop-scraper-usage)** — Products and shop analytics
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-r3YXQ95TB2FiMAMDE-hLw7rKePQh-5fb846a2-1b5c-4ebf-ac90-dce3c1e1bcb8.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[RedNote Scraper](https://apify.com/pro100chok/rednote-xiaohongshu-scraper)** — Notes, creators, comments

**Real estate**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Z8DnUeXHDZ8h3bwz5-GDpI3VmWWb-a7fb663b-39ca-4e6b-a8aa-579b94bee1b1.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Zillow Scraper](https://apify.com/pro100chok/zillow-scraper-all-in-one)** — Listings and agent leads
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-vness86lujcu7VTrh-auosYMY7dG-d2bc6ff1-0fba-4ff7-850b-ad33072e09f0.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Realtor.com Scraper](https://apify.com/pro100chok/realtor-com-scraper)** — Listings, agents, reviews
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-2bXBHs5BF7iBki2rV-8EhrRpAVWj-c84534b4-ba6f-4d40-8d93-801e9658109b.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Apartments.com Scraper](https://apify.com/pro100chok/apartments-scraper-usage)** — Rentals, prices, reviews
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/2nh2cdeW87EFLjZmA-actor-Z2kaPRD9dlPAfA95f-87i0TUrkQC-cb5e7474-9c72-45e9-ad20-1c1140238495.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **[Idealista Scraper](https://apify.com/pro100chok/idealista-scraper)** — Properties and agency contacts

**Tags:** Yelp Scraper · Yelp API · Yelp API alternative · Yelp business scraper · Yelp reviews scraper · Yelp data extraction · Yelp email scraper · Yelp leads · Yelp menu scraper · local business data · lead generation · local SEO · reputation management · sentiment analysis · competitor analysis · web scraping · restaurant data · business listings · contact scraper · market research

# Actor input Schema

## `scrapeType` (type: `string`):

Businesses gives one dataset row per company - contacts, hours, amenities, photos, ratings - with its reviews, menu and Q\&A nested inside that row, so the row count always matches the number of businesses you asked for. Reviews gives the flat shape instead: one row per review, handy for text analysis. Both modes accept the same search terms and URLs.

## `searchTerms` (type: `array`):

Keywords to search on Yelp, for example "plumber", "italian restaurant", "dentist". Every term is searched in every location below. Leave empty if you only use direct URLs. Yelp returns up to 240 businesses per combination.

## `locations` (type: `array`):

Cities, regions or postcodes to search in, for example "San Francisco, CA", "London, United Kingdom", "Warsaw, Poland". Required whenever you use search terms or categories - Yelp has no worldwide search.

## `categories` (type: `array`):

Yelp category aliases such as "restaurants", "plumbers", "dentists" or "homeservices". Use these instead of free-text search terms to match Yelp's own category pages exactly. The alias is the value after find\_desc or cflt in a Yelp URL.

## `directUrls` (type: `array`):

Yelp business URLs (https://www.yelp.com/biz/...), business aliases, or Yelp search result URLs from any Yelp domain. Search URLs are expanded into all of their results, and filters already applied in a search URL are kept. Works alongside or instead of the keyword search above.

## `maxResults` (type: `integer`):

How many businesses to return for each search term and location pair. Yelp itself serves at most 240 results per search, so use several locations or categories to collect more.

## `yelpDomain` (type: `string`):

Language of the results and which Yelp site the listings are read from. This does NOT limit coverage: businesses in every country, the United States included, are scraped whichever option you pick - only the wording of categories, amenities and opening hours changes, and every URL in the output is a www.yelp.com link. Pick United States or United Kingdom for English.

## `includeEmails` (type: `boolean`):

Visits each business's own website and extracts e-mail addresses plus Facebook, Instagram, X, LinkedIn, YouTube, TikTok and Telegram links. Yelp never publishes e-mails, so this is what turns a listing into a usable sales lead. Businesses with no website cost nothing extra.

## `maxPhotos` (type: `integer`):

How many photo URLs to return for each business. Around 40 come free with the profile; higher values fetch extra photo pages. Set to 0 to skip photos entirely.

## `maxQuestions` (type: `integer`):

How many community questions with their answers to return for each business, up to 10 - that is everything Yelp publishes without a logged-in session. Set to 0 to skip.

## `includeMenu` (type: `boolean`):

Adds the full Yelp menu for restaurants and food businesses - section, item name, price, description, photo and per-item review count. Businesses without a Yelp menu cost nothing extra.

## `includeAds` (type: `boolean`):

Also return businesses Yelp shows as sponsored placements in search results. Off by default so you get the organic ranking only, which also keeps searches cheaper.

## `maxReviews` (type: `integer`):

How many reviews to collect for each business. Set to 0 for no reviews. In Businesses mode they are nested inside the business row, so this does not change the number of rows; in Reviews mode each review is its own row.

## `reviewsSort` (type: `string`):

Order in which reviews are collected. Newest first is the usual choice for monitoring; Yelp sort is what a visitor sees on the page.

## `reviewRatings` (type: `array`):

Limit reviews to the selected star ratings, for example only 1 and 2 stars to study complaints. Leave empty for all ratings.

## `includeNotRecommendedReviews` (type: `boolean`):

Also collect the reviews Yelp hides behind its "not recommended" link. These never count towards the visible rating and are useful when auditing a business's real feedback. They arrive in a separate notRecommendedReviews array and are capped by Max reviews as well.

## `proxyConfiguration` (type: `object`):

Proxy used to reach Yelp. Residential proxy is strongly recommended and is the default - Yelp blocks datacenter addresses. You can also supply your own proxies on the Custom proxies tab.

## Actor input object example

```json
{
  "scrapeType": "search",
  "searchTerms": [
    "plumber"
  ],
  "locations": [
    "San Francisco, CA"
  ],
  "maxResults": 20,
  "yelpDomain": "www.yelp.com",
  "includeEmails": true,
  "maxPhotos": 20,
  "maxQuestions": 0,
  "includeMenu": false,
  "includeAds": false,
  "maxReviews": 20,
  "reviewsSort": "RELEVANCE_DESC",
  "includeNotRecommendedReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Business profiles with rating, contacts and location.

## `contacts` (type: `string`):

E-mails, phone numbers, websites and social profiles.

## `reviews` (type: `string`):

Review text with ratings, authors and owner replies.

## `hoursAmenities` (type: `string`):

Opening hours, amenities, highlights and health inspections.

## `menus` (type: `string`):

Menu sections, items and prices.

# 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 = {
    "scrapeType": "search",
    "searchTerms": [
        "plumber"
    ],
    "locations": [
        "San Francisco, CA"
    ],
    "maxResults": 20,
    "yelpDomain": "www.yelp.com",
    "maxPhotos": 20,
    "maxReviews": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("pro100chok/yelp-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 = {
    "scrapeType": "search",
    "searchTerms": ["plumber"],
    "locations": ["San Francisco, CA"],
    "maxResults": 20,
    "yelpDomain": "www.yelp.com",
    "maxPhotos": 20,
    "maxReviews": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("pro100chok/yelp-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 '{
  "scrapeType": "search",
  "searchTerms": [
    "plumber"
  ],
  "locations": [
    "San Francisco, CA"
  ],
  "maxResults": 20,
  "yelpDomain": "www.yelp.com",
  "maxPhotos": 20,
  "maxReviews": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call pro100chok/yelp-scraper --silent --output-dataset

```

## MCP server setup

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