Bulk Email Validation API | $0.90/1K | MX + Disposable avatar

Bulk Email Validation API | $0.90/1K | MX + Disposable

Pricing

from $0.90 / 1,000 address verifieds

Go to Apify Store
Bulk Email Validation API | $0.90/1K | MX + Disposable

Bulk Email Validation API | $0.90/1K | MX + Disposable

Validate email addresses in bulk. Syntax check, MX/DNS lookup, disposable and role-account detection, typo suggestions and a deliverability score. No SMTP probing. $0.90 per 1,000 emails.

Pricing

from $0.90 / 1,000 address verifieds

Rating

0.0

(0)

Developer

Extract Kit

Extract Kit

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Email Verifier & Validator — Bulk Email Validation

Clean your email list before you send. This Actor verifies email addresses in bulk and tells you which are safe to send to, which will bounce, and which are risky — with a reason for every decision.

No API key. No SMTP setup. No account anywhere else.

What it checks

CheckWhat it catches
SyntaxMalformed addresses, per RFC 5321 length and character rules
Domain / MXDomains that cannot receive mail at all
Typo detectiongmial.com → suggests gmail.com — recovers real customers from bad data
DisposableMailinator, Guerrilla Mail, temp-mail and ~100 other throwaway providers
Role accountsinfo@, support@, sales@ — deliverable, but they hurt conversion and raise complaints
Free providersGmail, Yahoo, Outlook — valid, but not business contacts
Catch-allDomains that accept everything, where "valid" means nothing
SMTP mailbox (optional)Individual mailbox existence — see the honest note below

Why bounce rate matters

Mailchimp, SendGrid and Klaviyo suspend accounts over high bounce rates, and above ~2% your domain reputation starts costing you inbox placement on the mail that does deliver. Verifying first is cheaper than recovering a burned sending domain.

Input

Paste addresses directly:

{
"emails": ["ada@example.com", "support@gmail.com", "someone@mailinator.com", "typo@gmial.com"]
}

Or point it at a list — the right approach for anything over a few hundred:

{
"emailListUrl": "https://example.com/contacts.csv",
"csvColumn": "email"
}

A plain .txt with one address per line works too. For Google Sheets: File → Share → Publish to web → CSV.

Output

One row per input address, in a shape you can filter directly:

{
"email": "ada@example.com",
"normalized": "ada@example.com",
"canonical": "ada@example.com",
"status": "deliverable",
"score": 85,
"reason": "mx_valid",
"domain": "example.com",
"mxFound": true,
"mxHost": "mx.example.com",
"isDisposable": false,
"isRoleAccount": false,
"isFreeProvider": false,
"didYouMean": null,
"checkedAt": "2026-08-16T09:00:00.000Z"
}

Four statuses:

  • deliverable — safe to send
  • undeliverable — do not send; it will bounce
  • risky — deliverable but low quality (role account, catch-all domain, or A-record-only)
  • unknown — a check could not complete; reason says which

Filter on status, or on score >= 70 to keep deliverable and drop risky. The score is deterministic — the same address always scores the same, so your filters keep working tomorrow.

The run also writes a SUMMARY record with counts by status, so you can see your list quality at a glance.

Honest notes

These are the things most verifiers do not tell you. They are here because a wrong answer costs you more than a missing one.

SMTP checking is off by default, and that is deliberate. Outbound port 25 is blocked on Apify and virtually every cloud platform, so an SMTP probe will usually time out. Worse, Gmail and Outlook accept RCPT TO for addresses that do not exist, so a positive result there proves nothing anyway. When SMTP cannot answer, the address falls back to its DNS-level verdict and smtp.reason records why the probe failed — the score stays capped at mx_valid (85) and the reason is never smtp_verified, so a failed probe can never be mistaken for a confirmed mailbox.

What DNS-level verification can and cannot tell you. It proves the domain accepts mail. It cannot prove one specific mailbox exists. That distinction is reported honestly in reason (mx_valid means the domain is good, smtp_verified means the mailbox was confirmed) rather than being blurred into a single confident-looking "valid".

The disposable list is embedded, not fetched. That keeps the Actor from breaking when a third-party blocklist goes down, but it means isDisposable: false means "not on our list", not "definitely permanent".

Runs do not fail because an address is bad. An address that does not exist is a successful verification with a negative result. The run fails only if there is genuinely nothing to verify or DNS itself is unreachable.

De-duplication

On by default, and provider-aware: Gmail ignores dots and +tags, so a.da+news@gmail.com and ada@gmail.com are the same mailbox and are verified once. Every input row still appears in the output, so results line up with your source file row-for-row.

Pricing

Pay per verified address. You are charged only for results actually delivered to your dataset, one at a time, so your run budget cap is respected exactly.

Common uses

  • Clean a list before a Mailchimp / SendGrid / Klaviyo campaign
  • Validate signups at import time to keep junk out of the CRM
  • De-risk a purchased or scraped lead list before outreach
  • Recover mistyped addresses from signup forms via didYouMean
  • Filter role accounts out of cold outreach

Integrations

Runs on a schedule, via API, or from Make, Zapier and n8n. Results export as JSON, CSV, Excel or XML.