Yelp Scraper Alternative - Local Leads + Verified Emails
Pricing
from $5.00 / 1,000 business leads
Yelp Scraper Alternative - Local Leads + Verified Emails
Yelp scraper alternative with no API key. Turn any business category + city into local business leads via OpenStreetMap: emails pulled from each website & MX-verified, plus phone, address, socials, a 0-100 lead score (A-F) and optional AI cold openers. Export CSV, JSON, Excel.
Pricing
from $5.00 / 1,000 business leads
Rating
0.0
(0)
Developer
Flash Scrape
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
A Yelp scraper alternative that turns any category + location into a contactable list of local business leads — verified emails, phones, websites and a 0-100 lead score. Search something like "dentists in Austin, TX" and get back a clean, scored, ready-to-contact spreadsheet of businesses, not a raw listing dump. It does not scrape Yelp itself — listings come from OpenStreetMap and contacts are crawled from each business's own website, which is why the emails are real and why no API key, login or proxy is needed.
Unlike Yelp itself (which almost never shows an email), this tool visits each business's own website to find the real email address — so the leads you export are actually reachable. Built for cold outreach, agencies, B2B sales prospecting, and anyone building a local-business lead list.
How to get local business leads
You don't need an API key, a Yelp login, or any code. Three steps:
- Enter one or more search terms (e.g.
coffee shops,plumbers,med spas). - Enter one or more locations (e.g.
Austin, TX,Miami, FL). Every term is searched in every location. - Set your filters and
maxItems, then run.
The actor finds matching local businesses via OpenStreetMap, visits each business website to enrich emails and social links, removes duplicates, MX-verifies every email, scores every lead 0–100, and pushes a clean dataset you can export to CSV, JSON, or Excel — best leads first. Running it with an empty input {} works too: it searches the default dentists in Austin, TX.
- Find local business emails — visits each website's home / contact / about pages to pull the real email.
- Get phone, website & address for every business — the core contact fields you need to reach out.
- Verify every email — MX + role + disposable checks label each address
deliverable,riskyorundeliverable. - Export only contactable leads — drop businesses with no website, no email or no verified email so you don't pay for dead rows.
- Rank leads automatically — a 0–100 lead score (A–F grade, hot/warm/cold tier) sorts the best prospects to the top.
- Write AI cold-email openers — an optional one-line personalized icebreaker per lead, on your own OpenAI/Anthropic key.
What data you get
One row per business, scored and sorted best-first. Every row of a run carries the same column set (absent values are null), so CSV headers never shift mid-export.
| Field | Description |
|---|---|
lead_score / lead_grade / lead_tier | 0–100 score from verified email deliverability + phone + website + socials; A–F grade; hot / warm / cold tier. score_breakdown shows the points per signal. |
name | Business name. |
category / categories | Business category (e.g. dentist) as mapped in OpenStreetMap. |
phone | Business phone number (from OpenStreetMap). |
email | Best email found on the business's own website (MX-verified when verification is on). extra_emails lists up to 5 more. |
email_status | deliverable, risky (role alias such as info@, or MX lookup unavailable), undeliverable; found when verification is off or ran out of time; missing when no email was found. |
email_provider | Mailbox host (e.g. Google Workspace, Microsoft 365) when known. email_domain_match says whether the email sits on the business's own domain. |
website / domain | Business website URL and its bare domain. |
address / city / region / postal_code | Street address and its parts as mapped in OpenStreetMap. |
facebook / linkedin / twitter | Social profiles found on the website. instagram is reserved and currently always null. |
has_email / has_phone / has_website | Convenience flags for CRM filters. |
icebreaker | Optional AI-written cold-email opener (null unless writeOpeners is on). |
source_url / source | Link back to the OpenStreetMap object this lead came from; source is always OpenStreetMap. |
attribution | The ODbL attribution string (© OpenStreetMap contributors, ODbL 1.0 …) — keep it with the data when you redistribute it (see Data source & licence). |
rating, reviews, hours, amenities, claimed, verified, health_score, photo, yelp_business_id | Always null / empty — OpenStreetMap carries none of these; kept for schema stability with older exports. |
JSON output sample
{"name": "Joe's Coffee House","category": "cafe","phone": "+1 512-555-0199","website": "https://joescoffee.com","email": "hello@joescoffee.com","email_status": "deliverable","email_provider": "Google Workspace","email_domain_match": true,"address": "123 Congress Ave, Austin, TX 78701","city": "Austin","region": "TX","postal_code": "78701","rating": null,"reviews": null,"facebook": "https://www.facebook.com/joescoffee","linkedin": null,"twitter": null,"icebreaker": null,"lead_score": 80,"lead_grade": "A","lead_tier": "hot","source_url": "https://www.openstreetmap.org/node/1234567890","source": "OpenStreetMap","domain": "joescoffee.com","attribution": "© OpenStreetMap contributors, ODbL 1.0 (https://www.openstreetmap.org/copyright)"}
Results also render as a sortable table on the Output tab and export to CSV / JSON / Excel.
Filters & options (input)
Provide search terms + locations, then tune what gets delivered. You're only charged for leads that survive your filters.
| Field | What it does |
|---|---|
searchTerms | Categories / keywords to scrape, one per line — e.g. plumbers, dentists. A term may embed its own city: coffee shops in Austin, TX. Default ["dentists"]. |
locations | Cities / areas, one per line — e.g. Denver, CO. Each term is searched in each location. Default ["Austin, TX"]. |
maxItems | Max businesses to deliver across all searches (default 50, max 1000). |
onlyNewLeads | Deliver — and bill — only businesses not delivered by an earlier run of the same search + filters (see New-business alerts). |
minRating / minReviews | Accepted for compatibility but not applied — OpenStreetMap exposes no ratings or review counts. The run says so in its status message when you set them. |
onlyWithWebsite | Drop businesses with no website (applied before the crawl, so those rows cost nothing). |
onlyWithEmail | Drop businesses where no email was found — best for cold email. |
onlyVerifiedEmail | Keep only deliverable / risky emails. Needs verifyEmails on; a row the run had no time to verify does not count as verified. |
enrichEmails | Visit each business website to extract emails + socials (default on, no key needed). |
verifyEmails | MX-verify every email and label it (default on, no key needed). |
minScore | Keep only leads scoring at or above this value (0–100). |
writeOpeners | Add an AI cold-opener per lead — needs your own AI key. |
llmProvider / llmApiKey / llmModel | Pick OpenAI or Anthropic and supply your key for the openers. |
webhookUrl | POST a digest of the delivered rows to Slack / Discord / any webhook (see Alerts). |
Example input:
{"searchTerms": ["restaurants", "coffee shops"],"locations": ["Austin, TX", "Portland, OR"],"maxItems": 50,"onlyWithWebsite": true,"onlyWithEmail": true,"enrichEmails": true,"verifyEmails": true,"writeOpeners": false}
What a run tells you
Every run ends with a plain-language status message and a RUN_SUMMARY record in the run's key-value store (counts, causes, coverage), so you never have to guess why you got the rows you got:
- A delivering run says how many leads were delivered and how many have an email, a phone and a verified email, plus a link to the run report.
- A run that delivers nothing exits SUCCEEDED, names the real cause — OpenStreetMap mirrors overloaded, a location that could not be geocoded, a category OpenStreetMap does not recognise, filters that removed every row, a quiet
onlyNewLeadswatch, or the run's time budget — and ends with "You were not charged." A search that failed is reported as failed, never as "no results". When the time budget cut a stage only part-way, the message gives both counts — rows that were crawled/verified and genuinely lack a usable email, and rows skipped for time — and promises only what a longer run can recover. If billing itself could not be recorded, the status message says so. - If part of a multi-city order could not be searched (a geocode failure, a mirror outage, the time budget), the message says which searches did not run — their rows are missing, not absent.
- Large orders degrade gracefully: the run watches its own timeout inside the crawl and verification loops, delivers what it has before the platform's deadline, and tells you how many websites were not crawled or emails not verified in time, so you can raise the run timeout instead of losing the whole run.
Use with AI agents & automation
This local-lead scraper plugs straight into your stack. Call it from the Apify MCP server so AI agents (Claude, ChatGPT, Cursor) can pull leads on demand, or wire the dataset into Make, n8n, or Zapier to push new leads into your CRM the moment a run finishes. Sync the output to Google Sheets for a live, shareable lead list — no engineering required.
New-business alerts (run it on a schedule)
Set onlyNewLeads: true and this Actor becomes a monitor instead of a one-off pull.
- The first run of a search is the baseline: it delivers everything it finds, and says so.
- Every later run on the same search delivers - and bills - only businesses that appeared since. A quiet week returns zero rows and charges nothing.
- Memory is per search + filter combination (
onlyWithWebsite,onlyWithEmail,onlyVerifiedEmail,minScore), kept 90 days in a named key-value store in your own account. ChangingmaxItems,enrichEmails,verifyEmails,writeOpenersorwebhookUrldoes not reset a watch; changing one of the four filters starts a new one. - Businesses still present in the search have their memory refreshed on every run, so a long-mapped business never ages out and gets sold to you twice; a business that disappears from OpenStreetMap drops out of memory after 90 days.
- A row is remembered only after it has actually been written to your dataset. If the watch's memory cannot be read, the run stops with a message instead of re-delivering (and re-billing) the baseline; if it cannot be saved, the run says so.
Alerts: get a Slack / Discord / webhook message when new rows land
Set webhookUrl and every run that delivers at least one row POSTs a digest to it. A Slack incoming webhook gets a text message, a Discord webhook gets a message, and any other URL (n8n / Make / Zapier catch hook, your own endpoint) gets JSON: {actor, delivered, run_url, dataset_url, rows[:20], text}. Quiet runs send nothing. Pair it with onlyNewLeads on a schedule and the Actor is a new-business alert service on its own — no extra flow needed just to see the rows. Delivery is best-effort: a webhook that fails is reported in the run's status message and never fails the run.
{"searchTerms": ["dentists"],"locations": ["Austin, TX"],"onlyNewLeads": true,"webhookUrl": "https://hooks.slack.com/services/T000/B000/XXXX"}
Every run comes with a report
Every run that delivers at least one row also stores a one-page HTML report: the headline numbers (businesses, % with email, % with phone, % verified, % with website, average lead score), the A–F lead-grade split, the top categories or cities, the email-status split and the first 100 rows, plus the same notes the status message carries. It is saved as the REPORT record of the run's key-value store — open it from the run's Output tab (record REPORT) or through the Report: link in the run's status message. It is a single self-contained HTML file (no scripts, no external assets), so it is safe to forward, attach to an email or screenshot for a client. The dataset stays the source of truth: the report summarises what was delivered and never replaces the rows, and a run that delivers nothing writes no report.
Pricing
Pay per result on top of Apify platform usage — you're only charged for leads delivered after filtering, so tightening onlyWithWebsite, onlyWithEmail or onlyVerifiedEmail directly lowers your cost. Rows are written to your dataset first and billed after, in exactly the number delivered; a run that delivers nothing bills nothing. The optional AI openers run on your own OpenAI/Anthropic key, billed by that provider. See the actor's pricing tab for current rates.
Data source & licence
Business listings come from OpenStreetMap. © OpenStreetMap contributors, available under the Open Database License (ODbL) v1.0 — https://www.openstreetmap.org/copyright. Every row carries source and attribution fields; keep them if you redistribute or publish the data, as ODbL requires attribution.
The website-crawled fields — email, extra_emails, email_status, email_provider, facebook, linkedin, twitter — are not OSM-derived. They come from each business's own public website and are not covered by ODbL. The name, category, phone, website and address columns are OpenStreetMap data.
Other Flash Scrape scrapers
Building leads from more than one source? The rest of the suite shares the same clean, scored output format:
- Google Maps Leads Opener — Google Maps business leads
- BBB + Yellow Pages Leads Scraper — BBB + Yellow Pages leads
- Local Business Leads — the same OpenStreetMap engine with more filters, presets and column selection
- Instagram Leads Scraper — Instagram profile leads
- TikTok Leads Scraper — TikTok creator leads
- YouTube Leads Scraper — YouTube creator leads
- Smart Scraper by Example — no-code web scraper
FAQ
Is this data legal to use? This actor collects public business data — OpenStreetMap listings (an open-data project, ODbL-licensed) and the contact details each business publishes on its own website. That's generally fine for legitimate prospecting, but you're responsible for how you use it: keep the ODbL attribution if you redistribute the rows, and follow anti-spam laws like CAN-SPAM and GDPR in any outreach you send.
Do I need an API key? No. Business discovery, website enrichment and email verification work without any key, login or proxy. The only place a key is needed is the optional AI cold-openers, where you supply your own OpenAI or Anthropic key — it's used once per run and never stored.
Does it scrape Yelp?
No — and it does not pretend to. It is an alternative to a Yelp scraper: business discovery runs on OpenStreetMap, and emails are crawled from each business's own website. That is why rating, reviews and yelp_business_id are always null.
Will every business have an email?
No. Directories rarely list one, so emails are pulled from each business's own website. Businesses with no site, or no email on it, show email_status: missing. Turn on onlyWithEmail (or onlyVerifiedEmail) to keep just the contactable leads — filtered rows are never billed.
How many results can I get?
Set maxItems up to 1000 businesses per run across all your search terms and locations. Add more terms or locations and run again to scale further. For big orders give the run a generous timeout: the run delivers what it has before the deadline and tells you how many websites it could not crawl in time.
Can I export to CSV / Google Sheets? Yes. Every run exports to CSV, JSON, or Excel from the dataset, and you can sync results to Google Sheets automatically via Make, n8n, Zapier, or the Apify API.
Can I scrape multiple cities at once? Yes. Add several locations and several search terms — each term is searched in each location, then deduped into a single scored list. If one city cannot be geocoded or one search fails on the OpenStreetMap mirrors, the status message names it.
Related Flash Scrape actors
- Multi Job Board Scraper — LinkedIn, Indeed, Glassdoor + 9 more boards, deduplicated, with only-new job alerts
- Local Business Leads Scraper — any category, any city, verified emails, lead scores
- Remote Jobs Aggregator — 10 keyless remote boards in one deduplicated feed
- All Flash Scrape actors — same house rules everywhere: pay per delivered row, honest status messages, only-new monitoring, webhook alerts, and a run report on every run.