How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
searchin What to collect. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Search Yelp by keyword and city, or paste business links, and get profiles with phones, websites, hours, photos, menus and reviews. Rows land in a table you can export to CSV, Excel or JSON, or read by API. You need no login and no API key, and 10 businesses take about a minute and cost about $0.044.
- Find businesses: run a Yelp search by keyword and location, or from a Yelp search link, and save one full profile per business.
- Business profiles: read the profiles for business links, aliases or IDs you already have.
- Reviews: save one row per review for the businesses you list, with text, rating, date, language and owner reply.
Good for
- You build a local lead list with phones and websites for a category and city.
- You compare ratings, price levels and amenities across competing venues.
- You read new reviews of your own or rival businesses on a schedule.
- You collect menu items and prices for restaurant research.
Who uses it
Local lead builders
Make a list with phones and websites for a category and city.
Restaurant researchers
Collect menu items and prices.
Reputation teams
Read new reviews of your business or a rival.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.00027 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Business profile | $0.0027 (from $0.00189 on paid Apify plans) | One saved business profile. |
| Review | $0.000255 (from $0.000179 on paid Apify plans) | One saved review. |
| Search page | $0.0165 (from $0.01155 on paid Apify plans) | One successfully parsed Yelp search page, including an empty page. |
| Detail page | $0.0014 (from $0.00098 on paid Apify plans) | One successfully parsed review or extra gallery/Q&A page, including filtered or unchanged pages; or a confirmed missing business lookup. No charge for transport or source errors. |
Examples
- One result: about $0.003.
- 1,000 results: about $2.70.
- Every day 100 results, for 30 days: about $8.11 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 1,800 results.
Prices checked on 8 November 2026. See the current price on Apify.
Questions
Do I need a Yelp account or API key?
No. You need only an Apify account.
Can I get owner emails?
No. The run saves the phone and website the business publishes on Yelp.
Why do two identical searches differ?
Yelp reorders results between runs and repeats some businesses. A larger Maximum results gives a steadier list.
Can I get more than 240 businesses?
Yes, with several locations or queries. Each pair stops at 240 positions, and repeats inside a pair are removed, so expect about 200 different businesses.
How do I get only new reviews?
Turn on Only new results, set a State name, and start the same input on a schedule.
Can I set a cost limit?
Yes. Set Maximum cost per run in Run options. Rows saved before the limit stay yours.
Details
Step by step on Apify
- Open the Input tab and keep What to collect on Find businesses (box 1).
- Keep coffee in Search query, or type your own keyword (box 2).
- Keep San Francisco in Search location, or type your own city (box 3).
- Keep Maximum results at 10 (box 4).
- Click Start.
- When the run ends, open the Output tab (box 6).
- Check
name,rating,reviewsCount,address.formatted,phoneandwebsite(box 7). Some businesses publish no phone or website, so those cells can shownull.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Build a local lead list | Find businesses, keyword and city, Businesses with a website on | Business | name, phone, website, address, categories | CSV for a CRM or outreach sheet |
| Compare rival venues | Business profiles, list of links | Business | rating, reviewsCount, priceRange, amenities, hours | Google Sheets or BI table |
| Watch new reviews | Reviews, business IDs, Only new results on | Review | rating, text, date, ownerReply, url | Apify schedule plus Slack or Notion summary |
| Study restaurant menus | Business profiles, Menu and popular dishes on | Business | menu, popularDishes, menuUrl | JSON for pricing analysis |
| Analyse customer opinions | Reviews, date range and keywords | Review | text, language, translatedText, reactions | Text analysis or LLM pipeline |
Tips for better results
- Yelp shows 240 positions per query and location. Use several locations for a big area.
- Turn on Only new results and set a State name to get only new reviews.
- Set Maximum cost per run in Run options to cap your spend.
Limits and good to know
- Public data only. The run uses no login and no customer cookies. Yelp's terms of service apply to how you use the data, so check them for your case
- The source can change. The run depends on Yelp's public data feeds, which are not a documented API. If Yelp changes one, reads fail with a
*_FORMAT_CHANGEDcode rather than saving wrong data - Countries. Tested on US businesses through Yelp's public frontend. Other countries can work but are not all tested
- Search depth. Yelp shows 240 positions per query and location. It repeats some businesses on later pages, and the run saves each one once, so two deep searches gave 185 and 204 different businesses from 24 pages. Repeats cost no row, so a page brings about 8 rows, not 10. There is no automatic map splitting, so use several locations for bigger areas
- Search order. Yelp's order differs between runs, so a monitor with a low Maximum results can return different businesses each time
- Photos and questions. A profile includes up to 25 gallery items and 2 question previews. Larger values load paid pages. For business videos,
urlis the thumbnail only - Non-recommended and removed reviews. These lists have a fixed order, and language and translation are
null - Monitor memory. Only new results keeps the latest 100,000 hashed IDs, so a very old row can come back. If the memory cannot be opened, you get all results and a
stateWarninginRUN_SUMMARY
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"recordType": "review",
"status": "complete",
"source": "Yelp",
"businessId": "WavvLdfdP6g8aZTtbBQHTw",
"businessName": "Gary Danko",
"businessAlias": "gary-danko-san-francisco",
"reviewId": "xtEERBKGS2OT72htwE2oDA",
"url": "https://www.yelp.com/biz/gary-danko-san-francisco?hrid=xtEERBKGS2OT72htwE2oDA",
"rating": 5,
"text": "Review text as published on Yelp.",
"translatedText": null,
"language": "en",
"date": "2026-11-02T04:16:53Z",
"reactions": { "helpful": 0, "thanks": 0, "love_this": 0, "oh_no": 0 },
"photos": [],
"videos": [],
"ownerReply": null,
"previousReviews": [],
"fetchedAt": "2026-11-03T00:06:42.987Z"
}Use it from code
Actor ID: cliqtomedia/yelp-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/yelp-scraper").call(run_input={
"mode": "search",
"query": "coffee"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~yelp-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "search", "query": "coffee"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/yelp-scraper")
result = tool.invoke({"run_input": {"mode": "search", "query": "coffee"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
recordType | string | Whether this row is a business profile or a review. |
status | string | Completeness of this result. |
source | string | Source of the data: Yelp. |
businessId | string | Encoded Yelp business ID. |
name | string | Business display name. |
alias | string | Business alias used in Yelp URLs. |
businessName | string | Name of the business reviewed. |
businessAlias | string | URL alias of the reviewed business. |
reviewId | string | Unique Yelp review ID. |
url | string | Canonical Yelp page or review link. |
rating | number | Business average rating or review stars. |
reviewsCount | integer | Number of recommended reviews reported by Yelp. |
categories | array | Business categories with aliases and titles. |
address | object | Street, city, region, postal code, country, and formatted business address. |
neighborhoods | array | Public business neighborhoods. |
coordinates | object | Latitude and longitude from Yelp business map. |
phone | string | Public business phone number. |
website | string | Business website URL. |
menuUrl | string | Link to the menu published on the business profile. |
priceRange | string | Yelp price range, from $ to $$$$. |
isClosed | boolean | Whether the business is permanently closed. |
isOpenNow | boolean | Whether Yelp reports the business open at fetch time. |
hours | array | Weekly opening hours, grouped by weekday. |
description | string | Business specialties or description. |
summary | string | Short profile summary published by Yelp. |
yearEstablished | integer | Establishment year when published. |
history | string | Business history text when published. |
amenities | array | Features and amenities with their names, labels, and values. |
photos | array | Business gallery or review media with IDs, URLs, and captions. Business gallery mediaType distinguishes photo and video; a video URL is its public thumbnail, not a playable video. |
photosCount | integer | Total business media items reported by Yelp. |
questions | array | Public community questions and answers. |
popularDishes | array | Popular dishes shown by Yelp; this is not the complete restaurant menu. |
ranking | integer | Position in the current search results. |
isAd | boolean | Whether the search result is sponsored. |
searchQuery | string | Search query that found this business. |
searchLocation | string | Search location that found this business. |
snippet | string | Review excerpt from the search result. |
text | string | Full review text. |
language | string | Language code of the review text. |
date | string | Review publication time in ISO 8601 UTC. |
Input settings (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| What to collect | mode | string | "search" |
| Search query | query | string | "coffee" |
| Search location | location | string | "San Francisco" |
| Business URLs or aliases | businessUrls | array | |
| Business IDs | businessIds | array | |
| More search queries | searchTerms | array | |
| More search locations | locations | array | |
| Maximum results | maxItems | integer | 10 |
| Businesses per search | maxBusinessesPerSearch | integer | 240 |
| Search order | searchSort | string | "recommended" |
| Category alias | category | string | "" |
| Price levels | priceLevels | array | |
| Business features | features | array | |
| Open now | openNow | boolean | false |
| Include sponsored results | includeAds | boolean | false |
| Also collect reviews | includeReviews | boolean | false |
| Reviews per business | maxReviewsPerBusiness | integer | 100 |
| Review order | reviewsSort | string | "newest" |
| Review ratings | ratings | array | |
| Review language | language | string | "en" |
| Review keywords | keywords | array | |
| Reviews from | dateFrom | string | "" |
| Reviews through | dateTo | string | "" |
| Translate reviews to | translateTo | string | "" |
| Public reviewer details | includeReviewerDetails | boolean | false |