Yelp Scraper - Local Business Data, Hours & Contacts avatar

Yelp Scraper - Local Business Data, Hours & Contacts

Pricing

from $4.00 / 1,000 business scrapeds

Go to Apify Store
Yelp Scraper - Local Business Data, Hours & Contacts

Yelp Scraper - Local Business Data, Hours & Contacts

Scrape Yelp local businesses by city and category: name, address, phone, website, opening hours, categories, price tier, rating and review count. No login. Export CSV/JSON.

Pricing

from $4.00 / 1,000 business scrapeds

Rating

0.0

(0)

Developer

WebDataLabs

WebDataLabs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Yelp Scraper — Local Business Data, Hours & Contacts

Turn any US city into a clean spreadsheet of local businesses: name, street address, phone, website, opening hours, categories, price tier, rating and review count — one flat row each, ready for CSV, Excel, Google Sheets or your CRM.

What you get

FieldExample
nameMoonshine Grill
address, city, state, postalCode900 E 11th St · Austin · TX · 78702
phone(512) 653-1187
websitehttps://franklinbbq.com/
categoriesSouthern, Breakfast & Brunch, Cocktail Bars
priceRange$$
rating / reviewCount4.4 / 6400
hoursMon: Closed · Tue: 11:00 AM - 3:00 PM · …
photoUrlsYelp CDN links
yelpUrl, businessId, alias, rankingstable identifiers + search position

website is the field most people actually come for — Yelp's own official API does not return it at any price tier.

Why this one

  • Real review counts. Yelp's UI abbreviates to "6.4k". Other scrapers ship 6.4. This returns 6400.
  • Honest completeness. Every row carries enrichmentStatusfull, search_only or blocked — so you always know whether a null means "Yelp doesn't list it" or "we couldn't read it". Nothing is ever invented to fill a gap: no "N/A", no 0 ratings, no placeholder addresses.
  • Honest coverage. Yelp will not paginate an anonymous search past roughly 60 results, no matter what total it displays. Most scrapers quietly hand you a truncated list that looks complete; this one tells you in the run summary exactly which queries were cut short and what to do about it.
  • No fake success. A run that gets refused on every query fails loudly rather than finishing green with an empty dataset.

Input

FieldRequiredDefaultNotes
locationyes*"Austin, TX" or a ZIP code
searchTermsno["Restaurants"]one query per term
maxResultsno100stop after N businesses
enrichDetailsnotrueoff = faster/cheaper, search-page fields only
startUrlsno[]paste Yelp business URLs instead of searching

* either location or startUrls.

{
"location": "Austin, TX",
"searchTerms": ["Pizza", "Coffee", "Sushi"],
"maxResults": 200,
"enrichDetails": true
}

Covering a whole city — read this first

Yelp serves roughly 60 results per search query, then stops paginating. It will happily tell you there are 240 matches, but it does not hand them over to anonymous visitors — offsets beyond the first few pages are refused outright. That is Yelp's limit, not the scraper's, and no scraper can honestly promise you 240 from one query.

So: use more queries, not a bigger maxResults. Each search term gets its own ~60-result allowance.

{
"location": "Los Angeles, CA",
"searchTerms": ["Pizza", "Sushi", "Tacos", "Thai", "Burgers", "Ramen", "Steakhouse", "Vegan"],
"maxResults": 400
}

Eight specific terms will get you far more of a city than one broad "Restaurants" ever will. Searching per ZIP code works the same way. The run summary names every query that was cut short and how many it returned versus how many Yelp claimed.

Example output

{
"businessId": "cs6HfZNykLVitm09jWFqWg",
"alias": "moonshine-grill-austin",
"name": "Moonshine Grill",
"yelpUrl": "https://www.yelp.com/biz/moonshine-grill-austin",
"ranking": 1,
"address": "303 Red River St",
"city": "Austin",
"state": "TX",
"postalCode": "78701",
"country": "US",
"phone": "(512) 236-9599",
"website": "https://moonshinegrill.com/",
"categories": ["Southern", "Breakfast & Brunch", "Cocktail Bars"],
"priceRange": "$$",
"rating": 4.4,
"reviewCount": 6400,
"isPermanentlyClosed": null,
"hours": [
{ "day": "Mon", "hours": "11:00 AM - 10:00 PM" },
{ "day": "Tue", "hours": "11:00 AM - 10:00 PM" }
],
"photoUrls": ["https://s3-media0.fl.yelpcdn.com/bphoto/…/l.jpg"],
"enrichmentStatus": "full",
"searchTerm": "Restaurants",
"searchLocation": "Austin, TX",
"scrapedAt": "2026-07-27T12:00:00.000Z"
}

Three dataset views ship with the actor: Overview, Contact list (name/phone/website/address — the lead-gen export), and Full data.

Pricing

Pay per result. You are charged $0.004 per business delivered, plus Apify's platform usage. Nothing else — a run that returns 40 businesses costs about $0.16.

Turning enrichDetails off makes runs substantially faster and cheaper, at the cost of the address, phone, website and hours fields.

Run summary

Every run writes an OUTPUT record to the key-value store with per-query coverage, how many rows were full vs search_only vs blocked, request counts, and any 240-cap warning. Use it to check a run really did cover what you asked for.

What this actor does not collect

  • No reviews, no reviewer names, photos or profiles. Only the aggregate rating and reviewCount numbers. This keeps the output free of personal data.
  • No images are copied. Photos are referenced by URL only.
  • No login, no accounts. Only publicly visible pages are read, at a deliberately measured request rate.

Notes

  • US residential proxy is required and enabled by default. Yelp filters by IP reputation, so datacenter proxies will be refused.
  • Sponsored/ad placements are excluded — you get organic listings only.
  • You are responsible for how you use the data you collect, including compliance with applicable law and with Yelp's terms.

Built by WebDataLabs. Found a problem or need another field? Open an issue on the actor page.