USA Business Email Finder — MX-Checked B2B Leads avatar

USA Business Email Finder — MX-Checked B2B Leads

Pricing

from $5.00 / 1,000 business contact with emails

Go to Apify Store
USA Business Email Finder — MX-Checked B2B Leads

USA Business Email Finder — MX-Checked B2B Leads

US business email finder: MX-checked email, phone and website by city and category, from OpenStreetMap. Pay per lead with an email.

Pricing

from $5.00 / 1,000 business contact with emails

Rating

0.0

(0)

Developer

Mohammed Samaan

Mohammed Samaan

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

12 days ago

Last modified

Categories

Share

USA Business Email Finder

Find real business emails for US companies: this actor takes US business names and their websites from OpenStreetMap, visits each company website, and extracts the contact emails published there - every email tagged valid / invalid with an MX check.

Great for B2B outreach, agency prospecting, supplier lists and CRM imports across New York, Los Angeles, Chicago, Houston, Miami, San Francisco and more.

What you get

Each dataset row contains:

FieldDescription
nameBusiness name
categoryType of business (restaurant, dentist, hairdresser, lawyer, clinic, ...)
emailContact email found on the business's own website
emailStatusvalid / invalid - based on an MX lookup of the email domain
phoneBusiness phone number, when available
websiteThe company website that was scanned
cityRegion searched
collectedAtDate collected

How it works

  1. Queries the OpenStreetMap Overpass API (free, public) for US businesses in your chosen region.
  2. Picks businesses that have their own website (social media links like Facebook/Instagram are skipped - no emails live there).
  3. Opens each website (homepage + one contact/about page) and extracts email addresses.
  4. Runs an MX check on every email domain and tags it valid / invalid.
  5. Deduplicates by email and saves results.

Websites are scanned 8 at a time with a short stagger between different hosts, so a large run finishes in minutes; the run also stops cleanly before its own timeout instead of being killed mid-way.

Input

FieldTypeDefaultDescription
Region / city (required)selectnew-york-citynew-york-city, los-angeles, chicago, houston, miami, san-francisco, seattle, boston, dallas, atlanta
Business categorystring-Optional filter, e.g. restaurant, dentist, hairdresser, lawyer, clinic, estate_agent
Max websites to visitinteger50How many company websites to open and scan
Verify emails (MX check)booleantrueTag each email valid / invalid
Only rows with emailbooleantrueDrop businesses with no email found

Example input

{
"region": "new-york-city",
"category": "dentist",
"maxSites": 50,
"verifyEmails": true,
"onlyWithEmail": true
}

Example output

{
"name": "Brooklyn Family Dental",
"category": "dentist",
"email": "info@brooklyndental.com",
"emailStatus": "valid",
"phone": "+1 718 555 0134",
"website": "https://brooklyndental.com/",
"city": "New York City",
"collectedAt": "2026-09-20"
}

Tips

  • Not every business publishes an email on its website - typically 10-40% of scanned sites yield an email. That is normal and why we only charge for rows that have one.
  • Filter by emailStatus: "valid" before outreach to remove dead domains.
  • Use the category filter to build targeted lists (e.g. only dentists, only law firms).
  • Re-run monthly to refresh and grow the list.

FAQ

Does an email marked valid mean it will reach the inbox? No. The check only asks the email's domain whether it publishes mail-server (MX) records. It does not test whether a specific mailbox exists, and it does not detect catch-all domains or predict bounces. Treat valid as "the domain can receive mail", nothing more.

Where do the emails come from? From the business's own website: the homepage plus one contact/about page, and the email tag on its OpenStreetMap entry when there is one. Nothing is guessed or generated.

What are the possible emailStatus values? valid (the domain has MX records) or invalid (no MX records, or the DNS lookup failed). It is empty when you turn off "Verify emails".

Am I charged for rows marked invalid? Yes. The charge is one event per delivered row that contains an email, whatever its MX status. Filter on emailStatus after the run, or switch "Verify emails" on to see it. Rows with no email are not charged.

Can I look up one specific company? No. You choose an area and an optional category; the actor lists businesses in that area that have a website. It does not search by company name.

What is the contactName field? The owner, founder or principal, only when the website clearly names one. It is empty otherwise and is never invented.

Can I run several areas in one run? Yes, put more than one value in the area list. Areas are interleaved so the "Max websites to visit" cap is spread across all of them.

