Disposable Email Validator — Bulk Email Checker
Pricing
$0.49 / 1,000 email validateds
Disposable Email Validator — Bulk Email Checker
Bulk email validator and disposable email checker. Syntax, MX, disposable domains, free providers, role accounts, and typo suggestions for up to 100,000 addresses. No SMTP mailbox probing.
Pricing
$0.49 / 1,000 email validateds
Rating
0.0
(0)
Developer
CleanData Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
Bulk email validator and disposable email checker for list cleaning. Check syntax, MX mail routing, disposable domains, free email providers, role accounts, and typo suggestions for up to 100,000 addresses in one run.
Use it for bulk email validation before a campaign or a signup import. It is an email verification check of the domain and the address shape. It does not open an SMTP session and does not tell you whether a specific mailbox exists.
What you get for each address
| Field | Meaning |
|---|---|
valid_syntax | Practical address syntax. Quoted local-parts and IP domains are rejected. |
has_mx | The domain publishes MX records, or it has no MX but an A/AAAA record (implicit MX). true means the domain can receive mail, not that the local part is real. |
mx / mx_hosts | Mail exchangers and priorities. |
disposable | The domain is on a disposable-email blocklist (tens of thousands of domains). |
free_provider | Consumer webmail or a major residential ISP, such as Gmail. Not a reason to block. |
role_account | Shared local part such as admin, info, or noreply. |
typo_suggestion | A popular provider one edit away, such as gmial.com → gmail.com. |
risk | low, medium, or high. |
reason | Highest-severity signal. Other flags can still be true. |
block | Silent-reject recommendation. True for unusable syntax, disposable domains, subdomains of disposable domains, and domains with no mail routing. False for free providers, role accounts, typos that still resolve, and DNS failures. |
Failed Worker calls are saved with worker_error and are not charged.
Why the results are fast
Addresses are sent in batches of 50, with several batches in flight. DNS lookups for the same domain are deduped by the checker. Default memory is 256 MB, which is enough for a 100,000-address list because results are written as they finish instead of being held in memory.
Input
| Field | Default | What to put |
|---|---|---|
| Email addresses | Prefill sample of four addresses | Up to 100,000 strings. Duplicates are kept so each row gets a result. |
| Dataset or CSV URL | Empty | CSV, JSON, JSON lines, or an Apify dataset items URL. A column or field named email is used. Otherwise the first CSV column is used. Private Apify datasets use the token of this run. |
| Concurrent batches | 8 | 1–20 batches of 50 in flight. |
| Retries per batch | 4 | Extra attempts after a timeout, HTTP 429, or HTTP 5xx, with exponential backoff. HTTP 400 and 401 are not retried. |
Inline addresses and the file are combined, in that order, and the total still cannot exceed 100,000.
Dataset URL shape:
https://api.apify.com/v2/datasets/DATASET_ID/items?format=json&clean=true&fields=email
Example input:
{"emails": ["ada@gmail.com", "a@mailinator.com", "not-an-email", "info@gmial.com"],"concurrency": 8}
Output
The default dataset has one item per address. The Overview table shows the cleaning decision. Mail routing shows MX hosts. Sort by index to restore input order. A run summary is stored as the OUTPUT record in the key-value store.
block: true is still a successful check. Only a transport or Worker failure sets worker_error.
Pricing
Pay per event. You pay for each address that comes back checked, not for platform compute, and not for addresses the Worker never returned.
| Event name | What it is | Price to set in Console |
|---|---|---|
email-validated | One address checked | $0.00049 |
apify-actor-start | Platform start event. Do not charge this from the Actor. | Leave the default $0.00005 |
10,000 addresses are $4.90. 100,000 are $49.
That price sits under bounceverify/bounceverify-email-verifier at $0.00089 per verified email. Bounceverify is a mailbox verifier. This Actor is a disposable email checker plus MX, syntax, free-provider, role, and typo signals, and it does not probe mailboxes. The lower price matches that smaller check. Copy the numbers from .actor/pay_per_event.json into the Actor's Monetization tab. The dollar amount is not hard-coded in the source.
Set the minimum run budget (minimalMaxTotalChargeUsd) to $0.001 so a run can pay for the start event and at least one address. The Actor stops cleanly when your run hits its maximum charge: the last billed address is saved, and the rest are skipped rather than written for free.
Honest limits
- No SMTP mailbox probing.
has_mx: truedoes not mean the inbox exists. Gmail, Outlook, and most large providers accept the recipient domain and then bounce or drop unknown users.mailbox_verificationon the checker is always false. - A typo suggestion is a hint. Show it even when
blockis true. A typo of a provider that still has working mail routing is not, by itself, a silent reject. - DNS failures are not treated as a block. Retry those addresses later.
- The disposable list is a snapshot of public blocklists, not a guarantee that a brand-new throwaway domain is already listed.
- One run accepts at most 100,000 addresses. Split larger files.
- A source file larger than 20 MB is refused.
Operator setup
Set these Actor environment variables only after the checker expects a shared secret. Leave both unset until then. Set both, or neither.
| Variable | Example |
|---|---|
WORKER_AUTH_HEADER | X-Origin-Secret |
WORKER_AUTH_VALUE | the shared secret |
The header is sent on every checker call and is never written to the dataset or the log.
Local run
npm installnpm testmkdir -p storage/key_value_stores/defaultprintf '%s\n' '{"emails":["ada@gmail.com","a@mailinator.com","not-an-email","info@gmial.com"]}' > storage/key_value_stores/default/INPUT.jsonnpm start
npm start sets ACTOR_TEST_PAY_PER_EVENT=1 and ACTOR_USE_CHARGING_LOG_DATASET=1. Locally, each event is priced at $1 and appended to storage/datasets/charging_log. That log is not created on the Apify platform. OUTPUT.charged_events is the number of events the run actually billed. Publish from this folder with apify push.