Clean lead lists before CRM imports and outreach. Submit email addresses in bulk and receive a structured syntax and public domain mail-readiness result for every unique address.
What you get
- Clear
validorinvalidstatus with a reason - Normalized email, local part, Unicode domain, and ASCII domain
- Public MX availability plus ordered mail-exchanger records
- SMTPUTF8 requirement and verification timestamp
- Deduplicated, export-ready JSON, CSV, Excel, or HTML results
Example input
{
"emails": ["contact@gmail.com", "not-an-email"],
"checkDeliverability": true,
"allowInternationalized": false
}
Example output
{
"inputEmail": "contact@gmail.com",
"status": "valid",
"reason": null,
"normalizedEmail": "contact@gmail.com",
"localPart": "contact",
"domain": "gmail.com",
"asciiDomain": "gmail.com",
"syntaxValid": true,
"hasMx": true,
"mxRecords": [{"exchange": "gmail-smtp-in.l.google.com", "priority": 5}],
"requiresSmtpUtf8": false,
"checkedAt": "2026-09-06T14:22:51.267Z"
}
Use cases
- Clean lead lists before sales outreach
- Reject malformed signup addresses
- Audit CRM email quality
- Separate syntax failures from domains without public mail servers
- Normalize internationalized domains for downstream systems
Input settings
| Field | Type | Default | Description |
|---|---|---|---|
emails |
string[] | required | 1–10,000 email addresses |
checkDeliverability |
boolean | true |
Resolve public MX records |
allowInternationalized |
boolean | false |
Allow non-ASCII local parts |
Input recipes
Fast syntax-only cleanup
{"emails":["lead@example.com","bad address"],"checkDeliverability":false}
Internationalized addresses
{"emails":["tèst@example.com"],"allowInternationalized":true}
Who is it for?
- Sales operations teams cleaning lead lists before CRM import
- Growth teams validating form submissions and prospect exports
- Data teams that need deterministic, row-by-row validation reasons
- Developers adding email hygiene to scheduled automations
Tips and limits
- MX records prove that a domain advertises mail infrastructure; they do not prove that a specific mailbox exists.
- This Actor does not perform SMTP handshakes, send messages, or claim catch-all detection.
- DNS changes can alter results over time; use
checkedAtwhen auditing snapshots. - A maximum of 10,000 input addresses is accepted per run.
API usage
cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~email-verifier-free-to-use-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"emails":["contact@example.com"],"checkDeliverability":true}'
JavaScript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/email-verifier-free-to-use-scraper').call({
emails: ['contact@example.com'], checkDeliverability: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/email-verifier-free-to-use-scraper').call(
run_input={'emails': ['contact@example.com'], 'checkDeliverability': True}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
MCP and agents
Connect through Apify MCP at https://mcp.apify.com?tools=fetch_cat/email-verifier-free-to-use-scraper.
claude mcp add apify --transport http \
"https://mcp.apify.com?tools=fetch_cat/email-verifier-free-to-use-scraper"
Equivalent JSON configuration:
{"mcpServers":{"apify":{"type":"http","url":"https://mcp.apify.com?tools=fetch_cat/email-verifier-free-to-use-scraper"}}}
Example prompts: “Validate these addresses and explain each rejection” or “Clean this exported lead list and return only rows whose domains publish MX records.”
Support
Open an issue on the Actor page with a minimal input and run ID. Do not post sensitive address lists publicly.