Email Verifier & Validator - Bulk Email Verification API avatar

Email Verifier & Validator - Bulk Email Verification API

Pricing

from $0.70 / 1,000 email verifications

Go to Apify Store
Email Verifier & Validator - Bulk Email Verification API

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.

Pricing

from $0.70 / 1,000 email verifications

Rating

0.0

(0)

Developer

SIÁN OÜ

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Email Verifier — Bulk Email Validation & Checker API 🚀

SIÁN Agency Store Store-Email & Contact Lead Scraper-1AE392 Store-Local Business Data Scraper-0077B5 Store-Property Skip Tracing-1AE392

✅ 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.com never 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 flagginginfo@, 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_all rather 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

FieldTypeRequiredDescription
emailstringNoA single address to verify
bulkEmailsarrayNoMany addresses at once, one per line
requestsFromUrlstringNoPublic URL of a text or CSV file with one address per line
operationstringNoAlways 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:

FieldTypeDescription
emailstringThe address as submitted
statusstringvalid · invalid · catch_all · disposable · unknown
reasonCodestringMachine-readable reason — filter on this
reasonDetailstringThe same reason in plain English
mailboxCheckstringconfirmed · rejected · catch_all · unavailable · not_possible · not_needed
smtpCodenumberThe mail server's own reply code, where it gave one
didYouMeanstringCorrected address when the domain looks like a typo
normalizedEmailstringDots and plus-suffixes collapsed, for de-duplicating
mxPresentbooleanWhether the domain has a mail server
mxHoststringThe mail server that answered
mailProviderstringReceiving platform, e.g. Google Workspace
disposablebooleanThrowaway domain
roleAddressbooleanShared inbox such as info@ or sales@
freeProviderbooleanFree mailbox provider such as Gmail
spfPresentbooleanDomain publishes SPF
dmarcPolicystringDMARC policy: none · quarantine · reject
checkedAtstringWhen 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 ApifyClient
client = 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)

  1. Trigger: a new sign-up, a form submission, or a weekly schedule
  2. HTTP Request: call the actor API with the address or list
  3. Process: read status and reasonCode from the JSON result
  4. Action: block disposable sign-ups, drop dead addresses, or queue unknown for 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
  • 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.

🔗 View current pricing

❓ 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 unknown as "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_invalid means the address as submitted had a stray character or an incomplete domain; mailbox_not_found means 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_all domain. It accepts everything, so no per-address answer is possible. Filter on status: catch_all and 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.

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

Telegram Support

Join our active support community


Built by SIÁN Agency | More Tools