Yelp Scraper Alternative - Local Leads + Verified Emails avatar

Yelp Scraper Alternative - Local Leads + Verified Emails

Pricing

from $5.00 / 1,000 business leads

Go to Apify Store
Yelp Scraper Alternative - Local Leads + Verified Emails

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

Flash Scrape

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

2

Monthly active users

8 days ago

Last modified

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:

  1. Enter one or more search terms (e.g. coffee shops, plumbers, med spas).
  2. Enter one or more locations (e.g. Austin, TX, Miami, FL). Every term is searched in every location.
  3. 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, risky or undeliverable.
  • 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.

FieldDescription
lead_score / lead_grade / lead_tier0–100 score from verified email deliverability + phone + website + socials; AF grade; hot / warm / cold tier. score_breakdown shows the points per signal.
nameBusiness name.
category / categoriesBusiness category (e.g. dentist) as mapped in OpenStreetMap.
phoneBusiness phone number (from OpenStreetMap).
emailBest email found on the business's own website (MX-verified when verification is on). extra_emails lists up to 5 more.
email_statusdeliverable, 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_providerMailbox host (e.g. Google Workspace, Microsoft 365) when known. email_domain_match says whether the email sits on the business's own domain.
website / domainBusiness website URL and its bare domain.
address / city / region / postal_codeStreet address and its parts as mapped in OpenStreetMap.
facebook / linkedin / twitterSocial profiles found on the website. instagram is reserved and currently always null.
has_email / has_phone / has_websiteConvenience flags for CRM filters.
icebreakerOptional AI-written cold-email opener (null unless writeOpeners is on).
source_url / sourceLink back to the OpenStreetMap object this lead came from; source is always OpenStreetMap.
attributionThe 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_idAlways 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.

FieldWhat it does
searchTermsCategories / keywords to scrape, one per line — e.g. plumbers, dentists. A term may embed its own city: coffee shops in Austin, TX. Default ["dentists"].
locationsCities / areas, one per line — e.g. Denver, CO. Each term is searched in each location. Default ["Austin, TX"].
maxItemsMax businesses to deliver across all searches (default 50, max 1000).
onlyNewLeadsDeliver — and bill — only businesses not delivered by an earlier run of the same search + filters (see New-business alerts).
minRating / minReviewsAccepted for compatibility but not applied — OpenStreetMap exposes no ratings or review counts. The run says so in its status message when you set them.
onlyWithWebsiteDrop businesses with no website (applied before the crawl, so those rows cost nothing).
onlyWithEmailDrop businesses where no email was found — best for cold email.
onlyVerifiedEmailKeep only deliverable / risky emails. Needs verifyEmails on; a row the run had no time to verify does not count as verified.
enrichEmailsVisit each business website to extract emails + socials (default on, no key needed).
verifyEmailsMX-verify every email and label it (default on, no key needed).
minScoreKeep only leads scoring at or above this value (0–100).
writeOpenersAdd an AI cold-opener per lead — needs your own AI key.
llmProvider / llmApiKey / llmModelPick OpenAI or Anthropic and supply your key for the openers.
webhookUrlPOST 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 onlyNewLeads watch, 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. Changing maxItems, enrichEmails, verifyEmails, writeOpeners or webhookUrl does 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.0https://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:


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.