Errors and limits

  • Unknown area value: it is not rejected. The actor silently falls back to New York City, so check the city column of your results if you call it through the API.
  • Category: lower-cased, and anything other than letters and underscores is removed. It must equal an OpenStreetMap tag value (for example dentist, restaurant). A category that matches nothing returns zero businesses and an empty dataset; the run still ends as succeeded.
  • Empty results are not an error. The run finishes normally with an empty dataset when no business in the area has a website, none of the sites show an email, or the source was unavailable (see next point). The log line "No businesses returned for ..." tells you which.
  • OpenStreetMap (Overpass) errors: the actor tries up to 5 public Overpass servers, in two passes, with a 120 s timeout per request and a 300 s budget per area. A server that errors, times out or answers empty is skipped and the next one is tried. If every server fails, that area contributes nothing and the run continues with the other areas. Re-run later if you suspect the source was busy.
  • Size cap: at most 800 businesses with a website are fetched per area per run, so very large areas without a category filter are a sample, not a full census. Split by category to get more.
  • Website errors: each site gets a 20 s timeout for the homepage and 15 s for the contact page. Non-200 responses, non-HTML responses, timeouts and blocked sites are skipped without a retry, and cost nothing. Social-media links and government/military sites are skipped.
  • Stopping rules: the run stops when "Max websites to visit" rows have been delivered, when 3 times that many sites have been tried, when the candidate list runs out, or about 2 minutes before the run's own timeout. In the last case it ends as succeeded with the rows already collected (a log warning says so).
  • Partial results: rows are saved one by one as they are found, so a stopped or limited run keeps everything delivered so far. If a single row cannot be saved it is skipped (with a log warning) and not charged.
  • Charging on failure: a row is charged only after it has been saved to the dataset. If you set a maximum charge per run, the actor stops cleanly when it is reached. Skipped sites, empty areas and rows without an email are not charged. The Apify actor-start event applies to every run.
  • Duplicates: an email is delivered once per run, even if several businesses list it.
  • Area labels: the city value comes from the business's OpenStreetMap address tag when it has one, otherwise from the area you searched. Search areas are rough rectangles that overlap, so a business near a border can carry a neighbouring area's label.
  • Notion output: if the optional Notion step fails, the dataset is still delivered and the reason is logged.

Pricing

Pay per event: $0.005 per row that contains an email ($5 per 1,000 rows). Businesses with no email found cost you nothing. Apify's own actor-start event (currently $0.00005) also applies to each run.

Disclaimer

This actor collects only publicly visible contact information from public business websites, with rate limiting. Please respect applicable privacy laws (e.g. CAN-SPAM) when using the data for outreach.

Send results to Notion (new, Sep 2026)

Authorize Notion once in Apify Console → Settings → API & Integrations → MCP connectors (choose Notion, sign in). Then pick that connector in Notion connector and paste the link of any Notion page in Notion page to create the table in. The first run creates a table inside that page and fills it with the business leads (up to 500 rows per run; the full set is always in the dataset). To keep adding to the same table on later runs, paste the table ID from the log into Existing Notion table ID. This Actor never sees your Notion login: Apify's connector proxy holds it. If the Notion step fails, your dataset results are still delivered and the reason is logged.

Use it from an AI agent (MCP)

Add this Actor to any MCP client (Claude, Cursor, VS Code) with one URL:

https://mcp.apify.com?tools=leadharbor/usa-business-email-finder

Or call it through the Apify API with an input like this:

{
"regions": [
"new-york-city"
],
"category": "hairdresser",
"maxSites": 25
}

Returns one row per US business: MX-checked email, phone and website. Results land in the run's default dataset (JSON, CSV or Excel). No login or API key is needed for the sites it reads, and pay-per-event pricing works with Apify's x402 agent payments.

API usage

Run it from your own code with an Apify API token. The input below is this actor's prefilled example.

curl (runs the actor and returns the dataset items):

curl -X POST "https://api.apify.com/v2/acts/leadharbor~usa-business-email-finder/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"regions": [
"new-york-city"
],
"category": "hairdresser",
"maxSites": 25,
"verifyEmails": true,
"onlyWithEmail": true
}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("leadharbor/usa-business-email-finder").call(run_input={
"regions": [
"new-york-city"
],
"category": "hairdresser",
"maxSites": 25,
"verifyEmails": True,
"onlyWithEmail": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Changelog

28 Sep 2026 — Fixed default category (the old default returned 0 rows); optional Notion output; MCP agent section. Plus 5 public example tasks with their own pages.

More from leadharbor


Using this actor? A quick review helps other buyers find it: usa-business-email-finder

New output fields (Sep 2026)

FieldWhat it is
contactName, contactRoleThe owner / founder / principal when the website clearly names one (e.g. "Dr Adil Sarwar, Founder"). An AI model only selects among names that appear on the site — it never invents one. Empty when the site doesn't name anyone.
siteLooksOutdated, siteCopyrightYearCopyright year in the footer; true when it is 3+ years old — a common sign of a neglected site.
siteMobileFriendlyWhether the homepage declares a mobile viewport.
siteHasAnalytics, siteHasFacebookPixel, siteCmsGoogle Analytics / Tag Manager present, Meta pixel present, and the site builder (WordPress, Wix, Squarespace, Shopify, Webflow).

When a site lists several emails, the returned email is the business's own main inbox — form placeholders (example@mysite.com, you@company.com), platform addresses and jobs inboxes are no longer picked.

  • Disposable Email & Domain Checker — Flags throwaway and free-provider email domains using 5 merged public lists. $0.30 per 1,000 checks.
  • Domain Trust Check — 0-100 trust score for a domain from domain age, SSL, SPF/DKIM/DMARC and disposable-domain lists. $2.50 per 1,000 domains.
  • Bulk Email Verifier — Verifies email addresses: syntax, MX, disposable and role flags, and a 0-100 score. $0.50 per 1,000.
  • UK Business Email Finder — MX-checked business emails for UK companies.
  • Website Technology Detector — Detects the CMS, frameworks, analytics and 100+ other technologies a website uses from its homepage. $9 per 1,000 sites.