Email Syntax, MX & Disposable Check
Pricing
$0.50 / 1,000 email checkeds
Email Syntax, MX & Disposable Check
Email validator for addresses you supply. Export syntax, DNS mail-routing, disposable-domain and role-account checks as JSON with errors. Does not verify individual mailbox existence.
Pricing
$0.50 / 1,000 email checkeds
Rating
0.0
(0)
Developer
Grit
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
Email validator API returns syntax, DNS mail-routing, disposable-domain, and role-account checks for supplied addresses. Email validation scraper rows include evidence and errors without claiming that an individual mailbox exists.
Supply addresses you already have permission to process. This actor checks your input; it does not discover or harvest addresses. It uses the local syntax parser, a bundled open list and public DNS. No SMTP session, verification email, login, third-party verification API or API key is used for the checks.
What it returns
| Field | Type | Example value |
|---|---|---|
inputIndex | integer | 0 |
input | string | "person@gmail.com" |
normalizedEmail | string | "person@gmail.com" |
domain | string | "gmail.com" |
syntaxValid | boolean | true |
domainLiteral | boolean | false |
status | string | "domain_routable" |
isDisposable | boolean | false |
disposableDomain | string | "mailinator.com" |
isRoleAccount | boolean | false |
mailboxExists | null | null |
smtpProbed | boolean | false |
billable | boolean | true |
checkedAt | string | "2026-10-05T13:02:32.704643+00:00" |
mxRecords | array | [{"priority": 1, "exchange": "mail.mailinator.com"}, {"priority": 1, "exchange": "mail2.mailinator.com"}] |
aRecords | array | ["142.251.27.17", "142.251.27.18", "142.251.27.19", "142.251.27.83"] |
aaaaRecords | array | ["2a00:1450:4025:1807::11", "2a00:1450:4025:1807::12", "2a00:1450:4025:1807::13", "2a00:1450:4025:1807::53"] |
hasMx | boolean | true |
nullMx | boolean | false |
mailDomainRoutable | boolean | true |
dnsStatus | string | "mx" |
errors | array | [] |
Input example
{"emails": ["person@gmail.com"],"maxItems": 10}
Use the input schema for the remaining filters and defaults.
Output example
This is a selected-field excerpt of the first object in sample_output.json.
{"inputIndex": 0,"input": "person@gmail.com","normalizedEmail": "person@gmail.com","domain": "gmail.com","syntaxValid": true,"domainLiteral": false,"status": "domain_routable","isDisposable": false,"disposableDomain": null,"isRoleAccount": false,"mailboxExists": null,"smtpProbed": false,"billable": true,"checkedAt": "2026-10-05T13:02:32.704643+00:00"}
Pricing
Proposed event: email at $0.0005, or $0.50 per 1,000 billable rows. A completed invalid-syntax string is a billable verdict; non-string inputs, item failures and indeterminate DNS/literal rows are free. Duplicates can be billable twice. No result beyond maxItems is emitted or charged. Event charges stop at the Apify event ceiling.
The observed Store leader's lowest event tier was $0.00065. See PRICING.md for the dated API response, tier prices, comparison scope and publisher configuration. These are proposed event fees; publication and platform-usage settings remain the owner's work.
Syntax and routing limits
The syntax check accepts bare RFC 5321 mailboxes, using RFC 5322 ASCII dot-atom or quoted-string local parts (including escaped quotes and an @ inside quotes), DNS hostnames/IDNA domains and IPv4/IPv6 literals. Local parts are limited to 64 ASCII octets; normalized addresses to 254 octets. Domain labels follow hostname rules.
Display names such as Name <address@example.com>, comments, obsolete header forms, folded/control characters and international Unicode local parts (SMTPUTF8/EAI) are outside this supported mailbox syntax. A single-label hostname can be syntactically accepted but usually lacks public routing. Valid address literals retain syntax validity and return a free, unknown domain-routing verdict; no host connection is made.
MX evidence only indicates domain routing. A/AAAA fallback applies when MX has no answer, including IPv6-only domains. A valid null MX overrides A/AAAA; malformed/mixed null MX stays unknown. MX query failures do not trigger an optimistic A fallback. MX targets are not contacted and their mailbox policy is not tested.
The list is a 9205-domain snapshot from disposable-email-domains, commit 1aac72a07cd89792016dd5d2056bc418d85b8f14, bundled under CC0-1.0 with its data/LICENSE.disposable-email-domains.txt and data/SOURCE.json. Parent matches respect dot boundaries. Lists can have stale entries, omissions and false positives; role flags are heuristics.
FAQ
What limits the output? The maxItems input caps output rows; its schema maximum is 100,000. Source availability and errors may yield fewer rows.
Does it need a proxy, login, or API key? The actor checks supplied addresses using local syntax rules and DNS. It does not log in, use a proxy input, or probe SMTP mailboxes.
How is it priced? PRICING.md proposes $0.0005 per delivered row with a completed syntax or determinate routing verdict. Unknown and item-error rows do not trigger that event.
What happens on rate limits? DNS requests use bounded retries for temporary failures. DNS failures can leave routing status unknown.
How fresh is the data? DNS evidence is checked during the run and may be cached within it; checkedAt is the row time. Routing can change later.
Does domain_routable mean a mailbox exists? No. It describes mail-routing DNS evidence, not mailbox existence or delivery.
Use with AI agents / MCP
An AI agent can call a published actor through the Apify MCP server or Apify API, pass the JSON input, then read the run’s default dataset. Check the actor’s published identifier and permissions in your Apify account.
After the owner publishes this actor, add its published actor identifier to your Apify MCP server or invoke it from your existing Apify client. Pass the input object above, then read the default dataset using the actor output's dataset link. MCP means the interface through which an agent invokes tools; here its tool input is the email array and its result is the dataset. Do not use domain_routable as a mailbox-existence answer. A deployed MCP integration has not been tested here.
Local development
From this actor directory, use the existing project interpreter. Put the input JSON in storage/key_value_stores/default/INPUT.json and run in PowerShell:
$env:APIFY_LOCAL_STORAGE_DIR = "$PWD/storage"C:/GritWork/earn/.venv/Scripts/python -m srcC:/GritWork/earn/.venv/Scripts/python -m pytest tests -q -p no:cacheproviderC:/GritWork/earn/.venv/Scripts/python -m pytest tests -m live -q -p no:cacheproviderapify validate-schema
The saved output is in storage/datasets/default/; run summary is the default key-value-store record SUMMARY. Local charging does not activate the proposed Store price. Test dependencies already exist in the specified environment; no package installation into it is required. Container runtime dependencies are in requirements.txt. The Dockerfile uses apify/actor-python:3.12; Docker/cloud execution remains unverified.