# Bulk Email Validator & MX/SPF/DMARC Deliverability Verifier (`apex-b2b-data/bulk-email-mx-smtp-validator`) Actor

Verify bulk email lists at scale. Validates RFC 5322 syntax, live DNS MX records via Google DoH, SPF and DMARC authentication, disposable/temporary inboxes, role accounts (info@, admin@), mail gateway fingerprinting (Google Workspace, M365, Proofpoint), and 0-100 deliverability risk scoring.

- **URL**: https://apify.com/apex-b2b-data/bulk-email-mx-smtp-validator.md
- **Developed by:** [George Barnes](https://apify.com/apex-b2b-data) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 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

## Bulk Email Validator & MX/SPF/DMARC Deliverability Verifier (`$1.50 / 1K`)

**Validate high-volume email lists for syntax, disposable inboxes, role accounts, live DNS MX records via Google DoH, SPF & DMARC authentication, mail gateway fingerprinting (Google Workspace, Microsoft 365, Proofpoint, etc.), and composite deliverability risk scoring (0–100).**

Never send cold outbound campaigns or automated emails to dead inboxes, temporary spamtraps, or unauthenticated domains. Protect your sender reputation, maximize inbox placement, and avoid blacklists—at a fraction of the cost of legacy SaaS verification tools.

***

### Why Choose This Validator? (Comparison)

| Feature | This Actor | Legacy Verification SaaS (NeverBounce / ZeroBounce) | Basic Regex / Scrapers |
| :--- | :--- | :--- | :--- |
| **Pricing per 1,000 Emails** | **`$1.50 / 1K` (`$0.0015`/email)** | `$8.00 – $15.00 / 1K` (`$0.008–$0.015`) | Free or cheap but incomplete |
| **Required API Keys** | **None (Zero API keys needed)** | Mandatory API key & credit lock-in | None |
| **Required Proxies** | **None (Zero residential proxy cost)** | None | None |
| **Live DNS MX Resolution** | ✅ Google & Cloudflare DoH (fast, unblocked) | ✅ Proprietary | ❌ Often missing or blocked |
| **SPF & DMARC Security Audit** | ✅ Full TXT parse & policy extraction (`p=reject`) | ⚠️ Partial / Enterprise add-on | ❌ No |
| **Mail Gateway Fingerprinting** | ✅ Google Workspace, M365, Proofpoint, Mimecast, etc. | ⚠️ Limited | ❌ No |
| **Disposable Inbox Scrubbing** | ✅ 300+ known temporary domains | ✅ Yes | ⚠️ Outdated static lists |
| **Departmental Role Detection** | ✅ Flags `info@`, `support@`, `admin@`, etc. | ✅ Yes | ⚠️ Incomplete rules |
| **Deliverability Score (0–100)** | ✅ Transparent composite scoring | ⚠️ Black-box score | ❌ No |
| **Clay.com, n8n, Make & Python Ready**| ✅ Native Apify REST & SDK integration | ⚠️ Custom API wrappers | ❌ Manual scripts |

***

### Transparent Pricing (`$1.50` per 1,000 Emails)

Pay only for the emails you actually validate (`$0.0015` per email via Apify Pay-Per-Event), with no recurring monthly subscriptions or expiring credits:

| Workflow | Emails Validated | Total Cost |
| :--- | :--- | :--- |
| **Quick Test Run** (verify list quality) | `25` emails | **`$0.0375` (~4 cents)** |
| **Daily Outbound Campaign Scrub** | `500` emails/day | **`$0.75 / day` (`~$22/month`)** |
| **Bulk Lead List Verification** | `1,000` emails | **`$1.50`** |
| **High-Volume Enrichment** | `10,000` emails | **`$15.00`** |
| **Enterprise Database Cleanse** | `100,000` emails | **`$150.00`** |

***

### High-Intent B2B Playbooks (Copy-Paste Inputs)

#### 1. Cold Email Outbound Campaign Scrubbing (Zero-Bounce Guarantee)

Filter out invalid syntax, disposable spamtraps, and domains with missing MX records before uploading lead lists to Instantly, Smartlead, or Lemlist:

```json
{
  "emails": [
    "alex.turner@stripe.com",
    "sarah.connor@acme-industrial.com",
    "test_lead_8899@mailinator.com",
    "support@shopify.com",
    "invalid-user-format"
  ],
  "checkMx": true,
  "checkSpfDmarc": true,
  "checkDisposable": true,
  "checkRoleAccount": true,
  "dohProvider": "google",
  "maxItems": 1000
}
```

#### 2. High-Deliverability Security & Gateway Audit (Identify Google & M365 Inboxes)

Fingerprint destination mail servers to tailor email delivery timing and warm-up settings based on whether leads use Google Workspace, Microsoft 365, or strict enterprise gateways like Proofpoint / Mimecast:

```json
{
  "emails": [
    "founder@apify.com",
    "security@github.com",
    "procurement@lockheedmartin.com",
    "cfo@walmart.com"
  ],
  "checkMx": true,
  "checkSpfDmarc": true,
  "checkDisposable": true,
  "checkRoleAccount": false,
  "dohProvider": "google"
}
```

#### 3. Rapid Disposable & Role-Account Pre-Filter (Low-Latency Pass)

Validate user registration inputs or form submissions instantly without waiting on full SPF/DMARC TXT resolution:

```json
{
  "emails": [
    "user1@temp-mail.org",
    "sales@targetcompany.com",
    "real_customer@gmail.com"
  ],
  "checkMx": true,
  "checkSpfDmarc": false,
  "checkDisposable": true,
  "checkRoleAccount": true
}
```

***

### Sample Output Record

Every validated email produces a comprehensive JSON record containing all overview transformation fields:

```json
{
  "email": "support@apify.com",
  "domain": "apify.com",
  "user": "support",
  "is_syntax_valid": true,
  "is_disposable": false,
  "is_role_account": true,
  "has_mx_records": true,
  "mx_hosts": [
    "aspmx.l.google.com",
    "alt1.aspmx.l.google.com",
    "alt2.aspmx.l.google.com",
    "aspmx2.googlemail.com",
    "aspmx3.googlemail.com"
  ],
  "primary_mx": "aspmx.l.google.com",
  "has_spf": true,
  "spf_record": "v=spf1 a mx include:_spf.google.com include:mailgun.org include:amazonses.com include:19497222.spf05.hubspotemail.net -all",
  "has_dmarc": true,
  "dmarc_record": "v=DMARC1; p=reject; sp=reject; pct=100; rua=mailto:dmarc-reports@apify.com; ri=604800",
  "dmarc_policy": "reject",
  "provider": "Google Workspace",
  "deliverability_score": 85,
  "risk_score": 15,
  "risk_level": "LOW",
  "deliverability_status": "DELIVERABLE",
  "risk_reasons": [
    "ROLE_ACCOUNT"
  ],
  "validated_at": "2026-11-04T00:20:18Z"
}
```

***

### Output Fields Explanation

| Field Name | Type | Description |
| :--- | :--- | :--- |
| `email` | `string` | Normalized input email address. |
| `domain` | `string` | Extracted domain hostname. |
| `user` | `string` | Local mailbox part (before `@`). |
| `is_syntax_valid` | `boolean` | True if string conforms to RFC 5322 specification. |
| `is_disposable` | `boolean` | True if domain matches known temporary/disposable email services. |
| `is_role_account` | `boolean` | True if mailbox is a shared or departmental address (`admin@`, `info@`, etc.). |
| `has_mx_records` | `boolean` | True if domain has live mail exchange (MX) DNS records. |
| `mx_hosts` | `array` | List of MX hostnames ordered by server priority. |
| `primary_mx` | `string` | Lowest priority number MX hostname. |
| `has_spf` | `boolean` | True if a valid SPF TXT record was resolved. |
| `spf_record` | `string` | Raw SPF DNS TXT record. |
| `has_dmarc` | `boolean` | True if a valid `_dmarc.<domain>` TXT record was resolved. |
| `dmarc_record` | `string` | Raw DMARC DNS TXT record. |
| `dmarc_policy` | `string` | Extracted policy: `reject`, `quarantine`, `none`, or `missing`. |
| `provider` | `string` | Fingerprinted mail provider (`Google Workspace`, `Microsoft 365`, `Proofpoint`, etc.). |
| `deliverability_score` | `number` | Composite deliverability score (`0–100`), where `100` represents optimal deliverability. |
| `risk_score` | `number` | Inverse bounce/reputation risk score (`0–100`), where `0` is safest. |
| `risk_level` | `string` | `LOW`, `MEDIUM`, `HIGH`, or `CRITICAL`. |
| `deliverability_status` | `string` | `DELIVERABLE`, `RISKY`, or `UNDELIVERABLE`. |
| `risk_reasons` | `array` | Specific risk triggers (`DISPOSABLE_DOMAIN`, `NO_MX_RECORDS`, `MISSING_SPF`, etc.). |
| `validated_at` | `string` | ISO 8601 UTC timestamp of validation run. |

***

### Integration Snippets

#### Python (Apify Client)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "emails": [
        "support@apify.com",
        "contact@google.com",
        "test@mailinator.com"
    ],
    "checkMx": True,
    "checkSpfDmarc": True,
    "checkDisposable": True,
    "checkRoleAccount": True,
    "dohProvider": "google"
}

