B2B Lead Scraper: Public Business Emails

Find public businesses and export visibly published emails, phones, websites, and source pages for transparent B2B research and CRM review.

Data fields

FieldTypeDescription
companyNamestringPublic business name.
domainstring | nullValue exported as domain.
websitestring | nullValue exported as website.
countrystring | nullValue exported as country.
sectorstring | nullValue exported as sector.
addressstring | nullValue exported as address.
discoveryUrlstringValue exported as discoveryUrl.
companyEmailsarrayValue exported as companyEmails.

Input preview

sectorBusiness type
countryCountry
citiesCities
startUrlsPublic business website URLs
maxLeadsMaximum businesses
maxPagesPerSiteMaximum public pages per site

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Build a source-backed B2B prospect list from public business websites. Discover businesses in an OpenStreetMap-bounded city or enrich a list of public website URLs, then export only contact channels visibly published by those businesses.

This is for public, no-login business research. It does not access Apollo, ZoomInfo, Lusha, private contact databases, or guessed personal email addresses.

Who is it for?

Sales operations, agencies, recruiters, researchers, and local-business teams that need a reviewable list of public business contact channels before a compliant outreach or market-research workflow. Use it as a business email scraper when public-source provenance matters, or as a lead generation scraper for bounded local-business research.

What you get

Default discovery exports only businesses with a visibly published public email, including its source page. Each row also has the business name, website/domain when public data provides it, phone links, explicit linked social profiles, and the exact pages inspected. Optional MX checks report whether the domain publishes MX records; they do not verify inbox ownership or deliverability.

Input recipes

Find Chicago dentists

{
  "sector": "dentist",
  "country": "United States",
  "cities": ["Chicago"],
  "maxLeads": 10,
  "maxPagesPerSite": 2,
  "requireEmail": true,
  "verifyMx": true
}

Enrich public business websites

{
  "startUrls": [{ "url": "https://www.freshworksdental.com/" }],
  "maxLeads": 1,
  "maxPagesPerSite": 2,
  "requireEmail": false,
  "verifyMx": true
}

Input settings

Field Description
sector OpenStreetMap business tag/value to find, such as dentist.
country and cities Location boundary for public business discovery. The first supplied city is used.
startUrls Optional public business websites to process directly instead of discovery.
maxLeads Maximum unique business rows to save (1–100).
maxPagesPerSite Homepage plus same-site contact, about, or team pages to inspect (1–5).
requireEmail Enabled by default. Keep only businesses with a visibly published email address. Disable only for public business-directory research where contact availability is optional.
verifyMx Check a domain’s MX records; this is not mailbox validation.
customOffset Skip discovered records to resume a bounded batch.

Use cases

  • Build a public supplier or local-business outreach list.
  • Find published business contact channels for market research.
  • Enrich a buyer-owned list of public websites with source-page provenance.
  • Export public business data for CRM review, Google Sheets, or compliant outreach.

Tips and limits

  • Use direct startUrls when you already know the businesses to research.
  • The default email-only mode can return fewer rows because many public sites do not publish an email address. Increase the city scope or use a buyer-owned public website list when you need more qualifying businesses.
  • The Actor inspects only a bounded number of same-site contact, about, and team pages.
  • Availability depends on public source data. Empty optional fields are never inferred.
  • Respect website terms, applicable law, and your outreach obligations.

API usage

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/lead-scraper-apollo-zoominfo-lusha-ppe-scraper').call({
  sector: 'dentist', country: 'United States', cities: ['Chicago'], maxLeads: 10,
});
console.log((await client.dataset(run.defaultDatasetId).listItems()).items);

Python

from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("fetch_cat/lead-scraper-apollo-zoominfo-lusha-ppe-scraper").call(run_input={"sector": "dentist", "cities": ["Chicago"], "maxLeads": 10})
print(client.dataset(run["defaultDatasetId"]).list_items().items)

cURL

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~lead-scraper-apollo-zoominfo-lusha-ppe-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"sector":"dentist","cities":["Chicago"],"maxLeads":10}'

MCP and automation

Add this Actor as an MCP tool:

claude mcp add apify -- npx -y @apify/mcp-server
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/mcp-server"],
      "env": { "APIFY_TOKEN": "${APIFY_TOKEN}" }
    }
  }
}

Use https://mcp.apify.com?tools=fetch_cat/lead-scraper-apollo-zoominfo-lusha-ppe-scraper.

Example prompts:

  • “Find 10 Chicago dentists with a publicly listed email and include source pages.”
  • “Enrich these public business websites and return phones, explicit social links, and MX status.”

Support

For a reproducible issue, include your non-sensitive input, run URL, and affected public URL in the Actor’s Issues tab.

Common questions

Questions and answers reused from the canonical actor README.

Does it provide Apollo, ZoomInfo, or Lusha data?

No. It uses OpenStreetMap records and public business websites only.

Are emails verified?

No. An email is included only when visibly published. emailMxStatus checks DNS MX records, not mailbox ownership or deliverability.

Why are there fewer results than maxLeads?

A city, sector, source availability, deduplication, and requireEmail can limit qualifying records.

Can I use my own website list?

Yes. Supply public URLs in startUrls; this bypasses OpenStreetMap discovery.

What data can I export with b2b lead scraper?

Default email-only discovery rows include a visible public email with its source page. Other public fields—website/domain, phones, address, and linked social profiles—are returned when the source provides them and otherwise remain empty rather than inferred. If you explicitly disable requireEmail, email fields can also be empty.