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_FOUNDorBLOCKED_OR_UNAVAILABLEoutcomes 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
statusand retainemailSourceUrlfor 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.