Email Validator for Syntax, MX & Disposable Emails avatar

Email Validator for Syntax, MX & Disposable Emails

Pricing

from $0.35 / 1,000 email checks

Go to Apify Store
Email Validator for Syntax, MX & Disposable Emails

Email Validator for Syntax, MX & Disposable Emails

Check email syntax, MX records, disposable domains and common typos in batches. Get address-level verdicts without SMTP probing or mailbox verification.

Pricing

from $0.35 / 1,000 email checks

Rating

0.0

(0)

Developer

mia.cx

mia.cx

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Security

Limited permissions

Share

Check an address list for syntax errors, missing MX records, disposable domains and common domain typos. DNS comes from Cloudflare; role, free-provider and typo signals come from curated lists. No SMTP probing or mailbox verification runs. A plausible address can still point to a nonexistent mailbox. Each completed unique check costs $0.00035, plus $0.00005 per run start at default memory.

Try it

{"emails":["Jane.Doe@Gmail.com"]}

An empty input {} checks Jane.Doe@gmail.com, info@example.com and someone@gamil.com. An empty emails list fails the run. No upstream API key is needed.

Use from an agent

Add https://mcp.apify.com?tools=miacx/email-validator to your MCP client and sign in to Apify. Call the dedicated Actor tool with the input above, then read its completed dataset with get-dataset-items. Or set APIFY_TOKEN to your Apify API token and request JSON rows:

curl --fail-with-body 'https://api.apify.com/v2/actors/miacx~email-validator/run-sync-get-dataset-items' \
-H "Authorization: Bearer $APIFY_TOKEN" -H 'Content-Type: application/json' \
-d '{"emails":["Jane.Doe@Gmail.com"]}'

What you get

Read status first. On ok, use verdict and reason; a successful check can return an invalid verdict. There is one row per input, in input order, including duplicates. All domain lookups finish before dataset rows are saved.

This row comes from the recorded Gmail DNS fixture, processed with a fixed clock.

{
"input": "Jane.Doe@Gmail.com",
"status": "ok",
"ok": true,
"error": null,
"message": null,
"syntaxValid": true,
"email": "Jane.Doe@gmail.com",
"local": "Jane.Doe",
"domain": "gmail.com",
"verdict": "plausible",
"reason": null,
"hasMx": true,
"mxHosts": [
"gmail-smtp-in.l.google.com",
"alt1.gmail-smtp-in.l.google.com",
"alt2.gmail-smtp-in.l.google.com",
"alt3.gmail-smtp-in.l.google.com",
"alt4.gmail-smtp-in.l.google.com"
],
"disposable": false,
"role": false,
"free": true,
"suggestion": null,
"source": "cloudflare-doh",
"fetchedAt": "2026-10-31T00:00:00.000Z"
}

email preserves local-part case and lowercases/IDNA-encodes the domain. input preserves the original string. syntaxValid is true for parsed syntax even if DNS fails, false for malformed syntax, or null for unsupported syntax. mxHosts lists hosts by increasing MX preference, without deduplication. Empty arrays need interpretation alongside hasMx and status. hasMx is null when the lookup failed; false can mean no MX, null MX or NXDOMAIN.

disposable matches the bundled domain list, including parent domains. role ignores local-part case and plus tags. free identifies listed free-mail providers. These lists are not exhaustive. suggestion offers a recognized one-edit domain correction; it never changes the input. source is cloudflare-doh for answered Actor lookups; fetchedAt records when that response was parsed. Both are null when there is no usable DNS answer. Syntax failures have null address fields and flags.

Verdicts use the first matching reason in this order: invalid_syntax, unsupported_syntax, no_domain, null_mx, disposable, dns_error, no_mx, typo, role. No matching reason yields plausible. Check status first because a disposable signal can coexist with a DNS failure.

Input

FieldDefaultAccepted input
emails["Jane.Doe@gmail.com","info@example.com","someone@gamil.com"]1–10,000 address strings. An empty list, null or a non-string item fails the run.

Whitespace around addresses is trimmed. Supported addresses have an ASCII dot-atom local part and a hostname domain. The local part allows 64 characters; the normalized address allows 254. Unicode domains are IDNA-encoded. Quoted local parts, address literals and non-ASCII local parts return unsupported_syntax.

Pricing

An Email check (email-checked) costs $0.00035 for a saved, successful check on a unique normalized address. plausible, risky and DNS-backed invalid verdicts count, including null MX and NXDOMAIN. Syntax failures, unsupported forms, DNS failures and spending-limit rows incur no Email check events. Duplicates incur no additional events within one run. Local-part case remains significant, so a@gmail.com and A@gmail.com count separately.

1,000 completed unique checks cost $0.35005, including the $0.00005 run start at default 256 MB memory. The start charge applies even with no billable checks. Apify counts one start event per GB, with a minimum of one. Verdicts beyond the spending limit become free spending_limit rows with null signals and verdict: "unknown". Duplicates of an already paid verdict remain available.

Limits and data freshness

  • At most 10,000 addresses per run. Each distinct normalized domain shares one MX lookup, including failures.
  • DNS runs with six concurrent lookups, a three-second timeout per attempt and a 64 KiB response cap.
  • Transient transport failures allow up to three attempts. Resolver answers such as SERVFAIL are final for that lookup.
  • No SMTP or A/AAAA fallback runs. A domain without MX gets a risky verdict because implicit-MX delivery is unchecked.
  • The disposable list is bundled from disposable-email-domains, refreshed on 2026-10-31.

The Actor has no cross-run DNS cache. It shares answers within the run, so addresses on the same domain share a timestamp. Results are saved in chunks of 100 rows. The default dataset contains input addresses and results under Apify's storage retention.

The synchronous API waits up to 300 seconds. Use asynchronous runs for longer batches.

If a row fails

StatusNext step
invalid_syntaxCorrect the address using message.
unsupported_syntaxUse a checker that supports that address form. It is not declared invalid.
dns_errorRead message; retry transient resolver failures later.
spending_limitRaise the run budget or submit fewer unique addresses.