Verify known emails, find publicly listed business contact emails, and audit domain email authentication in one batch. The Actor exports transparent MX, SPF, DMARC, DKIM, provider, disposable, role-account, and confidence signals without treating MX records as proof that a mailbox exists.
Who is it for?
Sales operations teams, lead-generation agencies, recruiters, founders, and developers can use this Actor to qualify public business-contact data and diagnose domain email setup before outreach.
What you can do
- Clean CRM and lead-list emails before outreach.
- Find a named person's email when it is publicly listed on the supplied company website.
- Audit company domains for mail routing and authentication gaps.
- Separate invalid, risky, ready, not-found, and domain-only results.
- Process up to 10,000 deduplicated targets with bounded concurrency and resumable cutoff evidence.
Example input
{
"emails": ["sales@example.com", "person@company.com"],
"contacts": [{ "firstName": "Ada", "lastName": "Lovelace", "domain": "example.org" }],
"domains": ["example.net"],
"maxConcurrency": 10,
"maxRuntimeSecs": 270
}
Example output
{
"email": "sales@example.com",
"firstName": null,
"lastName": null,
"domain": "example.com",
"isValidFormat": true,
"syntaxErrors": [],
"hasMxRecords": true,
"isVerified": null,
"isCatchAll": null,
"isDisposable": false,
"isFreeProvider": false,
"isRoleAccount": true,
"confidenceScore": 85,
"verificationMethod": "mx",
"mxHost": "mail.example.com",
"provider": "other",
"patternsTried": 0,
"sources": ["public-dns"],
"verificationTimeMs": 120,
"deliverabilityGrade": "A",
"deliverabilityScore": 85,
"spfExists": true,
"spfValid": true,
"dmarcExists": true,
"dmarcPolicy": "reject",
"dkimFound": false,
"deliverabilityIssues": ["COMMON_DKIM_SELECTOR_NOT_FOUND"],
"status": "READY",
"checkedAt": "2026-09-07T07:00:00.000Z"
}
Input settings
| Key | Type | Description |
|---|---|---|
emails |
string[] | Known email addresses to check. |
contacts |
object[] | Objects with firstName, lastName, and domain; only publicly evidenced matches are returned. |
domains |
string[] | Domains to audit without inventing an email address. |
csvText |
string | Comma, whitespace, or newline-separated email addresses. |
maxConcurrency |
integer | Concurrent independent targets, from 1 to 25. |
maxRuntimeSecs |
integer | Runtime budget from 60 to 270 seconds. |
At least one target is required. Inputs are deduplicated before network work.
Input recipes
Verify a pasted list
{ "csvText": "hello@example.com\nsales@example.org" }
Audit domains
{ "domains": ["google.com", "microsoft.com"] }
Find a public contact email
{ "contacts": [{ "firstName": "Jane", "lastName": "Smith", "domain": "example.com" }] }
Limits and data availability
- The maximum batch size is 10,000 unique targets; finder mode checks a bounded set of public company pages.
- Results depend on public DNS and website availability. Missing public evidence produces
NOT_FOUNDrather than a guessed address. - A valid format and MX record do not prove that a specific mailbox exists.
isVerified: nullandisCatchAll: nullmean the claim was not conclusively tested, notfalse.- DKIM selectors are chosen by each sender; common-selector discovery is useful but not exhaustive.
- Public contact discovery returns only an address found on the supplied company's public pages and textually matching a conventional person pattern.
- DNS changes can take time to propagate; use
checkedAtwhen comparing runs. - Large workloads may stop before the platform cutoff and preserve pending targets in the run key-value store.
API usage
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~email-enrichment-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"emails":["hello@example.com"]}'
JavaScript:
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/email-enrichment-scraper').call({ emails: ['hello@example.com'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/email-enrichment-scraper').call(
run_input={'emails': ['hello@example.com']}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
Use with MCP and AI agents
Claude Code:
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/email-enrichment-scraper"
Desktop, Cursor, or VS Code MCP configuration:
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=fetch_cat/email-enrichment-scraper" } } }
Support
Open an issue from the Actor page with a sanitized input example, run ID, expected result, and observed result. Do not include private lead lists or credentials.