Public B2B Email Finder & MX Verifier

Find person-bound business emails visibly published on company websites and verify syntax and public MX routing.

Data fields

FieldTypeDescription
firstNamestringValue exported as firstName.
lastNamestringValue exported as lastName.
fullNamestringValue exported as fullName.
companyDomainstringValue exported as companyDomain.
emailstring | nullValue exported as email.
normalizedEmailstring | nullValue exported as normalizedEmail.
statusstringValue exported as status.
emailSourceUrlstring | nullValue exported as emailSourceUrl.

Input preview

peoplePeople and company domains *
maxPagesPerDomainMaximum public pages per domain

API and agents

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

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

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

Open Apify page

Find business emails only when a company has visibly published an address beside the requested person's name on its own public website. Every result preserves the public evidence page and checks syntax plus public DNS MX routing.

This email finder and verifier is an evidence-first alternative to guessed address patterns. It supports a conservative business email lookup where a buyer needs to review the source before contacting anyone.

Who is it for

  • Sales and partnership researchers checking published business contacts.
  • Compliance teams that require a source URL and name context.
  • Agencies enriching a known list of people and company domains.
  • AI agents that need a conservative, auditable public-contact lookup.

What you get

For each requested person and company domain, the Actor returns one outcome row. A found email must be publicly visible on that company domain in bounded context with the requested full name.

  • Public source URL and short evidence snippets.
  • Normalized email and conservative role/disposable classification.
  • Syntax validation and public MX routing result.
  • Explicit NOT_FOUND or BLOCKED_OR_UNAVAILABLE outcomes instead of generated alternatives.

Input recipe

Use a small, specific batch first. Domains must be company website domains, without paths.

{
  "people": [
    {
      "firstName": "Jane",
      "lastName": "Smith",
      "domain": "company.com"
    }
  ],
  "maxPagesPerDomain": 4
}

Input settings

Input Type Default Description
people array required One to 100 person and company-domain targets. Duplicate targets are merged.
people[].firstName string required Requested person's first name.
people[].lastName string required Requested person's last name.
people[].domain string required Company website domain, without a path.
maxPagesPerDomain integer 8 One to 20 root, team, leadership, contact, and sitemap-discovered pages to inspect.

Output example

{
  "firstName": "Jane",
  "lastName": "Smith",
  "fullName": "Jane Smith",
  "companyDomain": "company.com",
  "email": "jane.smith@company.com",
  "normalizedEmail": "jane.smith@company.com",
  "status": "PUBLIC_EVIDENCE_MX_READY",
  "emailSourceUrl": "https://company.com/team",
  "emailEvidence": "Contact Jane Smith at jane.smith@company.com",
  "identityEvidence": "Jane Smith, Partnerships",
  "validSyntax": true,
  "mxFound": true,
  "mxRecords": ["mail.company.com"],
  "isDisposable": false,
  "isRoleAccount": false,
  "verificationScope": "Public syntax and DNS MX routing only; no SMTP mailbox probe.",
  "checkedAt": "2026-08-29T00:00:00.000Z"
}

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/email-finder-api-scraper').call({
  people: [{ firstName: 'Jane', lastName: 'Smith', domain: 'company.com' }],
  maxPagesPerDomain: 4,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/email-finder-api-scraper").call(run_input={
    "people": [{"firstName": "Jane", "lastName": "Smith", "domain": "company.com"}],
    "maxPagesPerDomain": 4,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

cURL

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~email-finder-api-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"people":[{"firstName":"Jane","lastName":"Smith","domain":"company.com"}],"maxPagesPerDomain":4}'

MCP and AI agents

Add Apify MCP to Claude Code, then ask for source-cited public contact research.

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

Example prompt: “Run fetch_cat/email-finder-api-scraper for Jane Smith at company.com and return only rows with source URLs and MX status.”

Use the hosted MCP tool catalog at Apify MCP when your client supports it.

Tips

  • Use the legal company domain, not a social profile or a URL path.
  • Keep names specific; initials reduce reliable same-page identity matching.
  • Begin with four pages per domain to control run scope.
  • Filter exports by status and retain emailSourceUrl for review.

Limits and responsible use

The Actor checks only public company-web content. It does not generate email patterns, use people databases, sign in, bypass access controls, or test SMTP recipients. MX routing indicates that a domain advertises mail routing; it does not prove a mailbox exists, accepts mail, or grants permission to contact a person.

Respect applicable privacy, marketing, and data-protection obligations before using any contact data.

Support

For help, include the target domain, returned status, and emailSourceUrl when present. Do not send credentials or private contact lists in a support request.

Common questions

Questions and answers reused from the canonical actor README.

Why is email empty?

The inspected public pages did not visibly contain both the requested full name and a same-domain email in the required bounded context.

Does MX verification mean an address is deliverable?

No. It only checks public DNS mail-routing records for the email domain. It does not perform SMTP recipient verification.

Why did I receive BLOCKED_OR_UNAVAILABLE?

The company site could not be inspected reliably within the configured scope. Keep the source URL/status in your workflow and retry later if appropriate.

Can I use a larger batch?

Yes, up to 100 targets. Start with a smaller representative batch so you can review source evidence and output statuses first.