run = client.actor("your-username/bulk-email-mx-smtp-validator").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['email']} -> {item['deliverability_status']} ({item['deliverability_score']}/100) [{item['provider']}]")
```

#### Direct REST API (Synchronous Run for Clay / n8n / Make)

```bash
curl -X POST "https://api.apify.com/v2/acts/your-username~bulk-email-mx-smtp-validator/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "emails": ["sales@openai.com", "billing@anthropic.com"],
    "checkMx": true,
    "checkSpfDmarc": true
  }'
```

#### Standalone CLI Execution (No Apify Token Required)

```bash
## Clone repository
cd bulk-email-mx-smtp-validator

## Run standalone verification
python3 src/main.py

## Results saved to storage/datasets/default/results.json
cat storage/datasets/default/results.json
```

# Actor input Schema

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

List of email addresses to validate. Can also be pasted as individual items. If empty, defaults to sample demonstration emails.

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

Resolve live DNS MX records using Google Public DNS over HTTPS (DoH) to verify mail servers exist.

## `checkSpfDmarc` (type: `boolean`):

Query DNS TXT records for SPF authentication and DMARC enforcement policies.

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

Flag temporary throwaway domains (Mailinator, TempMail, GuerrillaMail, etc.) to protect sender reputation.

## `checkRoleAccount` (type: `boolean`):

Flag departmental role-based mailboxes (e.g., info@, support@, admin@, sales@, billing@).

## `dohProvider` (type: `string`):

Select the primary DoH provider for firewall-safe, unthrottled DNS resolution.

## `maxItems` (type: `integer`):

Safety cap on maximum number of emails processed in a single run.

## Actor input object example

```json
{
  "emails": [
    "support@apify.com",
    "contact@google.com",
    "test@mailinator.com"
  ],
  "checkMx": true,
  "checkSpfDmarc": true,
  "checkDisposable": true,
  "checkRoleAccount": true,
  "dohProvider": "google",
  "maxItems": 100
}
```

# Actor output Schema

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

Structured JSON records produced by Bulk Email Validator & MX/SPF/DMARC Deliverability Verifier in the default dataset.

# 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("apex-b2b-data/bulk-email-mx-smtp-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("apex-b2b-data/bulk-email-mx-smtp-validator").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 '{}' |
apify call apex-b2b-data/bulk-email-mx-smtp-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apex-b2b-data/bulk-email-mx-smtp-validator"
        }
    }
}
```

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/0lyhjVadv0iVovUaT/builds/5tQFjhU12vHuEMbUg/openapi.json
