Small Business Leads Scraper - MX-Verified Emails & Phones
Pricing
from $5.00 / 1,000 business leads
Small Business Leads Scraper - MX-Verified Emails & Phones
Small business leads scraper for local leads with emails: any trade + city, crawl each site for emails + socials, MX-verify for verified email leads, score 0-100 (A-F), AI cold openers. No-API-key Yellow Pages / BBB alternative. Small business email list or new-business alert. CSV, JSON, Excel.
Pricing
from $5.00 / 1,000 business leads
Rating
5.0
(2)
Developer
Flash Scrape
Maintained by CommunityActor stats
1
Bookmarked
5
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Yellow Pages & BBB Scraper - Business Email & Phone Leads
Scrape Yellow Pages and BBB-style business directories into a ready-to-contact SMB lead list — with verified emails, phone numbers, addresses, categories, owner names, and a 0–100 lead score. Search by keyword + location (e.g. plumbers in Austin, TX), let the scraper visit each business website to enrich the email, and export clean leads to CSV, JSON, or Excel. This is a no-API-key alternative to Yellow Pages & BBB scrapers (listings come from OpenStreetMap — see Data source & licence below) built for one outcome: contactable small-business leads, not a raw directory dump.
Built for local-services agencies, B2B cold email, SDR and lead-gen teams, and SMB outreach — every row is deduped, scored, and ready to drop into your CRM or email tool.
Quick start
{"searchTerms": ["plumbers in Austin, TX"],"maxItems": 100,"onlyWithEmail": true}
That is a complete run: geocode the city, pull every matching business, crawl each website for an email, MX-verify it, score the lead 0–100, and deliver only the rows where an email was found. Add more lines to searchTerms to cover several trades and cities in one run — maxItems is the whole run's budget, split evenly between terms. One run can honestly enrich about 10,000 leads at the default 2-hour timeout (the run tells you and reduces the order if you ask for more than it can crawl); raise the run timeout for up to 25,000.
How much does it cost?
$5 per 1,000 leads ($0.005 per delivered lead — the Pricing tab always carries the current rate). You are billed only for leads delivered after filters and dedup, so onlyWithEmail, onlyVerifiedEmail and minScore cut your bill, not just the table. Email finding and MX verification are included in the per-lead price, not sold as add-ons. The optional AI cold opener bills $0.002 per opener written and uses your own OpenAI or Anthropic key (one call per lead, never stored), so the LLM cost is on your provider. Plus Apify's standard run-start event ($0.00005 per GB of run memory — a fraction of a cent). A run that delivers zero rows bills zero leads and says why in its status message.
What it does not do
- It does not visit yellowpages.com or bbb.org. Listings come from OpenStreetMap, an open-data project — which is exactly why no API key, login, or proxy is needed. You get the end product a YP/BBB scraper is bought for — a trade + city list with real contact details — without scraping either site.
- No star ratings, review counts, or BBB accreditation grades — OpenStreetMap carries none of those. Need Google ratings and reviews per business? Pair it with our Google Maps Places Scraper.
- Not every row has an email. Emails come only from each business's own website — never from the directory listing and never guessed — so a listing without a website cannot yield one. Set
onlyWithEmailand you only pay for rows that do. - It does not send email. The AI opener is a text column for your own sequencer; complying with CAN-SPAM/GDPR in what you send is on you.
How do I scrape Yellow Pages for leads?
You don't need code, an API key, or a proxy setup. Getting SMB leads takes three steps:
- Enter your search terms — one keyword + location per line, like
plumbers in Austin, TXor a JSON object{"keyword": "dentists", "location": "Miami, FL"}. Add as many trade + city combinations as you want. - Set your filters — cap the number of leads with Max results, and optionally keep only businesses that have a website or an email.
- Run it. The scraper pulls each matching directory listing from OpenStreetMap, visits the business website to find the email and social links, dedupes, and scores every lead 0–100 — best leads first.
When the run finishes you get a clean, sortable table on the Output tab that exports straight to CSV, JSON, or Excel.
How the Yellow Pages & BBB scraper works
- Finds local businesses by category + city worldwide via OpenStreetMap (Nominatim geocode + Overpass) — no API key, no proxies.
- Visits each business's website (home /
/contact//about) to extract the real email plus LinkedIn, Facebook, and Twitter links. - Captures the owner/operator name when the listing exposes it, so you can prioritize owner-run shops.
- Dedupes (same website / email / name+phone collapses to one row — scoped to the locality, so two branches of a chain in different postcodes both survive), applies your quality filters, and scores every lead 0–100.
- (Optional) Writes a personalized cold-email opener per lead using your own AI key.
- Pushes a clean dataset you can export to CSV, JSON, or Excel.
What columns come back
Every delivered row carries the same stable column tuple — degraded enrichment fills a column with an explicit null rather than changing the CSV shape:
| Column | Where it comes from / when it is filled |
|---|---|
name, category, address, city, state, postal_code, country | The OpenStreetMap listing. name is always present; address parts only when the listing carries them |
phone | The listing only — deliberately never mixed with numbers crawled from websites, so this column stays pure ODbL OpenStreetMap data |
website, domain | The listing's website; domain is the bare registered domain CRMs dedup on |
email, extra_emails | Crawled from the business's own website (home / contact / about) — never taken from the listing, never pattern-guessed |
email_status | deliverable / risky / undeliverable after MX verification; unverified when the run's time budget skipped the check (never implied to have passed); found / missing when verification is off |
email_provider, email_domain_match | Mailbox host where identifiable (Google Workspace, Microsoft 365, ...) and whether the email's domain matches the website's |
linkedin, facebook, twitter | Profile links found on the business website |
instagram | Reserved column, currently always empty — the crawler extracts LinkedIn, Facebook and X/Twitter only. Kept so the CSV shape stays stable |
owner_name | The listing's operator field, when it publishes one; blank otherwise |
years_in_business | Derived from the listing's start_date tag, when present |
icebreaker | The optional AI cold opener — only with writeOpeners: true and your own key |
lead_score, lead_grade, lead_tier | 0–100 deliverability-weighted score, A–F grade, hot/warm/cold tier |
score_breakdown | The per-component points behind the score, so it is auditable |
has_email, has_phone, has_website | Booleans for quick filtering |
source_url, source, attribution | A link to the exact OpenStreetMap element, the source name, and the ODbL attribution that must travel with the data |
What data you get
Each row is one business, sorted best-lead-first:
- Find the business email — enriched from the company website, not just whatever the directory shows.
- Get phone numbers and addresses for every listing.
- See the business category so you can segment plumbers vs. roofers vs. dentists.
- Spot owner-operated SMBs via the owner/operator name signal.
- Sort by a 0–100 lead score — verified-deliverable email (up to +40), phone (+20), website (+15), socials (+5 each, max +10), owner/tenure (+5 each) — so the most contactable leads float to the top.
- Grab the listing and website URLs to verify any lead in one click.
- Export to CSV, JSON, or Excel and pipe straight into your outreach stack.
Filters & options
| Field | What it does |
|---|---|
| searchTerms | Keyword + location, one per line — "plumbers in Austin, TX" or {"keyword": "dentists", "location": "Miami, FL"}. |
| maxItems | Max number of business leads across all search terms (budget split evenly between terms). |
| onlyWithWebsite | Keep only listings that have a website (you can't enrich an email without one). |
| onlyWithEmail | Keep only listings where an email was found — best for cold-email campaigns. |
| onlyVerifiedEmail | Keep only leads whose email passed MX verification (deliverable / risky) — protects your sender reputation. |
| minScore | Keep only leads scoring at or above this value — pay only for your best A/B leads. |
| onlyNewLeads | New-business alert mode — see the scheduling section below. |
| enrichEmails | Visit each business website (home + /contact + /about) to extract emails and socials. On by default. No key needed. |
| writeOpeners | Add an AI cold-opener per lead — requires your own OpenAI/Anthropic key. |
| llmProvider | OpenAI or Anthropic, for the openers. |
| llmApiKey | Your own AI key. Used only to write openers; never stored. |
| llmModel | Optional model override. |
Example input
{"searchTerms": ["plumbers in Austin, TX", { "keyword": "dentists", "location": "Miami, FL" }],"maxItems": 100,"onlyWithEmail": true,"enrichEmails": true,"writeOpeners": false}
JSON output sample
One row per business, best leads first. Illustrative sample — the field shapes are real, the values are examples:
{"lead_score": 75,"name": "Lone Star Plumbing Co.","category": "Plumbers, Drain Cleaning","phone": "(512) 555-0142","email": "hello@lonestarplumbing.com","email_status": "deliverable","website": "https://lonestarplumbing.com","address": "1200 E 6th St, Austin, TX 78702","city": "Austin","owner_name": "Maria Delgado","icebreaker": "18 years keeping Austin's drains clear is no small feat…","source_url": "https://www.openstreetmap.org/node/1980597011","source": "OpenStreetMap","attribution": "© OpenStreetMap contributors, ODbL 1.0 (https://www.openstreetmap.org/copyright)"}
Results render as a clean sortable table on the Output tab and export to CSV, JSON, or Excel.
Use with AI agents & automation
This Yellow Pages & BBB scraper plugs into your stack with zero glue code. Trigger it from an MCP client (Claude, Cursor, or any MCP-compatible agent) to pull SMB leads on demand, or wire it into Make, n8n, or Zapier to run on a schedule and push fresh leads into your CRM, email sequencer, or Google Sheets. A common flow: scrape leads → filter onlyWithEmail → append rows to Google Sheets → fire a cold-email sequence — all automated.
Local leads with emails, verified before you send
Most directory scrapers hand you a list of names and a website. This one is built to end with a verified email leads file you can actually send to.
For every business it finds, it visits the site, pulls the best contact address it can find, then
MX-verifies it — checking the domain really accepts mail — and labels it deliverable, risky
or undeliverable. Rows that fail are still delivered and labelled, so you decide what to send to
rather than discovering bounces later.
That makes it a straightforward sales leads source for local outreach: pick a trade and a city, get local leads with emails, phones, addresses, socials and a 0-100 score, and drop them straight into your CRM or sequencer.
Use cases
- Build an outreach list of local service businesses in a city + trade.
- Build a small business email list by city —
onlyWithEmailplusonlyVerifiedEmaildelivers only rows with an MX-verified address, straight to CSV. - Find owner-operated SMBs with real contact info for cold email or calling.
- Agencies: enrich a client's target-market directory into emails + CSV.
New-business alerts (run it on a schedule)
Set onlyNewLeads: true and this Actor stops being a one-off pull and becomes a monitor.
- 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 have appeared since. A quiet week returns zero rows and charges you nothing.
- Memory is kept per search + filter combination for 90 days, in a named key-value store in
your own account. Two schedules with different filters are two separate watches; changing
maxItems,sortByorconcurrencydoes not reset a watch, because those change how many rows you get, not which businesses exist.
Pair it with an Apify schedule (daily or weekly) and you have a standing feed of every new dentist, roofer or gym opening in your territory, without paying twice for the ones you already have.
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-enriched values — emails found by crawling the business's own site, extra_emails, linkedin/facebook/twitter links, and the email_status / email_provider / email_domain_match verification columns — are not OSM-derived; they come from each business's own public website and are not covered by ODbL. Everything taken straight from the listing (name, category, phone, address, city, owner_name, years_in_business, source_url) is OSM data — and to keep that boundary clean per column, phone is never gap-filled from crawled pages and email is never taken from the listing.
FAQ
Is it legal to scrape this business-directory data? It reads publicly available data from OpenStreetMap (an open-data project, ODbL-licensed — see Data source & licence above) and each business's own public website — names, categories, phones, addresses, and emails published on the open web. No login, no private data, no anti-bot circumvention. Use it for legitimate B2B outreach and follow the applicable terms and anti-spam laws (CAN-SPAM, GDPR) in how you message people.
Is this a free Yellow Pages scraper? The Actor itself needs no API key, subscription, or proxy plan. You pay Apify's pay-per-result rate — $5 per 1,000 delivered leads — and new Apify accounts come with free platform credits, so a first test list typically costs nothing out of pocket.
Do I need an API key? No — searching listings and finding emails on business websites needs no key. A key is only required if you turn on the optional AI cold-opener, and it's your own OpenAI or Anthropic key, used once per lead and never stored.
Will every business have an email?
No. Many directory listings only carry a phone and address; emails depend on what's published on the business website. Turn on enrichEmails (on by default) to maximize the fill-rate, and onlyWithEmail to keep only the contactable leads — you are never billed for rows a filter removed.
Can I build a small business email list with it?
Yes — that is the designed outcome. Set onlyWithEmail (and onlyVerifiedEmail if you want MX-verified addresses only), run one search term per trade + city, and export the result to CSV or Excel. email_status tells you per row whether the address is deliverable, risky, or undeliverable, so you decide what enters your sequence.
How many results / leads can I get?
As many as the directory returns for your search terms — set Max results to cap your run, and add more keyword + location combinations to widen the net. The budget is split evenly across your search terms. One run honestly enriches about 10,000 leads at the default 2-hour timeout; raise the timeout for up to 25,000, or set enrichEmails: false for raw listings.
Can I export to CSV, Excel, or Google Sheets? Yes. Results export to CSV, JSON, and Excel from the Output tab, and you can push rows directly to Google Sheets via Make, n8n, or Zapier.
Where does the owner name come from? From the underlying listing's operator field when it publishes one; it's left blank otherwise.
How is this different from the Local Business Scraper?
Same data source, same MX verification, two different jobs. This Actor is the simple one: one-line "trade in city" searches, owner names, years in business, and optional AI cold openers. Our Local Business Scraper is the deep one: 61 columns including website platform (WordPress, Wix, Squarespace...), marketing-tech and neglect signals, Google Maps links, radius search, use-case presets, and a businesses-without-a-website mode — at $3 per 1,000 leads.
Other Flash Scrape scrapers
Need leads from another platform? The full Flash Scrape suite:
- Local Business Scraper — the deep 61-column sibling: website platform, marketing tech, Google Maps links, radius search, businesses without a website
- Google Maps Places Scraper — live Google Maps ratings, review counts, phones and websites (the review data this Actor's source does not carry)
- Email Verifier — bulk-validate and clean an existing email list before you launch a campaign
- Google Maps Leads Scraper — Google Maps business leads
- Yelp Leads Scraper — Yelp business leads
- 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