Bulk Email Validator: MX, Disposable and Typo Check · Apify
Email List Cleaner: Bulk Email Validator, $0.80/1k, MX Check avatar

Email List Cleaner: Bulk Email Validator, $0.80/1k, MX Check

Pricing

from $0.50 / 1,000 email checkeds

Go to Apify Store
Email List Cleaner: Bulk Email Validator, $0.80/1k, MX Check

Email List Cleaner: Bulk Email Validator, $0.80/1k, MX Check

Email validation: validate an email list in bulk, remove bad, disposable and role addresses (info@), fix typos like gmial.com, check syntax and MX. Verifier and list cleaner that cuts bounces from dead domains. Valid, risky or invalid with a reason. $0.80/1k. Domain checked, mailbox not: no SMTP.

Pricing

from $0.50 / 1,000 email checkeds

Rating

0.0

(0)

Developer

Solid Fetch

Solid Fetch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Features

Limited permissions

Share

Clean an email list before you send to it: validate an email list in bulk, remove bad and disposable addresses and catch the typos and dead domains that cause hard bounces. An email list cleaner, email validator and email verifier for marketers and sales teams, with the verification done at domain level: syntax, MX records, disposable and role addresses. Paste a column of addresses and each one gets valid, risky or invalid with a reason (valid means the domain takes mail, not that the mailbox exists), a suggested fix for typos (gmial.com becomes gmail.com) and a flag for role addresses (info@). It checks syntax and MX records only, with no SMTP probing, so it cannot catch every bounce: a mailbox that does not exist on a working domain still comes back valid. $0.80 per 1,000 checked addresses on the free plan; bad syntax and repeats are free.

{ "emails": ["info@example.com", "jane.doe@gmial.com", "test@mailinator.com"] }

One row of the result (shortened, an invented domain; see Output for all fields):

{ "email": "jane.doe@acme.example", "domain": "acme.example", "verdict": "valid", "reason": "mx-found", "explanation": "The domain has MX records", "syntaxValid": true, "mxFound": true, "mxHost": "mx1.acme.example" }

Clean an email list in bulk before you send to it, for $0.80 per 1,000 checked addresses on the free plan ($0.50 per 1,000 on Gold and above). Bad syntax, repeats and failed lookups are free. For every address the actor checks the syntax, looks up the domain's MX records in DNS, flags disposable domains, free-mail providers and role addresses (info@, sales@), suggests a fix for common typos (gmial.com becomes gmail.com) and gives a final verdict, valid, risky or invalid, with the reason in a code and in a plain sentence. Paste a column from a spreadsheet or pass a list. There is no file upload, so copy the column and paste it into the text field. A domain-only mode checks a list of domains.

No SMTP probing, said plainly. The actor never connects to an SMTP server, never sends a message and never asks a server whether a mailbox exists. It uses DNS only, so it cannot tell you that jane@company.com is a real mailbox, and it never claims a domain is catch-all. A valid verdict means "the address is well formed and its domain can receive mail", not "the mailbox exists": nobody-here@company.com comes back valid when company.com takes mail, so every row has mailboxVerified: false.

Why that is often the better trade for a list clean-up:

  • Speed. One DNS lookup per domain, however many addresses share it. No waiting on slow or greylisting mail servers.
  • Nothing to get blocked or blacklisted. No mail server on your list is contacted, so no server sees a probe, rate-limits it or puts an IP on a blocklist over it.
  • A clear reason for every verdict. Each row says why: domain-not-found, no-mail-records, disposable-domain, role-account, possible-typo and so on, so you decide what to drop and what to keep. SMTP checks can end in "unknown" for servers that accept every address or refuse to answer.

It removes the structural junk: dead domains, domains that take no mail, throwaway services, shared role inboxes and typos. If you need a mailbox-level answer, you need an SMTP-probing service, and those come with their own error rates and blocked IPs.

