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

3

Total users

2

Monthly active users

8 days 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.
  • You don't pay for rows we couldn't deliver. A business whose detail page Yelp refused still appears in your dataset, flagged blocked, but is not billed.
  • Repeat sweeps get cheaper. Details you already fetched are reused for cacheMaxAgeDays days instead of being downloaded again, and every row carries detailFetchedAt so you can see how fresh it is.

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
cacheMaxAgeDaysno7reuse details from your own recent runs; 0 = always fetch fresh

* 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",
"detailFetchedAt": "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, all-inclusive: $0.006 per business delivered. Compute and proxy traffic are already covered by that price — there is nothing else to add. A run that returns 40 businesses costs $0.24.

Apify subscription plans discount it automatically: $0.00533 on Bronze, $0.00467 on Silver, $0.004 on Gold and above.

You are only charged for rows that arrived with the data they were fetched for. If you asked for full details and Yelp refused a business's page, that row is still delivered — so you can see exactly which ones failed and re-run them — but it is not charged for. The run summary reports how many rows were charged and how many were delivered free.

Turning enrichDetails off makes runs substantially faster, 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, how many rows were charged vs delivered free, cache hits, request counts, and any coverage warning. Use it to check a run really did cover what you asked for, and what you actually paid 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.