# Ultimate Yelp Scraper (`epctex/yelp-scraper`) Actor

Gather info on millions of businesses, events, and reviews. Scrape businesses and extract descriptions, images, menus, addresses, and all other properties.. Customize with search terms, filters, and mappings for limitless insights. Ultimate Yelp scraper you need. No limits! No limits!

- **URL**: https://apify.com/epctex/yelp-scraper.md
- **Developed by:** [epctex](https://apify.com/epctex) (community)
- **Categories:** Travel
- **Features:** Limited permissions
- **Stats:** 1,938 total users, 31 monthly users, 84.0% runs succeeded, 49 bookmarks
- **User rating**: 3.54 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

## Actor - Ultimate Yelp Scraper

### Yelp scraper

The Yelp data scraper supports the following features:

- Get reviews - Get reviews of businesses without any limits!

- Retrieve business information - Address, images, menu, reviews, and many different information are ready for your consumption.

- Search any keyword - Search for any keyword you want to find on Yelp.

- Search any location - If you need to search on a specific location, just type it!

- Scrape events - Any event information can be found right away.

- Scrape collections - User collections can be directly retrieved. If you need to get the collection information, get it right away!

### Bugs, fixes, updates, and changelog

This scraper is under active development. If you have any feature requests you can create an issue from [here](https://github.com/epctex-support/yelp-advanced-scraper/issues).

### Input Parameters

The input of this scraper should be JSON containing the list of pages on Yelp that should be visited. Possible fields are:

- `search`: (Optional) (String) Keyword that you want to search on Yelp.

- `searchLocation`: (Optional) (String) Location that you want to initiate the search on Yelp.

- `startUrls`: (Optional) (Array) List of Yelp URLs. You should only provide business detail, event detail, event or business search, collections, or collection detail URLs.

- `includeReviews`: (Optional) (Boolean) This will add all the reviews that Yelp provides into the detail objects. Please keep in mind that the time and resources the actor uses will increase proportionally to the number of reviews.

- `startPageForReviews`: (Optional) (Number) Starting number of review pages that you want to scrape. The default is `1`. This applies to business reviews individually.

- `endPageForReviews`: (Optional) (Number) Final number of review pages that you want to scrape. The default is `Infinite`. This applies to business reviews individually.

- `includePhotos`: (Optional) (Boolean) This will add photos of businesses into the detail objects if available. Please keep in mind that the time and resources the actor uses will increase proportionally to the number of photos.

- `endPageForPhotos`: (Optional) (Number) The final page number for photos that you want to scrape per business. By default, there is no end page, meaning all pages will be scraped.

- `endPage`: (Optional) (Number) Final number of page that you want to scrape. The default is `Infinite`. This applies to all `search` requests and `startUrls` individually.

- `maxItems`: (Optional) (Number) You can limit scraped items. This should be useful when you search through the big lists or search results.

- `proxy`: (Required) (Proxy Object) Proxy configuration.

- `extendOutputFunction`: (Optional) (String) Function that takes a JQuery handle ($) as an argument and returns an object with data.

- `customMapFunction`: (Optional) (String) Function that takes each object's handle as an argument and returns an object with executing the function.

This solution requires the use of **Proxy servers**, either your own proxy servers or you can use [Apify Proxy](https://www.apify.com/docs/proxy).

#### Tip

When you want to scrape over a specific list URL, just copy and paste the link as one of the **startUrl**.

If you would like to scrape only the first page of a list then put the link for the page and have the `endPage` as 1.

With the last approach that is explained above you can also fetch any interval of pages. If you provide the 5th page of a list and define the `endPage` parameter as 6 then you'll have the 5th and 6th pages only.

#### Compute Unit Consumption

The actor is optimized to run blazing fast and scrape as many items as possible. Therefore, it forefronts all the detailed requests. If the actor doesn't block very often it'll scrape 100 listings in 2 minutes with ~0.02-0.12 compute units.

#### Yelp Scraper Input example

```json
{
  "startUrls":[
    "https://www.yelp.com/biz/maxs-restaurant-glendale-glendale-3",
    "https://www.yelp.com/search?find_desc=max&find_loc=Los+Angeles%2C+CA",
    "https://www.yelp.com/collection/qGqt9YpsLBCH5nruuVCK2A/Food",
    "https://www.yelp.com/collections/user?userid=a_UbCGv_MTAHFs3P_zxUDA",
    "https://www.yelp.com/events/la/browse?start_date=20230215",
    "https://www.yelp.com/events/monterey-park-monterey-park-strong-star-ballroom-shooting-community-resources"
  ],
  "search":"max",
  "searchLocation":"Los Angeles",
  "maxItems": 20,
  "includePhotos": true,
  "endPageForPhotos": 2,
  "includeReviews": true,
  "endPage":1,
  "endPageForReviews":1,
  "proxy":{
    "useApifyProxy":true
  }
}

```

### During the Run

During the run, the actor will output messages letting you know what is going on. Each message always contains a short label specifying which page from the provided list is currently specified.
When items are loaded from the page, you should see a message about this event with a loaded item count and total item count for each page.

If you provide incorrect input to the actor, it will immediately stop with a failure state and output an explanation of what is wrong.

### Yelp Export

During the run, the actor stores results into a dataset. Each item is a separate item in the dataset.

You can manage the results in any language (Python, PHP, Node JS/NPM). See the FAQ or <a href="https://www.apify.com/docs/api" target="blank">our API reference</a> to learn more about getting results from this Yelp actor.

### Scraped Yelp Properties

The structure of each item on Yelp looks like this:

#### Business Detail

```json
{
	"businessId": "rbcOzsLyUv4D8H1VyfKhcQ",
	"type": "business",
	"url": "https://www.yelp.com/biz/good-grill-express-los-angeles-2",
	"title": "Good Grill Express",
	"rating": 2.9,
	"reviewCount": 44,
	"priceRange": "$$",
	"categories": [
		"Mexican",
		"Seafood",
		"American"
	],
	"address": {
		"city": "Los Angeles",
		"regionCode": "CA",
		"addressLine1": "210 E Olympic Blvd 108-127",
		"addressLine2": "Ste 127-108",
		"addressLine3": null,
		"postalCode": "90015",
		"formatted": "210 E Olympic Blvd 108-127\nSte 127-108\nLos Angeles, CA 90015"
	},
	"coordinates": [{
		"latitude": 34.038995,
		"longitude": -118.2555
	}],
	"primaryPhoto": "https://s3-media0.fl.yelpcdn.com/bphoto/VUpvBRGaf7iWklEasbI6OA/o.jpg",
	"reviews": [
		{
			"userName": "Johanna T.",
			"userUrl": "https://www.yelp.com/user_details?userid=DTXMbSRoCqJU6eC0RWuZ0A",
			"isElite": false,
			"rating": 5,
			"date": "2024-01-10T22:39:14.000Z",
			"review": "I have a business in the neighborhood and ordered from this place from a flyer dropped at my store.  I ordered a chicken soup and chicken flautas.  The chicken soup was flavorful and abundant with veggies.  The chicken flautas were delicious and not to mention the combo of salsa, sour cream and Guacamole had my mouth watering.   I will definitely order from here gain.",
			"reviewLanguage": "en",
			"author": {
				"id": "DTXMbSRoCqJU6eC0RWuZ0A",
				"name": "Johanna T.",
				"location": "Boyle Heights, Los Angeles, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/VHLQJjz9X8sTMKt6s9K5nA/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/VHLQJjz9X8sTMKt6s9K5nA/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/VHLQJjz9X8sTMKt6s9K5nA/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/VHLQJjz9X8sTMKt6s9K5nA/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/VHLQJjz9X8sTMKt6s9K5nA/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/VHLQJjz9X8sTMKt6s9K5nA/180s.jpg"
				},
				"friendCount": 0,
				"reviewCount": 12,
				"businessPhotoCount": 20,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 0,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Veronica V.",
			"userUrl": "https://www.yelp.com/user_details?userid=vbCTS7V4MoosknHTCyWi2g",
			"isElite": false,
			"rating": 1,
			"date": "2023-07-11T21:54:46.000Z",
			"review": "Worse service by phone  the girl answered she's super mean, I was asking for if they can change the corn tortillas for flour and she wants to charge me  for that a ridiculous amount of difference. I been working before with the guy (male) he even laughed about my request but this girl damn! \n\nI work around the place and it's flexible for me order from there....but omg I can understand why someone has to be so mean and not just do the service I deserve.",
			"reviewLanguage": "en",
			"author": {
				"id": "vbCTS7V4MoosknHTCyWi2g",
				"name": "Veronica V.",
				"location": "Los Angeles, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/zA-kkSmuamdPRhDtnS6jNA/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/zA-kkSmuamdPRhDtnS6jNA/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/zA-kkSmuamdPRhDtnS6jNA/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/zA-kkSmuamdPRhDtnS6jNA/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/zA-kkSmuamdPRhDtnS6jNA/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/zA-kkSmuamdPRhDtnS6jNA/180s.jpg"
				},
				"friendCount": 55,
				"reviewCount": 2,
				"businessPhotoCount": 0,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 0,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Julie M.",
			"userUrl": "https://www.yelp.com/user_details?userid=HlU-aUCVVaSFVjiO3VSZ2g",
			"isElite": false,
			"rating": 1,
			"date": "2022-04-02T17:33:48.000Z",
			"review": "So sad to come in and pay 10 bucks for two drinks and not allowed to use the restroom. Not one single customer is in the store and I was refused to use the restroom.",
			"reviewLanguage": "en",
			"author": {
				"id": "HlU-aUCVVaSFVjiO3VSZ2g",
				"name": "Julie M.",
				"location": "Paramount, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/OFc6E9vIvtv2RXZGmJHqeQ/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/OFc6E9vIvtv2RXZGmJHqeQ/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/OFc6E9vIvtv2RXZGmJHqeQ/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/OFc6E9vIvtv2RXZGmJHqeQ/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/OFc6E9vIvtv2RXZGmJHqeQ/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/OFc6E9vIvtv2RXZGmJHqeQ/180s.jpg"
				},
				"friendCount": 14,
				"reviewCount": 181,
				"businessPhotoCount": 530,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 0,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Sparkles D.",
			"userUrl": "https://www.yelp.com/user_details?userid=RVyNRipJXhEQko_eztWYyg",
			"isElite": true,
			"rating": 1,
			"date": "2018-02-17T18:43:59.000Z",
			"review": "Found this piece of metal in my food. Super disappointed  because the food was good up until that point.",
			"reviewLanguage": "en",
			"author": {
				"id": "RVyNRipJXhEQko_eztWYyg",
				"name": "Sparkles D.",
				"location": "Baldwin Park, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/-cIiIbC8TEKFpl13ePAOvQ/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/-cIiIbC8TEKFpl13ePAOvQ/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/-cIiIbC8TEKFpl13ePAOvQ/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/-cIiIbC8TEKFpl13ePAOvQ/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/-cIiIbC8TEKFpl13ePAOvQ/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/-cIiIbC8TEKFpl13ePAOvQ/180s.jpg"
				},
				"friendCount": 205,
				"reviewCount": 133,
				"businessPhotoCount": 180,
				"isElite": true
			},
			"feedback": {
				"usefulCount": 1,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Diego R.",
			"userUrl": "https://www.yelp.com/user_details?userid=WTVr3jCQq6pZWkMFAXnhZw",
			"isElite": false,
			"rating": 1,
			"date": "2018-04-29T20:49:59.000Z",
			"review": "My wife and I were visiting the Santee Mall (or whatever they call it) and, after scoring a parking spot, we wandered into this little shopping mall to see what was in there. Around that time, I told my wife I needed to find a bathroom. This restaurant had one so I told her, \"Why don't we eat here for lunch?\" \n\nI waited in line for the lavatory while my wife waited in line to order something. A lady who worked there approached me and I mentioned to her I was going to use the bathroom but my wife was in line. She seemed to tell me I couldn't use the bathroom. I pointed at my wife and said, \"We're ordering something.\" She walked away as if she didn't understand, so my wife told the lady (who was now behind the counter) we were ordering food so me using the bathroom was a non-issue. \n\nNonetheless, she chased my wife and I away, telling us we had to eat there in order to use the bathroom. Not only is that ridiculous, but we were planning on eating there anyway.....except we didn't, because we don't appreciate being treated like caca.\n\nI have no idea what the food is like, but the customer service reeks. I really should have demanded to talk with the manager but I really needed to pee. What I did instead was I went down the hall to The Coffee Bean, where they not only treated me like a valued customer but also they gave me a token to use the public bathrooms down the hall.\n\nI just find it disheartening that \"Bad Grill Express\" is not interested in my money or patronage.....I mean, I'm pretty gringo so I hope it's not just Mexicans who are welcome.",
			"reviewLanguage": "en",
			"author": {
				"id": "WTVr3jCQq6pZWkMFAXnhZw",
				"name": "Diego R.",
				"location": "Los Angeles, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/XWS4Cyf1l9_L517fiUwq7Q/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/XWS4Cyf1l9_L517fiUwq7Q/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/XWS4Cyf1l9_L517fiUwq7Q/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/XWS4Cyf1l9_L517fiUwq7Q/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/XWS4Cyf1l9_L517fiUwq7Q/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/XWS4Cyf1l9_L517fiUwq7Q/180s.jpg"
				},
				"friendCount": 21,
				"reviewCount": 138,
				"businessPhotoCount": 2,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 2,
				"funnyCount": 1,
				"coolCount": 0
			}
		},
		{
			"userName": "Jocelyn Z.",
			"userUrl": "https://www.yelp.com/user_details?userid=0V704SWBbvJbRSKA6ufbbw",
			"isElite": false,
			"rating": 1,
			"date": "2019-07-26T20:35:47.000Z",
			"review": "They have the worst attitude. \nWhy have a restaurant and treat people like crap?\nI understand that the breakfast menu is over at 11am \nBut how in the world do you try to charge someone for a steak and egg for 16$ when it's 11.95$? \nIs not like the food is well serve when it's delivered anyway.",
			"reviewLanguage": "en",
			"author": {
				"id": "0V704SWBbvJbRSKA6ufbbw",
				"name": "Jocelyn Z.",
				"location": "Los Angeles, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/pm_qkDMIjRNSXgZEw9sRiQ/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/pm_qkDMIjRNSXgZEw9sRiQ/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/pm_qkDMIjRNSXgZEw9sRiQ/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/pm_qkDMIjRNSXgZEw9sRiQ/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/pm_qkDMIjRNSXgZEw9sRiQ/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/pm_qkDMIjRNSXgZEw9sRiQ/180s.jpg"
				},
				"friendCount": 355,
				"reviewCount": 5,
				"businessPhotoCount": 2,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 0,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Margarita R.",
			"userUrl": "https://www.yelp.com/user_details?userid=yyyAARK_4FkL5WWgzLRwHg",
			"isElite": false,
			"rating": 1,
			"date": "2021-10-12T17:45:35.000Z",
			"review": "I should've paid attention to the reviews. Food got yo or table in about 5 minutes or less and was cold. What does that tell you. Stale old food, and that's what it tasted like",
			"reviewLanguage": "en",
			"author": {
				"id": "yyyAARK_4FkL5WWgzLRwHg",
				"name": "Margarita R.",
				"location": "Upland, CA",
				"friendCount": 59,
				"reviewCount": 22,
				"businessPhotoCount": 13,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 0,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Erika T.",
			"userUrl": "https://www.yelp.com/user_details?userid=oYbv5vLasDJK74T2sKXUAQ",
			"isElite": false,
			"rating": 1,
			"date": "2018-07-18T04:38:18.000Z",
			"review": "Very bad customer service try paying for a\nCoffee $1 and some change. Was giving the cashier some pennies and she gave me a bad attitude saying she was no longer gonna get change (pennies) how is it if money is money never again buy from them. Not the first time the cashier gives attitude. And she's the owners husband her name is mari. Bad service",
			"reviewLanguage": "en",
			"author": {
				"id": "oYbv5vLasDJK74T2sKXUAQ",
				"name": "Erika T.",
				"location": "Huntington Park, Los Angeles, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/jtLjPqcDWhbIceOBrH_kvw/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/jtLjPqcDWhbIceOBrH_kvw/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/jtLjPqcDWhbIceOBrH_kvw/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/jtLjPqcDWhbIceOBrH_kvw/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/jtLjPqcDWhbIceOBrH_kvw/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/jtLjPqcDWhbIceOBrH_kvw/180s.jpg"
				},
				"friendCount": 111,
				"reviewCount": 1,
				"businessPhotoCount": 0,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 2,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Gladys M.",
			"userUrl": "https://www.yelp.com/user_details?userid=YKzDFaFff_leP2qFbKEAhw",
			"isElite": false,
			"rating": 1,
			"date": "2019-04-14T04:20:08.000Z",
			"review": "I walked in to ask if they had a restroom for my toddler to use, the employees were absolutely rude and told me no. Then I noticed a cockroach crawling across their floor. Completely disgusting.",
			"reviewLanguage": "en",
			"author": {
				"id": "YKzDFaFff_leP2qFbKEAhw",
				"name": "Gladys M.",
				"location": "Riverside, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/gOgY0s-U1TphQLHLfB-uCQ/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/gOgY0s-U1TphQLHLfB-uCQ/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/gOgY0s-U1TphQLHLfB-uCQ/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/gOgY0s-U1TphQLHLfB-uCQ/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/gOgY0s-U1TphQLHLfB-uCQ/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/gOgY0s-U1TphQLHLfB-uCQ/180s.jpg"
				},
				"friendCount": 11,
				"reviewCount": 21,
				"businessPhotoCount": 7,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 2,
				"funnyCount": 0,
				"coolCount": 0
			}
		},
		{
			"userName": "Rivka C.",
			"userUrl": "https://www.yelp.com/user_details?userid=ddUU4Z05Gf1EC7M4s_hQCQ",
			"isElite": false,
			"rating": 1,
			"date": "2019-07-26T20:23:26.000Z",
			"review": "These people deserve 0 stars!!! Super rude customer service. We were ordering over the phone and they wanted to charge us $16 for my coworkers steak and eggs because she made a little change and my salad a total of $30 plus. When we asked why and I calculated the amount we just decided to order the salad. The guy said either we pay the $30 or nothing I was trying to get more of an explanation and he hung up on me. \nThey have no right to be this rude when we are trying to give them business. They are scammers they tell you  your order is ready right after you have ordered and they don't allow any changes to you order and will charge you more and take advantage of you if you substitute or change anything minor in your order!! \nDo yourselves a favor and do not eat here their food is not that good and they are not afraid of being super rude and kicking you out. I hope this place loses all their business for this kind of behavior.",
			"reviewLanguage": "en",
			"author": {
				"id": "ddUU4Z05Gf1EC7M4s_hQCQ",
				"name": "Rivka C.",
				"location": "San Diego, CA",
				"photoUrls": {
					"mediaItemSrcUrl": "https://s3-media0.fl.yelpcdn.com/photo/nv9RC5fDih1I1QdrFaSNSQ/30s.jpg",
					"mediaItemSrcSetUrl200x": "https://s3-media0.fl.yelpcdn.com/photo/nv9RC5fDih1I1QdrFaSNSQ/60s.jpg",
					"mediaItemSrcSetUrl300x": "https://s3-media0.fl.yelpcdn.com/photo/nv9RC5fDih1I1QdrFaSNSQ/90s.jpg",
					"__typename": "UserPhotoUrl",
					"userSrc": "https://s3-media0.fl.yelpcdn.com/photo/nv9RC5fDih1I1QdrFaSNSQ/60s.jpg",
					"userSrcSet200x": "https://s3-media0.fl.yelpcdn.com/photo/nv9RC5fDih1I1QdrFaSNSQ/120s.jpg",
					"userSrcSet300x": "https://s3-media0.fl.yelpcdn.com/photo/nv9RC5fDih1I1QdrFaSNSQ/180s.jpg"
				},
				"friendCount": 0,
				"reviewCount": 6,
				"businessPhotoCount": 5,
				"isElite": false
			},
			"feedback": {
				"usefulCount": 1,
				"funnyCount": 0,
				"coolCount": 1
			}
		}
	],
	"operationHours": {
		"Mon": [
			"9:00 AM - 3:00 PM"
		],
		"Tue": [
			"9:00 AM - 3:00 PM"
		],
		"Wed": [
			"9:00 AM - 3:00 PM"
		],
		"Thu": [
			"9:00 AM - 3:00 PM"
		],
		"Fri": [
			"9:00 AM - 3:00 PM"
		],
		"Sat": [
			"9:00 AM - 3:00 PM"
		],
		"Sun": [
			"9:00 AM - 3:00 PM"
		]
	},
	"amenities": [
		"Offers Delivery",
		"Offers Takeout",
		"No Reservations",
		"Accepts Credit Cards",
		"Accepts Apple Pay",
		"Accepts Cryptocurrency",
		"Outdoor Seating",
		"Casual",
		"Moderate Noise",
		"Good for Groups",
		"Good For Kids",
		"Good for Lunch",
		"Street Parking, Validated Parking",
		"Waiter Service",
		"Wheelchair Accessible",
		"TV",
		"Covered Outdoor Seating",
		"Offers Catering",
		"No Wi-Fi",
		"No Happy Hour",
		"No Alcohol",
		"No Drive-Thru",
		"No Heated Outdoor Seating",
		"No Private Dining",
		"Bike Parking",
		"Plastic-free packaging",
		"Provides reusable tableware"
	],
	"about": "Established in 1990.\n\nWe have come a long way serviring to our local business and visitors from all around the world. They like our delicious food good prices and prompt clean service. We like to serve and been friendly to all. Our commitment id dedicated to improve quality food ingredients and a really healthy environment. We have had uninterrupted A+ Grade from the health department. We Love You. Thank You for your patronage.\n\nEnnio Zepeda and Staff.",
	"faq": [
		{
			"question": "Does Good Grill Express offers delivery or takeout?",
			"answer": " They offer  takeout.  "
		},
		{
			"question": "What forms of payment are accepted at Good Grill Express?",
			"answer": "        Good Grill Express accepts credit cards. "
		},
		{
			"question": "How is Good Grill Express rated?",
			"answer": "Good Grill Express has 3.0 stars from 44 reviews."
		},
		{
			"question": "Does Good Grill Express have outdoor seating?",
			"answer": "Yes, they have outdoor seating"
		},
		{
			"question": "What are some popular dishes to order at Good Grill Express?",
			"answer": " The following dishes are the most popular here <ul>  <li> <a href=\"https://www.yelp.com/menu/good-grill-express-los-angeles-2/item/chicken-soup-w-rice\"> Chicken Soup W/ Rice </a> has 3 review mentions  and 1 photo uploads on Yelp! </li>  <li> <a href=\"https://www.yelp.com/menu/good-grill-express-los-angeles-2/item/wet-burrito-asada-chicken-guac\"> Wet Burrito Asada / Chicken / Guac </a> has 5 review mentions  and 1 photo uploads on Yelp! </li>  <li> <a href=\"https://www.yelp.com/menu/good-grill-express-los-angeles-2/item/chicken-taquitos-3\"> Chicken Taquitos </a> has 1 review mentions  and 2 photo uploads on Yelp! </li>  <li> <a href=\"https://www.yelp.com/menu/good-grill-express-los-angeles-2/item/tuna-salad-w-chips\"> Tuna Salad W/ Chips </a> has 1 review mentions  and 2 photo uploads on Yelp! </li>  <li> <a href=\"https://www.yelp.com/menu/good-grill-express-los-angeles-2/item/baked-chicken-1-4-platter\"> Baked Chicken (1/4) Platter </a> has 1 review mentions on Yelp! </li>  </ul> "
		},
		{
			"question": "Is Good Grill Express good for kids?",
			"answer": "Yes, they are rated good for kids.  \n\n\n\n\n "
		},
		{
			"question": "What is the ambience like at Good Grill Express?",
			"answer": " Good Grill Express is \n  \n  \n    casual. "
		},
		{
			"question": "What are my parking options at Good Grill Express?",
			"answer": "They have           nearby street parking and offer validated parking. "
		},
		{
			"question": "What kind of meals is Good Grill Express known for?",
			"answer": "They are great for lunch."
		},
		{
			"question": "How long has Good Grill Express been on Yelp?",
			"answer": "Good Grill Express has been on yelp since 2011/07/26."
		},
		{
			"question": "Where is Good Grill Express?",
			"answer": "Good Grill Express is located at 210 E Olympic Blvd 108-127, Los Angeles, CA."
		}
	],
	"questions": [],
	"ratingDistribution": {
		"1": 20,
		"2": 1,
		"3": 3,
		"4": 5,
		"5": 15
	},
	"menu": "http://www.goodgrillexpress.net",
	"website": "http://www.goodgrillexpress.net",
	"phoneNumber": "(213) 749-2345",
	"mediaCount": 71,
	"media": [
		"https://s3-media0.fl.yelpcdn.com/bphoto/6vCTai7K2-sb-_si4pd7Iw/o.jpg",
		"https://s3-media0.fl.yelpcdn.com/bphoto/VUpvBRGaf7iWklEasbI6OA/o.jpg",
		"https://s3-media0.fl.yelpcdn.com/bphoto/8U_os_Qbiv2mLdGRxDoSLA/o.jpg",
		"https://s3-media0.fl.yelpcdn.com/bphoto/qgohPympZCJxjPS-2XFJhw/o.jpg",
		"https://s3-media0.fl.yelpcdn.com/bphoto/f0PU_ALgWCTkdB0JwS4VAw/o.jpg",
		"https://s3-media0.fl.yelpcdn.com/bphoto/fAlQcUU8_esAz6aWrC3RlA/o.jpg",
	]
}
```

#### Event Detail

```json
{
    "type": "event",
    "url": "https://www.yelp.com/events/monterey-park-monterey-park-strong-star-ballroom-shooting-community-resources",
    "title": "Monterey Park Strong: Star Ballroom Shooting - Community Resources",
    "image": "https://s3-media0.fl.yelpcdn.com/ephoto/Y0fY94JB0CZI9hK1nSXVXw/300s.jpg",
    "categories": [
        "Other",
        "Official Yelp Events"
    ],
    "business": {
        "url": "",
        "name": null,
        "reviewCount": null,
        "rating": null,
        "location": "Monterey Park, CA 91754"
    },
    "fromDate": "2023-01-23T08:00:00.000Z",
    "toDate": "2023-02-20T08:00:00.000Z",
    "price": "",
    "description": "Our thoughts are with everyone in San Gabriel Valley affected by the Monterey Park Star Ballroom Shooting on Lunar New Year's Eve. In a time of what is supposed to be celebration, we are heartbroken by this tragedy of gun violence. As we mourn the loss of precious life and rebuild the community spirit, many in the Yelp community have asked how they can support our neighbors in need. #MontereyParkStrong #MPKStrongBelow are ways you can help the victims and their families.DONATIONS:All-Victims Fundgofundme.com/f/monterey-…***Sponsored by Advancing Social Justice Southern California. All proceeds contributed to the fund will go to the many individuals affectedClassroom of Compassion Public Alter Fundgofundme.com/f/classroom…***The Los Angeles-based nonprofit, Classroom of Compassion, will be creating 10 public altars to honor the ten victims lost ********************BUSINESSES OFFERING SUPPORT:Nomad Ice Pops  I  415 S Mission Dr San Gabriel, CA 91776yelp.com/biz/nomad-ice-p…***20% of sales will go to victim relief funds for the rest of the monthArcadia Donuts  I  34 Las Tunas Dr Arcadia, CA 91007yelp.com/biz/arcadia-don…***A fundraiser is being held Arcadia Donuts on Thursday in honor Yu (Andy) Kao, happening Thursday, January 26 - 28, until sold outLangley Center  I  400 N. Emerson Ave., Monterey Park, CA 91754.***A Survivors Resource Center has been established from January 23 - 28. If you have any questions or need assistance please call (626)307-1395********************EVENTS / MEMORIALS:JAN 23 - JAN 26 - Community Healing Circle  I  Asian Mental Health Projectinstagram.com/p/CnvQfMaP…***Free community circles this week for the APIDA community. This is a space for people to grieve, mourn, love, process and heal in response to the Monterey Park Lunar New Year Massacre and years of enduring Anti-Asian hate. Sign up in our bio or at bit.ly/APIDA-healingJAN 24, 5:30 PM - Candlelight Vigil  I  Monterey Park City Hallmontereypark.ca.gov/Arch…***Hosted by the City of Monterey Park. People are encouraged to bring flowers or candles to Monterey Park's City Hall, at 320 W. Newmark AveJAN 25, 6:00 PM - Candlelight Vigil  I  Star Dance Studioinstagram.com/p/CnvjWrJr…***Hosted by Compassion in SGV at Star Dance Studio, 122 W Garvey Ave #B, Monterey Park, CA 91754. If you have any questions or would like to help, please email us at hello@compassioninsgv.orgMonterey Park City Hall  I  320 W Newmark Ave Monterey Park, CA 91754***A memorial honoring the victims and survivors has been established for our community to mourn********************Other resources that you think should be added? Send us an email at sgv@yelp.com********************SOURCES:montereypark.ca.gov/Civi…gofundme.com/c/act/monte…instagram.com/montereypa…instagram.com/p/CnulzJRv…youtube.com/watch?v=jn6s…",
    "subscribers": [
        {
            "name": "Leonard A.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/XsKjcaG1b96hewUndgDfsg/60s.jpg",
            "friendCount": 1100,
            "reviewCount": 720,
            "isElite": true
        },
        {
            "name": "Sarni N.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/AYSvaB-BGsnCmeizwTyr8w/60s.jpg",
            "friendCount": 412,
            "reviewCount": 114,
            "isElite": true
        },
        {
            "name": "Anna S.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/ikSr3K87jCAQNsamJJNKgg/60s.jpg",
            "friendCount": 15,
            "reviewCount": 89,
            "isElite": true
        },
        {
            "name": "Gillian A.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/QTEskPPJqMAsXluQcBVKtQ/60s.jpg",
            "friendCount": 291,
            "reviewCount": 810,
            "isElite": true
        },
        {
            "name": "Darylynn D.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/2aUizo8RIgz78W9SQTyKCg/60s.jpg",
            "friendCount": 349,
            "reviewCount": 2825,
            "isElite": true
        },
        {
            "name": "Donna B.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/lWz3Qh4R8GS8NgwT0nzyAw/60s.jpg",
            "friendCount": 401,
            "reviewCount": 1597,
            "isElite": true
        },
        {
            "name": "Shawn T.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/CB1P5-kR6BvBNYPyMEsA3w/60s.jpg",
            "friendCount": 67,
            "reviewCount": 372,
            "isElite": true
        },
        {
            "name": "Becky L.",
            "avatar": "https://s3-media0.fl.yelpcdn.com/photo/bvJmP6e_AnaWbDI6Kdo4jg/60s.jpg",
            "friendCount": 341,
            "reviewCount": 553,
            "isElite": true
        }
    ],
    "submittedBy": {
        "name": "Thuy Dan T.",
        "avatar": "https://s3-media0.fl.yelpcdn.com/photo/D_DV155q-AD94rEkooGvbA/30s.jpg",
        "friendCount": 4331,
        "reviewCount": 862,
        "isElite": true
    }
}
```

### Contact

Please visit us through [epctex.com](https://epctex.com) to see all the products that are available for you. If you are looking for any custom integration or so, please reach out to us through the chat box in [epctex.com](https://epctex.com). In need of support? <business@epctex.com> is at your service.

# Actor input Schema

## `search` (type: `string`):

The keyword that you can search on Yelp

## `searchLocation` (type: `string`):

The location that you use to search on Yelp

## `includeReviews` (type: `boolean`):

Including reviews on objects if it have any.

## `includePhotos` (type: `boolean`):

Includes photos of businesses if available.

## `endPageForPhotos` (type: `integer`):

The page number where photos should end per business. By default, there is no end page.

## `reviewSort` (type: `string`):

Sort reviews by. Only applicable on review fetching

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

URLs to start with. It should be list or detail URL

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

Maximum number of items that you want as output. Default is all

## `endPage` (type: `integer`):

The page number that you want to end with. By default there is no end page. This is applies to all search request and startUrls individually.

## `startPageForReviews` (type: `integer`):

The page number that you want to start with for reviews. This is applies to business reviews individually.

## `endPageForReviews` (type: `integer`):

The page number that you want to end with for reviews. By default there is no end page. This is applies to business reviews individually.

## `extendOutputFunction` (type: `string`):

Function that takes a JQuery handle ($) as argument and returns data that will be merged with the default output

## `customMapFunction` (type: `string`):

Function that takes each of the objects as argument and returns data that will be mapped by the function itself.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "search": "grill",
  "searchLocation": "Los Angeles",
  "includeReviews": false,
  "includePhotos": false,
  "endPageForPhotos": 1,
  "reviewSort": "relevance_desc",
  "startUrls": [
    "https://www.yelp.com/biz/maxs-restaurant-glendale-glendale-3",
    "https://www.yelp.com/search?find_desc=max&find_loc=Los+Angeles%2C+CA",
    "https://www.yelp.com/collection/qGqt9YpsLBCH5nruuVCK2A/Food",
    "https://www.yelp.com/collections/user?userid=a_UbCGv_MTAHFs3P_zxUDA",
    "https://www.yelp.com/events/la/browse?start_date=20230215",
    "https://www.yelp.com/events/monterey-park-monterey-park-strong-star-ballroom-shooting-community-resources"
  ],
  "maxItems": 20,
  "endPage": 1,
  "startPageForReviews": 1,
  "endPageForReviews": 1,
  "extendOutputFunction": "($) => { return {} }",
  "customMapFunction": "(object) => { return {...object} }",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "search": "grill",
    "searchLocation": "Los Angeles",
    "endPageForPhotos": 1,
    "reviewSort": "relevance_desc",
    "startUrls": [
        "https://www.yelp.com/biz/maxs-restaurant-glendale-glendale-3",
        "https://www.yelp.com/search?find_desc=max&find_loc=Los+Angeles%2C+CA",
        "https://www.yelp.com/collection/qGqt9YpsLBCH5nruuVCK2A/Food",
        "https://www.yelp.com/collections/user?userid=a_UbCGv_MTAHFs3P_zxUDA",
        "https://www.yelp.com/events/la/browse?start_date=20230215",
        "https://www.yelp.com/events/monterey-park-monterey-park-strong-star-ballroom-shooting-community-resources"
    ],
    "maxItems": 20,
    "endPage": 1,
    "startPageForReviews": 1,
    "endPageForReviews": 1,
    "extendOutputFunction": ($) => { return {} },
    "customMapFunction": (object) => { return {...object} },
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("epctex/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 = {
    "search": "grill",
    "searchLocation": "Los Angeles",
    "endPageForPhotos": 1,
    "reviewSort": "relevance_desc",
    "startUrls": [
        "https://www.yelp.com/biz/maxs-restaurant-glendale-glendale-3",
        "https://www.yelp.com/search?find_desc=max&find_loc=Los+Angeles%2C+CA",
        "https://www.yelp.com/collection/qGqt9YpsLBCH5nruuVCK2A/Food",
        "https://www.yelp.com/collections/user?userid=a_UbCGv_MTAHFs3P_zxUDA",
        "https://www.yelp.com/events/la/browse?start_date=20230215",
        "https://www.yelp.com/events/monterey-park-monterey-park-strong-star-ballroom-shooting-community-resources",
    ],
    "maxItems": 20,
    "endPage": 1,
    "startPageForReviews": 1,
    "endPageForReviews": 1,
    "extendOutputFunction": "($) => { return {} }",
    "customMapFunction": "(object) => { return {...object} }",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("epctex/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 '{
  "search": "grill",
  "searchLocation": "Los Angeles",
  "endPageForPhotos": 1,
  "reviewSort": "relevance_desc",
  "startUrls": [
    "https://www.yelp.com/biz/maxs-restaurant-glendale-glendale-3",
    "https://www.yelp.com/search?find_desc=max&find_loc=Los+Angeles%2C+CA",
    "https://www.yelp.com/collection/qGqt9YpsLBCH5nruuVCK2A/Food",
    "https://www.yelp.com/collections/user?userid=a_UbCGv_MTAHFs3P_zxUDA",
    "https://www.yelp.com/events/la/browse?start_date=20230215",
    "https://www.yelp.com/events/monterey-park-monterey-park-strong-star-ballroom-shooting-community-resources"
  ],
  "maxItems": 20,
  "endPage": 1,
  "startPageForReviews": 1,
  "endPageForReviews": 1,
  "extendOutputFunction": "($) => { return {} }",
  "customMapFunction": "(object) => { return {...object} }",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call epctex/yelp-scraper --silent --output-dataset

```

## MCP server setup

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