Email Domain Checker (MX, SPF, DMARC)
Pricing
from $0.80 / 1,000 email checkeds
Email Domain Checker (MX, SPF, DMARC)
Check email addresses or domains for syntax, MX, SPF, DMARC, disposable and role flags. Does not connect to mail servers or confirm mailboxes.
Pricing
from $0.80 / 1,000 email checkeds
Rating
0.0
(0)
Developer
myuon
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Email Domain Check
Check a list of email addresses or bare domains for syntax problems and DNS-level deliverability signals, before you send anything. One result row per entry.
This Actor checks syntax and DNS records only. It never connects to any mail server (no SMTP, no RCPT probing, no catch-all testing). It cannot tell you whether a particular mailbox exists. A likely_ok verdict means the address is well-formed and its domain is set up to receive mail, nothing more.
Who it is for
- People who clean a lead list or a signup list before sending, to drop typos, dead domains and domains that explicitly accept no mail.
- People who care about deliverability hygiene: spotting disposable domains and role addresses, and seeing whether a domain publishes SPF and DMARC.
It does not enrich people, find or guess addresses, or return any information about the person behind an address.
What each row contains
| Field | Meaning |
|---|---|
input | The entry exactly as you gave it (trimmed of surrounding spaces) |
domain | Lower-case ASCII domain; internationalised domains are shown in punycode (xn--...) |
syntaxValid, syntaxError | Whether it parses as an address or domain, and why not |
mxStatus | present, implicit_a, null_mx, none, nxdomain, unknown, or not_checked (invalid syntax) |
mxPresent, mxRecords, nullMx | MX presence, the MX list sorted by priority, and whether the domain publishes a Null MX |
spfPresent, spfRecord | Whether a v=spf1 TXT record exists, and its text |
dmarcPresent, dmarcPolicy | Whether _dmarc.<domain> has a v=DMARC1 record, and its p= value (none, quarantine, reject) |
disposable | Domain, or a parent domain, is on the bundled disposable-domain list |
roleAddress | Local part is a role mailbox such as info, sales, support, noreply (null for bare domains) |
freeProvider | Domain is a well-known consumer mailbox provider (a built-in list that is not exhaustive) |
verdict, reasons | likely_ok, risky, invalid or unknown, with machine-readable reasons |
Verdicts
invalid: bad syntax, the domain does not exist, the domain publishes a Null MX (RFC 7505, it states it accepts no mail), or it has neither MX nor address records.risky: usable on paper, but disposable domain, role address, non-ASCII local part (needs SMTPUTF8), or no MX record and mail would fall back to the domain's A/AAAA record.likely_ok: valid syntax, the domain has MX records, and none of the risk flags apply.unknown: DNS timed out or the resolver failed (SERVFAIL etc.) after retries. This is not a statement that the address is bad. Unknown rows are delivered but not charged; run them again later.
Missing SPF or DMARC does not change the verdict; the fields are informational. DMARC is looked up at _dmarc.<exact domain> only; policy inherited from a parent domain is not followed.
MX fallback (RFC 5321 section 5.1)
If a domain has no MX record but does have an A or AAAA record, mail servers deliver to that address as an implicit MX. Such a domain gets mxStatus: "implicit_a" and verdict risky (reason no_mx_uses_address_record_fallback), not invalid.
Syntax rules
Dot-atom local parts up to 64 bytes, plus signs allowed (name+tag@example.com), non-ASCII local parts allowed and flagged, internationalised domains converted to punycode. Quoted local parts ("a b"@example.com), display names (Name <a@b.com>) and IP-literal domains (a@[1.2.3.4]) are reported as invalid. A bare domain (no @) is accepted and checked as a domain.
Input
| Field | Meaning | Default |
|---|---|---|
emails | Addresses or bare domains, one per entry. Up to 50,000 per run; a longer list is rejected before anything is processed | required |
dedupe | Skip entries identical to an earlier one | on |
Duplicates
With dedupe on, an entry that matches an earlier one after trimming and lower-casing produces no row and is not charged; the number skipped is in the run summary. Different addresses on the same domain are never merged: each gets its own row, and they share a single DNS lookup (results are cached by domain within the run). Blank entries are always skipped. With dedupe off, every non-blank entry gets a row and is charged.
Pricing
Pay per event: email-checked, suggested $0.0008 per row, charged once per row delivered to the dataset. See .actor/pay_per_event.json.
- Rows for syntactically invalid entries are delivered and are charged.
- Rows with verdict
unknown(DNS timeout or failure) are delivered but not charged. - Skipped duplicates, blank lines and entries not processed are not charged.
- The Actor respects your maximum charge per run. When the next row would exceed it, the run stops cleanly, and the status message and the
SUMMARYrecord in the key-value store say how many entries were not processed. Rows already delivered stay in the dataset.
The price is set in Apify Console, so check the Actor's pricing tab for the current value.
Limits
- 50,000 entries per run.
- Only DNS is queried, with a per-query timeout and up to two retries. A resolver that is slow or rate-limited for a particular domain gives
unknownfor that domain only. - The disposable list is a snapshot (see below) and the free-provider and role lists are short built-in lists. None of them is complete.
- The default test input uses
iana.organdicann.org(which publish MX records) and twoexample.com/example.orgaddresses (reserved domains that publish a Null MX, so they come backinvalid). Every entry yields a row, so the dataset is never empty.
Privacy
Your list stays in your own run storage (dataset and key-value store). Local parts are used in memory for the syntax and role checks and appear only in your own dataset rows. Logs contain counts only, never addresses or local parts. The only network traffic is DNS queries for the domains in your list; the domain names are visible to the DNS resolver, as with any DNS lookup. No mail server is contacted and no email is sent.
Your responsibility
You are responsible for complying with the email and privacy laws that apply to you, for example Japan's Act on Regulation of Transmission of Specified Electronic Mail (特定電子メール法), the US CAN-SPAM Act, and the EU GDPR. This tool is not for sending, or enabling the sending of, unsolicited mail. A result from this Actor is not consent, and does not make a list lawful to use.
Data sources
- Disposable domains: the community list at https://github.com/disposable-email-domains/disposable-email-domains (CC0 1.0), obtained through the npm package
disposable-email-domains-js1.26.0 (published 2026-09-21), vendored indata/disposable-domains.json. Licence and provenance are indata/.