Bulk Email Validator - Clean Your List Before You Send avatar

Bulk Email Validator - Clean Your List Before You Send

Pricing

from $1.00 / 1,000 validated emails

Go to Apify Store
Bulk Email Validator - Clean Your List Before You Send

Bulk Email Validator - Clean Your List Before You Send

Remove invalid, dead-domain, disposable and role addresses from any email list, and get a 0-100 send-risk score with a plain-English reason for every row.

Pricing

from $1.00 / 1,000 validated emails

Rating

0.0

(0)

Developer

Alan Salomon

Alan Salomon

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Bulk Email Validator — clean your email list before you send

Paste a list, link a CSV, or chain it after a scraper. Every address comes back validated, classified and scored, so the junk is gone before it ever touches your sending domain.

This Actor removes the addresses that are provably bad and flags the ones that are risky to send to — without sending anything and without needing an API key.

What it removes and flags

CheckWhat it catches
Syntax validationMalformed addresses, typos, broken exports
Domain & MX checkDomains that don't exist or can't receive mail at all — usually the biggest slice of a scraped list
Disposable detectionTemporary and burner mailboxes
Role account detectioninfo@, sales@, support@, admin@ — deliverable, but rarely a person
Free provider detectionGmail, Outlook, Yahoo and friends, flagged so you can filter a B2B list
Mail provider identificationGoogle Workspace, Microsoft 365, and other hosts
Send-risk scoringA 0–100 score and a recommended action, with the reason spelled out

What you get per address

ColumnWhat it's for
safe_to_send_score0–100. The one number to branch on.
recommended_actionsend, send_low_volume, secondary_verification, retry_later, manual_review, suppress
recommendation_detailOne plain sentence explaining the decision
statusThe verdict: deliverable, undeliverable, risky, unknown
is_disposable, is_role_account, is_free_providerFilter your list however you like
mail_providerWho actually runs the mailbox
confidence_scoreHow sure we are of our own assessment
reason_codesExactly which signals produced the decision

Every run's dataset ships with two ready-made views. Decisions is the one you want for a clean spreadsheet — export CSV from that tab and you get eight columns in the order you actually read them. Evidence shows the signals behind each call. Exporting the unfiltered dataset gives you every column, sorted alphabetically — useful for analysis, less pleasant to read.

Be clear about what this does and does not check

It does not connect to mail servers to confirm that an individual mailbox exists. No SMTP probing, no mailbox-level verification.

That is deliberate, and it is why this is cheap and fast. What it does instead is remove everything that can be proven bad without touching a mail server — and on a typical scraped or purchased list that is a large share of the file.

Use it as the first pass. Clean here, then, if you need mailbox-level confirmation on what survives, send only the survivors to a per-email SMTP verifier. You pay the expensive per-email price on a much smaller list.

And it will never tell you a catch-all mailbox exists. Nobody can — a catch-all domain accepts every address by design, so no verifier on the market can confirm one, whatever the marketing says. Catch-all domains are reported honestly as unresolved rather than guessed at.

Honest uncertainty is the point. A validator that guesses confidently is how sending domains get burned.

What that means for your scores

Because no mailbox is contacted, an address that passes every check is reported as not disproven, not as confirmed. In practice:

What you'll seeWhat it means
suppressProvably bad — broken syntax, dead domain, or disposable. Delete these with confidence; this is the bulk of what the Actor removes.
send_low_volumePassed every check available. The domain accepts mail and nothing looks wrong. The mailbox itself was not probe-confirmed, so send carefully and watch bounces. Free mailboxes land here too — deliverable, just a weaker target on a B2B list.
manual_reviewA shared role inbox (info@, sales@), or an address we could not process. A human should decide; never treated as bad.
secondary_verificationGenuinely uncertain — the domain resolves but gave no recognisable mail host. If you need certainty, this is the shortlist to send to a per-email SMTP verifier.

Branch on recommended_action, not on the number. Without a mailbox check the confidence ceiling applies to every address, so scores cluster low by design and nothing reaches the 80s or 90s. The score is a useful ranking within a band; the action is the decision.

Input

Three ways in, and you can combine them — everything is merged and de-duplicated before validation, so you are never charged twice for the same address:

  • Paste addresses into the Email addresses field.
  • Link a CSV (published Google Sheet, S3 link, anything downloadable). The email column is detected automatically, whatever it is called.
  • Chain a dataset from a previous Actor — put its dataset ID in inputDatasetId and this runs straight after your scraper or enrichment step.

Messy input is expected and handled: display names, mailto: prefixes, BOMs, semicolon delimiters, headerless files, and any column name.

How the scoring works

Two numbers underpin the headline score, and they are deliberately separate:

  • Deliverability — will a message be accepted?
  • Confidence — how sure are we of that assessment?

safe_to_send_score combines them, then subtracts the outreach-specific risk that deliverability alone ignores: role inboxes and free mailboxes on a B2B list are perfectly deliverable and often a bad send. The score is also capped by confidence — it will never claim an address is safer to send than we are sure of our own answer.

Every score is explainable. reason_codes tells you exactly which signals produced it, so you can argue with the result instead of trusting it blindly.

One bad row never breaks your run

An address we cannot process comes back as a row marked manual_review and retryable, with the same columns as every other row — never dropped, never silently marked unsendable. Our failure is not your lead's failure, and a CSV whose shape changes halfway down breaks every formula built on it.

Typical uses

  • Clean a scraped or purchased list before it touches your sending domain.
  • Cut the cost of email verification — remove the provable junk here, pay per-email only for what survives.
  • Run it as the last step of an Apify pipeline so leads land already scored.
  • Branch in n8n, Make or Zapier on recommended_action.
  • Filter B2B lists on is_free_provider and is_role_account.

Pricing

Pay per address validated. Duplicates are removed before validation, so you are never charged twice for the same address in a run.