# Yelp Business Scraper — Details, Contacts & Reviews (`genial_candlestand/yelp-business-scraper`) Actor

Get Yelp businesses with rating, reviews count, phone, website, address, coordinates, hours and amenities, plus optional reviews. Search terms × locations worldwide or Yelp URLs. No login, $2.25 per 1,000 businesses.

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

## Pricing

Pay per event

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

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

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

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Yelp Business Scraper — Details, Contacts & Reviews

Get Yelp businesses with their rating, reviews count, categories, price range, phone, website, address, coordinates, opening hours and amenities. Search by term and location anywhere in the world, or paste Yelp business and search URLs. Optionally add each business's reviews (text, stars, date, language, reviewer display name, owner reply) to the same row.

### What does it do?

You give search terms and locations (for example "pizza" in "San Francisco, CA"), or Yelp URLs. The actor returns one flat dataset row per business with full details taken from the business page, not just the search snippet. If you set a number of reviews, each row also carries a `reviews` array.

It is built for lead generation teams, location and market analysts, reputation and agency teams, and AI agents that look up one business by URL or the top N for a term in a city. No Yelp login and no residential proxy are needed; the default Apify datacenter proxy works.

### How to use

1. Open the actor in Apify Console and click **Try for free**.
2. Enter **Search terms** and **Locations**, or paste **Start URLs** (Yelp business or search URLs).
3. Set **Max businesses per search** and, if you want reviews, **Max reviews per business**.
4. Click **Start** and download the dataset as JSON, CSV or Excel.

You can also run it through the Apify API, the Apify client libraries or the Apify MCP server, with the same input as below.

### Pricing

Pay per event:

| Event | Price | Per 1,000 |
|---|---|---|
| Business (one row with full details) | $0.00225 | $2.25 |
| Review (only when you ask for reviews) | $0.0003 | $0.30 |
| Actor start | $0.00005 | – |

Businesses that are not found are free. Example: 500 businesses without reviews cost about $1.13; 100 businesses with 20 reviews each cost about $0.23 + $0.60 = $0.83.

### Input

| Field | What it does |
|---|---|
| `queries` | Search terms, one per line. Every term is searched in every location. |
| `locations` | City, neighbourhood or ZIP code, worldwide. Required with search terms. |
| `startUrls` | Yelp business URLs or search URLs (must contain `find_loc`). |
| `maxResultsPerSearch` | Businesses per search, 1–240 (default 50). Sponsored results are skipped. |
| `maxItems` | Total businesses in the run (default 1000). |
| `sortBy` | `recommended`, `rating` or `review_count`. |
| `priceLevels` | Only `1`–`4` ($ to $$$$). |
| `maxReviews` | Reviews per business, 0–2000 (default 0 = none). |
| `reviewsSort` | `newest`, `oldest`, `highest`, `lowest`, `relevance`. |
| `reviewsLanguage` | Two-letter code such as `en`, or `all`. |
| `reviewsRatings` | Only reviews with these star ratings, e.g. `["1","2"]`. |

```json
{
  "queries": ["pizza"],
  "locations": ["San Francisco, CA"],
  "maxResultsPerSearch": 50,
  "sortBy": "rating",
  "maxReviews": 20,
  "reviewsSort": "newest"
}
```

### Output

| Field | Description |
|---|---|
| `title`, `url`, `id`, `alias` | Business name and identifiers |
| `rating`, `reviewsCount`, `priceRange` | Stars, number of reviews, price level |
| `category`, `categories` | Main and all categories |
| `phone`, `website`, `menuUrl` | Contacts |
| `address`, `street`, `city`, `region`, `postalCode`, `country`, `latitude`, `longitude` | Location |
| `hours`, `isClosed`, `isClaimed`, `isAdvertiser` | Opening hours and status |
| `amenities`, `healthScore`, `yearEstablished`, `description` | Extra details |
| `query`, `searchLocation`, `position` | Which search found it, and its rank |
| `reviews` | Optional array: `rating`, `text`, `language`, `publishedAt`, `author`, `authorLocation`, `helpfulCount`, `ownerReply` |

Example (shortened):

```json
{
  "url": "https://www.yelp.com/biz/tonys-pizza-napoletana-san-francisco",
  "title": "Tony's Pizza Napoletana",
  "rating": 4.2,
  "reviewsCount": 9051,
  "priceRange": "$$",
  "categories": ["Pizza", "Italian", "Cocktail Bars"],
  "phone": "(415) 835-9888",
  "website": "http://www.tonyspizzanapoletana.com",
  "address": "1570 Stockton St, San Francisco, CA 94133, United States",
  "latitude": 37.800389,
  "longitude": -122.409033,
  "hours": ["Mon: 12:00 PM - 10:00 PM", "Tue: 12:00 PM - 10:00 PM"],
  "isClaimed": true,
  "healthScore": "Pass",
  "query": "pizza",
  "searchLocation": "San Francisco, CA",
  "position": 1,
  "reviews": [
    {
      "rating": 4,
      "language": "en",
      "publishedAt": "2026-10-24T06:27:46Z",
      "author": "Tanya D.",
      "authorLocation": "Elk Grove, United States",
      "helpfulCount": 0,
      "ownerReply": null
    }
  ]
}
```

### Use cases

