# Email Verifier & Validator - Bulk, Syntax, MX & Disposable (`santhej/email-verifier`) Actor

Bulk-verify email addresses: syntax, domain/MX deliverability, disposable, role-account, free-provider and typo detection. Fast, no API key, pay per email.

- **URL**: https://apify.com/santhej/email-verifier.md
- **Developed by:** [Santhej Kallada](https://apify.com/santhej) (community)
- **Categories:** Other
- **Stats:** 34 total users, 14 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 email verifieds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Email Verifier & Validator — Bulk, SMTP, Catch-all & Disposable

Clean and validate email lists at scale with **deep, real-time verification**. For every address you get a clear **status** (`valid` / `invalid` / `risky` / `unknown`), a **0–100 score**, and the full signal set: **live SMTP check**, **catch-all detection**, **deliverability**, **MX**, **disposable**, **role account**, **free provider**, **spam-trap**, and a **"did you mean?"** typo fix. No API key, no setup.

Cut bounce rates, protect sender reputation, and stop wasting sends on dead or risky addresses.

### Features

- **Two modes:**
  - **Power** (default) — deep verification with a **live SMTP handshake**, **catch-all** and **deliverability** detection. Most accurate.
  - **Quick** — instant check (syntax, MX, disposable, role, free) with no SMTP. Faster and cheaper.
- **Bulk** — verify up to tens of thousands of emails per run.
- **Rich signals per email** — `is_safe_to_send`, `is_deliverable`, `is_catch_all`, `can_connect_smtp`, `is_disposable`, `is_role_account`, `is_free_email`, `is_spamtrap`, `has_inbox_full`, `is_disabled`, `mx_record`.
- **"Did you mean?"** — suggests fixes for obvious typos (e.g. `gmial.com` → `gmail.com`).
- **Confidence score** — one 0–100 number for quick filtering.
- **Fair pricing** — duplicates are removed and never charged.

### Input

| Field | Type | Description |
|---|---|---|
| `emails` | array | Email addresses, one per line. **Required.** |
| `mode` | string | `power` (deep SMTP + catch-all, recommended) or `quick` (instant, no SMTP). Default `power`. |
| `deduplicate` | boolean | Lower-case and de-duplicate before verifying. Default `true`. |

```json
{
  "emails": ["jeff@amazon.com", "info@stripe.com", "test@mailinator.com", "bad@@format"],
  "mode": "power",
  "deduplicate": true
}
```

### Output

One record per email:

```json
{
  "email": "info@stripe.com",
  "status": "risky",
  "score": 69,
  "is_safe_to_send": false,
  "is_deliverable": true,
  "is_catch_all": true,
  "can_connect_smtp": true,
  "is_disposable": false,
  "is_role_account": true,
  "is_free_email": false,
  "domain": "stripe.com",
  "mx_record": "aspmx.l.google.com",
  "did_you_mean": null
}
```

#### Status meanings

| Status | Meaning |
|---|---|
| `valid` | Safe to send — syntax, MX and (in Power mode) SMTP all check out. |
| `invalid` | Will bounce — bad syntax, dead domain, no mail server, or spam-trap. |
| `risky` | Deliverable but lower quality — catch-all domain, role account, disposable, or a likely typo. |
| `unknown` | The mail server couldn't be probed conclusively (some providers block checks) — verify later or treat with caution. |

### Notes

- **Power mode** performs a live SMTP conversation with the recipient's mail server to confirm the mailbox where possible, and detects **catch-all** domains (which accept any address). Some large providers (e.g. Google/Microsoft hosted) deliberately block these probes — those return `unknown` rather than a false verdict.
- **Quick mode** skips SMTP for instant results — ideal for fast, high-volume syntax/MX/disposable filtering.

# Actor input Schema

## `emails` (type: `array`):

Email addresses to verify, one per line.

## `mode` (type: `string`):

Power = full deep check (live SMTP, catch-all, deliverability, spam-trap) — most accurate. Quick = instant check (syntax, MX, disposable, role) — faster and cheaper, no SMTP.

## `deduplicate` (type: `boolean`):

Lower-case and de-duplicate the input list before verifying (you are not charged for duplicates).

## Actor input object example

```json
{
  "emails": [
    "jeff@amazon.com",
    "info@stripe.com",
    "test@mailinator.com",
    "bad@@format"
  ],
  "mode": "power",
  "deduplicate": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

One record per email with status, score and signals.

## `summary` (type: `string`):

Counts of valid / invalid / risky / unknown emails.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "emails": [
        "jeff@amazon.com",
        "info@stripe.com",
        "test@mailinator.com",
        "bad@@format"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("santhej/email-verifier").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "emails": [
        "jeff@amazon.com",
        "info@stripe.com",
        "test@mailinator.com",
        "bad@@format",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("santhej/email-verifier").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "emails": [
    "jeff@amazon.com",
    "info@stripe.com",
    "test@mailinator.com",
    "bad@@format"
  ]
}' |
apify call santhej/email-verifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santhej/email-verifier"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LFgD4hKgZC43fabgU/builds/GNZnegfghtWtwtsIq/openapi.json