What people use it for

  • Cleaning a list before a campaign. Drop addresses that cannot bounce for structural reasons: typos in the syntax, domains that do not exist, domains that publish no mail records. This protects your sender reputation from the cheapest kind of hard bounce.
  • Removing throwaway sign-ups. The disposable flag uses the maintained open list disposable-email-domains (about 9,900 domains).
  • Splitting people from teams. The role flag marks info@, sales@, admin@, support@ and similar shared addresses, and the free-provider flag marks gmail, outlook, yahoo and other public mailboxes, so you can route a lead list by company or by person.
  • Catching typos while they can still be fixed. jane@gmial.com comes back with suggestion: "jane@gmail.com".
  • Cleaning a domain list. Domain mode takes domains, URLs or addresses and returns the MX, disposable, free-mail and typo checks for each domain.

How to use it

A list:

{
"emails": ["info@example.com", "jane.doe@gmial.com", "test@mailinator.com"]
}

A pasted column (one per line, or separated by commas, semicolons or tabs):

{
"text": "jane@acme.com\nbob@acme.com, sue@globex.com\nNot an address"
}

Domains only:

{
"mode": "domains",
"text": "gmail.com\nhttps://www.mailinator.com/\nsome-typo-gmial.com"
}

Both fields can be used in one run. Name <a@b.com> and mailto: links are cleaned, and a field name the actor does not know stops the run with a hint such as "email" (did you mean "emails"?), so a typo cannot give you a run that ignored a setting.

Input

FieldWhat it does
emailsList of addresses. An entry may hold several addresses separated by commas, semicolons or line breaks. Up to 100,000 entries per run.
textA text blob with one address per line, or separated by commas, semicolons or tabs. Used together with emails.
modeemails (default) or domains. In domain mode, URLs and addresses are reduced to their domain.

Repeats are found after normalising (lower case, domain in punycode, a trailing dot dropped). Jane@Example.com and jane@example.com are the same address. jane+news@example.com is a different one, because the tag may route to a different folder or a different person.

Output

One row per input, in input order, so you can put the result next to your original column. The row is flat, so the CSV export works as is. An example of the row shape (invented domain):

{
"input": " Jane.Doe@Acme.example ",
"email": "jane.doe@acme.example",
"domain": "acme.example",
"verdict": "valid",
"reason": "mx-found",
"reasons": ["mx-found"],
"explanation": "The domain has MX records",
"syntaxValid": true,
"mxFound": true,
"mxCount": 2,
"mxHost": "mx1.acme.example",
"mxRecords": [
{ "exchange": "mx1.acme.example", "priority": 10 },
{ "exchange": "mx2.acme.example", "priority": 20 }
],
"dnsStatus": "mx",
"hasARecord": null,
"hasAaaaRecord": null,
"disposable": false,
"freeProvider": false,
"roleAccount": false,
"role": null,
"suggestion": null,
"smtpChecked": false,
"mailboxVerified": false,
"duplicateOf": null,
"checkedAt": "2026-10-22T12:00:00.000Z"
}
FieldMeaning
inputThe entry as you gave it.
email, domainThe normalised address (lower case, domain in ASCII) and its domain. null when the syntax is invalid.
verdictvalid, risky or invalid. See the rules below.
reason, reasons, explanationThe main reason code, all reason codes (heaviest first) and the same reasons as plain sentences.
syntaxValidFalse when the address breaks a syntax rule. The reason code says which one.
mxFound, mxCount, mxHost, mxRecordsThe MX records, sorted by priority. mxFound is null when the lookup failed.
dnsStatusmx, a-fallback, null-mx, no-mail-records, nxdomain or error.
hasARecord, hasAaaaRecordOnly filled when the domain has no MX: whether it has an address record that mail would fall back to.
disposable, freeProviderFlags for the domain.
roleAccount, roleA shared function address and which one (info, sales, noreply). Not in domain mode.
suggestionThe corrected address (or domain in domain mode) when the domain looks like a mistyped popular one.
smtpCheckedAlways false.
mailboxVerifiedAlways false: a valid row says the domain takes mail, not that this mailbox exists.
duplicateOfThe normalised address this row repeats, so repeats can be filtered out.
checkedAtWhen the DNS was asked.

