# Email Verifier | $0.9 / 1k | Enterprise Grade (`fatihtahta/email-verifier-validator-pro`) Actor

Advanced email verification with live handshakes and catch-all detection by using validatedmails.com API. Validates SMTP, DNS/MX, and deliverability; returns rich detailed reasoning. Use to clean lists, cut bounces, protect sender reputation.

- **URL**: https://apify.com/fatihtahta/email-verifier-validator-pro.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Lead generation, Developer tools, Integrations
- **Stats:** 1,164 total users, 143 monthly users, 99.9% runs succeeded, 19 bookmarks
- **User rating**: 4.14 out of 5 stars

## Pricing

from $0.89 / 1,000 results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Email Verifier Pro

**Slug:** fatihtahta/email-verifier-validator-pro

### Overview

Email Verifier Pro validates email addresses and returns structured records with normalized email values, domain details, deliverability verdicts, confidence indicators, and validation checks. Each run produces consistent JSON output for every submitted address, making the results straightforward to use in reporting, segmentation, and operational workflows. The actor is built around [ValidatedMails.com](https://validatedmails.com), a dedicated email validation service, which makes the output especially useful for improving contact quality before outreach or onboarding. It automates repetitive verification tasks at scale so teams can avoid manual checks and keep decision rules consistent. In practice, this saves time for both one-time cleanups and recurring data quality operations.

### Why Use This Actor

- **Market research and analytics teams:** Measure email list quality over time, track deliverability trends by domain, and monitor risk patterns such as disposable or role-based addresses.
- **Product and content teams:** Improve signup and lead form quality by identifying invalid or risky addresses early and reducing downstream friction in lifecycle campaigns.
- **Developers and data engineering teams:** Feed standardized validation records into ETL jobs, data warehouses, and internal services without custom parsing for each run.
- **Lead generation and enrichment teams:** Pre-qualify prospect lists before outreach, prioritize high-confidence records, and reduce bounce-related waste.
- **CRM and revenue operations teams:** Maintain cleaner customer data, support healthier sender reputation, and improve segmentation accuracy for engagement workflows.

### Input Parameters

Provide any combination of URLs, queries, and filters…

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `emailList` | `string[]` | List of email addresses to validate (for example: `tester@company.com`). Add one or many addresses; each entry is validated and returned as a separate result record. Allowed values: any syntactically valid email string format. | – |

### Example Input

```json
{
  "emailList": [
    "amigos@apify.com",
    "support@databricks.com",
    "hello@validatedmails.com",
    "sales@example.org",
    "notamail@email.com"
  ]
}
```

### Output

#### 6.1 Output destination

The actor writes results to an Apify dataset as JSON records. And the dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs without post-processing.

Each run also writes a `RUN-SUMMARY` record to the default key-value store with exact input, saved, pending, skipped, retry, recovery-wait, and charged-event counts. Check this receipt when determining whether a run is complete or resumable.

#### 6.2 Record envelope (all items)

Every dataset item includes these stable identifiers:

- **type** *(string, required)*
- **id** *(number, required)*
- **url** *(string, required)*

Recommended idempotency key: `type + ":" + id`.
Use this key for deduplication and upserts so repeated runs update existing entities instead of creating duplicates.

#### 6.3 Examples

Example: email verification | Valid (`type = "email_verification"`)

```json
{
  "type": "email_verification",
  "id": 100001,
  "url": "https://validatedmails.com",
  "email": "user.one@example-company.com",
  "normalizedEmail": "user.one@example-company.com",
  "domain": "example-company.com",
  "request": {
    "succeeded": true,
    "httpStatusCode": 200,
    "errorMessage": null,
    "durationMs": 2131
  },
  "verdict": {
    "isValid": true,
    "status": "valid",
    "state": "Deliverable",
    "confidenceScore": 100,
    "primaryReason": "ACCEPTED EMAIL",
    "reasons": [
      "syntax_ok",
      "mx_ok",
      "a_ok"
    ]
  },
  "classification": {
    "isFreeProvider": false,
    "isRoleBased": false,
    "isDisposable": false,
    "hasTag": false
  },
  "checks": {
    "smtpReachable": true,
    "syntaxValid": true,
    "mxRecordsValid": true,
    "aRecordValid": true,
    "catchAllDomain": null,
    "mxHosts": [
      "example-company-com.mail.protection.outlook.com"
    ],
    "apiResponseTimeMs": 2002
  },
  "traceId": "11111111-2222-4333-8444-555555555555"
}
```

Example: email verification | Invalid (`type = "email_verification"`)

```json
{
  "type": "email_verification",
  "id": 100002,
  "url": "https://validatedmails.com",
  "email": "user.two@example-agency.com",
  "normalizedEmail": "user.two@example-agency.com",
  "domain": "example-agency.com",
  "request": {
    "succeeded": true,
    "httpStatusCode": 200,
    "errorMessage": null,
    "durationMs": 936
  },
  "verdict": {
    "isValid": false,
    "status": "invalid",
    "state": "Not Deliverable",
    "confidenceScore": 60,
    "primaryReason": "INVALID MAIL",
    "reasons": [
      "syntax_ok",
      "mx_ok",
      "a_ok"
    ]
  },
  "classification": {
    "isFreeProvider": false,
    "isRoleBased": false,
    "isDisposable": false,
    "hasTag": false
  },
  "checks": {
    "smtpReachable": false,
    "syntaxValid": true,
    "mxRecordsValid": true,
    "aRecordValid": true,
    "catchAllDomain": null,
    "mxHosts": [
      "aspmx.l.google.com",
      "alt1.aspmx.l.google.com",
      "alt2.aspmx.l.google.com"
    ],
    "apiResponseTimeMs": 712
  },
  "traceId": "66666666-7777-4888-9999-aaaaaaaaaaaa"
}
```

Example: email verification | Valid but catch-all domain (`type = "email_verification"`)

```json
{
  "type": "email_verification",
  "id": 100003,
  "url": "https://validatedmails.com",
  "email": "user.three@example-technology.com",
  "normalizedEmail": "user.three@example-technology.com",
  "domain": "example-technology.com",
  "request": {
    "succeeded": true,
    "httpStatusCode": 200,
    "errorMessage": null,
    "durationMs": 5481
  },
  "verdict": {
    "isValid": true,
    "status": "valid",
    "state": "Deliverable",
    "confidenceScore": 70,
    "primaryReason": "ACCEPTED EMAIL",
    "reasons": [
      "syntax_ok",
      "mx_ok",
      "a_ok"
    ]
  },
  "classification": {
    "isFreeProvider": false,
    "isRoleBased": false,
    "isDisposable": false,
    "hasTag": false
  },
  "checks": {
    "smtpReachable": true,
    "syntaxValid": true,
    "mxRecordsValid": true,
    "aRecordValid": true,
    "catchAllDomain": true,
    "mxHosts": [
      "example-technology.in.tmes.trendmicro.com"
    ],
    "apiResponseTimeMs": 5303
  },
  "traceId": "bbbbbbbb-cccc-4ddd-8eee-ffffffffffff"
}
```

### Field reference

#### Email verification fields (`type = "email_verification"`)

- **type** *(string, required)*: Record type label.
- **id** *(number, required)*: Stable numeric record identifier.
- **url** *(string, required)*: Source website homepage URL.
- **email** *(string, required)*: Email exactly as provided in input.
- **normalizedEmail** *(string, optional)*: Normalized email representation.
- **domain** *(string, optional)*: Domain parsed from the email address.
- **request.succeeded** *(boolean, required)*: Indicates whether validation request completed.
- **request.httpStatusCode** *(number, required)*: HTTP status code for the validation request.
- **request.errorMessage** *(string, optional)*: Error details when available.
- **request.durationMs** *(number, required)*: End-to-end request duration in milliseconds.
- **verdict.isValid** *(boolean, required)*: Pass/fail validity signal. Risky catch-all addresses are not marked valid.
- **verdict.isRisky** *(boolean, required)*: Indicates a risky validation result such as a catch-all domain.
- **verdict.status** *(string, required)*: Verdict status (`valid`, `risky`, `invalid`, or `unknown`).
- **verdict.state** *(string, required)*: Human-readable deliverability state.
- **verdict.confidenceScore** *(number, required)*: Confidence score from 0 to 100.
- **verdict.primaryReason** *(string, required)*: Primary reason text for the verdict.
- **verdict.reasons** *(string\[], optional)*: Machine-friendly reason codes.
- **classification.isFreeProvider** *(boolean, required)*: Whether provider is a free email service.
- **classification.isRoleBased** *(boolean, required)*: Whether local part appears role-based.
- **classification.isDisposable** *(boolean, required)*: Whether domain appears disposable.
- **classification.hasTag** *(boolean, required)*: Whether plus-tagging is detected.
- **checks.smtpReachable** *(boolean, optional)*: SMTP-level reachability signal.
- **checks.syntaxValid** *(boolean, required)*: Syntax validation result.
- **checks.mxRecordsValid** *(boolean, required)*: MX routing validation result.
- **checks.aRecordValid** *(boolean, required)*: A-record fallback routing result.
- **checks.catchAllDomain** *(boolean, optional)*: Catch-all detection signal.
- **checks.mxHosts** *(string\[], optional)*: Resolved MX host list.
- **checks.apiResponseTimeMs** *(number, required)*: Validation API response time in milliseconds.
- **traceId** *(string, required)*: Trace identifier for diagnostics and support.

### Data guarantees & handling

- **Best-effort extraction:** fields may vary by region/session/availability/UI experiments.
- **Optional fields:** null-check in downstream code.
- **Deduplication:** recommend `type + ":" + id`.
- **Managed throughput:** the actor continuously refills up to four two-address pages (at most eight addresses in flight), retries only unresolved addresses during temporary service pressure, and checkpoints completed output before recovery waits.

### How to Run on Apify

1. Open the actor in Apify Console.
2. Configure your search parameters (for this actor, provide the email addresses you want to validate).
3. Set the maximum number of outputs to collect.
4. Click **Start** and wait for the run to finish.
5. Download results in JSON, CSV, Excel, or other supported formats.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**
You can schedule recurring runs to keep your validation dataset current without manual execution. This is useful for routine CRM hygiene, lead intake checks, and periodic list refreshes.

- Navigate to **Schedules** in Apify Console
- Create a new schedule (daily, weekly, or custom cron)
- Configure input parameters
- Enable notifications for run completion
- (Optional) Add webhooks for automated processing

#### Integration Options

This actor is designed to plug directly into automated validation workflows and downstream systems.

- **Webhooks:** Automatically trigger downstream processing (e.g., CRM updates, tagging, cleanup jobs) when a run completes. Ideal for fully hands-off validation pipelines.
- **Zapier:** Connect validation results to 5,000+ apps without writing code. Common flows include updating HubSpot, Airtable, Notion, or triggering Slack alerts for risky emails.
- **Make (Integromat):** Build multi-step logic such as validating emails → filtering by status → enriching → storing only "deliverable" results.
- **Google Sheets:** Push validated results into a spreadsheet for internal review, segmentation, or campaign preparation.
- **Slack / Discord:** Send automated summaries of run results (e.g., total validated, invalid count, catch-all domains detected).
- **Email Reports:** Automatically send structured validation reports to stakeholders after scheduled runs.

All integrations work via Apify run outputs, webhooks, or API access — enabling both no-code and developer-based automation setups.

### Performance

Execution time varies with recipient mail-server latency and temporary validation capacity. The actor checkpoints completed rows and records exact progress in `RUN-SUMMARY`; use that receipt instead of relying on a fixed duration estimate.

### Compliance & Ethics

#### Responsible Usage

This actor processes email addresses provided directly by the user for validation purposes only.\
It does **not** crawl, scrape, or harvest data from third-party platforms.

Legitimate use cases include:

- CRM hygiene and database cleanup
- Lead intake validation in signup or onboarding flows
- Fraud prevention and abuse mitigation
- Pre-campaign list verification
- Internal data quality and deliverability audits

Users are responsible for ensuring their collection and use of data complies with applicable laws, regulations, and platform terms. This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site’s terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable (e.g., GDPR, CCPA)

### Support

For help, use the Issues tab on the actor page in Apify Console. Include the input you used (redacted), the run ID, a clear expected vs. actual behavior summary, and an optional small output sample so troubleshooting can start quickly.

# Actor input Schema

## `emailList` (type: `array`):

Enter specific emails you want to validate, eg. tester@company.com

## Actor input object example

```json
{
  "emailList": [
    "amigos@apify.com",
    "support@databricks.com",
    "notamail@email.com"
  ]
}
```

# Actor output Schema

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

No description

## `runSummary` (type: `string`):

Machine-readable completion, recovery, pending, and charge counts for this run.

# 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 = {
    "emailList": [
        "amigos@apify.com",
        "support@databricks.com",
        "notamail@email.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/email-verifier-validator-pro").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 = { "emailList": [
        "amigos@apify.com",
        "support@databricks.com",
        "notamail@email.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/email-verifier-validator-pro").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 '{
  "emailList": [
    "amigos@apify.com",
    "support@databricks.com",
    "notamail@email.com"
  ]
}' |
apify call fatihtahta/email-verifier-validator-pro --silent --output-dataset

```

## MCP server setup

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

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/zjec57U2EHqmfIIGI/builds/IA8WiAkSNut6OjqZb/openapi.json
