# Bulk Email Syntax & MX Validator (`snappytools/email-syntax-mx-validator`) Actor

This Actor validates lists of email addresses without sending any email and without SMTP probing. For each address it performs an RFC-style syntax check, a DNS MX lookup (falling back to A records, per RFC 5321), detection of disposable/throwaway domains, detection of role accounts such as info@.

- **URL**: https://apify.com/snappytools/email-syntax-mx-validator.md
- **Developed by:** [Snappy](https://apify.com/snappytools) (community)
- **Categories:** Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$43.10 / 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.

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 Validator – bulk email syntax and MX check

Paste in a list of email addresses and get back one row per address with a verdict you can filter on. Each row says whether the address is well formed, whether its domain can receive mail, whether it is a disposable or role address, and what the likely typo fix is.

No email is sent and no mailbox is contacted. The check uses a syntax test and public DNS lookups only. Schedule it to clean new lists on a regular basis.

### Why this one

- **No emails sent.** It does not send mail and does not probe SMTP servers, so it can't hurt your sender reputation.
- **Five checks per address.** Syntax, DNS MX lookup (with A record fallback per RFC 5321), disposable domains, role accounts such as info@, and typo suggestions.
- **A clear verdict.** The `status` field is `valid`, `risky` or `invalid`, and `reason` tells you why.
- **Duplicates removed.** Repeated addresses are dropped, ignoring case, so you don't pay twice.
- **Fair pricing.** $43.10 per 1,000 results, and runs with no results cost nothing.

### Quick start

```json
{
  "checkMx": true,
  "emails": [
    "info@example.com",
    "john.doe@gmial.com",
    "test@mailinator.com"
  ],
  "maxEmails": 5
}
```

This returns one row per unique address, with its status, reason and any suggested correction.

### What you can use it for

| Who | What for |
| --- | --- |
| Email marketers | Clean a list before a campaign to cut bounces |
| Product and growth teams | Screen sign-ups for disposable addresses and typos |
| B2B sales teams | Flag role accounts like info@ or sales@ so you can chase named contacts |
| Data and ops teams | Run a quick hygiene audit on an exported contact spreadsheet |

### How to use it

1. Click **Try for free**.
2. In **Email addresses**, add your list, for example `info@example.com`.
3. Set **Maximum emails** to cap the run, from 1 to 10,000. The default is 1,000.
4. Leave **Check DNS MX records** on to look up mail servers for each unique domain. Turn it off for a syntax-only check.
5. Click **Start**.
6. Use **Schedules** to rerun it on new lists.

### What data you get

Each address becomes one row in the dataset.

| Field | What it is | Example |
| --- | --- | --- |
| `email` | The address as you supplied it | `john.doe@gmial.com` |
| `normalizedEmail` | The cleaned, normalised address | `john.doe@gmial.com` |
| `domain` | The part after the @ | `gmial.com` |
| `url` | The domain as an https link | `https://gmial.com` |
| `syntaxValid` | Whether the address is well formed | `true` |
| `hasMx` | Whether the domain has mail records | `true` |
| `mxRecords` | The mail servers found | `["gmial.com"]` |
| `isDisposable` | Whether it is a throwaway domain | `false` |
| `isRoleAccount` | Whether it is a role address like info@ | `false` |
| `suggestion` | A likely corrected address, or null | `john.doe@gmail.com` |
| `status` | `valid`, `risky` or `invalid` | `risky` |
| `reason` | Why that status was given | `possible_typo` |
| `checkedAt` | When the check ran | `2026-10-28T10:22:42.241Z` |
| `id` | A stable ID for the row | `1d9af1529cfc75c8970e8b517246a543717f7872` |

### Pricing

| Event | Price |
| --- | --- |
| Result (one per address checked) | $0.04 |

The exact price is $43.10 per 1,000 results. There is no start fee.

| Run | Cost |
| --- | --- |
| 100 results | $4.31 |
| 1,000 results | $43.10 |
| 10,000 results | $431.00 |

### Good to know

- **A valid status is not proof of a mailbox.** It means the address is well formed and the domain can receive mail. The specific mailbox is never contacted.
- **Limit of 10,000 addresses per run.** Set by **Maximum emails**.
- **Data source.** Public DNS lookups and a bundled list of known disposable domains. The list is not exhaustive.
- **Only your addresses are processed.** Nothing is collected from other websites. Make sure you have a lawful basis to process the addresses you submit.
- **Not affiliated.** This tool isn't affiliated with or endorsed by any email provider.

### FAQ

**Does it send emails to check them?** No. It never sends mail or talks to mail servers directly.

**Does it catch typos?** Yes. For common providers it suggests a fix, for example gmial.com to gmail.com, in the `suggestion` field.

**What is a role account?** An address like info@, sales@ or support@ that usually goes to a team, not a person.

### Getting the data out

Download results as Excel, CSV or JSON from the Output tab. Send them to Google Sheets, Slack, Zapier, Make or webhooks from the **Integrations** tab. Every run is also available through the Apify API, and you can schedule runs from **Schedules**.

### Questions or problems

Open an issue on the **Issues** tab and include the run link. I reply within one business day.

### Related tools

- [TED Europa Tender Scraper](https://apify.com/snappytools/ted-europa-tender-scraper): pulls public tender notices from TED Europa
- [Companies House Company Scraper](https://apify.com/snappytools/companies-house-uk-scraper): gets UK company records from Companies House

# Actor input Schema

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

List of email addresses to validate. Duplicates are removed (case-insensitive).

## `maxEmails` (type: `integer`):

Upper bound on the number of emails processed in one run (1-10000).

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

When enabled, perform DNS MX lookups (with A record fallback) for each unique domain.

## Actor input object example

```json
{
  "emails": [
    "info@example.com",
    "john.doe@gmial.com",
    "test@mailinator.com"
  ],
  "maxEmails": 1000,
  "checkMx": true
}
```

# Actor output Schema

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

No description

# 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": [
        "info@example.com",
        "john.doe@gmial.com",
        "test@mailinator.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("snappytools/email-syntax-mx-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 = { "emails": [
        "info@example.com",
        "john.doe@gmial.com",
        "test@mailinator.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("snappytools/email-syntax-mx-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 '{
  "emails": [
    "info@example.com",
    "john.doe@gmial.com",
    "test@mailinator.com"
  ]
}' |
apify call snappytools/email-syntax-mx-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,snappytools/email-syntax-mx-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/0aUQDoD0jFfSGkWMo/builds/iEioDmQWVPT5cvnBF/openapi.json
