Cold outreach fails faster when the email list is dirty.
It is not only the obvious typos. A list can be full of addresses that look valid but point to domains with no mail servers, disposable inboxes, free providers that do not match a B2B campaign, role-based inboxes like info@ or support@, and mailboxes that reject SMTP delivery.
If you send to those addresses, you pay for the mistake twice. First you waste credits in the sending tool. Then you damage the sender reputation you need for the next campaign.
The better workflow is simple: validate before you send.
The Problem
Most prospecting workflows treat email validation as a cleanup step at the end. That is backwards.
By the time a bad email reaches the final CSV, it may already be attached to a CRM record, an outreach sequence, a lead score, or an automation rule. Removing it later creates a second data-cleaning job.
The real goal is not "check if this string has an at sign." The real goal is to answer practical questions before the email ever gets used:
- Is the email formatted correctly?
- Does the domain have MX records?
- Is the address from a disposable provider?
- Is it a role-based inbox?
- Is it a free provider instead of a company domain?
- Does the SMTP server accept the mailbox?
- Should this lead be sent, reviewed, or discarded?
That is the job of an email validation API.
The Solution
Email Validator API on Apify validates addresses with a five-layer pipeline:
- Format validation.
- Disposable or temporary domain detection.
- Role-based inbox detection.
- MX record lookup.
- SMTP mailbox verification.
The actor also returns a 0-100 confidence score, domain-level flags, MX records, and the reason behind the result. That makes it useful for more than a pass/fail check. You can use the output to route leads into different follow-up paths.
For example:
-
valid=trueandscore >= 60: safe to keep. -
is_disposable=true: remove before CRM import. -
is_free=true: keep for consumer campaigns, review for B2B. -
is_role_based=true: useful for company contact, weak for personal outreach. -
mx_found=false: discard or enrich from another source.
Actor link: https://apify.com/george.the.developer/email-validator-api
Quick Start
Use the Apify Store page to run it directly:
- Open the actor on Apify.
- Enter one
email, or pass anemailsarray for a batch. - Choose
validate,disposable, orbulk. - Run the actor and export the dataset as JSON, CSV, Excel, or through the Apify API.
The input schema supports:
{
"mode": "bulk",
"emails": [
"founder@company.com",
"sales@gmail.com",
"fake@mailinator.com"
]
}
For real-time API use, copy the actor's Standby URL from Apify and call the HTTP endpoints directly.
Code Example
Batch validation with Standby
const standbyUrl = process.env.EMAIL_VALIDATOR_STANDBY_URL;
const response = await fetch(`${standbyUrl}/validate/bulk`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
emails: [
'founder@company.com',
'sales@gmail.com',
'fake@mailinator.com',
],
}),
});
const { results } = await response.json();
const cleanList = results.filter((item) =>
item.valid &&
item.score >= 60 &&
!item.is_disposable
);
console.log(cleanList);
If your Standby endpoint requires authentication, add an Apify bearer token from an environment variable:
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
}
Standard Apify actor run
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.APIFY_TOKEN,
});
const run = await client.actor('george.the.developer/email-validator-api').call({
mode: 'bulk',
emails: [
'founder@company.com',
'sales@gmail.com',
'fake@mailinator.com',
],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const sendable = items.filter((item) =>
item.valid &&
item.score >= 60 &&
!item.is_disposable
);
console.log(sendable);
Example Output
{
"email": "hello@stripe.com",
"valid": true,
"format_valid": true,
"mx_found": true,
"smtp_check": "valid",
"is_disposable": false,
"is_free": false,
"is_role_based": true,
"domain": "stripe.com",
"score": 90,
"reason": "Valid email address"
}
That output is structured enough to plug straight into a lead scoring workflow.
Use Cases
Clean a scraped lead list
If you scrape websites, directories, or company pages, validate emails before pushing them to a CRM. Keep valid business emails, flag free-provider emails, and remove disposable inboxes.
Protect cold email deliverability
High bounce rates are expensive. Run new prospects through validation before they enter an outreach sequence, then route risky addresses into manual review.
Block disposable signups
For SaaS forms, waitlists, and gated content, use disposable detection to block temporary inboxes before they become low-quality accounts.
Score B2B leads
An email from a company domain is usually stronger than a free-provider address for B2B outbound. The API returns is_free, is_role_based, and domain, so you can add those signals to your score.
Audit old CRM records
Old lead databases decay. Run stale records through the validator before reactivation campaigns so you do not wake up a list with avoidable bounces.
Pricing
Email Validator API uses Pay Per Event pricing:
- $0.002 per email validated.
- 100 emails cost $0.20.
- 1,000 emails cost $2.00.
- 10,000 emails cost $20.00.
Bulk requests charge per email in the batch. The current input schema supports up to 50 emails per bulk request.
FAQ
Does this only check email syntax?
No. Syntax is just the first layer. The API also checks disposable domains, role-based inboxes, MX records, SMTP response, free-provider status, and a confidence score.
Can I use it without writing code?
Yes. Run the actor from Apify, paste one email or a JSON array, and export the dataset when the run finishes.
Can I use it in a real-time app?
Yes. The actor supports Standby mode, so you can call HTTP endpoints such as /validate, /disposable, and /validate/bulk.
Should I remove every role-based address?
Not always. info@, sales@, and support@ can still be useful for general company contact. They are weaker for personalized outbound, so the best move is to route them differently instead of treating them like personal inboxes.
What should my minimum score be?
Start with valid=true, score >= 60, mx_found=true, and is_disposable=false. Tighten the rule if you are protecting a high-value sending domain.
Get Started
Run Email Validator API on Apify:
https://apify.com/george.the.developer/email-validator-api
Use it before a campaign, before CRM import, or directly inside a lead generation pipeline.
Top comments (0)