Email List Precheck: Syntax, MX & Disposable Check avatar

Email List Precheck: Syntax, MX & Disposable Check

Pricing

from $0.20 / 1,000 email pre-checkeds

Go to Apify Store
Email List Precheck: Syntax, MX & Disposable Check

Email List Precheck: Syntax, MX & Disposable Check

Cheap email list hygiene before real verification: syntax, MX records, disposable domains, role accounts, free providers, typo suggestions and duplicates, up to 100,000 addresses. No SMTP probing, never claims a mailbox exists. Optional exact check with your own key.

Pricing

from $0.20 / 1,000 email pre-checkeds

Rating

0.0

(0)

Developer

Offera Studio

Offera Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

What does Email List Precheck do?

Email List Precheck is a fast, cheap clean-up step for email lists. It removes the addresses that are clearly bad before you pay for a real verification or send a campaign. It checks, for up to 100,000 addresses per run:

  • ✍️ Syntax (practical RFC 5322) and normalisation: trimmed, domain in lower case, internationalised domains turned into punycode.
  • 📬 Mail server: does the domain have MX records (or an A/AAAA record, which counts as an implicit MX)? Looked up once per domain through DNS-over-HTTPS. A domain that does not exist, or says it takes no mail ("null MX"), is invalid.
  • 🗑️ Disposable domains (a bundled open list of 9,000+ domains), role accounts (info@, sales@, admin@, noreply@ ...), free webmail providers, and typo suggestions (gmial.com → gmail.com, hotmial.com, .con → .com).
  • ♻️ Duplicates within your list (free).

⚠️ What this Actor does NOT do

It never talks to the mailbox. Outbound port 25 (SMTP) is closed on Apify, so there is no SMTP probing, and the Actor never claims a mailbox exists. Without a key its best verdict is unknown ("passed the pre-checks, mailbox not verified"). It is a pre-check that removes bad addresses so that you pay a verification service only for addresses worth verifying. Only if you give your own MillionVerifier or ZeroBounce key do addresses get an exact valid / invalid / catch-all / unknown from that provider.

Verdicts

VerdictMeaning
invalidCannot receive mail: bad syntax, the domain does not exist, no mail server, or a null MX.
riskyCan receive mail, but is a disposable domain, a role account (can be switched off), or has a suspected typo.
unknownNothing against it. The mailbox itself was not verified.
valid, catch-allOnly with your own provider key: the provider's answer, with its raw status in providerStatus.

Who is it for?

  • Email marketers and sales teams: shrink a list by removing typos, dead domains and throw-away addresses before sending or before paying for a verifier.
  • Lead generation and data teams: flag role accounts and free-mail addresses in B2B lists.
  • Developers: clean a signup export; add the exact provider check only for the addresses that pass.

How to use it

  1. Paste addresses into Emails, one per line (commas, semicolons and Name <address> are understood).
  2. Optional: switch Mark duplicates or Role accounts count as risky off.
  3. Optional: choose MillionVerifier or ZeroBounce and paste your own API key (stored encrypted, never logged or put in the results). Addresses that pass the pre-check are then verified with your account, and the provider's answer becomes the verdict.
  4. Click Start. The Results tab shows the verdict and reasons per address.

Input example

{
"emails": ["maria.garcia@gmail.com", "john.smith@gmial.com", "info@example-company.com", "Name <someone@example.org>"],
"dedupe": true,
"includeRoleAccounts": true,
"byokProvider": "none"
}

Output example

Real results from a run on 7 October 2026 (no key):

