# Email Validator & Verifier (`junipr/email-validator`) Actor

6-layer email validation: format, MX records, SMTP mailbox verify, disposable detection (5K+ domains), role-based check, free provider ID. Quality score 0-100 per email. Typo suggestions. Batch processing.

- **URL**: https://apify.com/junipr/email-validator.md
- **Developed by:** [junipr](https://apify.com/junipr) (community)
- **Categories:** Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.95 / 1,000 email validateds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Validator

### What does Email Validator do?

Email Validator performs multi-layer validation on any list of email addresses to determine if they are real, deliverable, and safe to use. It checks email format against RFC 5322, verifies the domain has valid MX DNS records, connects to the mail server via SMTP to confirm the mailbox exists, detects disposable/temporary email providers (30,000+ domains), flags role-based addresses (admin@, info@, support@), identifies free email providers (Gmail, Yahoo, Outlook), and optionally detects catch-all domains.

Each email receives a quality score from 0 to 100 and a human-readable reason explaining the result. The actor also suggests corrections for common domain typos (e.g., `gmial.com` to `gmail.com`). Use it to clean email lists before outreach campaigns, validate sign-up forms, or enrich contact data with deliverability intelligence.

### Features

- **Format validation** — RFC 5322 compliant email format checking
- **MX record verification** — Confirms the domain has valid mail exchange DNS records
- **SMTP mailbox verification** — Connects to the mail server and checks if the specific mailbox exists using RCPT TO
- **Disposable domain detection** — Checks against 30,000+ known disposable and temporary email providers
- **Role-based address detection** — Flags addresses like admin@, info@, support@, noreply@, sales@, webmaster@
- **Free provider detection** — Identifies Gmail, Yahoo, Hotmail, Outlook, and other free email services
- **Catch-all detection** — Optionally checks if the domain accepts all email addresses regardless of the local part
- **Typo suggestions** — Detects common domain misspellings and suggests corrections (gmial.com, yaho.com, outloo.com)
- **Quality scoring** — 0-100 score based on format, MX, SMTP, disposable status, role status, and provider type
- **Batch processing** — Validate hundreds of emails concurrently with configurable parallelism
- **Automatic deduplication** — Duplicate emails are removed before processing

### Input Configuration

```json
{
  "emails": ["john@company.com", "test@gmail.com", "fake@temp-mail.io"],
  "checkMx": true,
  "checkSmtp": true,
  "checkDisposable": true,
  "checkRole": true,
  "checkFreeProvider": true,
  "checkCatchAll": false,
  "smtpTimeout": 10000,
  "maxConcurrency": 5
}
````

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `emails` | string\[] | `["test@gmail.com", "invalid@nonexistent-domain-12345.com"]` | Email addresses to validate |
| `checkMx` | boolean | `true` | Verify domain has MX DNS records |
| `checkSmtp` | boolean | `true` | Verify mailbox exists via SMTP RCPT TO |
| `checkDisposable` | boolean | `true` | Check against 30,000+ disposable email domains |
| `checkRole` | boolean | `true` | Detect role-based addresses (admin@, info@, etc.) |
| `checkFreeProvider` | boolean | `true` | Detect free email providers (Gmail, Yahoo, etc.) |
| `checkCatchAll` | boolean | `false` | Detect catch-all domains (slower, extra SMTP connection) |
| `smtpTimeout` | integer | `10000` | SMTP connection timeout in milliseconds (3,000-30,000) |
| `maxConcurrency` | integer | `5` | Maximum emails to validate simultaneously (1-20) |

### Output Format

Each validated email produces one result:

```json
{
  "email": "john@company.com",
  "isValid": true,
  "formatValid": true,
  "mxValid": true,
  "smtpValid": true,
  "isDisposable": false,
  "isRole": false,
  "isFreeProvider": false,
  "isCatchAll": null,
  "mxRecords": [
    { "exchange": "mx1.company.com", "priority": 10 },
    { "exchange": "mx2.company.com", "priority": 20 }
  ],
  "suggestion": null,
  "score": 100,
  "reason": "Valid email address",
  "scrapedAt": "2026-03-11T12:00:00.000Z"
}
```

Example of an invalid email:

```json
{
  "email": "user@temp-mail.io",
  "isValid": true,
  "formatValid": true,
  "mxValid": true,
  "smtpValid": null,
  "isDisposable": true,
  "isRole": false,
  "isFreeProvider": false,
  "isCatchAll": null,
  "mxRecords": [{ "exchange": "mx.temp-mail.io", "priority": 10 }],
  "suggestion": null,
  "score": 55,
  "reason": "Valid email with warnings: disposable email domain",
  "scrapedAt": "2026-03-11T12:00:00.000Z"
}
```

### Usage Examples / Use Cases

- **Email list cleaning** — Validate your mailing list before campaigns to remove invalid, disposable, and risky addresses and improve deliverability
- **Sign-up form validation** — Integrate via API to verify email addresses in real time during user registration
- **Lead qualification** — Score incoming leads by email quality, filtering out disposable addresses and prioritizing business domains over free providers
- **CRM data hygiene** — Periodically validate contact emails in your CRM to flag outdated or invalid addresses
- **Fraud prevention** — Block disposable and temporary email addresses from account creation to reduce fake sign-ups
- **Email deliverability auditing** — Check MX records and SMTP responses for your own domain to diagnose sending issues

### Pricing

This actor uses Pay-Per-Event (PPE) pricing: **$1.90 per 1,000 emails validated** ($0.0019 per event).

Pricing includes all platform compute costs — no hidden fees.

### FAQ

#### Why does SMTP verification sometimes return null?

SMTP verification connects to port 25 on the target mail server. Some hosting environments (including Apify's infrastructure) may restrict outbound port 25 connections. When this happens, SMTP verification returns `null` (inconclusive) rather than `false`. The email still receives partial credit in the quality score. MX record verification and all other checks still work normally.

#### What is the quality score based on?

The score (0-100) is calculated from six factors: valid format (30 points), MX records present (30 points), SMTP verification passed (20 points), not a disposable domain (10 points), not role-based (5 points), and business domain vs free provider (5 points). An email with valid format, working MX, confirmed SMTP, from a business domain scores 100.

#### How accurate is disposable email detection?

The actor checks against a database of 30,000+ known disposable and temporary email domains. The list covers major providers like Guerrilla Mail, Temp Mail, Mailinator, and thousands of lesser-known services. New disposable providers appear constantly, so some very new services may not be in the list.

#### Can I validate thousands of emails in one run?

Yes. The actor deduplicates your list automatically and processes emails concurrently based on `maxConcurrency`. For large lists (10,000+), increase the run timeout and consider disabling `checkSmtp` and `checkCatchAll` for faster processing since those require network connections per email.

#### What does the suggestion field do?

If the actor detects a likely typo in the domain part of the email (e.g., `user@gmial.com` instead of `user@gmail.com`), it returns a corrected suggestion in the `suggestion` field. This helps you fix common data entry errors rather than simply marking the email as invalid.

### Related Actors

- [Disposable Email Checker](https://apify.com/junipr/disposable-email-checker) — Focused disposable domain detection if you only need that check
- [Contact Info Scraper](https://apify.com/junipr/contact-info-scraper) — Extract emails from websites, then validate them with this actor
- [Domain WHOIS Lookup](https://apify.com/junipr/domain-whois-lookup) — Get WHOIS registration and DNS data for email domains
- [Yellow Pages Scraper](https://apify.com/junipr/yellow-pages-scraper) — Scrape business listings with contact emails to validate
- [RAG Web Extractor](https://apify.com/junipr/rag-web-extractor) — Extract structured content from websites for AI and data pipelines

# Actor input Schema

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

List of email addresses to validate. One email per line or comma-separated.

## `checkMx` (type: `boolean`):

Verify the domain has valid mail exchange (MX) DNS records.

## `checkSmtp` (type: `boolean`):

Connect to the mail server and verify the mailbox exists via SMTP RCPT TO. May not work on all infrastructure (port 25 restrictions).

## `checkDisposable` (type: `boolean`):

Check email domain against 30,000+ known disposable/temporary email providers.

## `checkRole` (type: `boolean`):

Detect role-based email addresses (admin@, info@, support@, noreply@, etc.).

## `checkFreeProvider` (type: `boolean`):

Detect free email providers (Gmail, Yahoo, Hotmail, Outlook, etc.).

## `checkCatchAll` (type: `boolean`):

Detect if the domain accepts all email addresses (catch-all configuration). Slower — requires additional SMTP connection.

## `smtpTimeout` (type: `integer`):

Timeout in milliseconds for SMTP connections.

## `maxConcurrency` (type: `integer`):

Maximum number of emails to validate simultaneously.

## Actor input object example

```json
{
  "emails": [
    "test@gmail.com",
    "invalid@nonexistent-domain-12345.com"
  ],
  "checkMx": true,
  "checkSmtp": true,
  "checkDisposable": true,
  "checkRole": true,
  "checkFreeProvider": true,
  "checkCatchAll": false,
  "smtpTimeout": 10000,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Email validation results with quality scores, MX records, SMTP status, disposable/role/free flags, and suggestions.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/email-validator").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 = {}

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call junipr/email-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=junipr/email-validator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Email Validator & Verifier",
        "description": "6-layer email validation: format, MX records, SMTP mailbox verify, disposable detection (5K+ domains), role-based check, free provider ID. Quality score 0-100 per email. Typo suggestions. Batch processing.",
        "version": "1.0",
        "x-build-id": "MMtWqEfNsLYnGbjFP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~email-validator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-email-validator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/junipr~email-validator/runs": {
            "post": {
                "operationId": "runs-sync-junipr-email-validator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/junipr~email-validator/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-email-validator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "emails": {
                        "title": "Email Addresses",
                        "type": "array",
                        "description": "List of email addresses to validate. One email per line or comma-separated.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "test@gmail.com",
                            "invalid@nonexistent-domain-12345.com"
                        ]
                    },
                    "checkMx": {
                        "title": "Check MX Records",
                        "type": "boolean",
                        "description": "Verify the domain has valid mail exchange (MX) DNS records.",
                        "default": true
                    },
                    "checkSmtp": {
                        "title": "Check SMTP",
                        "type": "boolean",
                        "description": "Connect to the mail server and verify the mailbox exists via SMTP RCPT TO. May not work on all infrastructure (port 25 restrictions).",
                        "default": true
                    },
                    "checkDisposable": {
                        "title": "Check Disposable",
                        "type": "boolean",
                        "description": "Check email domain against 30,000+ known disposable/temporary email providers.",
                        "default": true
                    },
                    "checkRole": {
                        "title": "Check Role-Based",
                        "type": "boolean",
                        "description": "Detect role-based email addresses (admin@, info@, support@, noreply@, etc.).",
                        "default": true
                    },
                    "checkFreeProvider": {
                        "title": "Check Free Provider",
                        "type": "boolean",
                        "description": "Detect free email providers (Gmail, Yahoo, Hotmail, Outlook, etc.).",
                        "default": true
                    },
                    "checkCatchAll": {
                        "title": "Check Catch-All",
                        "type": "boolean",
                        "description": "Detect if the domain accepts all email addresses (catch-all configuration). Slower — requires additional SMTP connection.",
                        "default": false
                    },
                    "smtpTimeout": {
                        "title": "SMTP Timeout (ms)",
                        "minimum": 3000,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Timeout in milliseconds for SMTP connections.",
                        "default": 10000
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of emails to validate simultaneously.",
                        "default": 5
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
