Bulk Email Verifier & Validator: Syntax, MX, Role avatar

Bulk Email Verifier & Validator: Syntax, MX, Role

Pricing

from $0.19 / 1,000 email checkeds

Go to Apify Store
Bulk Email Verifier & Validator: Syntax, MX, Role

Bulk Email Verifier & Validator: Syntax, MX, Role

Bulk email verifier and validator at $0.29 per 1,000: RFC syntax, DNS MX and null MX, role accounts, domain typo hints, and an exact match on a built-in list of 10,141 disposable domains (not exhaustive). No mailbox (SMTP) check. Works with n8n, Make, Zapier and AI agents via MCP.

Pricing

from $0.19 / 1,000 email checkeds

Rating

0.0

(0)

Developer

PlainKit bin

PlainKit bin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Security

Limited permissions

Share

Introduction

Clean an email list in bulk with this verifier and validator before you send to it. For each address this Actor checks syntax against a strict ASCII subset of RFC 5321 and RFC 5322, queries DNS MX records with fallback to address records, flags role mailboxes such as info or support, suggests a fix for common domain typos, and flags an exact match on a built-in list of 10,141 disposable domains that is not exhaustive. You get one row per address with a simple status: mx_ok, risky or invalid.

What it does not do: it never connects to mail servers, so it makes no mailbox (SMTP) check. mx_ok means the domain has mail routing, not that the mailbox exists. Use it as a low-cost first pass, at $0.29 per 1,000 addresses on the FREE tier, to remove addresses that cannot work. It also runs from n8n, Make and Zapier, and from AI agents through the Apify MCP server.

Use cases

  • Marketing list cleaning: Filter out syntax errors, defunct domains, and null MX domains before launching cold email or newsletter campaigns.
  • Form submission hygiene: Validate bulk contact submissions and catch domain typos such as typos in popular providers.
  • Spam and abuse reduction: Flag exact matches on a built-in list of 10,141 disposable domains that is not exhaustive and generic role mailboxes (e.g., admin, info, support) to protect lead scoring and onboarding pipelines.

Sample output

Each address gives one row like this illustrative one:

{
"checked_utc": "2026-11-04T12:00:00Z",
"did_you_mean": "",
"domain": "example.com",
"email": "user@example.com",
"has_mx": true,
"is_disposable": false,
"is_role_account": false,
"mx_hosts": [
"mail.example.com"
],
"normalized_email": "user@example.com",
"reason": "syntax_and_mx_ok",
"status": "mx_ok",
"syntax_valid": true
}

Tutorial

Step-by-step guide

  1. Prepare a JSON input object containing the emails array with up to 100,000 email addresses.
  2. Run the Actor on the Apify platform or trigger it via the Apify API.
  3. Once completed, view or download the checked dataset in JSON, CSV, or Excel format.
  4. Filter rows by status (mx_ok, risky, invalid) to segment your contacts.

Pricing

The Actor is priced on a Pay-Per-Event model under the email-checked event. Under the FREE tier, the cost is $0.00029 per checked address, with tiered discounts available for higher subscription tiers.

Charge contract

Each row is pushed first and charged right after a successful push; a refused charge stops work and that row stays delivered and uncharged; a reached limit stops work after that row was charged; failed items are neither pushed nor charged.

  • Duplicates and blank lines: Blank lines are ignored and not charged. Duplicate addresses within the input list are deduplicated before any charge; deduplication keeps the local part case-sensitive and lowercases the domain. Duplicate addresses are discarded and are not charged.
  • Failed items: If a DNS timeout or nameserver failure occurs during lookup, the address is considered a failed item; failed items produce no row, so compare input and output to find them, and failed items are not charged. A failed lookup applies to every address of that domain in that run.
  • Invalid input: A run with invalid input ends as failed before any address is processed; invalid input is not charged.
  • Restarted runs: Rows already in the dataset of a restarted run are skipped and not charged again; if the dataset of a restarted run cannot be read, the run fails with DATASET_READ_FAILED before any new row or charge.
  • Largest bill: For the maximum input of 100,000 addresses, the bill is $29.00 at the FREE price ($0.00029 per address) and $19.30 at the GOLD price ($0.000193 per address). Buyers can configure a maximum cost per run setting in the Apify Console.
  • Unprocessed items and runtime budget: The actor timeout is RUN_TIMEOUT_SECONDS = 3600 seconds. When remaining execution time drops below the safety margin (DEADLINE_MARGIN_SECONDS = 15 seconds, derived from MAX_DNS_QUERIES_PER_DOMAIN * DNS_LIFETIME_SECONDS), the run stops gracefully with stop code RUN_TIME_BUDGET_REACHED. Unprocessed addresses are neither pushed nor charged.
  • Large lists: A run stops when its 3,600 second time budget is nearly used. How many addresses fit depends on DNS speed and on platform calls for each row, and it has not been measured for large lists. Each address needs one DNS lookup unless its domain was already looked up in the run, then one push and one charge, in sequence. Addresses not reached produce no row and no charge, and the status message gives the count. To be safe, split a very large list into several runs.
  • Syntax edge cases: Internationalised addresses (non-ASCII characters or IDN) and quoted local parts return invalid_syntax and are charged, as syntax validation requires standard ASCII dot-atom local parts.