[
{ "type": "email", "email": "maria.garcia@gmail.com", "normalized": "maria.garcia@gmail.com", "verdict": "unknown", "reasons": [], "domain": "gmail.com", "mx": true, "mxHosts": ["gmail-smtp-in.l.google.com", "alt1.gmail-smtp-in.l.google.com", "alt2.gmail-smtp-in.l.google.com"], "disposable": false, "role": false, "freeProvider": true, "suggestion": null, "provider": null, "providerStatus": null },
{ "type": "email", "email": "john.smith@gmial.com", "normalized": "john.smith@gmial.com", "verdict": "risky", "reasons": ["dns-unavailable", "disposable-domain", "typo-suspected"], "domain": "gmial.com", "mx": null, "disposable": true, "suggestion": "john.smith@gmail.com" },
{ "type": "email", "email": "test.user@mailinator.com", "verdict": "risky", "reasons": ["disposable-domain"], "disposable": true, "mx": true },
{ "type": "email", "email": "info@wikipedia.org", "verdict": "risky", "reasons": ["role-account"], "role": true, "mx": true },
{ "type": "email", "email": "someone@zq7x-no-such-domain-4f9a1c3e8b.com", "verdict": "invalid", "reasons": ["domain-not-found"], "mx": false },
{ "type": "email", "email": "not-an-email", "normalized": null, "verdict": "invalid", "reasons": ["syntax:missing-at-sign"] },
{ "type": "email", "email": "alex@example.com", "verdict": "invalid", "reasons": ["null-mx"], "mx": false },
{ "type": "duplicate", "email": "Maria.Garcia@Gmail.com", "duplicateOf": "maria.garcia@gmail.com", "reasons": ["duplicate"] }
]

(Rows shortened here; every email row has all fields.) With your own key a row also has provider (millionverifier or zerobounce), providerStatus (the provider's own text, e.g. ok, catch_all, valid) and providerDetail, and the verdict is the provider's answer.

Reason codes

syntax:<problem> (missing-at-sign, multiple-at-signs, contains-spaces, invalid-local-characters, misplaced-dot-in-local-part, invalid-domain, invalid-tld ...), domain-not-found, no-mx-records, null-mx, dns-unavailable (DNS did not answer: the verdict is not changed by it), disposable-domain, role-account, typo-suspected, provider-error (your provider could not check this address: the pre-check verdict stays).

How much does it cost?

Pay per event:

EventPriceWhen
email-prechecked$0.0002 per addressevery address that is pre-checked (valid or not)
email-verified-byok$0.0005 per addressonly when your provider returned a result for the address

1,000 addresses pre-checked cost $0.20. Free: duplicate rows and error rows. Your provider charges its own price to your account with them, on top. Only addresses that pass the pre-check are sent, which saves your credits: invalid addresses, disposable domains and suspected typos are never sent.

Limitations

  • No mailbox verification without your own key, by design (see above).
  • Role accounts and free providers are flags, not errors: info@ can be a real, monitored mailbox. Switch the verdict effect off with Role accounts count as risky.
  • Typo suggestions cover the big providers and common TLD slips; an unusual typo of a company domain is not caught. A suggestion is a hint, not a correction.
  • The disposable list (CC0, 9,000+ domains) misses new throw-away services and may list a few domains that are not disposable any more; it is refreshed with scripts/refresh-disposable.mjs before releases.
  • DNS answers can be wrong for a moment (dns-unavailable): re-run those addresses.
  • Quoted local parts ("john smith"@example.com), comments and IP-address domains are rare and are reported as syntax problems.
  • Local parts are kept as written (they are case-sensitive in theory); duplicates are found ignoring case.

FAQ

Why is the best verdict "unknown" and never "valid"?

Because without asking the mail server (SMTP), nobody can know a mailbox exists, and port 25 is closed on Apify. "Valid" would be a guess. With your provider key you get the provider's real answer.

Which provider should I use?

Either works the same here: the Actor sends the address and shows the answer. Check their prices and accuracy for your lists. The key is yours: set it in the secret field; it is never written to results or logs.

What happens to addresses my provider cannot check?

The row keeps its pre-check verdict and gets the reason provider-error; you are not charged the verification event. If the key is rejected or the credits run out, the Actor stops using the provider for the rest of the run and adds one free error row.

Does it use a proxy?

No.

More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

Website audits

Company data and compliance

Media and AI

Market signals

Feedback

Missing a typo pattern or a role name, or a disposable domain that is wrongly listed? Open an issue on the Issues tab.