Yelp Scraper - Local Business Data, Hours & Contacts
Pricing
from $4.00 / 1,000 business scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
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
| Field | Example |
|---|---|
name | Moonshine Grill |
address, city, state, postalCode | 900 E 11th St · Austin · TX · 78702 |
phone | (512) 653-1187 |
website | https://franklinbbq.com/ |
categories | Southern, Breakfast & Brunch, Cocktail Bars |
priceRange | $$ |
rating / reviewCount | 4.4 / 6400 |
hours | Mon: Closed · Tue: 11:00 AM - 3:00 PM · … |
photoUrls | Yelp CDN links |
yelpUrl, businessId, alias, ranking | stable 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 returns6400. - Honest completeness. Every row carries
enrichmentStatus—full,search_onlyorblocked— 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", no0ratings, 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
cacheMaxAgeDaysdays instead of being downloaded again, and every row carriesdetailFetchedAtso you can see how fresh it is.
Input
| Field | Required | Default | Notes |
|---|---|---|---|
location | yes* | — | "Austin, TX" or a ZIP code |
searchTerms | no | ["Restaurants"] | one query per term |
maxResults | no | 100 | stop after N businesses |
enrichDetails | no | true | off = faster/cheaper, search-page fields only |
startUrls | no | [] | paste Yelp business URLs instead of searching |
cacheMaxAgeDays | no | 7 | reuse 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
ratingandreviewCountnumbers. 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.