Bulk Email Verifier Pro
Pricing
from $1.25 / 1,000 email verifieds
Bulk Email Verifier Pro
Bulk-verify email deliverability: syntax + DNS MX/A, disposable/role/free-provider flags, and typo suggestions. Per-email verdict. No SMTP probing, no proxy. Pay only for emails we actually verify - malformed input and DNS failures are free.
Pricing
from $1.25 / 1,000 email verifieds
Rating
0.0
(0)
Developer
Virtual Footprint LLC
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
Bulk-verify email deliverability with DNS MX/A checks, disposable / role / free-provider flags, and typo suggestions — a clear per-email verdict at $0.005 per verified email (20× below the $0.10-per-result incumbent). No SMTP probing, no proxy, no residential IPs. You pay only for emails we actually verify — malformed input and DNS failures are free.
Pricing promise:
apify-actor-start$0.0001 (one-time) +email_verified$0.005 charged once per email we actually verify against DNS (deliverable,undeliverable-no-mail-server, orrisky-disposable). Malformed input, placeholder/example domains, and DNS failures are never charged — no-result = no charge. Each result row carries adnsCheckedflag so you can see exactly what was billed.
What it checks (in order, cheapest first)
- Syntax — RFC-pragmatic validation (local part bounded, ≥2-char alpha TLD). Rules ported from our published Website Contact Extractor, so the verifier is never fooled by demo/placeholder emails (
you@company.com,info@example.com) or scraped junk. - Domain MX/A via DNS — the domain must be configured to receive mail. MX is preferred, with an A-record fallback (per RFC). Lookups are cached per domain, so a list of 5,000 addresses at one company costs one DNS query, not 5,000.
- Disposable / throwaway detection — a curated static list of common disposable domains (mailinator, guerrillamail, 10minutemail, yopmail, …). No external API call.
- Role-account detection — flags shared/role mailboxes (
info@,sales@,support@,admin@,noreply@, …). B2B buyers usually filter these; most incumbents don't flag them. - Free-provider detection —
gmail.com,yahoo.com,outlook.com, … →freeProvider: true(a B2B list usually wants company domains). - Typo suggestion — obvious typos against well-known domains, e.g.
gmial.com → gmail.com, returned asdidYouMean.
What we deliberately DON'T check (and why)
- No SMTP mailbox probing. Connecting to mail servers to confirm a specific mailbox exists gets your IPs blocklisted, is slow at scale, and is unreliable under greylisting and catch-all servers. We'd rather be honest than overclaim.
- Therefore
deliverablemeans the domain is configured to receive mail (MX or A record) — it does NOT guarantee the specific mailbox exists.riskyflags disposable domains (they accept mail but are low-value/junk).unknownmeans the DNS check couldn't complete (transient error) and you are not charged.
If you need per-mailbox SMTP confirmation, pair this actor with an SMTP-probing service downstream — but most deliverability screening and list-hygiene jobs only need what we provide, at 20× the value.
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
emails | array | yes | — | Emails to verify. Bare addresses or Display Name <a@b.com> envelopes. Messy input (whitespace, mixed case, blanks, duplicates) is handled. |
skipDisposable | boolean | no | false | If true, disposable addresses are dropped from the output. Default false keeps them with a risky verdict + disposable: true so you can see what was filtered. |
concurrency | integer | no | 10 | Parallel emails (1–25). DNS is cached per domain. |
{"emails": ["team@stripe.com","notrealperson@thisdomaindoesnotexistxyz.com","joe@mailinator.com","info@example.com","Jane <jane.doe@gmail.com>"],"skipDisposable": false,"concurrency": 10}
Output
One row per input email (or per malformed entry). Duplicates are deduped case-insensitively.
| Field | Type | Description |
|---|---|---|
email | string | The normalized address (lowercased). For malformed input, the original raw string. |
valid | bool|null | true = domain accepts mail; false = undeliverable (bad syntax or no mail server); null = unknown (DNS check failed). |
status | string | deliverable | undeliverable | risky | unknown. |
reason | string | Human-readable, always populated. |
domain | string|null | The email domain. |
hasMx | bool|null | true if an MX record exists. null if the DNS check failed. |
mxHost | string|null | Highest-priority MX exchange host, or null if no MX record (even when an A-record fallback makes the domain deliverable). |
disposable | bool | true if the domain is a known throwaway provider. |
role | bool | true if the local part is a shared/role mailbox. |
freeProvider | bool | true if the domain is a free consumer provider (gmail/yahoo/outlook/…). |
didYouMean | string|null | Suggested domain for an obvious typo (e.g. gmail.com), or null. |
dnsChecked | bool | true if the verdict came from a live DNS check (this is what you're billed for). false for malformed/placeholder rows that were rejected before DNS — never charged. |
checkedAt | string (ISO) | UTC timestamp of the check. |
Live-run sample
Real output from a run on Apify (build latest). checkedAt omitted for brevity; every other field is verbatim from the dataset.
[{"email": "team@stripe.com", "valid": true, "status": "deliverable", "reason": "domain is configured to receive mail (MX or A record)", "domain": "stripe.com", "hasMx": true, "mxHost": "alt2.aspmx.l.google.com", "disposable": false, "role": true, "freeProvider": false, "didYouMean": null, "dnsChecked": true},{"email": "jane.doe@gmail.com", "valid": true, "status": "deliverable", "reason": "domain is configured to receive mail (MX or A record)", "domain": "gmail.com", "hasMx": true, "mxHost": "alt2.gmail-smtp-in.l.google.com", "disposable": false, "role": false, "freeProvider": true, "didYouMean": null, "dnsChecked": true},{"email": "notrealperson@thisdomaindoesnotexistxyz.com", "valid": false, "status": "undeliverable", "reason": "domain has no mail server (no MX/A record)", "domain": "thisdomaindoesnotexistxyz.com", "hasMx": false, "mxHost": null, "disposable": false, "role": false, "freeProvider": false, "didYouMean": null, "dnsChecked": true},{"email": "joe@mailinator.com", "valid": true, "status": "risky", "reason": "disposable/throwaway domain (accepts mail but junk)", "domain": "mailinator.com", "hasMx": true, "mxHost": "mail.mailinator.com", "disposable": true, "role": false, "freeProvider": false, "didYouMean": null, "dnsChecked": true},{"email": "info@anthropic.com", "valid": true, "status": "deliverable", "reason": "domain is configured to receive mail (MX or A record)", "domain": "anthropic.com","hasMx": true, "mxHost": "alt3.aspmx.l.google.com", "disposable": false, "role": true, "freeProvider": false, "didYouMean": null, "dnsChecked": true},{"email": "team@gmial.com", "valid": true, "status": "deliverable", "reason": "domain is configured to receive mail (MX or A record)", "domain": "gmial.com", "hasMx": true, "mxHost": "mail.gmial.com", "disposable": false, "role": true, "freeProvider": false, "didYouMean": "gmail.com", "dnsChecked": true},{"email": "plainjunk", "valid": false, "status": "undeliverable", "reason": "malformed", "domain": null, "hasMx": false, "mxHost": null, "disposable": false, "role": false, "freeProvider": false, "didYouMean": null, "dnsChecked": false},{"email": "info@example.com", "valid": false, "status": "undeliverable", "reason": "placeholder/example domain", "domain": "example.com", "hasMx": false, "mxHost": null, "disposable": false, "role": false, "freeProvider": false, "didYouMean": null, "dnsChecked": false}]
Charge audit for this run: 6 email_verified charges (the six dnsChecked: true rows) + 1 apify-actor-start. The two dnsChecked: false rows (malformed plainjunk, placeholder info@example.com) are not charged — exactly as promised. (mxHost values reflect Google's rotating MX hosts at run time; gmial.com is a real registered domain that accepts mail, so it's correctly deliverable and flagged didYouMean: gmail.com.)
Pricing vs. the market
| Per-result price | Charges on errors? | Role flag | Disposable flag | Typo suggestion | |
|---|---|---|---|---|---|
| Bulk Email Verifier Pro | $0.005 | No (malformed/DNS-fail free) | ✅ | ✅ | ✅ |
michael.g/email-verifier-validator (incumbent, 1,250+ users) | $0.10 | varies | — | — | — |
We charge ~20× less per verified email, and we don't charge you for input we couldn't verify. That price transparency is the differentiator — the same deliverability screening for list-hygiene and B2B lead cleanup, at a fraction of the cost.
Troubleshooting
- A real company address shows
unknown— a transient DNS failure (resolver timeout). Re-run; DNS is generally stable and the cached-per-domain design keeps retries cheap. deliverablebut the address still bounces — we verify the domain accepts mail, not the specific mailbox (we don't SMTP-probe by design). Userole/freeProvider/disposableto triage quality before sending.- An address you expected is missing from the output — you set
skipDisposable: trueand it was a throwaway domain, or it was an exact duplicate of an earlier address (deduped). SetskipDisposable: falseto see everything. didYouMeanisnullfor an obvious typo — we only suggest against well-known domains to avoid proposing junk. For niche domain typos, no suggestion is returned.- Large lists at one company are slow / fast? — DNS is cached per domain, so 5,000 addresses at one company is one lookup; raise
concurrencytoward 25 for big, diverse lists.
Notes
- No API keys, no proxy, no residential IPs. The only network hop is standard DNS (UDP). Margin-positive from the first email.
- Disposable-domain list is a curated static set (not exhaustive) — we update it periodically; it intentionally errs toward the common throwaway providers.