Yelp Scraper
Pricing
from $1.20 / 1,000 business scrapeds
Yelp Scraper
Scrape Yelp business listings by search term, category, location, or URL. Optional full business details with phone, hours, website, and reviews.
Pricing
from $1.20 / 1,000 business scrapeds
Rating
0.0
(0)
Developer
Farhan Ali
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Yelp Scraper creates a structured dataset of business listings collected from Yelp. Each dataset item can include business identifiers, ratings, review counts, price range, categories, address and coordinates, and — when business details are enabled — phone, hours, attributes, and review text. Query the source using start URLs, a search term and location, or searchQueries, control the result limit with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.
Dataset at a glance
| Property | Value |
|---|---|
| Source | Yelp (yelp.com and regional sites such as yelp.de, yelp.co.uk, yelp.com.au) |
| Record unit | One business listing |
| Input methods | startUrls, searchTerm + location, searchQueries |
| Main identifiers | businessId, url, alias |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML, HTML |
| Update model | Fresh records per Actor run |
| Pricing | $1.50 per 1,000 listings; $3.00 per 1,000 additional for full business details |
Coverage and available records
The Actor collects business listings from Yelp search and category pages, and from direct business-page URLs. Supported behavior:
- Search by term and location —
searchTermpluslocationresolves through Yelp's own search/autocomplete. - Search queries —
searchQueriesaccepts strings like"Pizza in Berlin"or"term | location". - Regional sites —
countryCodeselects among 31 Yelp sites (US, DE, AT, CH, FR, IT, ES, NL, BE, IE, GB, CA, AU, NZ, SG, JP, MX, BR, SE, NO, DK, FI, PL, CZ, PT, AR, CL, HK, MY, PH, TW). Ignored when a start URL already includes a host. - Listing-only vs. details —
scrapeDetails(defaultfalse) returns listing fields only; when enabled, each business is enriched with phone, hours, attributes, full address, and up to a page of review text. - Pagination and limits —
maxItemscaps the number of businesses (0 = unlimited).
Not currently collected: menu data, photos beyond the primary thumbnail, owner responses, and full review history (the Actor returns the review snippet visible on the page, not every review).
Data dictionary
Listing fields (always present when available):
| Field | Type | Nullable | Description | Example |
|---|---|---|---|---|
businessId | string | no | Yelp internal business identifier; recommended deduplication key | _n0Awcf8FFjXBJaCgXXROw |
name | string | no | Business name | Café Bondi |
alias | string | yes | Yelp URL slug | café-bondi-berlin-2 |
url | string | no | Business page URL | https://www.yelp.de/biz/café-bondi-berlin-2 |
rating | number | yes | Average star rating | 4.2 |
reviewCount | integer | yes | Number of reviews | 117 |
priceRange | string | yes | Price range symbols | €€ |
categories | array | yes | Display category names | ["Frühstück & Brunch","Café"] |
categoryAliases | array | yes | Normalized category slugs | ["breakfast_brunch","cafes"] |
photo | string | yes | Primary photo URL | https://s3-media0.fl.yelpcdn.com/...jpg |
isAd | boolean | yes | Whether the listing is paid placement | false |
ranking | integer | yes | Position within the search result set | 1 |
searchTerm | string | yes | Term used for the query | Lunch |
searchLocation | string | yes | Resolved location | Berlin, Deutschland |
sourceQuery | string | yes | Combined query string | Lunch in Berlin, Deutschland |
domain | string | yes | Yelp site host | www.yelp.de |
snippet | string | yes | Highlighted review snippet | ...lots of lunch menu items... |
detailsFetched | boolean | no | Whether detail enrichment succeeded | true |
Detail fields (present when scrapeDetails is enabled and the page yields them):
| Field | Type | Nullable | Description | Example |
|---|---|---|---|---|
address | string | yes | Full street address | Eichendorffstr. 6, Berlin, BE, 10115 |
addressLine1 | string | yes | First address line | Eichendorffstr. 6 |
city | string | yes | City | Berlin |
region | string | yes | State/region code | BE |
postalCode | string | yes | Postal code | 10115 |
country | string | yes | Country code | DE |
neighborhoods | array | yes | Neighborhood names | ["Mitte"] |
latitude / longitude | number | yes | Coordinates | 52.53034262 |
phone | string | yes | Phone number | 030 2411221 |
isClosed | boolean | yes | Whether the business is marked closed | false |
isOpenNow | boolean | yes | Whether open at scrape time | true |
hours | array | yes | Weekly hours, one object per day | [{"day":"Mo","hours":["8:00 AM - 6:00 PM"]}] |
attributes | object | yes | Business attributes (parking, seating, etc.) | {"OutdoorSeating":true} |
reviews | array | yes | Review objects from the page | see below |
Each element of reviews contains id, rating, text, language, author, authorLocation, authorReviewCount, and date.
Example dataset record
{"businessId": "vs3J4zfbThn0_5w2Q5Mfuw","name": "Schlögl's","alias": "schlögls-berlin","url": "https://www.yelp.de/biz/schlögls-berlin","rating": 4.3,"reviewCount": 114,"priceRange": "€€","categories": ["Deutsch", "Biergarten"],"categoryAliases": ["german", "beergarden"],"photo": "https://s3-media0.fl.yelpcdn.com/bphoto/6J497GlRPS0VMOg3GQTuog/l.jpg","isAd": false,"ranking": 2,"searchTerm": "Lunch","searchLocation": "Berlin, Deutschland","sourceQuery": "Lunch in Berlin, Deutschland","domain": "www.yelp.de","detailsFetched": true,"address": "Karl-Liebknecht-Str. 9, Berlin, BE, 10178","city": "Berlin","country": "DE","latitude": 52.5213,"longitude": 13.406281,"phone": "030 2411221","isClosed": false,"isOpenNow": false,"hours": [{"day": "Mo", "hours": ["Geschlossen"], "isClosed": null}],"reviews": [{"id": "E6wsKvO9VBU3e6lLjaQx1g","rating": 5,"text": "Went here on the limb. While visiting Berlin...","language": "en","author": "Renata R.","authorLocation": "New York, Vereinigte Staaten","authorReviewCount": 607,"date": "2026-07-01T21:29:42+02:00"}]}
The record above was produced by a run with searchQueries: ["Lunch in Berlin"], countryCode: "DE", and scrapeDetails: true.
Query and input reference
| Input | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
startUrls | array | no | — | Yelp search or business URLs | Preferred input; domain is taken from the URL host |
searchTerm | string | no | — | keyword or category | What to find, e.g. Restaurants, Pizza |
location | string | no | — | city or area | Where to search, e.g. Berlin, New York, NY |
searchQueries | array | no | — | "term in location" or "term | location" | Alternative to searchTerm + location |
countryCode | string | no | US | 31 regional codes | Yelp site used when no start URL host is present |
scrapeDetails | boolean | no | false | true / false | Fetches full business details; adds the listing-details charge event |
maxItems | integer | no | 0 | 0 = unlimited | Maximum businesses to scrape |
proxyConfiguration | object | no | residential proxy | proxy settings | Residential proxies are recommended |
Minimal request:
{"searchTerm": "Lunch","location": "Berlin","countryCode": "DE","maxItems": 20,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Advanced request (bulk queries with details):
{"searchQueries": ["Lunch in Berlin", "Pizza in München"],"countryCode": "DE","scrapeDetails": true,"maxItems": 0,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Retrieve the data through the API
- Start the Actor with a JSON input (see above).
- Wait for the run to finish, or call the synchronous endpoint for quick jobs.
- Retrieve items from the run's default dataset.
- Paginate or export the dataset in the format you need.
Python example:
import jsonimport urllib.requestAPI_TOKEN = "<your Apify API token>"ACTOR_ID = "datascrapers/yelp-scraper"payload = {"searchTerm": "Lunch","location": "Berlin","countryCode": "DE","maxItems": 20,"proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]},}req = urllib.request.Request(f"https://api.apify.com/v2/acts/{ACTOR_ID}/runs?token={API_TOKEN}",data=json.dumps(payload).encode(),headers={"Content-Type": "application/json"},)with urllib.request.urlopen(req) as resp:run = json.loads(resp.read())["data"]dataset_id = run["defaultDatasetId"]with urllib.request.urlopen(f"https://api.apify.com/v2/datasets/{dataset_id}/items?token={API_TOKEN}") as resp:items = json.loads(resp.read())
For other languages, use the generated API tab on the Actor's page.
Data quality and record handling
- Conditional fields — detail fields (phone, hours, attributes, reviews) are only present when
scrapeDetailsis enabled and Yelp exposes them for that business. - Nullable values —
rating,reviewCount, and address components may be absent for sparse listings; treat them as nullable. - Deduplication —
businessIdis the stable, recommended unique key.urlalso uniquely identifies a business. - Retries and errors — requests are retried with backoff; a business that fails to load is skipped rather than partially written.
- Raw values —
priceRange,categories, andhoursare reported as Yelp displays them; no normalization beyond extracting the fields above.
The Actor does not guarantee a full-site snapshot; results reflect what a given query returns at run time.
Export and pipeline examples
| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL/Supabase | Dataset API or webhook consumer | Store business records keyed by businessId |
| Google Sheets | Apify integration | Review and share a small result set |
| S3/cloud storage | Scheduled export or integration | Archive daily/weekly snapshots |
| BI tools | CSV/JSON export | Analyze ratings and price ranges by city |
Pricing and cost examples
The Actor uses pay-per-event billing. Two charge events apply:
dataset-item— $1.50 per 1,000 business listings returned.listing-details— $3.00 per 1,000 businesses whenscrapeDetailsis enabled (in addition to the listing event).
Apify plan discounts (Bronze/Silver/Gold) reduce these rates.
| Records | Estimated base cost |
|---|---|
| 1,000 listings | $1.50 |
| 10,000 listings | $15.00 |
| 10,000 listings + details | $45.00 |
Estimates assume the free-tier rate and no proxy markup; actual cost depends on your Apify plan and selected options.
Limitations and responsible data use
- The Actor collects publicly accessible listing data only; it does not bypass login or paywalls.
- Results depend on Yelp's current page structure; site changes can require Actor updates.
- Some fields are conditional or nullable (see Data dictionary).
- The Actor does not retain historical snapshots unless you store them yourself.
- You are responsible for complying with Yelp's terms of service and applicable privacy and contractual obligations.
Dataset questions
What does one dataset item represent?
One Yelp business listing, optionally enriched with full business details and a page of reviews.
Which field should I use as a unique identifier?
businessId. url is also unique and useful for joins with other datasets.
Are fields nullable or conditional?
Yes. Rating, review count, and address components may be null. Detail fields appear only when scrapeDetails is enabled and the page exposes them.
Can I retrieve the records as CSV or JSON?
Yes. The default dataset supports JSON, CSV, Excel, and XML exports, and the Dataset API returns JSON.
How do I paginate large datasets?
Set maxItems to cap the run, or paginate the default dataset via the Dataset API (offset/limit parameters).
What counts as a billable result?
Each business listing returned counts as one dataset-item. Enabling scrapeDetails adds one listing-details event per business.
Related datasets from Data Scrapers
- LinkedIn Company Scraper — company-level data (employee count, posts, founders) that can be joined with business listings by company name.
- Redfin Scraper — real-estate listings with pricing for location-based market research.
- Instagram Post Scraper — social posts that complement local-business brand analysis.
- Zoopla Scraper — property listings for adjacent UK location datasets.
Data Scrapers support
Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.