# Yelp Business Scraper (`beatanalytics/yelp-business-scraper`) Actor

Extract 25+ fields from any Yelp business — ratings, hours, photos, address, categories, and attributes. Search by query and location or look up by URL. No API key needed. Export as CSV, JSON, or Excel.

- **URL**: https://apify.com/beatanalytics/yelp-business-scraper.md
- **Developed by:** [Beat Analytics](https://apify.com/beatanalytics) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 20 total users, 18 monthly users, 93.8% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.50 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Business Scraper -- Extract Business Details & Search Results Without the API

Extract detailed business information from any Yelp listing -- no API key required, no rate limits, no 3-review data cap. Search for businesses by query and location or look up specific businesses by URL, alias, or ID. Get addresses, ratings, hours, photos, attributes, and 25+ structured data fields per business for competitive intelligence, lead generation, or market research.

Yelp Business Scraper is an Apify actor that extracts detailed business information from Yelp listings and search results, without requiring a Yelp API key. It works as a full Yelp API alternative that returns more data fields than the official Yelp Fusion API, with no authentication setup and no request limits.

Whether you need to scrape Yelp search results for an entire city, extract Yelp business data for a list of competitors, or build a local business directory from Yelp listings, this scraper handles it all. Provide search queries and locations to discover businesses, or supply direct Yelp URLs for businesses you already know. The scraper deduplicates results automatically, so businesses found through multiple inputs are only included once.

- [Why Use This Yelp Business Scraper](#why-use-this-yelp-business-scraper)
- [What Data Can You Extract from Yelp Businesses?](#what-data-can-you-extract-from-yelp-businesses)
- [How to Scrape Yelp Business Data](#how-to-scrape-yelp-business-data)
- [Input Parameters](#input-parameters)
- [Output Examples](#output-examples)
- [How Much Does It Cost to Scrape Yelp Business Data?](#how-much-does-it-cost-to-scrape-yelp-business-data)
- [Use Cases for Yelp Business Data](#use-cases-for-yelp-business-data)
- [Integrations and API Access](#integrations-and-api-access)
- [Frequently Asked Questions](#frequently-asked-questions)
- [Related Actors](#related-actors)

### Why Use This Yelp Business Scraper

- 🔍 **Search for businesses by query and location** -- find businesses matching any search term in any city, state, or neighborhood. Search "pizza" in "Chicago, IL" or "coffee shops" in "San Francisco, CA" and get structured data for every result.
- 🔄 **Cartesian product search** -- provide multiple search queries and multiple locations to automatically search all combinations. 5 queries and 10 locations means 50 searches in a single run.
- 🔗 **Direct business lookup by URL, alias, or ID** -- already have a list of Yelp business pages? Paste URLs like `https://www.yelp.com/biz/the-old-fashioned-madison`, aliases like `the-old-fashioned-madison`, or Yelp business IDs directly.
- 🧩 **Combine search and direct lookup** -- use both search and direct URLs in the same run. The scraper merges all results and deduplicates automatically.
- ⚡ **No API key required** -- unlike the Yelp Fusion API, you do not need to register an app, request API keys, or manage OAuth tokens. Just add your inputs and click Start.
- 🔓 **No rate limits** -- the Yelp Fusion API enforces strict daily request quotas. This scraper has no such limits. Scrape hundreds or thousands of businesses in a single run.
- 📊 **25+ data fields per business** -- extract more data than the Fusion API returns, including business attributes (Wi-Fi, outdoor seating, reservations), health inspection scores, photo URLs, menu links, and machine-readable hours.
- 💾 **Export as JSON, CSV, Excel, XML, or HTML** -- download your scraped Yelp data in whichever format your workflow requires. Apify supports all five formats out of the box.
- 🛡️ **Automatic deduplication** -- businesses found through multiple search queries or inputs are included only once in the output, so you never pay for or process duplicate records.
- 🌐 **Full Yelp API alternative** -- use this scraper anywhere you would use the Yelp Fusion API, but with more data, fewer restrictions, and zero configuration overhead.

### What Data Can You Extract from Yelp Businesses?

The Yelp Business Scraper extracts over 25 structured data fields for each business. Here is the complete list of every field included in the output:

**Business identity:**
- **id** -- Yelp's internal business ID (e.g. `RJNAeNA-209sctUO0dmwuA`)
- **alias** -- URL-friendly business alias/slug (e.g. `the-old-fashioned-madison`)
- **name** -- Business display name
- **url** -- Direct link to the Yelp business page

**Location and geography:**
- **address** -- Street address
- **city** -- City name
- **state** -- State or province code
- **zip** -- ZIP or postal code
- **country** -- Country code (e.g. `US`)
- **latitude** -- Geographic latitude coordinate
- **longitude** -- Geographic longitude coordinate
- **neighborhoods** -- List of neighborhoods the business belongs to

**Business classification:**
- **categories** -- Business categories (e.g. "American", "Breakfast & Brunch", "Beer Bar")
- **price_range** -- Price level indicator (e.g. "$", "$$", "$$$", "$$$$")

**Contact information:**
- **phone** -- Business phone number
- **website** -- Business website URL

**Ratings and reviews:**
- **avg_rating** -- Average star rating (rounded, e.g. 4.0)
- **unrounded_avg_rating** -- Precise average rating (e.g. 4.1)
- **review_count** -- Total number of reviews on Yelp

**Hours of operation:**
- **hours** -- Machine-readable hours as minute-based intervals (useful for programmatic analysis)
- **localized_hours** -- Human-readable business hours (e.g. "Mon-Thu 11:00 am - 9:00 pm")

**Media and extras:**
- **photos** -- List of business photo URLs (full-resolution Yelp CDN links)
- **attributes** -- Business attributes like "Takes Reservations: No", "Wi-Fi: Free", "Outdoor Seating: Yes"
- **health_score** -- Health inspection result (where available)
- **health_score_url** -- Link to health inspection details
- **menu_url** -- Link to the business menu on Yelp

**Business status:**
- **is_closed** -- Whether the business is permanently closed
- **is_temp_closed** -- Whether the business is temporarily closed

**Search context (when found via search):**
- **_search.query** -- The search query that returned this business
- **_search.location** -- The location that was searched
- **_search.rank** -- Position in search results for that query and location (1-indexed)

This comprehensive field set makes the Yelp Business Scraper suitable for a wide range of data analysis tasks, from building business directories to performing competitive intelligence research to powering location-based analytics dashboards.

### How to Scrape Yelp Business Data

Getting started with the Yelp Business Scraper takes less than two minutes. Follow these five steps to extract Yelp business details:

**Step 1: Create a free Apify account**

Sign up at [apify.com](https://apify.com) if you do not have an account yet. Every new account includes $5 in free credits -- enough to scrape 2,000 Yelp business listings at no cost.

**Step 2: Open the Yelp Business Scraper**

Navigate to the [Yelp Business Scraper](https://apify.com/beatanalytics/yelp-business-scraper) actor page on the Apify Store and click "Try for free" or "Start."

**Step 3: Add your search queries, locations, or business URLs**

You have three ways to specify which businesses to scrape:

- **Search:** Enter search queries (e.g. "pizza", "plumber", "coffee shop") and locations (e.g. "New York, NY", "London, UK"). The scraper searches all combinations of queries and locations.
- **Direct URLs:** Paste one or more Yelp business page URLs, such as `https://www.yelp.com/biz/the-old-fashioned-madison`.
- **Aliases or IDs:** Enter Yelp business aliases (e.g. `the-old-fashioned-madison`) or internal Yelp business IDs.

You can combine all three methods in a single run. The scraper deduplicates results automatically.

**Step 4: Click Start**

Click the "Start" button to begin the scrape. The scraper will process your inputs, fetch business details, and push results to the dataset. You can monitor progress in real time on the run detail page.

**Step 5: Download your data in JSON, CSV, Excel, XML, or HTML**

Once the run completes, go to the Storage tab to view and download your results. Apify supports five export formats out of the box:

- **JSON** -- structured data, ideal for programmatic processing
- **CSV** -- spreadsheet-friendly, opens directly in Excel or Google Sheets
- **Excel (.xlsx)** -- native Excel format with proper column types
- **XML** -- for systems that consume XML feeds
- **HTML** -- human-readable table view

You can also access your data programmatically through the Apify API, or set up automatic exports to Google Sheets, Dropbox, Amazon S3, and other destinations.

### Input Parameters

<!-- ![Yelp Business Scraper input configuration](https://private-user-images.githubusercontent.com/10531844/590941959-d7bf305a-1171-406b-8cd0-71c7e54efb07.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Nzg1NzU0MDgsIm5iZiI6MTc3ODU3NTEwOCwicGF0aCI6Ii8xMDUzMTg0NC81OTA5NDE5NTktZDdiZjMwNWEtMTE3MS00MDZiLThjZDAtNzFjN2U1NGVmYjA3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA1MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNTEyVDA4MzgyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM3YmVlZTg4MzVmZjAwOWFjOWIzZjdmZGM2MjA0NDNiZmFmNTE4OWY3OGM2Y2MzMmM1YjVlMjcxOWI3NDI2MjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.ax8tuKJqXTdubBdixU0rXHaOJEjAaSRt182rJE9RPNA) -->

The Yelp Business Scraper accepts the following input parameters:

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQueries` | Array of strings | No | -- | Search query strings to find businesses (e.g. "pizza", "cheese curds", "plumber"). Used together with `searchLocations` -- all combinations are searched. |
| `searchLocations` | Array of strings | No | -- | Locations to search in (e.g. "Madison, WI", "Chicago, IL", "New York"). Used together with `searchQueries` -- all combinations are searched. |
| `businessUrls` | Array of URLs | No | -- | Yelp URLs of specific businesses you want details for (e.g. `https://www.yelp.com/biz/the-old-fashioned-madison`). Can be used instead of or in addition to search. |
| `businessAliasesOrIds` | Array of strings | No | -- | Business aliases (e.g. `the-old-fashioned-madison`) or Yelp business IDs. Can be used instead of or in addition to URLs and/or search. |
| `maxResultsPerSearch` | Integer | No | 10 | Maximum number of business results per search query+location combination. Increase this to get more results per search. |

**Note:** You must provide at least one of `searchQueries` (with `searchLocations`), `businessUrls`, or `businessAliasesOrIds`. You can use any combination of these inputs together -- the scraper merges and deduplicates all results automatically.

**Search example:** Setting `searchQueries` to `["pizza", "sushi"]` and `searchLocations` to `["Chicago, IL", "New York, NY"]` will run four searches: pizza in Chicago, pizza in New York, sushi in Chicago, and sushi in New York. With `maxResultsPerSearch` set to 10, this would return up to 40 unique businesses (fewer if there is overlap between searches).

### Output Examples

<!-- ![Yelp Business Scraper output data](https://private-user-images.githubusercontent.com/10531844/590942556-a3f72fe0-27d7-4675-8848-791adb1841ef.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Nzg1NzU0MDgsIm5iZiI6MTc3ODU3NTEwOCwicGF0aCI6Ii8xMDUzMTg0NC81OTA5NDI1NTYtYTNmNzJmZTAtMjdkNy00Njc1LTg4NDgtNzkxYWRiMTg0MWVmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA1MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNTEyVDA4MzgyOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZjMjQ0MmFiNjQ4ZWI4Yzc3MmEwMTI1YTRiMzZkNGUxZjYyOTQ1NjhkNTZkNmQ1NWYxZDA4NmZhMDBlMGJlNzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.bVC44FPGcfEQNN92eGSu5KKmOwQCl6RnqM7l3r5gAmA) -->

The Yelp Business Scraper outputs data in two formats: a structured JSON dataset and a flattened CSV file. You can download results in JSON, CSV, Excel, XML, or HTML from the Storage tab after each run.

#### CSV file

Business details are stored in a CSV file named `businesses.csv`. The file contains the following columns:

* `id`: Yelp business ID
* `alias`: Yelp business alias (URL slug)
* `name`: Business name
* `url`: Link to the Yelp business page
* `is_closed`: Whether the business is permanently closed
* `is_temp_closed`: Whether the business is temporarily closed
* `address`: Street address
* `city`: City
* `state`: State
* `zip`: ZIP code
* `country`: Country code
* `latitude`: Latitude
* `longitude`: Longitude
* `neighborhoods`: Neighborhoods (newline-separated)
* `categories`: Business categories (newline-separated)
* `phone`: Phone number
* `website`: Website URL
* `price_range`: Price range (e.g. "$$")
* `avg_rating`: Average star rating
* `unrounded_avg_rating`: Unrounded average star rating
* `review_count`: Number of reviews
* `localized_hours`: Human-readable business hours (newline-separated)
* `photos`: Photo URLs (newline-separated)
* `attributes`: Business attributes as "Label: Value" (newline-separated)
* `health_score`: Health inspection score
* `health_score_url`: Link to health inspection details
* `menu_url`: Link to the business menu

##### Example CSV output

```csv
id,alias,name,url,is_closed,is_temp_closed,address,city,state,zip,country,latitude,longitude,neighborhoods,categories,phone,website,price_range,avg_rating,unrounded_avg_rating,review_count,localized_hours,photos,attributes,health_score,health_score_url,menu_url
RJNAeNA-209sctUO0dmwuA,the-old-fashioned-madison,The Old Fashioned,https://www.yelp.com/biz/the-old-fashioned-madison,False,False,23 N Pinckney St,Madison,WI,53703,US,43.0761862475496,-89.3837572171967,Capitol,"American
Breakfast & Brunch
Beer Bar","(608) 310-4545",http://theoldfashioned.com/,$$,4.0,4.1,2529,"Mon-Thu 11:00 am - 9:00 pm
Fri 11:00 am - 10:00 pm
Sat 10:00 am - 10:00 pm","https://s3-media0.fl.yelpcdn.com/bphoto/n1imsZpO7rNv0aueEL52EQ/o.jpg
https://s3-media0.fl.yelpcdn.com/bphoto/K5cehQF2wsBV76sha1oGHg/o.jpg","Takes Reservations: No
Offers Delivery: Yes
Outdoor Seating: Yes
Wi-Fi: Free",No Reinspection Required,https://m.yelp.com/inspections/the-old-fashioned-madison,https://m.yelp.com/menu/RJNAeNA-209sctUO0dmwuA
````

#### Apify Dataset

The results are stored in a dataset which you can find in the Storage tab. Each item in the dataset represents a single business.

##### Example JSON output

```json
{
  "id": "RJNAeNA-209sctUO0dmwuA",
  "alias": "the-old-fashioned-madison",
  "name": "The Old Fashioned",
  "url": "https://www.yelp.com/biz/the-old-fashioned-madison",
  "is_closed": false,
  "is_temp_closed": false,
  "address": "23 N Pinckney St",
  "city": "Madison",
  "state": "WI",
  "zip": "53703",
  "country": "US",
  "latitude": 43.0761862475496,
  "longitude": -89.3837572171967,
  "neighborhoods": ["Capitol"],
  "categories": ["American", "Breakfast & Brunch", "Beer Bar"],
  "phone": "(608) 310-4545",
  "website": "http://theoldfashioned.com/",
  "price_range": "$$",
  "avg_rating": 4.0,
  "unrounded_avg_rating": 4.1,
  "review_count": 2529,
  "hours": [[660, 1260], [2100, 2700], [3540, 4140], [4980, 5580], [6420, 7080], [7800, 8520]],
  "localized_hours": [
    "Mon-Thu 11:00 am - 9:00 pm",
    "Fri 11:00 am - 10:00 pm",
    "Sat 10:00 am - 10:00 pm"
  ],
  "photos": [
    "https://s3-media0.fl.yelpcdn.com/bphoto/n1imsZpO7rNv0aueEL52EQ/o.jpg",
    "https://s3-media0.fl.yelpcdn.com/bphoto/K5cehQF2wsBV76sha1oGHg/o.jpg",
    "https://s3-media0.fl.yelpcdn.com/bphoto/ptE_UYxhabKfEztonGqHDw/o.jpg"
  ],
  "attributes": [
    {"label": "Takes Reservations", "value": "No"},
    {"label": "Offers Delivery", "value": "Yes"},
    {"label": "Outdoor Seating", "value": "Yes"},
    {"label": "Wi-Fi", "value": "Free"}
  ],
  "health_score": "No Reinspection Required",
  "health_score_url": "https://m.yelp.com/inspections/the-old-fashioned-madison",
  "menu_url": "https://m.yelp.com/menu/RJNAeNA-209sctUO0dmwuA"
}
```

### How Much Does It Cost to Scrape Yelp Business Data?

The Yelp Business Scraper uses simple, transparent per-result pricing -- you only pay for the data you get.

**$2.50 per 1,000 results** -- each business returned counts as one result, whether found via search or direct URL lookup. Deduplication happens before billing, so you never pay for the same business twice.

**Free trial:** Every new Apify account comes with $5 in free platform credits -- no credit card required. That's enough to scrape 2,000 business listings at no cost, so you can fully evaluate the scraper before committing.

**Enterprise plans:** If you need to scrape large volumes of Yelp business data on a regular basis -- thousands up to millions of listings per month -- reach out to <sales@beatanalytics.org> for custom Enterprise pricing with dedicated support and volume discounts.

### Use Cases for Yelp Business Data

Yelp business data powers a wide range of analytical, operational, and research workflows. Here are the most common use cases:

**Competitive intelligence and benchmarking**

Scrape Yelp business details for your competitors and compare ratings, review counts, price ranges, categories, and attributes side by side. Track how competitor ratings and review volumes change over time by scheduling regular scraping runs. Identify which business attributes (outdoor seating, delivery, Wi-Fi) competitors offer and you do not.

**Market research and industry analysis**

Search for all businesses in a given category and location to map the competitive landscape. Analyze the density of businesses by category, neighborhood, or price range. Use the data to identify underserved markets, trending business categories, or geographic gaps in service coverage.

**Lead generation and sales prospecting**

Extract contact information (phone numbers, website URLs) for businesses matching specific criteria. Build targeted prospect lists by searching for businesses in specific categories and locations. Use business attributes, ratings, and review counts to qualify leads and prioritize outreach.

**Real estate and location intelligence**

Analyze business density and category distribution by neighborhood to evaluate commercial real estate opportunities. Use latitude/longitude data to create heat maps of business activity. Assess the vibrancy and character of neighborhoods based on the types and quality of businesses present.

**Local SEO and business directory building**

Build comprehensive local business directories from Yelp data. Aggregate business details across multiple categories and locations to create niche industry directories. Use the data to power local search features in your own applications.

**Academic and social science research**

Study patterns in business ratings, review volumes, and category distributions across cities and regions. Analyze the relationship between business attributes and customer satisfaction. Research urban development patterns using business density and category data as proxies for economic activity.

**Business operations and supply chain**

Identify potential suppliers, vendors, or partners in specific locations. Build databases of businesses matching specific criteria for partnership or franchise development. Monitor the opening and closing status of businesses in your supply chain or competitive set.

**Data journalism and public interest reporting**

Investigate business trends, closures, and patterns across neighborhoods and cities. Analyze health inspection scores and their correlation with ratings. Report on the economic health of commercial districts using Yelp business data as a proxy.

### Integrations and API Access

The Yelp Business Scraper integrates with the Apify platform ecosystem, giving you programmatic access to your scraped data and the ability to connect it to thousands of external tools.

#### Python API access

Use the [Apify Python SDK](https://docs.apify.com/sdk/python/) to run the scraper and retrieve results programmatically:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run_input = {
    "searchQueries": ["pizza", "sushi"],
    "searchLocations": ["Chicago, IL"],
    "maxResultsPerSearch": 20,
}

run = client.actor("beatanalytics/yelp-business-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']} - {item['avg_rating']} stars - {item['address']}, {item['city']}")
```

#### JavaScript / Node.js API access

Use the [Apify JavaScript SDK](https://docs.apify.com/sdk/js/) to integrate Yelp business scraping into your Node.js applications:

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("beatanalytics/yelp-business-scraper").call({
    searchQueries: ["coffee shops"],
    searchLocations: ["San Francisco, CA"],
    maxResultsPerSearch: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.name} - ${item.avg_rating} stars - ${item.phone}`);
});
```

#### No-code integrations

Connect the Yelp Business Scraper to thousands of apps without writing code:

- **Make (formerly Integromat)** -- trigger workflows when new Yelp data is scraped, or schedule regular scraping runs as part of larger automations
- **Zapier** -- connect Yelp business data to Google Sheets, Slack, email, CRM tools, and 5,000+ other apps
- **Webhooks** -- receive HTTP notifications when a scraping run completes, then process the data in your own backend
- **Google Sheets** -- export results directly to a Google Sheets spreadsheet for collaborative analysis
- **Amazon S3 / Dropbox** -- automatically save scraped data to cloud storage after each run

#### Scheduled runs

Set up the Yelp Business Scraper to run on a schedule (hourly, daily, weekly, or custom cron) to keep your data fresh. Each run appends new results to your dataset, making it easy to track changes in business details, ratings, and review counts over time.

#### API endpoints

Every scraper run on Apify exposes RESTful API endpoints for accessing results, checking run status, and managing datasets. See the [Apify API documentation](https://docs.apify.com/api/v2) for the complete reference.

### Frequently Asked Questions

#### Is it legal to scrape Yelp business data?

Scraping publicly available business information from Yelp is generally considered legal in the United States, following the precedent set by the *hiQ Labs v. LinkedIn* case, where the Ninth Circuit Court of Appeals ruled that scraping publicly accessible data does not violate the Computer Fraud and Abuse Act. Yelp business details such as names, addresses, ratings, hours, and categories are publicly visible to anyone browsing the Yelp website without logging in. However, laws vary by jurisdiction, and you should consult a legal professional if you have concerns about your specific use case. Always use scraped data responsibly and in compliance with applicable laws and regulations.

#### How is this different from the Yelp Fusion API?

The Yelp Fusion API is Yelp's official developer API. While it provides structured access to business data, it has several limitations that this scraper addresses:

- **Authentication:** The Fusion API requires you to register an application and manage API keys. This scraper requires no API key or authentication setup.
- **Rate limits:** The Fusion API enforces strict daily request quotas (typically 5,000 requests per day for free-tier apps). This scraper has no request limits.
- **Data fields:** This scraper extracts fields that the Fusion API does not return, including business attributes with values, health inspection scores, menu URLs, and machine-readable hours.
- **Search flexibility:** This scraper supports cartesian product search (multiple queries times multiple locations in a single run) and automatic deduplication.
- **Review data:** The Fusion API returns only 3 reviews per business. For full review data, use this scraper in combination with our [Yelp Business Review Scraper](https://apify.com/beatanalytics/yelp-business-review-scraper).

#### What is the difference between the Yelp Business Scraper and the Yelp Business Review Scraper?

These are two complementary Apify actors:

- **Yelp Business Scraper** (this actor) extracts business details: name, address, hours, ratings, photos, categories, attributes, and more. It also supports search, so you can discover businesses by query and location.
- **[Yelp Business Review Scraper](https://apify.com/beatanalytics/yelp-business-review-scraper)** extracts individual reviews for specific businesses: review text, star ratings, dates, reviewer information, and business owner replies. It supports filtering by language and sorting by date, rating, or elite status.

Use both together for a complete picture: scrape business details with this actor to identify businesses of interest, then pass those business URLs to the Review Scraper to extract all their reviews for sentiment analysis or reputation monitoring.

#### How many businesses can I scrape?

There is no hard limit on the number of businesses you can scrape in a single run. Typical runs scraping 100-500 businesses complete in a few minutes. Runs scraping thousands of businesses may take longer but are fully supported. For very large-scale scraping (tens of thousands of businesses), consider reaching out to <sales@beatanalytics.org> for [Enterprise plans](#how-much-does-it-cost-to-scrape-yelp-business-data) with volume discounts.

#### Can I search for businesses by location?

Yes. The Yelp Business Scraper supports location-based search as a core feature. Enter one or more locations in the `searchLocations` field along with search queries in the `searchQueries` field (see [Input Parameters](#input-parameters)). The scraper searches all combinations of queries and locations automatically. Each business result includes its full address, city, state, ZIP code, country, latitude, and longitude, so you can perform geographic analysis on the results.

#### What export formats are supported?

The Yelp Business Scraper supports five export formats, all available directly from the Apify platform with no additional configuration:

- **JSON** -- structured data, ideal for programmatic processing and API integrations
- **CSV** -- comma-separated values, opens directly in Excel, Google Sheets, or any spreadsheet tool
- **Excel (.xlsx)** -- native Microsoft Excel format with proper column types
- **XML** -- for systems that consume XML feeds or require XML-based data exchange
- **HTML** -- human-readable table view for quick visual inspection

You can download data in any format from the Storage tab after a run completes, or retrieve it programmatically through the Apify API.

#### How often is the data updated?

The Yelp Business Scraper fetches live data from Yelp every time it runs. There is no cached or stale data -- each run makes fresh requests to Yelp and returns the most current business information available. To keep your data fresh, you can schedule the scraper to run on a recurring basis (hourly, daily, weekly, or on a custom cron schedule) using Apify's built-in scheduling feature. This is particularly useful for tracking changes in ratings, review counts, business hours, or open/closed status over time.

#### Can I scrape Yelp search results?

Yes. Scraping Yelp search results is one of the primary features of this actor. Enter your search queries (e.g. "restaurants", "dentists", "auto repair") and locations (e.g. "Austin, TX"), and the scraper will return full business details for each search result. You can control how many results to return per search with the `maxResultsPerSearch` parameter (default: 10). Each result includes a `_search` field with metadata about which query and location found it, along with its ranking position in the search results.

#### Can I get business photos and attributes?

Yes. The scraper extracts all publicly visible business photos as full-resolution Yelp CDN URLs. Business attributes are extracted as structured label-value pairs -- for example, `{"label": "Takes Reservations", "value": "No"}`, `{"label": "Wi-Fi", "value": "Free"}`, `{"label": "Outdoor Seating", "value": "Yes"}`. The specific attributes available depend on what each business has listed on its Yelp page. Common attributes include reservations, delivery, takeout, outdoor seating, Wi-Fi, parking, wheelchair accessibility, and many more.

#### How do I scrape Yelp business data without the API?

The Yelp Business Scraper is designed specifically for this use case. Instead of dealing with API key registration, OAuth authentication, rate limits, and limited data fields, you simply open the scraper on Apify, enter your search queries or business URLs, and click Start. The scraper handles all the data extraction automatically and returns structured results in JSON, CSV, or any other supported format. No API key, no rate limits, no authentication setup. See [How to Scrape Yelp Business Data](#how-to-scrape-yelp-business-data) for a step-by-step walkthrough.

### Related Actors

#### Yelp Business Review Scraper

The **[Yelp Business Review Scraper](https://apify.com/beatanalytics/yelp-business-review-scraper)** is the companion actor to this Yelp Business Scraper. While this actor extracts business details (address, hours, ratings, photos, attributes), the Review Scraper extracts individual customer reviews with full text, star ratings, dates, reviewer information, and business owner replies.

**Complementary workflow:** Use this Yelp Business Scraper to search for and identify businesses of interest, then feed the resulting business URLs into the Yelp Business Review Scraper to extract all reviews for sentiment analysis, reputation monitoring, or competitive benchmarking.

**Key features of the Review Scraper:**

- Extract all reviews for any Yelp business (not limited to 3 like the Yelp Fusion API)
- Filter reviews by language (24 languages supported)
- Sort by newest, oldest, highest rated, lowest rated, or elite reviews
- Includes reviewer information, feedback counts, and business owner replies
- Automatic pagination -- fetches all available review pages

Together, these two actors provide a complete Yelp data extraction solution: business details plus full review history, all without requiring a Yelp API key.

# Actor input Schema

## `searchQueries` (type: `array`):

Search query strings to find businesses (e.g. "cheese curds", "pizza"). Used together with Search locations. All combinations are searched.

## `searchLocations` (type: `array`):

Locations to search in (e.g. "Madison, WI", "Chicago, IL"). Used together with Search queries. All combinations are searched.

## `businessUrls` (type: `array`):

Yelp URLs of specific businesses you wish to retrieve details for. Can be used instead of or in addition to business aliases or IDs and/or search.

## `businessAliasesOrIds` (type: `array`):

Business aliases (e.g. "the-old-fashioned-madison") or IDs. Can be used instead of or in addition to URLs and/or search.

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

Maximum number of business results per search query+location combination.

## Actor input object example

```json
{
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/the-old-fashioned-madison"
    }
  ],
  "maxResultsPerSearch": 10
}
```

# Actor output Schema

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

All scraped business details with ratings, categories, and metadata.

## `csv` (type: `string`):

Business details exported as a CSV file.

# 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 = {
    "businessUrls": [
        {
            "url": "https://www.yelp.com/biz/the-old-fashioned-madison"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("beatanalytics/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 = { "businessUrls": [{ "url": "https://www.yelp.com/biz/the-old-fashioned-madison" }] }

# Run the Actor and wait for it to finish
run = client.actor("beatanalytics/yelp-business-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "businessUrls": [
    {
      "url": "https://www.yelp.com/biz/the-old-fashioned-madison"
    }
  ]
}' |
apify call beatanalytics/yelp-business-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=beatanalytics/yelp-business-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Yelp Business Scraper",
        "description": "Extract 25+ fields from any Yelp business — ratings, hours, photos, address, categories, and attributes. Search by query and location or look up by URL. No API key needed. Export as CSV, JSON, or Excel.",
        "version": "1.0",
        "x-build-id": "ea4iLAW7IkZDFN5No"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/beatanalytics~yelp-business-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-beatanalytics-yelp-business-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/beatanalytics~yelp-business-scraper/runs": {
            "post": {
                "operationId": "runs-sync-beatanalytics-yelp-business-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/beatanalytics~yelp-business-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-beatanalytics-yelp-business-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Search query strings to find businesses (e.g. \"cheese curds\", \"pizza\"). Used together with Search locations. All combinations are searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchLocations": {
                        "title": "Search locations",
                        "type": "array",
                        "description": "Locations to search in (e.g. \"Madison, WI\", \"Chicago, IL\"). Used together with Search queries. All combinations are searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "businessUrls": {
                        "title": "Business URLs",
                        "type": "array",
                        "description": "Yelp URLs of specific businesses you wish to retrieve details for. Can be used instead of or in addition to business aliases or IDs and/or search.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "businessAliasesOrIds": {
                        "title": "Business aliases or IDs",
                        "type": "array",
                        "description": "Business aliases (e.g. \"the-old-fashioned-madison\") or IDs. Can be used instead of or in addition to URLs and/or search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResultsPerSearch": {
                        "title": "Max results per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of business results per search query+location combination.",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
