Email Validator for Syntax, MX & Disposable Emails
Pricing
from $0.35 / 1,000 email checks
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
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
| Field | Default | Accepted 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
| Status | Next step |
|---|---|
invalid_syntax | Correct the address using message. |
unsupported_syntax | Use a checker that supports that address form. It is not declared invalid. |
dns_error | Read message; retry transient resolver failures later. |
spending_limit | Raise the run budget or submit fewer unique addresses. |