Input and output examples

Input example

{
"emails": [
"user@example.com",
"support@example.com",
"invalid-user@example.org"
]
}

The prefilled sample uses example.com, which publishes a null MX, so a first run returns invalid with reason null_mx. Put your own list in its place.

Output example

Illustrative row, not a live result. Real domains return their own records, and example.com itself publishes a null MX.

{
"checked_utc": "2026-11-04T12:00:00Z",
"did_you_mean": "",
"domain": "example.com",
"email": "user@example.com",
"has_mx": true,
"is_disposable": false,
"is_role_account": false,
"mx_hosts": [
"mail.example.com"
],
"normalized_email": "user@example.com",
"reason": "syntax_and_mx_ok",
"status": "mx_ok",
"syntax_valid": true
}

Output fields

FieldTypeDescription
checked_utcStringISO 8601 UTC timestamp of when the address was checked
did_you_meanStringSuggested address correction for common domain typos
domainStringExtracted lowercased domain part (empty for invalid syntax)
emailStringEmail holds the trimmed input string (truncated to 254 chars on invalid rows)
has_mxBooleanTrue if the domain has valid DNS MX records
is_disposableBooleanTrue if domain is an exact match on a built-in list of 10,141 domains that is not exhaustive
is_role_accountBooleanTrue if local part is a generic role account (admin, support, etc.)
mx_hostsArrayUp to 5 MX hostnames ordered by preference, and a hostname with a long digit run may be masked by the output safety filter
normalized_emailStringNormalized email representation (truncated to 254 chars on invalid rows)
reasonStringMachine-readable diagnosis reason code
statusStringHigh-level validation status: mx_ok, risky, or invalid
syntax_validBooleanTrue if email adheres to RFC 5321 / RFC 5322 syntax specifications

Status and reason reference

StatusReasonDescription
mx_oksyntax_and_mx_okSyntax is valid and domain has valid DNS MX records
riskya_record_fallbackDomain lacks MX records but has valid A or AAAA host records
riskydisposable_domainDomain is an exact match on a built-in list of 10,141 domains that is not exhaustive
riskyrole_accountLocal part matches a shared departmental role mailbox
invalidinvalid_syntaxEmail fails RFC 5321 length limits or character syntax rules
invalidnxdomainDomain does not exist according to the DNS resolver
invalidnull_mxDomain explicitly announces it does not accept mail (RFC 7505)
invalidno_mx_or_a_recordDomain exists but has no MX, A, or AAAA DNS routing records

Actor recommendations

For full lead pipeline management, pair this Actor with:

  • Web Scraper & Crawler Actors: Extract business contact pages and domain references.
  • CRM Integrator Actors: Ingest checked clean contacts directly into your CRM or email delivery platform.

FAQ and support

Does this check confirm that a specific mailbox actually exists?

No. It checks syntax, DNS MX records, an exact match on a built-in list of 10,141 domains that is not exhaustive, and role patterns. It does not connect to mail servers and does not prove the mailbox exists.

The disposable list is the public disposable-email-domains project (CC0 1.0), commit a72c0cec of 2026-11-04, minus 2 entries removed for our release checks.

Are my email lists logged or stored?

Addresses are never written to run logs, which hold aggregate counts and status codes only. The input list and the output rows stay in the buyer's own Apify run storage under the buyer's retention settings, because the output rows are the delivered result. The buyer must have a lawful basis to process the list under applicable data protection laws (such as GDPR).

Support and inquiries

For issues, bug reports, or feature requests, submit a ticket through the Apify Console Actor issue tracker.