Bulk Email Verifier Pro avatar

Bulk Email Verifier Pro

Pricing

from $1.25 / 1,000 email verifieds

Go to Apify Store
Bulk Email Verifier Pro

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

Virtual Footprint LLC

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

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, or risky-disposable). Malformed input, placeholder/example domains, and DNS failures are never charged — no-result = no charge. Each result row carries a dnsChecked flag so you can see exactly what was billed.

What it checks (in order, cheapest first)

  1. 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.
  2. 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.
  3. Disposable / throwaway detection — a curated static list of common disposable domains (mailinator, guerrillamail, 10minutemail, yopmail, …). No external API call.
  4. Role-account detection — flags shared/role mailboxes (info@, sales@, support@, admin@, noreply@, …). B2B buyers usually filter these; most incumbents don't flag them.
  5. Free-provider detectiongmail.com, yahoo.com, outlook.com, … → freeProvider: true (a B2B list usually wants company domains).
  6. Typo suggestion — obvious typos against well-known domains, e.g. gmial.com → gmail.com, returned as didYouMean.

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 deliverable means the domain is configured to receive mail (MX or A record) — it does NOT guarantee the specific mailbox exists. risky flags disposable domains (they accept mail but are low-value/junk). unknown means 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

FieldTypeRequiredDefaultDescription
emailsarrayyesEmails to verify. Bare addresses or Display Name <a@b.com> envelopes. Messy input (whitespace, mixed case, blanks, duplicates) is handled.
skipDisposablebooleannofalseIf 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.
concurrencyintegerno10Parallel 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.

FieldTypeDescription
emailstringThe normalized address (lowercased). For malformed input, the original raw string.
validbool|nulltrue = domain accepts mail; false = undeliverable (bad syntax or no mail server); null = unknown (DNS check failed).
statusstringdeliverable | undeliverable | risky | unknown.
reasonstringHuman-readable, always populated.
domainstring|nullThe email domain.
hasMxbool|nulltrue if an MX record exists. null if the DNS check failed.
mxHoststring|nullHighest-priority MX exchange host, or null if no MX record (even when an A-record fallback makes the domain deliverable).
disposablebooltrue if the domain is a known throwaway provider.
rolebooltrue if the local part is a shared/role mailbox.
freeProviderbooltrue if the domain is a free consumer provider (gmail/yahoo/outlook/…).
didYouMeanstring|nullSuggested domain for an obvious typo (e.g. gmail.com), or null.
dnsCheckedbooltrue 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.
checkedAtstring (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 priceCharges on errors?Role flagDisposable flagTypo suggestion
Bulk Email Verifier Pro$0.005No (malformed/DNS-fail free)
michael.g/email-verifier-validator (incumbent, 1,250+ users)$0.10varies

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.
  • deliverable but the address still bounces — we verify the domain accepts mail, not the specific mailbox (we don't SMTP-probe by design). Use role / freeProvider / disposable to triage quality before sending.
  • An address you expected is missing from the output — you set skipDisposable: true and it was a throwaway domain, or it was an exact duplicate of an earlier address (deduped). Set skipDisposable: false to see everything.
  • didYouMean is null for 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 concurrency toward 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.