Bulk Email List Cleaner API - Dedupe, Verify, Score
Pricing
from $1.00 / 1,000 email verified (with mailbox check)s
Bulk Email List Cleaner API - Dedupe, Verify, Score
Clean an email list before you import it: duplicates collapsed (Gmail dots and +tags too), syntax and MX checked, disposable and role addresses flagged, typos suggested, mailboxes verified where the server answers.
Pricing
from $1.00 / 1,000 email verified (with mailbox check)s
Rating
0.0
(0)
Developer
Blackcube
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
| Contact Validation Suite • 5 Actors, one codebase, one check billed once | ||
| Email Verifier & Validator API MX, Disposable, Role, Phone | Bulk Email List Cleaner API ➤ You are here | Disposable Email Checker API Throwaway, Role, Free-Mail Flags |
| Phone Number Validator API Valid, Type, Country, E.164 | MX Record Checker API Does This Domain Accept Mail? | |
More from this account: YouTube Transcript Suite · Website Contact & Email Suite · Career Site & ATS Jobs Suite · Google News Suite · Keyword Research Suite · Shopify Store Intelligence Suite · eBay Data Suite · Amazon Reviews Suite · Reddit · Meta Ad Library · Vinted · Trustpilot Review Intelligence Suite · App Store & Google Play Reviews Suite · Etsy Research Suite · YouTube Comments Intelligence Suite · Telegram Channel Intelligence Suite · Business Reviews Suite · Google Trends Suite · Amazon Product Data Suite · Polymarket Order Book · Nordic Marketplaces Suite · Google Sheets Suite · TikTok Suite · Snapchat Suite · LinkedIn Public Data Suite · Instagram Suite · Google Maps Suite · X / Twitter
The contact validation suite
- Email Verifier & Validator API — emails and phone numbers verified in one run, priced by what could be checked
- Disposable Email Checker API — the fast, cheap check: throwaway providers, role addresses, free mail, typos, MX
- Phone Number Validator API — numbers in any format in, validity, line type, country and E.164 out
- MX Record Checker API — domains in, mail hosts in priority order and an accepts-mail flag out
Paste a whole email list and get it back deduplicated, checked and scored: syntax, domain mail records, disposable and role flags, free-mail flags, typo suggestions and a 0–100 score you can filter on. Pure computation — nothing is scraped, nothing is sent, no proxy, no API key. Invalid input is free, and you pay less when less could be checked.
Quick start
- Press Start — the defaults are a working run that shows every verdict.
- Replace them with your own addresses, one per line — or objects from your CRM under Records.
- Take the dataset as JSON, CSV or Excel, or via the API. Every row has a
type; the freecoveragerow says what was asked for, what arrived, and whether mailbox checks were possible from this network.
What people use it for
- Clean a list before you import it. Drop the invalid, the disposable and the dead domains; keep the score so you can decide where to draw the line.
- Protect your sender reputation. A bounce rate above a few percent gets a domain throttled; verifying first is cheaper than warming a domain back up.
- Feeding an AI agent or workflow. Send objects from n8n, Make or a sheet as
records; the email or phone field is found by name and every other field comes back on the row aspassthrough.
What the rows look like
An email row
{"type": "email","input": "John.Doe+newsletter@Gmail.com","email": "John.Doe+newsletter@gmail.com","normalized": "johndoe@gmail.com","domain": "gmail.com","verdict": "deliverable","score": 95,"reasons": ["free-mail-provider"],"checks": { "syntax": true, "mx": true, "disposable": true, "role": true, "freeMail": true, "smtp": true },"hasMx": true,"mxHosts": ["gmail-smtp-in.l.google.com", "alt1.gmail-smtp-in.l.google.com"],"isDisposable": false,"isRole": false,"isFreeMail": true,"didYouMean": null,"smtp": { "status": "deliverable", "code": 250, "message": "2.1.5 OK", "host": "gmail-smtp-in.l.google.com" },"passthrough": { "crmId": "c_1842" }}
verdict is one of deliverable, undeliverable, risky (disposable, role or catch-all) and unknown (the server gave no answer). checks says exactly which checks ran, and the price follows it. normalized is the inbox with Gmail dots and +tags removed — what duplicates are collapsed on. didYouMean suggests a provider when the domain has no mail records and is one or two letters from a big one.
What it costs
| You pay for | Price |
|---|---|
| Each address verified with a mailbox answer (deliverable, undeliverable or catch-all) | $1.00 per 1,000 addresses |
| Each address checked without a mailbox answer (mailbox check off, or the server did not answer) | $0.40 per 1,000 addresses |
Free, always: an input that is not an email, a phone number or a domain at all, a duplicate of something already in the run (one inbox spelled three ways is one charge), every input the run did not reach, every error row, the coverage row and the run summary. A run that checks nothing costs nothing.
You pay less when less could be checked. The verified price is charged only when a mail server actually answered about the mailbox. On Apify's network that connection is not currently possible (outbound port 25 is closed — measured 2026-09-02), so every address is billed at the checked price and smtp.status says blocked. Syntax, MX, disposable, role, free-mail, typo and score are all delivered regardless.
Set Cost ceiling (USD) to stop any run before it passes a number you choose; the free summary row reports what the run actually spent.
Limits, stated plainly
Mailbox checks do not run on Apify today. The code can ask a domain's mail server whether a mailbox exists, but Apify's network closes outbound port 25 (measured 2026-09-02), so smtp.status is blocked on every row, the verdict is unknown or risky from the other checks, and you are billed the lower checked price. If that changes, the verified rows and price switch on automatically.
Where a mailbox check can run, some servers still refuse to answer: catch-all domains accept everything, greylisting servers say "try later", and a few big providers rate-limit unknown connections. Those rows are risky or unknown with the reason stated, never a guess dressed as a verdict. A verified "deliverable" is the server's word at that moment, not a guarantee the mailbox is read.
Nothing here contacts WhatsApp, Telegram or any messaging service — those checks need an unofficial client and are not sold.
Use it from n8n, MCP, the API or a schedule
Built to be called by a workflow, not only from the Store form. The Actor is vonsensey/bulk-email-list-cleaner-api; every snippet below sends {}, which runs the defaults shown on the form — replace it with your own input.
n8n
Install the Apify community node (@apify/n8n-nodes-apify under Settings → Community Nodes, or search "Apify" on n8n Cloud). Add Apify → Run Actor with Actor vonsensey/bulk-email-list-cleaner-api and your input JSON, then Apify → Get Dataset Items on the run's defaultDatasetId and pipe the rows anywhere. For scheduled runs, the On new Apify Event trigger fires when a run of this Actor finishes.
MCP (Claude, Cursor, VS Code, any MCP client)
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=vonsensey/bulk-email-list-cleaner-api","headers": {"Authorization": "Bearer <YOUR_APIFY_TOKEN>"}}}}
Your agent then calls vonsensey/bulk-email-list-cleaner-api as a tool with the same input the form takes and reads the dataset back.
REST API (one call, rows in the response)
curl -X POST "https://api.apify.com/v2/acts/vonsensey~bulk-email-list-cleaner-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" -d '{}'
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("vonsensey/bulk-email-list-cleaner-api").call(run_input={})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('vonsensey/bulk-email-list-cleaner-api').call({});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Make, Zapier, LangChain, CrewAI
The Apify app in Make and Zapier has a Run an Actor module: pick vonsensey/bulk-email-list-cleaner-api. In LangChain and CrewAI the Apify tool wrappers take the same Actor id. A daily schedule needs nothing but the Console: Schedules → Create → this Actor → cron, and the dataset fills on its own.
Run it without configuring anything — Clean and deduplicate an email list, a ready-made example you can start as-is or copy.
Use cases
- Clean a list before you send to it. Syntax, the domain's mail records, disposable-provider and role-address detection, a free-mail flag, a typo suggestion and a score — with the list deduplicated on the normalised address, so Gmail dots and
+tagscollapse to one inbox and one charge. - Normalise phone numbers from anywhere. Numbers in any format in; valid and possible flags, E.164, national and international formats, country, calling code, line type and a mobile flag out.
- Qualify a domain before prospecting. Whether it has MX records, which hosts serve it in priority order, whether it falls back to an A record, whether it accepts mail at all, and whether it is a disposable or free-mail provider.
- Enrich CRM rows without losing your ids. Send objects in
recordsinstead of a plain list: the email, phone or domain field is found by name and every other field comes back on the row aspassthrough. - Verify without scraping anything. Pure computation — DNS, the numbering plans and a mail-server handshake where the network allows it. No website is fetched, no proxy is used and no API key is needed.
Run it on a schedule
A one-off pull answers a question; a schedule answers it every day without you. Open Schedules in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per check delivered, and the FAQ below says exactly what a scheduled run that finds nothing new costs.
FAQ
Does it send an email to the address?
No. Nothing is ever sent. The mailbox check opens a connection to the domain's mail server and asks whether it would accept mail for that address, then hangs up before any message — the same question every mail server asks before delivering.
Why is the mailbox status blocked on every row?
Because Apify's network does not allow outbound connections to mail servers on port 25 — measured 2026-09-02 and stated here rather than discovered on your invoice. Every row is billed at the cheaper email checked price instead of the verified one, and everything else — syntax, MX, disposable, role, free-mail, typo suggestion and score — is delivered in full. If that ever changes, the verified rows and their price switch on automatically.
What does "catch-all" mean?
The domain's server says yes to every address, so a yes for yours proves nothing. The row is marked risky with the reason catch-all-domain; whether to send is your call. Greylisting and rate-limiting servers are reported the same honest way — risky or unknown with the reason stated, never a guess dressed as a verdict.
Do I need an API key or a proxy for anything?
No. Everything is handled for you and there is nothing to buy on top.
Does it tell me the carrier?
No. Carrier and porting data are paid telecom lookups. This validates against the international numbering plans, which is what most pipelines actually need, at a fraction of the price — it says whether a number can exist and what type it is, not whether it is currently assigned.
Will I be charged twice for the same address?
Not inside one run. Addresses are collapsed on their normalised form — Gmail dots and +tags, upper and lower case — so one inbox is one row and one charge. An input that is not an email, a phone number or a domain at all costs nothing.
Is a re-run cheaper than the first run?
No, and this suite will not pretend otherwise: there is no change-only mode here. Every address, number and domain you submit is checked and billed on every run, so re-verify a list on the cadence your data actually needs rather than on an hourly cron.
Does it check WhatsApp or Telegram?
No. Nothing here contacts WhatsApp, Telegram or any messaging service — those checks need an unofficial client and are not sold.
Something wrong, or a field you need that is missing? Open an issue on the Issues tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.