Yelp Scraper avatar

Yelp Scraper

Pricing

from $1.20 / 1,000 business scrapeds

Go to Apify Store
Yelp Scraper

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

Farhan Ali

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

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

PropertyValue
SourceYelp (yelp.com and regional sites such as yelp.de, yelp.co.uk, yelp.com.au)
Record unitOne business listing
Input methodsstartUrls, searchTerm + location, searchQueries
Main identifiersbusinessId, url, alias
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel, XML, HTML
Update modelFresh 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 locationsearchTerm plus location resolves through Yelp's own search/autocomplete.
  • Search queriessearchQueries accepts strings like "Pizza in Berlin" or "term | location".
  • Regional sitescountryCode selects 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. detailsscrapeDetails (default false) 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 limitsmaxItems caps 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):

FieldTypeNullableDescriptionExample
businessIdstringnoYelp internal business identifier; recommended deduplication key_n0Awcf8FFjXBJaCgXXROw
namestringnoBusiness nameCafé Bondi
aliasstringyesYelp URL slugcafé-bondi-berlin-2
urlstringnoBusiness page URLhttps://www.yelp.de/biz/café-bondi-berlin-2
ratingnumberyesAverage star rating4.2
reviewCountintegeryesNumber of reviews117
priceRangestringyesPrice range symbols€€
categoriesarrayyesDisplay category names["Frühstück & Brunch","Café"]
categoryAliasesarrayyesNormalized category slugs["breakfast_brunch","cafes"]
photostringyesPrimary photo URLhttps://s3-media0.fl.yelpcdn.com/...jpg
isAdbooleanyesWhether the listing is paid placementfalse
rankingintegeryesPosition within the search result set1
searchTermstringyesTerm used for the queryLunch
searchLocationstringyesResolved locationBerlin, Deutschland
sourceQuerystringyesCombined query stringLunch in Berlin, Deutschland
domainstringyesYelp site hostwww.yelp.de
snippetstringyesHighlighted review snippet...lots of lunch menu items...
detailsFetchedbooleannoWhether detail enrichment succeededtrue

Detail fields (present when scrapeDetails is enabled and the page yields them):

FieldTypeNullableDescriptionExample
addressstringyesFull street addressEichendorffstr. 6, Berlin, BE, 10115
addressLine1stringyesFirst address lineEichendorffstr. 6
citystringyesCityBerlin
regionstringyesState/region codeBE
postalCodestringyesPostal code10115
countrystringyesCountry codeDE
neighborhoodsarrayyesNeighborhood names["Mitte"]
latitude / longitudenumberyesCoordinates52.53034262
phonestringyesPhone number030 2411221
isClosedbooleanyesWhether the business is marked closedfalse
isOpenNowbooleanyesWhether open at scrape timetrue
hoursarrayyesWeekly hours, one object per day[{"day":"Mo","hours":["8:00 AM - 6:00 PM"]}]
attributesobjectyesBusiness attributes (parking, seating, etc.){"OutdoorSeating":true}
reviewsarrayyesReview objects from the pagesee 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

InputTypeRequiredDefaultAccepted valuesDescription
startUrlsarraynoYelp search or business URLsPreferred input; domain is taken from the URL host
searchTermstringnokeyword or categoryWhat to find, e.g. Restaurants, Pizza
locationstringnocity or areaWhere to search, e.g. Berlin, New York, NY
searchQueriesarrayno"term in location" or "term | location"Alternative to searchTerm + location
countryCodestringnoUS31 regional codesYelp site used when no start URL host is present
scrapeDetailsbooleannofalsetrue / falseFetches full business details; adds the listing-details charge event
maxItemsintegerno00 = unlimitedMaximum businesses to scrape
proxyConfigurationobjectnoresidential proxyproxy settingsResidential 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

  1. Start the Actor with a JSON input (see above).
  2. Wait for the run to finish, or call the synchronous endpoint for quick jobs.
  3. Retrieve items from the run's default dataset.
  4. Paginate or export the dataset in the format you need.

Python example:

import json
import urllib.request
API_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 scrapeDetails is enabled and Yelp exposes them for that business.
  • Nullable valuesrating, reviewCount, and address components may be absent for sparse listings; treat them as nullable.
  • DeduplicationbusinessId is the stable, recommended unique key. url also 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 valuespriceRange, categories, and hours are 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

DestinationRecommended methodTypical use
PostgreSQL/SupabaseDataset API or webhook consumerStore business records keyed by businessId
Google SheetsApify integrationReview and share a small result set
S3/cloud storageScheduled export or integrationArchive daily/weekly snapshots
BI toolsCSV/JSON exportAnalyze 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 when scrapeDetails is enabled (in addition to the listing event).

Apify plan discounts (Bronze/Silver/Gold) reduce these rates.

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

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