How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
[email protected]in Emails. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Bulk Email List Validator takes a CSV file, a Google Sheet link or a pasted list of email addresses, removes duplicates, checks every address and gives you back a clean CSV with your original columns. Each address gets a status (deliverable, risky, undeliverable or unknown) and a reason, based on syntax, DNS mail records, disposable domains, role addresses and domain typos. No login and no API key.
- Reads your list: a CSV file you upload, a public CSV link, a Google Sheets share link, or addresses you paste. It finds the email column by its name or by its content.
- Removes duplicate addresses (upper and lower case count as the same address).
- Checks each address:
- Syntax by the email standards.
[email protected]fails because of the two dots. - Domain mail records (DNS): MX records, a "null MX" record that says the domain takes no mail (RFC 7505), and the A/AAAA fallback when a domain has no MX.
- Disposable domains (temporary inboxes like mailinator.com), role addresses (info@, sales@, support@…) and free providers (gmail.com, outlook.com…).
- Typos in popular domains:
[email protected]→ suggestion[email protected]. - Writes one Dataset row per address and three files:
CLEAN_LIST.csv(only the rows you can send to),ALL_RESULTS.csvandRUN_SUMMARY(how clean your list is).
Good for
- Clean a CSV export from Mailchimp, HubSpot, Excel or a CRM before the next send.
- Find and remove fake, mistyped, disposable and role addresses from a sign-up list.
- Get a quick "how dirty is this list" report: percent of bad addresses and the main reasons.
Not a good fit
- No mailbox check (SMTP). The Actor does not connect to the mail server, so it cannot tell if a mailbox exists on a working domain. A made-up
[email protected]isdeliverablehere. It also does not detect catch-all domains. - It does not find new email addresses. It only checks the ones you give.
- Up to 25,000 unique addresses and a 10 MB CSV file per run.
Who uses it
Email marketers
Clean a Mailchimp or HubSpot export before the next send.
Founders and small teams
Remove fake and mistyped addresses from sign-up lists.
List buyers
See how many bad addresses a list has before you use it.
Price
Prices will be shown after release.
Questions
Does it check if a mailbox really exists?
No. It does not connect to mail servers. It removes clearly bad addresses.
Can I use a Google Sheet?
Yes. Paste a Google Sheets share link or a public CSV link.
Is my list sent to another company?
No. It uses public DNS and built-in lists. Results stay in your Apify storage.
Should I delete risky addresses?
Not always. Role addresses like info@ often work. Typos and temporary inboxes are usually bad.
Do I need an account with an email verification service?
No. The Actor uses public DNS and built-in lists. No API key, no login. Your list is not sent to a third-party verification service.
Why is a fake gmail.com address "deliverable"?
Because the Actor does not ask the mail server if the mailbox exists (outgoing SMTP port 25 is closed on the platform). gmail.com has working mail servers, so the address passes. Use this Actor to remove clearly bad addresses before a mailbox check, not instead of it.
Should I remove every risky address?
Not always. Role addresses like info@ often work, but many senders avoid them in cold email. Disposable and typo addresses are usually not worth sending to. Choose deliverable_and_risky if you want to keep risky rows in the clean list and decide yourself.
Is my list stored?
The results stay in your own Apify storage. RUN_SUMMARY and the run log contain counts only, not addresses. Uploaded files are kept as your Apify storage keeps them.
Details
Step by step on Apify
- Open the Input tab.
- Keep the example addresses in Emails (
emails), paste your own, or upload a file in CSV file (csvUrl). - Keep Remove duplicates (
dedupe) on and Clean list keeps (cleanList) atdeliverable. - Click Start. Two addresses take a few seconds.
- Open the Output tab. Check the
statusandreasoncolumns, then downloadCLEAN_LIST.csvfrom the storage tab.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Clean a CRM or ESP export | csvUrl (upload) | CLEAN_LIST.csv | your columns + email_status, email_reason | import the file back into your email tool |
| Check a shared Google Sheet | csvUrl (share link) | Dataset + ALL_RESULTS.csv | status, reason, didYouMean | fix typos in the sheet |
| Check a few pasted addresses | emails | Dataset | status, reason, role, disposable | decide who to email |
| Measure list quality | any | RUN_SUMMARY | percent, byReason, listHealth | decide if the list is safe to send |
Tips for better results
- Leave the email column empty. The tool finds it by name or content.
- Keep duplicate removal on. Duplicates are not charged.
- Split lists over 25,000 addresses into several runs.
Limits and good to know
unknownrows (DNS failed) are not charged- Duplicates removed by
dedupeare not charged - A CSV of 1 MB or less has no file fee. A 25,000-row file with one email column is about 0.8 MB
- A run that fails on input pays the start fee, plus the CSV megabytes if a large file was downloaded
- 25,000 unique addresses per run (25,000 took about 5 minutes in our tests). Split bigger lists into several runs
- CSV file up to 10 MB
- CSV links:
httporhttpsonly, public addresses only, ports 80, 443, 8080, 8443
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"email": "[email protected]",
"status": "risky",
"reason": "role_account",
"reasons": ["role_account", "mailbox_not_verified"],
"mx": "aspmx.l.google.com",
"mxProvider": "Google",
"disposable": false,
"role": true,
"freeProvider": false,
"didYouMean": null,
"inCleanList": false,
"source": "emails",
"sourceRow": 1,
"checkedAt": "2026-10-15T17:37:39.844Z"
}Data fields (14)
| Field | Type | Meaning |
|---|---|---|
email | string | The address as found in your list (trimmed). |
status | string | deliverable: valid syntax and a working mail domain, no risk flags. risky: the domain accepts mail but there is a risk flag. undeliverable: invalid syntax or the domain cannot receive mail. unknown: DNS failed; not charged. The mailbox itself is not probed. |
reason | string | Main reason code: mx_found, invalid_syntax, domain_not_found, null_mx_domain_accepts_no_mail, no_mail_server, mx_host_unresolvable, dns_lookup_failed, disposable_domain, possible_domain_typo, role_account, no_mx_a_record_fallback. |
reasons | array | All reason codes. mailbox_not_verified is added to deliverable and risky rows because no SMTP probe is made. |
mx | string | Highest-priority MX host of the domain, or null. |
mxProvider | string | Mail provider recognised from the MX host (Google, Microsoft, …). |
disposable | boolean | The domain is a known disposable (temporary) email service. |
role | boolean | The local part is a role/team inbox such as info@, sales@, support@. |
freeProvider | boolean | The domain is a free webmail provider (gmail.com, yahoo.com, …). |
didYouMean | string | Suggested fix for a likely domain typo (gmial.com → gmail.com). |
inCleanList | boolean | The row is in CLEAN_LIST.csv. |
source | string | Where the address came from. |
sourceRow | integer | Data row number in your CSV (header not counted), or the position in the pasted list. |
checkedAt | string | ISO time of the check. |
Input settings (6)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Emails | emails | array | ["[email protected]", "[email protected]"] |
| CSV file | csvUrl | string | |
| Email column | emailColumn | string | |
| Remove duplicates | dedupe | boolean | true |
| Clean list keeps | cleanList | string | "deliverable" |
| Parallel checks | concurrency | integer | 20 |
Use cases with this tool
Each guide shows all the steps and the other tools.