- **Lead lists:** phone, website and address of local businesses by category and city.
- **Market analysis:** compare ratings, price levels and business density per area.
- **Reputation monitoring:** the newest or lowest-rated reviews of your clients and competitors (`reviewsRatings` of 1 and 2).
- **Location research:** coordinates, neighbourhoods and opening hours for mapping.
- **AI agents:** look up one business by URL, or the top N for a term in a city.

### Limitations

- Yelp returns at most 240 businesses per search. Split big cities into neighbourhoods or ZIP codes.
- Locations are required with search terms; without them the run stops with an input error.
- Fields such as `website`, `priceRange`, `menuUrl` and `healthScore` are empty when Yelp does not show them. Businesses without a price level are dropped when you filter by price.
- Text fields (hours, categories, amenities) can come in a local language for some businesses.
- Reviewers appear only by the display name Yelp prints publicly (for example "Kate H.") and their display location; no profile URLs or photos.
- The actor depends on Yelp's public pages; if Yelp changes its protection, runs may fail.

### FAQ

**Is it legal to scrape Yelp?**
The actor collects only public business data visible without a login. You are responsible for how you use it, including compliance with Yelp's terms and data protection law. Reviewer names are personal data; use them accordingly.

**Do I need a login or residential proxy?**
No. The default Apify datacenter proxy is enough.

**Can I get reviews only?**
Reviews are attached to business rows; set `maxReviews` and pass the business URLs in `startUrls`.

**Why is my result count lower than expected?**
Yelp caps a search at 240 businesses, and sponsored results are skipped.

### Other actors

Other public data actors from the same author:

- [Google Play Reviews Scraper](https://apify.com/genial_candlestand/google-play-reviews-scraper) — app reviews with star rating, text, date and developer reply.
- [Google Trends Scraper](https://apify.com/genial_candlestand/google-trends-scraper) — interest over time, by region and related queries.
- [Google Ads Transparency Scraper](https://apify.com/genial_candlestand/google-ads-transparency-scraper) — ads of any domain or advertiser.

# Actor input Schema

## `queries` (type: `array`):

What to search for on Yelp, one per line, e.g. "pizza" or "plumbers". Each term is searched in every location, so Locations is required.

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

City, neighbourhood or ZIP code, one per line, e.g. "San Francisco, CA" or "Paris, France". Yelp returns at most 240 businesses per search; use neighbourhoods or ZIP codes for big cities.

## `startUrls` (type: `array`):

Yelp business URLs (https://www.yelp.com/biz/<name>) or Yelp search URLs (https://www.yelp.com/search?find_desc=pizza\&find_loc=Austin%2C+TX) from any Yelp country site. A search URL must contain find_loc; its own sort and price filters are used, the Sort and Price fields below do not apply to it. Other URLs are rejected with an input error.

## `maxResultsPerSearch` (type: `integer`):

How many businesses to take from each search (each search term × location, and each search URL), in Yelp's order. Sponsored results are skipped. Yelp shows at most 240 per search.

## `maxItems` (type: `integer`):

Stop after this many businesses in the whole run (across all searches and URLs). Each business is one charged result.

## `sortBy` (type: `string`):

Order of search results for Search terms × Locations: Yelp's recommended order, highest rated first, or most reviewed first. Does not apply to Start URLs.

## `priceLevels` (type: `array`):

Only businesses with one of these Yelp price levels ($ to $$$$), for Search terms × Locations. Leave empty for all. Mostly for restaurants and shops: businesses without a price level (plumbers, doctors) are dropped by Yelp, so a filtered service search returns very few results. Does not apply to Start URLs.

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

Reviews to add to each business. 0 = none (cheapest). Each review is charged separately.

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

Which reviews to take first when Max reviews per business is above 0: newest, oldest, highest rated, lowest rated, or Yelp's most relevant.

## `reviewsLanguage` (type: `string`):

Two-letter language code of the reviews to take, e.g. "en", "fr", "ja"; or "all" for every language (English first, then the other languages by number of reviews). Used only when Max reviews per business is above 0.

## `reviewsRatings` (type: `array`):

Only reviews with these star ratings, e.g. 1 and 2 to collect complaints. Leave empty for all ratings. Used only when Max reviews per business is above 0.

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

Proxy for requests to Yelp. The default Apify datacenter proxy works; residential proxy is not needed and only makes the run slower.

## Actor input object example

```json
{
  "queries": [
    "pizza"
  ],
  "locations": [
    "San Francisco, CA"
  ],
  "maxResultsPerSearch": 50,
  "maxItems": 1000,
  "sortBy": "recommended",
  "priceLevels": [],
  "maxReviews": 0,
  "reviewsSort": "newest",
  "reviewsLanguage": "all",
  "reviewsRatings": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `businesses` (type: `string`):

Dataset with one item per business (details and, if requested, its reviews)

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

The businesses in the Overview view (name, rating, reviews, category, price, phone, website, address)

# 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 = {
    "queries": [
        "pizza"
    ],
    "locations": [
        "San Francisco, CA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("genial_candlestand/yelp-business-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 = {
    "queries": ["pizza"],
    "locations": ["San Francisco, CA"],
}

# Run the Actor and wait for it to finish
run = client.actor("genial_candlestand/yelp-business-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 '{
  "queries": [
    "pizza"
  ],
  "locations": [
    "San Francisco, CA"
  ]
}' |
apify call genial_candlestand/yelp-business-scraper --silent --output-dataset

```

## MCP server setup

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