Bulk Email Verifier
Pricing
from $0.05 / 1,000 results
Bulk Email Verifier
Verify large email lists at scale without paid APIs. Bulk Email Verifier checks syntax, DNS MX records, disposable and role-based emails, and returns explainable results (valid, invalid, risky, unknown). Built for fast, low-cost bulk verification.
Pricing
from $0.05 / 1,000 results
Rating
0.0
(0)
Developer

Hayder Al-Khalissi
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Share
What does Bulk Email Verifier do?
Bulk Email Verifier checks large lists of email addresses and tells you which are valid, invalid, risky, or unknown—without using any paid verification APIs. You provide emails (inline, from a CSV URL, or from an Apify Dataset), and the Actor returns explainable results for each address: syntax checks, MX (mail server) lookup, and flags for disposable domains and role accounts. It is built for bulk email verification at low cost and runs reliably on the Apify platform with configurable concurrency and rate limiting.
What can Bulk Email Verifier do?
- Verify emails at scale – Process up to tens of thousands of addresses per run with configurable concurrency and timeouts.
- Multiple input options – Pass an array of emails directly, or load from an Apify Dataset, Key-Value Store, a CSV URL, or raw CSV text.
- Three verification modes – Basic (syntax only), MX (syntax + DNS MX lookup), or SMT (experimental SMTP handshake). MX mode is recommended for production.
- Explainable results – Each result includes status, reason codes, and signals (syntax OK, MX OK, disposable, role account, free provider) so you can understand why an email was classified the way it was.
- No paid APIs – Uses only Node.js DNS and optional SMTP; the MVP is self-contained and does not call external email verification services.
- Output flexibility – Results go to the default dataset; you can also export CSV to the Key-Value Store and send webhook batches to your own URL.
- Apify platform benefits – Schedule runs, call via API, integrate with Zapier or Make, monitor runs, and scale without managing infrastructure.
What data does Bulk Email Verifier produce?
Each verified email in the dataset includes the following main data points:
| Field | Description |
|---|---|
| Normalized email address (lowercase). | |
| status | One of: valid, invalid, risky, unknown. |
| reasons | Reason codes, e.g. invalid_syntax, no_mx, disposable_domain, role_account, dns_timeout. |
| signals | Object with syntaxOk, mxOk, mxRecords, isDisposable, isRole, isFreeProvider, domain. |
| timing | Per-step timing (normalize, syntax, MX, heuristics) in milliseconds. |
| reasoning | Human-readable explanation (when "Include reasoning" is enabled). |
Summary statistics (totals by status and by reason) are logged at the end of each run.
How to use Bulk Email Verifier to verify email lists
- Open the Actor on Apify (Store or Console) and go to the Input tab.
- Either paste or upload a list of emails, or choose a source: Apify Dataset, Key-Value Store key, CSV URL, or raw CSV text.
- Select mode: Basic (syntax only), MX (syntax + MX lookup), or SMT (experimental). For most use cases, MX is the best choice.
- Optionally adjust limits (max emails, concurrency, timeouts) and output (e.g. include CSV export or reasoning).
- Click Start and wait for the run to finish. Results appear in the Output tab as dataset items; you can download them as JSON, CSV, Excel, or use the Apify API.
For local development, run:
npm installapify run --input-file examples/input-inline.json
Use --no-purge to keep local storage between runs. See the examples/ folder for sample inputs (inline list, URL CSV, Apify dataset).
How much does bulk email verification cost?
Bulk Email Verifier runs on Apify’s consumption-based pricing (Compute Units). You pay for the compute time and memory used during the run. There are no per-email or per-result fees from this Actor—it does not call paid verification APIs. Cost depends on list size, concurrency, and DNS response times. For rough guidance: verifying thousands of emails in MX mode typically stays within a few dollars per run when using default settings. You can lower cost by reducing concurrency or capping max emails. Check the Apify pricing page and the run’s usage in the Console for exact figures.
Input
Bulk Email Verifier has the following input options. Click on the Input tab in the Actor detail page for the full schema and tooltips.
- Emails – Optional array of email strings. Omit if you use a source.
- Source – Optional. Type:
apifyDataset,apifyKeyValueStore,urlCsv, orrawCsv, with the correspondingdatasetId,kvKey,url, orcsvText. - Mode –
basic(syntax only),mx(syntax + MX lookup), orsmtp(experimental). - Filters – Check disposable domains, role accounts; allow catch-all; deduplicate.
- Output – Format (dataset only or dataset + CSV); include reasoning text.
- Webhook – Optional URL, batch size, and whether to include run info.
- Limits – Max emails, concurrency, DNS timeout, overall timeout.
Example input (verify a small list inline):
{"emails": ["user@example.com", "support@company.com"],"mode": "mx","dedupe": true,"limits": { "maxEmails": 1000, "concurrency": 20 }}
Output
You can download the dataset produced by Bulk Email Verifier in various formats such as JSON, CSV, or Excel from the Output tab or via the Apify API.
Example output (one item per email):
{"email": "user@example.com","status": "valid","reasons": [],"signals": {"syntaxOk": true,"mxOk": true,"mxRecords": [{ "exchange": "mail.example.com", "priority": 10 }],"isDisposable": false,"isRole": false,"isFreeProvider": false,"domain": "example.com"},"timing": { "normalize": 0, "syntax": 0, "mx": 45, "heuristics": 1 },"reasoning": "Syntax and MX OK; no risky signals."}
When CSV output is enabled, a file is also saved to the run’s Key-Value Store under the key results.csv.
Webhook output
You can send verification results to an external URL in batches. In the Input tab, set Webhook → url to your endpoint and optionally set batch size and include run info. The Actor sends POST requests with a JSON body like:
{"results": [ { "email": "...", "status": "valid", "reasons": [], "signals": { ... }, "timing": { ... }, "reasoning": "..." }, ... ],"runId": "...","actorId": "...","batchIndex": 0}
Use this to push results into Slack, GitHub issues, n8n, or an email pipeline:
| Destination | How to send |
|---|---|
| Slack | Create an Incoming Webhook in your Slack app. Set the Actor’s webhook URL to your Slack webhook URL. Slack expects { "text": "..." } (or blocks), so either use a small middleware (e.g. n8n or Zapier) that receives the Actor’s POST, formats a message from results, and POSTs to Slack, or point the Actor at an n8n/Zapier workflow URL that does that. |
| GitHub issue | Use a workflow that receives the Actor’s webhook and creates or updates a GitHub issue via the GitHub API. In n8n: Webhook node (receives POST) → process body.results → GitHub node (create issue or add comment). Set the Actor’s webhook URL to your workflow’s webhook URL. |
| n8n webhook | In n8n, add a Webhook node and activate the workflow. Copy the Production webhook URL (e.g. https://your-n8n.com/webhook/...) and paste it into the Actor’s Webhook → url. Each batch of results is POSTed to that URL; you can then branch by status, filter, or forward to other nodes (Slack, email, GitHub, etc.). |
| Email pipeline | Point the Actor’s webhook URL at a pipeline that accepts POST and triggers emails (e.g. n8n workflow with Webhook → process results → Send Email, or Zapier/Make “Webhook → Email”). Use the batch payload to send summaries or per-result notifications. |
SMTP mode (experimental)
When mode is smtp and Enable SMTP check is turned on, the Actor performs a minimal SMTP handshake (connect, EHLO, MAIL FROM, RCPT TO, QUIT—no message content is sent). SMTP verification can be blocked by many providers (port 25 filtering, rate limits), can be unreliable (greylisting, temporary failures), and may affect IP reputation if overused. For production use, MX mode is recommended. Use SMTP only for small batches and with caution.
Tips and advanced options
- Faster runs – Increase concurrency (e.g. 20–50) within your timeout and DNS limits; the Actor caches MX lookups per domain to avoid repeated DNS queries.
- Large lists – Set maxEmails and overallTimeoutMs so the run does not exceed your time or budget. Results are pushed incrementally to the dataset, so partial progress is saved if the run stops.
- Webhooks – If you provide a webhook URL, the Actor POSTs batches of results to your endpoint; useful for piping verified emails into your own system without polling the dataset.
- Extra disposable domains – Use disposableDomainsExtra to add domain names that should be treated as disposable in addition to the built-in list.
FAQ and support
Is it legal to verify emails with this Actor?
The Actor only checks whether an email address has valid syntax and whether its domain has mail servers (MX records). It does not harvest or store personal data beyond what you supply as input. You are responsible for ensuring you have a lawful basis to process the email addresses you feed into the Actor (e.g. consent or legitimate interest under GDPR or equivalent laws). Do not use the Actor to verify lists you do not have the right to process.
Why is my email marked "unknown"?
Common causes: the domain has no MX records, the DNS lookup timed out, or an error occurred during verification. Check the reasons and signals fields for that item. You can increase dnsTimeoutMs or retry later if the problem is transient.
Can I use this Actor via the API?
Yes. Use the Apify API to start the Actor with your input and to fetch the output dataset. The Actor is designed to be called from scripts, other Actors, or integrations (e.g. Zapier, Make).
Where can I report issues or ask for help?
If you run into bugs or have feature requests, use the Issues tab on the Actor’s page or the repository’s issue tracker. For general Apify platform support, see Apify Help.
Deployment – To deploy your own copy, use the Apify CLI: apify login then apify push.