The run also writes a SUMMARY record with the counts by verdict and by reason, how many rows were charged, and how many DNS lookups were made.

Verdict rules

The verdict is invalid if any invalid reason applies, otherwise risky if any risky reason applies, otherwise valid.

ReasonVerdictWhen
Syntax codes such as missing-at, local-part-too-long, domain-without-dot, invalid-domain-characterinvalidThe address breaks a syntax rule. The code names the first rule it breaks.
domain-not-foundinvalidDNS says the domain does not exist (NXDOMAIN).
domain-rejects-mailinvalidThe domain publishes a null MX record (RFC 7505), which says it accepts no mail.
no-mail-recordsinvalidThe domain exists but has no MX and no A or AAAA record.
no-mx-address-fallbackriskyNo MX, but an A or AAAA record. Mail systems then try that address, but few real mailboxes work that way.
dns-lookup-failedriskyTimeout or server failure. Nothing is known about the domain. Run it again.
disposable-domainriskyThe domain is a throwaway mailbox service.
role-accountriskyinfo@, sales@, admin@, support@, noreply@ and similar.
possible-typoriskyThe domain looks like a mistyped popular domain. A typo domain that does not exist is invalid, with the suggestion still given.
international-local-partriskyNon-ASCII letters before the @, which many mail systems cannot deliver to.
mx-foundinformationThe domain has MX records. It is the only reason of a valid row.

A free provider (gmail.com and the like) is not a reason by itself. It sets freeProvider and nothing else.

Syntax follows what mail systems accept in practice (RFC 5321 and 5322 without the exotic parts). Quoted local parts ("john doe"@example.com), comments and IP literals (user@[1.2.3.4]) are valid in the RFCs and rejected here, because no ordinary mailbox uses them.

Pricing

Pay per event, prices on the Pricing tab.

EventCharged for
email-checkedEach address (or domain, in domain mode) that has valid syntax, is not a repeat of an earlier one, and got an answer from DNS.

Free: inputs with invalid syntax, repeats of an earlier address, and rows where the DNS lookup failed (timeout or server failure), because the actor could not answer them. Rows past your maximum cost per run are not saved.

The final status line adds it up, for example 1,000 of 1,000 inputs checked: 790 valid, 150 risky, 60 invalid. 940 charged as email-checked, 60 free (35 with bad syntax, 25 repeats).

Limits

  • No mailbox check, no catch-all detection. See the top of this page. valid says the domain can receive mail, not that jane exists there.
  • DNS only. Each domain is looked up once per run, however many addresses share it. Lookups have a timeout of 5 seconds and one retry. A domain whose name servers do not answer ends as dns-lookup-failed and is free, and a re-run usually answers it.
  • Disposable list. It is the open list disposable-email-domains (CC0 1.0, fetched 2026-10-22, 9,919 domains). New throwaway services appear every week, so the flag catches the known ones. A subdomain of a listed domain counts as listed.
  • Typo suggestions are for popular providers only (gmail, yahoo, hotmail, outlook, icloud, protonmail, yandex). A company domain with a typo is not suggested, it just fails the MX check if the domain does not exist.
  • Role addresses are a list of common names, not a guess. sales.manager@ is not flagged, sales@ is.
  • Up to 100,000 entries per run.

Privacy

Your addresses are your data. The actor does not log them (the log holds counts only, and an error message that quotes an address is masked to j***@example.com), does not keep them anywhere except the dataset of the run, and does not send them to any service other than the DNS resolver asked about the domain part. The run's restart record holds a hash of the list and counters, not addresses.

When a run fails, an error report with the error message (addresses masked) and the shape of the input (which fields are set, how long the lists are), never your input values or your results, is sent to the developer to fix bugs.

Attribution

The disposable-domain flag uses the disposable-email-domains list (https://github.com/disposable-email-domains/disposable-email-domains), published under CC0 1.0 Universal. The actor is not affiliated with it.

Did this help? A review on this page, or an issue saying what is missing, helps other people find it.