Email Verifier & Validator - Bulk Email Verification API
Pricing
from $0.70 / 1,000 email verifications
Email Verifier & Validator - Bulk Email Verification API
Verify email addresses in bulk: syntax, domain and MX records, disposable and catch-all detection, role-account flags and typo suggestions. Pay per email.
Email Verifier — Bulk Email Validation & Checker API 🚀
✅ Syntax, domain and mail-server checks on every address — plus a mailbox answer wherever the server gives one — $0.80 per 1,000
Built for marketers, sales teams and developers who need to know which addresses will bounce before they hit send
🔎 What is the Email Verifier — and when should you use it?
The Email Verifier turns a list of email addresses you already hold into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: one row per address with a status: valid, invalid, catch_all, disposable or unknown. Each row carries a filterable reason code, the mail server that answered and the receiving platform. SPF, DMARC and a role-account flag come with it. A one-character domain typo gets a did-you-mean correction in the same row. Duplicates are removed before anything is charged, and a malformed address is never billed.
Use something else when: you do not have the addresses yet and need to find them. Use Email & Contact Lead Scraper for collecting the addresses from websites in the first place, which this actor then checks. Use Local Business Data Scraper for business listings with their contact details attached, for building the list rather than grading it. This actor grades addresses you supply. It does not find new ones, and it does not send anything — a mailbox is confirmed by asking the recipient's mail server, never by delivering mail.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/email-verifier
Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want to know which email addresses on a list are safe to send to using the Apify Actor `sian.agency/email-verifier`.Use it when I need: one row per address with a status: valid, invalid, catch_all, disposable or unknown. Each row carries a filterable reason code, the mail server that answered and the receiving platform. SPF, DMARC and a role-account flag come with it. A one-character domain typo gets a did-you-mean correction in the same row. Duplicates are removed before anything is charged, and a malformed address is never billed.Don't use it when: you do not have the addresses yet and need to find them — use email-contact-lead-scraper or local-business-data-scraper instead.How to call it: pass a single address in `email`, a list in `bulkEmails`, or a public text/CSV URL in `requestsFromUrl`. Everything else is automatic: syntax, domain and MX, disposable, role and catch-all detection, and a typo correction where one is suspected.Start with this input:{"operation": "verify","bulkEmails": ["name@company.com","info@acme.co","test@mailinator.com"]}Ask me for the addresses or the file URL they want checked, and whether they care more about strictness (drop everything not confirmed) or reach (keep anything not proven dead), then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Check these 300 newsletter addresses and give me three lists: safe to send, remove, and retry later.
- Grade last month's sign-ups and tell me which came from throwaway domains or shared inboxes.
- Scan my lead list and flag every domain that publishes no DMARC policy or has no mail server.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/email-verifier.md.
📋 Overview
Paste a list, get a verdict on every address. The Email Verifier runs each address through five checks and returns one row per address with a status, a plain-English reason and a machine-readable reason code you can filter on.
What you get:
- ✅ Five checks in one pass: syntax, domain existence, mail server (MX), throwaway detection and catch-all detection. One run answers what would otherwise be five lookups. The first four land on every row; the mailbox questions depend on the receiving server accepting one.
- 💡 Typo rescue: a one-character miss in the domain is caught and the corrected address returned, so
gmial.comnever costs you a customer. - 🧭 Deliverability signals included: every row carries the mail server found, the receiving platform (22 recognised, from Google Workspace to Cloudflare), plus SPF and DMARC answers for the domain.
- 💰 Priced under the category leader: $0.80 per 1,000 addresses. You are never charged for a malformed address.
- 🔎 The reason, per row: 8 reason codes. Filter your list by why an address failed instead of guessing at valid and invalid.
- ✨ No keys, no setup: no account to connect and no provider to sign up for. Paste and run.
✨ Features
- ✅ Syntax validation — malformed addresses are flagged with what to fix, and never charged.
- 🌍 Domain and mail-server lookup — a live MX query per unique domain, with an A-record fallback for domains that publish no MX.
- 🗑️ Disposable address detection — 8,700+ known throwaway domains bundled in the build, so the check never depends on a third-party quota.
- 👥 Role-account flagging —
info@,sales@,admin@and 550+ other shared inboxes, marked so a campaign can treat them differently. - 📥 Catch-all detection — where a domain accepts every address, the row is reported as
catch_allrather than falsely marked deliverable. Part of the mailbox answer, so it appears when the mail server takes the question. - 💡 Did-you-mean suggestions — a near-miss domain gets the corrected address in the same row.
- 📦 Three ways to load a list — a single address, a pasted bulk list, or a public text/CSV URL for very large files.
- 🚫 Duplicate removal before charging — the same address twice is checked and billed once.
- 📄 A run report you can act on — safe-to-send and remove lists, each with a one-click copy.
🎬 Quick Start
Give it one address and press Start. The default input is pre-filled, so a bare run returns real results.
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~email-verifier/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"email": "name@company.com"}'
🚀 Getting Started (3 Simple Steps)
Step 1: Add your addresses
Paste one address into Email address, or a list into Bulk email list, or point Load list from URL at a public text file.
Step 2: Run it
Press Start. Checks run 15 addresses at a time and every unique domain is looked up once, so large lists do not slow down.
Step 3: Filter your dataset
Download the results and split them on status: send to valid, drop invalid and disposable, retry unknown later.
That's it! In under a minute for a hundred addresses, you'll have:
- A safe-to-send list, ready to copy
- A removal list with the reason for each address
- Per-row mail server, platform, SPF and DMARC answers
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| string | No | A single address to verify | |
| bulkEmails | array | No | Many addresses at once, one per line |
| requestsFromUrl | string | No | Public URL of a text or CSV file with one address per line |
| operation | string | No | Always verify — kept for API compatibility |
Single address:
{"email": "name@company.com"}
Bulk:
{"bulkEmails": ["name@company.com", "sales@other.com", "test@mailinator.com"]}
From a file:
{"requestsFromUrl": "https://example.com/my-list.txt"}
📤 Output
One row per address, with 17 fields:
| Field | Type | Description |
|---|---|---|
| string | The address as submitted | |
| status | string | valid · invalid · catch_all · disposable · unknown |
| reasonCode | string | Machine-readable reason — filter on this |
| reasonDetail | string | The same reason in plain English |
| mailboxCheck | string | confirmed · rejected · catch_all · unavailable · not_possible · not_needed |
| smtpCode | number | The mail server's own reply code, where it gave one |
| didYouMean | string | Corrected address when the domain looks like a typo |
| normalizedEmail | string | Dots and plus-suffixes collapsed, for de-duplicating |
| mxPresent | boolean | Whether the domain has a mail server |
| mxHost | string | The mail server that answered |
| mailProvider | string | Receiving platform, e.g. Google Workspace |
| disposable | boolean | Throwaway domain |
| roleAddress | boolean | Shared inbox such as info@ or sales@ |
| freeProvider | boolean | Free mailbox provider such as Gmail |
| spfPresent | boolean | Domain publishes SPF |
| dmarcPolicy | string | DMARC policy: none · quarantine · reject |
| checkedAt | string | When this row was checked |
Example:
{"email": "support@apify.com","status": "valid","reasonCode": "mailbox_confirmed","reasonDetail": "The mail server confirmed this mailbox exists.","mailboxCheck": "confirmed","smtpCode": 250,"mxPresent": true,"mxHost": "aspmx.l.google.com","mailProvider": "Google Workspace","spfPresent": true,"dmarcPolicy": "reject","normalizedEmail": "support@apify.com","disposable": false,"roleAddress": true,"freeProvider": false,"checkedAt": "2026-08-31T02:42:35.757Z"}
💼 Use Cases & Examples
1. Clean a mailing list before a campaign
An email marketer with 50,000 subscribers and a hard-bounce limit to protect.
Input: the exported list, one address per line Output: send / remove / retry lists, each with the reason Use: strip what cannot exist before it damages your sender reputation and your ESP account.
2. Stop trial abuse at sign-up
A SaaS operator watching disposable addresses burn free trials.
Input: new sign-ups as they arrive
Output: disposable status with the throwaway domain flagged
Use: block or challenge throwaway registrations without touching real customers.
3. Triage a bought lead list
A sales team that just paid for 10,000 B2B contacts.
Input: the vendor's CSV by URL Output: dead mailboxes and role accounts separated from real people Use: spend sending credits only on addresses that can receive mail.
4. Rescue typos at the point of entry
A developer building a sign-up form who cannot afford to lose customers to fat fingers.
Input: the address as typed
Output: didYouMean with the corrected address
Use: prompt the user with the fix instead of silently storing a dead address.
5. Audit sender domains in a B2B list
A deliverability consultant checking which prospects can even receive mail securely.
Input: the prospect list Output: MX, mail platform, SPF and DMARC per domain Use: flag domains with no mail server or no DMARC before outreach.
6. Keep a CRM clean on a schedule
An operations lead whose CRM decays between one-off cleanups.
Input: a scheduled run pointed at the exported CRM file URL Output: a fresh grade for every address, every week Use: retire dead contacts continuously instead of in a yearly panic.
🔗 Integration Examples
JavaScript/Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/email-verifier').call({email: 'name@company.com'});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].status);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/email-verifier').call(run_input={'email': 'name@company.com'})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['email'], item['status'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~email-verifier/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"bulkEmails": ["a@company.com", "b@company.com"]}'
Automation Workflows (N8N / Zapier / Make)
- Trigger: a new sign-up, a form submission, or a weekly schedule
- HTTP Request: call the actor API with the address or list
- Process: read
statusandreasonCodefrom the JSON result - Action: block disposable sign-ups, drop dead addresses, or queue
unknownfor a retry
📊 Performance & Pricing
FREE Tier (Try It Now)
- 5 addresses per run — every check included, same quality
- No credit card required
- Perfect for trying it on a handful of your own addresses
PAID Tier (Production Ready)
- Unlimited addresses per run
- 15 checks in parallel; each unique domain is looked up once per run
- Pay per address verified — never for a malformed one
💰 $0.80 per 1,000 addresses — under the category leader's $0.89.
❓ Frequently Asked Questions
Q: What does each status mean?
A: valid — the mail server confirmed the mailbox. invalid — the address cannot receive mail: bad syntax, dead domain, no mail server, or mailbox not found. catch_all — the domain accepts every address, so this one cannot be confirmed individually. disposable — a throwaway domain. unknown — the domain is real and takes mail, but its server would not confirm the individual mailbox. On a cloud platform that is the common outcome for the mailbox question, which is why the row carries everything the domain level did establish.
Q: Which mail servers will not confirm a mailbox?
A: Most of them, when the question comes from a cloud platform: many recipient servers refuse the connection outright, and Microsoft-hosted domains in particular answer based on who is asking rather than on the address. Those rows come back unknown with mailboxCheck: unavailable. The row still tells you the domain is live, has a mail server, and whether it is disposable or a role account. The check is always attempted, so a server that does take the question is answered on the spot.
Q: Do you send an email to check the address? A: No. The check asks the recipient's mail server a question and stops there. No message is delivered to any address at any point.
Q: Do I get charged for invalid addresses?
A: Not for malformed ones — an address that fails the syntax check is returned free of charge. Every other answer, including invalid and unknown, is a real verification result and is charged.
Q: How many addresses can one run handle? A: Thousands. Checks run 15 at a time, and each unique domain is looked up once per run.
Q: What output formats are available? A: JSON, CSV and Excel, straight from the Apify dataset.
Q: Is this legal? A: The actor only checks addresses you already hold. You are responsible for having a lawful basis to process them — see the legal section below.
🐞 Troubleshooting
Everything comes back unknown
- The receiving servers refused the mailbox question. Most do when the question comes from a cloud platform. You still get the domain, mail server, provider, SPF and DMARC answers on every row, plus disposable and role flags. Treat
unknownas "probably deliverable, unverified" and re-run later — the check is attempted on every run.
An address I know is real came back invalid
- Check the
reasonCode.syntax_invalidmeans the address as submitted had a stray character or an incomplete domain;mailbox_not_foundmeans the recipient's own server said it does not exist — usually a full or closed mailbox, or an address that was deleted.
A whole domain comes back the same for every address
- That is a
catch_alldomain. It accepts everything, so no per-address answer is possible. Filter onstatus: catch_alland treat those as deliverable but unverified.
My list file was not loaded
- The URL must be public and point at a plain text or CSV file with one address per line. A link that needs a login will fail.
info@ addresses marked valid but I want to exclude them
- Filter on
roleAddress: true. Shared inboxes are flagged rather than marked invalid, because many of them do receive mail.
⚖️ Is it legal to verify email addresses?
This actor checks addresses you supply. It collects no data of its own and sends no email to anyone. You are responsible for holding a lawful basis to process the addresses you verify: personal data is protected by the GDPR in the European Union and by equivalent laws elsewhere, and commercial sending is governed by laws such as CAN-SPAM. If you are unsure whether your use is lawful, consult your lawyers.
You can also read Apify's post on the legality of web scraping.
🤝 Support
Join our active support community
- For issues or questions, open an issue in the actor's repository
- Check the SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools