Bulk e-mail validator with MX check
Returns a valid, risky or invalid verdict for each e-mail address, with a syntax check, the domain's MX records, disposable domain and role account flags, a typo suggestion (gmial.com to gmail.com) and the reason in one sentence.
Send a list of addresses, or point the tool at an Apify dataset from another actor, and get one row per address back. Duplicates are checked and charged once, and up to 100 000 unique addresses fit in one run.
The tool never connects to the mail servers and never sends anything. It looks up DNS records and compares the address with an open list of 9 203 disposable domains and a list of role names (info, sales, noreply, kontakt and others). That means it cannot confirm that a specific mailbox exists, but it also never puts your IP address at risk of being blocklisted for probing mail servers.
Sample from a real run
3 rows (selected fields) from run NmnE22LpE3oQ6ksCP on 6 October 2026, exactly as the tool returned them.
email | status | reason | hasMx | mxHosts | isDisposable | isRoleAccount | suggestion |
|---|---|---|---|---|---|---|---|
| info@apify.com | risky | Role account that reaches a team, not one person. | true | aspmx.l.google.com, alt1.aspmx.l.google.com, alt2.aspmx.l.google.com, aspmx2.googlemail.com, aspmx3.googlemail.com | false | true | null |
| hello@example.com | invalid | The domain publishes a null MX record: it accepts no e-mail. | false | [ ] | false | true | null |
| noreply@github.com | risky | Role account that reaches a team, not one person. | true | github-com.mail.protection.outlook.com | false | true | null |
Fields
Every row has these fields. Field names are stable between versions.
| Field | What it holds |
|---|---|
email | The address exactly as you sent it |
normalized | Cleaned address: trimmed, without display name or mailto:, in lower case, with an international domain in its ASCII (punycode) form. null when the syntax is invalid |
isValidSyntax | Whether the address follows the syntax of RFC 5321 and 5322 (dot-atom or quoted local part, UTF-8 local parts as in RFC 6531) |
domain | The domain part, in ASCII form |
hasMx | true when the domain has MX records, false when it has none, null when the lookup failed or the syntax was invalid |
mxHosts | The MX hosts, sorted by priority |
isDisposable | The domain, or a parent domain, is on the open list of disposable e-mail domains |
isRoleAccount | The local part is a role address such as info, admin, support, sales, noreply, kontakt or kundtjanst (English and Nordic names, +tags ignored) |
suggestion | The address with the likely intended domain when the domain looks like a typo of a large mailbox provider, for example gmial.com to gmail.com |
status | valid, risky or invalid |
reason | Why, in one sentence |
Input example
Paste it into the JSON tab of the actor in Apify Console, or send it to the Apify API.
{
"emails": [
"anna@example.com",
"info@company.se",
"firstname.lastname@gmial.com",
"test@mailinator.com"
],
"onlyNew": false
}What people use it for
- Cleaning a list before a send. Remove addresses whose domain accepts no mail, and decide what to do with role accounts and disposable domains before they hurt your sender reputation.
- Checking sign-ups. Run new sign-ups through the tool with
onlyNewset to true, so each address is checked and charged once. - After a lead scraper. Give the dataset ID from another actor in
datasetIdand the field name inemailField, and the addresses are checked in the same pipeline.
Price
1 USD per 1 000 addresses, plus Apify platform usage.
A run with empty input checks four example addresses, which costs 0.004 USD in results. Platform usage is small: a test run that checked 2 000 addresses across 315 domains took 4 seconds and used 0.0001 USD.
Run it on a schedule
Set onlyNew to true and add the actor to a schedule in Apify Console (for example the cron expression 0 7 * * * for 07:00 every day). The actor remembers what it has already delivered for the same input, in a named key-value store in your own Apify account (nightwave-state-email-validator), and each run returns and charges only what is new. The first run returns everything in the selection. A run with nothing new finishes with 0 rows and costs nothing beyond platform usage.
Source and license
The checks are the tool's own code: the syntax rules of RFC 5321, 5322 and 6531, DNS lookups of MX, A and AAAA records, and built-in lists of role names and mailbox providers. With onlyNew, only one-way SHA-256 hashes of checked addresses are stored, never the addresses.
The disposable domain list is from disposable-email-domains, published under CC0 1.0 Universal, which allows commercial use without asking permission. It was downloaded on 3 October 2026 and is bundled with the tool.
Try it
The tool runs on Apify. Apify handles your account, the runs and the payment, and you can try it with the input above before you schedule anything.
Built and maintained by Nightwave AB. Questions or bugs: kontakt@nightwave.se