Yelp Scraper — Business + Reviews + Menu + Photos in One Call
Pricing
from $4.00 / 1,000 business profiles
Yelp Scraper — Business + Reviews + Menu + Photos in One Call
Extract a Yelp business profile + all reviews (auto-expanded, ISO dates) + menu + photos + amenities + hours in one call. Worldwide — any Yelp country domain, residential-proxy ready. No Fusion key, no 3-review cap. Pay-per-event: $0.004/business, $0.0008/review.
Pricing
from $4.00 / 1,000 business profiles
Rating
0.0
(0)
Developer
Tomas Lebedinskas
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Extract Yelp business data at scale — the full business profile, all reviews (auto-expanded, with ISO dates), the menu, and the photo gallery — in a single call. No Yelp Fusion API key. No 3-review cap. Works on any Yelp country domain.
Maintained by Godberry Studios. Questions or a regional domain acting up? hello@godberrystudios.com.
How to use (30 seconds)
- Open any Yelp business in your browser.
- Copy the URL from the address bar.
- Paste it into Yelp URLs below and click Start.
That's it. Add as many URLs as you like — they run in one batch. Free-text queries (Joe's Pizza Bleecker Street New York) and bare slugs (the-original-pancake-house-portland) also work — the actor resolves them the way a human would on Yelp's search page.
Which domains work best. The regional domains —
yelp.de,yelp.co.uk,yelp.fr,yelp.com.au,yelp.it,yelp.es, … — are the reliable ones; set the Proxy country to match the domain (e.g. proxyDEforyelp.de) for clean runs.yelp.comandyelp.caare the exception: DataDome defends them very aggressively and frequently 403s requests from cloud platforms even through a residential proxy — for those, your best bet is a residential proxy on an IP you control. The actor ships with Apify Residential proxy as the default (Apify bills residential data by the gigabyte, separately from this actor's pay-per-event charges); on the regional domains you can switch to the cheaper datacenter proxy in the Proxy option.
What you get
Per business (~33 fields) — name, Yelp slug, canonical URL, regional domain, full address (street, city, state/region, postcode, country), latitude/longitude, phone in E.164 and local format, website, average rating, total review count, price level, categories, photo-gallery URLs (full resolution), hero image, hours for each weekday, claimed-by-owner flag, amenities, extracted email when present, plus a scrape timestamp.
Per review (16 fields) — reviewer name, profile URL, Elite status, lifetime review count, location, star rating, full (auto-expanded) review text, the raw relative date ("3 weeks ago"), an absolute ISO-8601 date, helpful/cool/funny counts, review photos, and the owner's reply (text + dates) when one exists.
Per menu item (5 fields) — name, price, category, photo, description. Restaurants with a Yelp menu page only.
Field coverage — what's reliable vs. occasional
These come back populated on essentially every business: name, address, city/postcode/country, phone, website, rating, review count, price level, categories, hours, amenities, photos, reviews. The menu populates for restaurants that have a Yelp menu page. These are in the schema for completeness but Yelp surfaces them inconsistently — or no longer at all — so expect them to be empty more often than not: latitude/longitude, socialLinks, neighborhoods, ownerName, healthScore, establishedYear, extractedEmail, and popularDishes. We'd rather you know that up front than be surprised in the dataset.
Why this one
- Bundled output. Business profile + every review + menu + photos come back in one run, in one record — not split across separate actors you'd have to pay for and stitch together yourself.
- Worldwide. The regional domain is auto-detected from the URL; the phone is normalized to E.164 with the right country code; review dates are parsed across ~15 languages, both relative and absolute. ~31 country domains are pre-verified (see Worldwide support below) and an unrecognized
yelp.<tld>still works. - ISO dates. Every review carries an absolute ISO-8601 date alongside Yelp's relative string, so trend lines and filters Just Work.
- No Fusion API limits. The official Yelp Fusion API caps you at 3 reviews per business and requires a key. This doesn't.
- GDPR-aware. An
includePersonalDatatoggle that defaults off on EU/EEA + UK + Switzerland domains, so you only pull reviewer profile data when you mean to. - Pay-per-event pricing. You pay for what comes back — a few tenths of a cent per business, fractions of a cent per review — fair on small lookups, predictable on large pulls.
- Resilient. Real Chrome (not a headless shell), residential proxy by default, and it detects DataDome challenges — both the redirect kind and the embedded-iframe kind served at the original URL — and retries on a fresh session. If a deep review pull gets rate-limited mid-pagination, you get what was collected rather than a failed run; if retries are exhausted you still get the business profile.
Pricing
Pay-per-event — you pay only for what comes back.
| Event | Price |
|---|---|
| Run start | $0.001 |
| Per business returned | $0.004 |
| Per review returned | $0.0008 |
| Per menu item returned | $0.0005 |
Example. One restaurant with 50 reviews + 20 menu items = $0.001 + $0.004 + (50 × $0.0008) + (20 × $0.0005) = $0.055 in actor charges.
Two things to keep in mind on total cost: (1) the default Residential proxy — needed to get past DataDome — is billed by Apify by the gigabyte, separately from the events above (usually a few cents per business); on most regional domains you can switch to the cheaper datacenter proxy. (2) Apify's free plan includes $5/month of platform usage — that covers anywhere from tens to a few hundred small runs depending on your proxy choice. Plenty to decide whether this fits your workflow.
Input
{"urls": ["https://www.yelp.co.uk/biz/dishoom-london","https://www.yelp.de/biz/burgermeister-berlin-3","https://www.yelp.com.au/biz/the-grounds-of-alexandria-alexandria","Burgermeister Berlin"],"maxReviewsPerBusiness": 100,"sortReviews": "newest","onlyWithText": false,"includeMenu": true,"includePhotos": true,"includeOwnerResponses": true,"includePersonalData": false,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Input fields
| Field | Type | Default | Description |
|---|---|---|---|
urls | string[] | required | Yelp business URLs, business slugs, or business-name search queries — one per line |
maxReviewsPerBusiness | int | 100 | Cap reviews per business (1–1000; Yelp paginates 10 per page) |
sortReviews | enum | newest | relevant (Yelp Sort) / newest / oldest / highest / lowest — applied via Yelp's review sort |
onlyWithText | bool | false | Skip star-only reviews that have no text |
includeMenu | bool | true | Extract the menu when the business has a Yelp menu page (restaurants only) |
includePhotos | bool | true | Include the full-resolution photo-gallery URLs |
includeOwnerResponses | bool | true | Capture the owner's reply under each review, when present |
includePersonalData | bool | false on EU/EEA/UK/CH domains; true elsewhere | GDPR toggle — reviewer name, profile URL, location, Elite status, lifetime review count |
flattenForSpreadsheet | bool | false | Joins array fields with " | " and pushes reviews/menu as separate rows — clean CSV/Excel export |
proxyConfiguration | object | Apify Residential | Standard Apify proxy input. Residential is the default because DataDome blocks datacenter IPs. On a regional domain, set the proxy country to match the domain (e.g. apifyProxyCountry: "DE" for yelp.de) — that's the reliable setup. yelp.com/yelp.ca are still often 403'd even through a residential proxy on a cloud platform; a residential proxy on an IP you control via proxyUrls is the best option there. |
Worldwide support
Works on any Yelp country domain — the regional domain is auto-detected from the URL, the phone is normalized to E.164 with the right country code, and review dates are parsed across ~15 languages (relative and absolute). Pre-verified domains (~31): yelp.com .ca .co.uk .ie .fr .de .at .ch .it .es .pt .nl .be .pl .cz .dk .fi .no .se .com.au .co.nz .com.sg .com.ph .com.hk .com.tw .co.jp .com.br .com.mx .com.ar .cl .com.tr. An unrecognized yelp.<tld> still works — it just falls back to the page's structured data for the country.
includePersonalData defaults to false on EU/EEA + UK + Switzerland domains (.co.uk .ie .fr .de .at .ch .it .es .pt .nl .be .pl .cz .dk .fi .no .se) for GDPR safety — set it true to override.
Anti-bot posture
Yelp uses DataDome (TLS/JA3 fingerprinting, JS challenges, IP-reputation blocking). This actor:
- routes through Apify Residential proxy by default — DataDome blocks datacenter/cloud IPs, so a residential exit is required; set the proxy country to match the regional domain for clean runs. (
yelp.com/yelp.caare the hard case — even a residential proxy on a cloud platform is frequently blocked; a residential IP you control gives the best odds.) You can bring your ownproxyUrls, pick a country, or disable the proxy for testing. - runs the real Chrome binary, not Playwright's
chromium_headless_shell(the latter is fingerprinted by every modern anti-bot) - hides the
navigator.webdriverflag and uses a desktop-class viewport and a current Chrome User-Agent - detects DataDome challenges — both redirect-style and the embedded-iframe kind served at the original URL — and treats them as transient errors, so it retries with a fresh proxy session
- on a deep review pull, if DataDome rate-limits the pagination it returns what it collected rather than failing the whole business; if retries are exhausted it still delivers the business profile
Use cases
- Restaurant intelligence — bundle reviews + menu + photos for chain-vs-chain analysis
- Lead generation — claimed-business data with a normalized E.164 phone (and an email where Yelp shows one) for outreach
- Reputation monitoring — feed reviews into a sentiment pipeline; ISO dates make trend lines easy
- Competitive analysis — pull competitors in an area and sort by rating or review velocity
- AI / NLP training data — full review text + ISO dates + reviewer profiles in clean JSON
Limits worth knowing
- Search input resolves to the top result. Pass a Yelp
/searchURL or a free-text query and the actor opens the first business it returns — it does not yet crawl a whole result page. For a multi-business pull, supply the business URLs directly. (Yelp itself caps search results at 240 — narrow by neighborhood or zipcode if you're building such a list.) yelp.com/yelp.caare the hard case. DataDome defends them very aggressively — they're frequently 403'd from cloud platforms even through a residential proxy. The regional domains (.de,.co.uk,.fr,.com.au,.it, …) are the reliable ones; foryelp.com/yelp.ca, supply a residential proxy on an IP you control viaproxyUrls.- Deep review pulls can get rate-limited by DataDome after a few hundred reviews even with a residential proxy; past that, the actor returns what it got rather than failing.
- Free-plan Apify users are capped at 1 business and 10 reviews per run, with an upgrade message — Apify pay-per-event events don't pay developers when triggered by free-plan accounts. Any paid Apify subscription unlocks the full output.
- Selectors can shift. A few of Yelp's
aria-labelstrings differ across regional domains; if a particular domain breaks, email us — those live in oneSELECTORSconstant and we patch quickly.
Reliability
Once this actor has 30 days of production runs, we'll publish its 30-day SUCCEEDED rate here and refresh it weekly. Target: ≥99%.
License
MIT. Author: Godberry Studios — hello@godberrystudios.com.