Email Verifier - Bulk List Cleaning, MX & Disposable Checks avatar

Email Verifier - Bulk List Cleaning, MX & Disposable Checks

Pricing

Pay per event

Go to Apify Store
Email Verifier - Bulk List Cleaning, MX & Disposable Checks

Email Verifier - Bulk List Cleaning, MX & Disposable Checks

A domain that accepts mail says so in public DNS, with an MX record. Every address is checked against that, plus syntax, disposable domains and role names like info@, and returns a status, a 0-100 score and the reason. It never sends mail, so it cannot confirm a mailbox exists. Billed per address.

Pricing

Pay per event

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

163

Total users

5

Monthly active users

3 days ago

Last modified

Share

Email Verifier — syntax, MX, disposable and role checks

A domain that can receive mail has to say so in public DNS, with an MX record, and a domain that has sworn off mail says that too, with a null MX. Those records are the first thing checked here. You get one row per address telling you whether the domain can actually receive mail, whether it's a throwaway like Mailinator, and whether the address is a shared inbox such as info@ or sales@. It's the pass you run before a send so bounces don't wreck your sender reputation.

Nothing is ever emailed. You don't supply a login, an API key, a mailbox or a proxy.

What it can tell you, and what it can't

It can tell you the syntax is malformed, the domain has no MX records at all, the domain is on a disposable-provider list, the local part is a role account, or the domain is a free consumer provider like gmail.com.

It can't tell you a specific mailbox exists. Nothing that doesn't send mail can. A domain with perfectly good MX records still rejects individual recipients, runs a catch-all, or blocks probes outright. So valid here means "syntax passed and the domain accepts mail". It is not a deliverability guarantee, and the actor won't pretend otherwise.

What you get back

One row per address:

FieldWhat's in it
emailThe normalised address (lowercased, trimmed).
statusvalid, risky, invalid or unknown. valid means the address is worth keeping in a list, not that the mailbox exists. See mailboxVerified if that is the question you are asking.
mailboxVerifiedtrue only when a mail server accepted this exact recipient. false when one permanently refused it. null when nobody could ask. On Apify's runners this is null on every row — outbound port 25 is blocked there, so the probe never completes. Run the actor on your own machine to get a real answer.
confidence0–100 heuristic score behind that status.
reasonWhy: mx_valid, no_mx_record, invalid_syntax, disposable_domain, role_account, smtp_recipient_accepted, smtp_recipient_rejected, dns_inconclusive.
syntaxValidBoolean.
domainDomain part.
mxFoundtrue, false, or null when DNS itself was inconclusive.
mxRecordsArray of { priority, exchange }, sorted by priority.
isDisposableOn the built-in throwaway-domain list.
isRoleAccountinfo@, sales@, admin@, support@ and friends.
isFreeProviderGmail, Outlook, Yahoo and the rest.
smtpnull unless you turn the probe on; otherwise { status, smtpCode, reason }.

A real example from a run:

{
"ok": true,
"email": "info@apify.com",
"status": "risky",
"mailboxVerified": null,
"confidence": 88,
"syntaxValid": true,
"domain": "apify.com",
"mxFound": true,
"mxRecords": [
{ "priority": 1, "exchange": "aspmx.l.google.com" },
{ "priority": 5, "exchange": "alt1.aspmx.l.google.com" }
],
"isDisposable": false,
"isRoleAccount": true,
"isFreeProvider": false,
"smtp": null,
"reason": "role_account"
}

risky there is the right answer: the domain is fine, but info@ is a shared mailbox, and shared mailboxes are where cold email goes to die.

Input

{
"emails": ["person@example.com", "info@example.com", "bad@@example.com"],
"checkSmtp": false,
"smtpTimeoutMs": 5000,
"maxConcurrency": 10
}
FieldDefaultNotes
emailsThe list. Duplicates are lowercased and collapsed, so you're only billed once for the same address.
checkSmtpfalseTurn on the bounded SMTP probe. Read the section below first.
smtpTimeoutMs5000Per connection. Hard-capped at 8000 so a run can't hang on one dead MX.
maxConcurrency101–25 checks in flight. Lower it if you want gentler DNS traffic.

Leave emails empty and you get a single labelled _sample: true row showing the output shape. That row is free.

About the SMTP probe

With checkSmtp: true the actor opens TCP port 25 on the top-priority MX host and sends EHLO, MAIL FROM and RCPT TO. It never sends a message body.

Be realistic about it. Apify's own runners block outbound port 25, so in the cloud the probe never connects and mailboxVerified comes back null on every row — measured across eight mail hosts, including self-hosted ones. Run the actor locally and the probe works normally. Beyond that, the big providers deliberately refuse to confirm or deny a recipient even when you can reach them.

When the probe cannot reach a verdict the smtp object says inconclusive and the row keeps whatever the DNS evidence earned it. An inconclusive probe never gets upgraded into a deliverability claim.

The reply code decides which of those it is:

ReplyWhat it meanssmtp.status
250 at RCPT TOthe server accepted this recipientaccepted
5xx at RCPT TOthe server permanently refused this recipientrejected
5xx earlierthe server refused us, not the mailboxinconclusive, server_refused_probe
4xx anywheretemporary: greylisting, rate limiting, try laterinconclusive, temporary_failure

That last row matters more than it looks. Greylisting is the standard reply to an unfamiliar sender, and a greylisted address is usually a perfectly good one.

Limits

  • DNS runs over DNS-over-HTTPS so cloud behaviour stays consistent; a DNS timeout returns mxFound: null and status: unknown rather than a false invalid.
  • Catch-all domains are indistinguishable from working mailboxes over SMTP. They come back inconclusive.
  • The disposable-domain list is built in. It's good, it isn't every throwaway service on earth.
  • 25 concurrent checks is the ceiling.

Billing

Two charges. A $0.001 run-start fee each time a run begins, and a per-verification fee for every completed check.

Per verification it's $0.00199 ($1.99 per 1,000).

Sample rows, diagnostic rows, duplicates and runs that return nothing are never charged the per-verification fee. An invalid-syntax address is a completed check and is billed once. No residential proxy is involved, so nothing is metered by the gigabyte.

Responsible use

Only run addresses you're allowed to process. What comes back is a list-cleaning signal. It isn't consent and it isn't permission to send.