# Bulk Email Validator – Syntax, MX, Disposable, Role (no SMTP) (`flets_sv/email-validator-mx`) Actor

Validate email lists in bulk: syntax, MX records, disposable and role addresses, free providers and typo fixes (gmial.com). Fast, cheap, no SMTP pinging.

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

## Pricing

$0.30 / 1,000 email checkeds

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

## Bulk Email Validator – Syntax, MX, Disposable, Role (no SMTP)

Validate email lists in bulk: syntax, MX records, disposable and role addresses, free providers and typo fixes (`gmial.com` → `gmail.com`). No SMTP pinging, so it is fast, cheap and safe for your sender reputation. *Versión en español más abajo.*

***

### Use cases

- Clean a mailing list before a campaign to cut bounces and protect sender reputation
- Block disposable and role addresses (info@, sales@) on signup forms via API
- Lead enrichment pipelines: verify scraped emails cheaply, with typo suggestions (gmial.com -> gmail.com)
- CRM hygiene: re-check old contacts on a schedule

### English

#### What does it do?

For every email the Actor checks the syntax, looks up the MX records of the domain (with an A-record fallback), optionally reports SPF and DMARC, and flags disposable domains, role addresses (`info@`, `sales@`), free providers and likely typos. Each email gets a `veredicto` (`valid`, `risky`, `invalid` or `unknown`) with the reasons in `motivos`.

Use cases: cleaning a mailing list before a campaign, signup form checks, lead enrichment, CRM hygiene.

#### Input

- `emails`: list of addresses, one per line.
- `urlLista`: public URL of a CSV or TXT; every email found is checked.
- `comprobarMx`, `comprobarSpfDmarc`, `sugerirCorreccion`: choose the checks.
- `soloValidos`: output only valid emails (all checked emails are still charged).
- `soloNuevos`: skip emails already checked in earlier runs, and do not charge them again.
- `maxEmails`, `concurrencia`: budget and speed limits.

Duplicates inside a run are checked and charged once.

#### Output

One record per email: `email`, `emailNormalizado`, `sintaxisValida`, `dominio`, `tieneMx`, `registrosMx`, `desechable`, `rol`, `proveedorGratuito`, `sugerencia`, `tieneSpf`, `tieneDmarc`, `veredicto`, `motivos`, `error`, `comprobadoEn`.

#### Pricing (pay per event)

| Event | Price | Per 1,000 |
|---|---|---|
| Email checked (`email-checked`) | $0.0003 | $0.30 |

Set a maximum spend per run; the Actor stops when the limit is reached and keeps what it saved.

#### Integrations (Make, Zapier, Google Sheets)

- **Make**: add the Apify module "Run an Actor" (Actor `Flets_sv/email-validator-mx`), paste the input JSON, chain "Get Dataset Items" and map the fields to Google Sheets, Slack, Airtable or your CRM.
- **Zapier**: the Apify app offers "Run Actor" and "Fetch Dataset Items". Add a Schedule trigger and send each row to Gmail, Slack or Notion.
- **Google Sheets**: enable the official Google Sheets integration in the Actor's Integrations tab to append every run to a sheet, or call `https://api.apify.com/v2/acts/Flets_sv~email-validator-mx/run-sync-get-dataset-items?format=csv` with POST and your input from Apps Script (`UrlFetchApp`).
- **API and webhooks**: start the Actor from the REST API, use Schedules for recurring runs and add a webhook to notify your system when a run finishes.

Input to paste into Make or Zapier:

```json
{"emails":["info@apify.com","john.doe@gmial.com","test@mailinator.com","sales@example.com","not-an-email"],"comprobarMx":true,"comprobarSpfDmarc":false,"sugerirCorreccion":true,"soloValidos":false,"soloNuevos":false,"maxEmails":100,"concurrencia":20}
```

#### FAQ

**Does it use SMTP?** No. It never connects to the mail server, so a `valid` verdict means the domain can receive mail, not that the mailbox exists.

**What if DNS fails?** The verdict is `unknown` and `error` explains why; it is not marked invalid.

**Can I run it daily?** Yes. Use `soloNuevos` to process only addresses not seen before.

***

### Español

#### ¿Qué hace?

Para cada email comprueba la sintaxis, consulta los registros MX del dominio (con respaldo en registro A), informa opcionalmente de SPF y DMARC, y marca dominios desechables, direcciones de rol, proveedores gratuitos y erratas probables. Cada email recibe un `veredicto` (`valid`, `risky`, `invalid` o `unknown`) y los motivos en `motivos`.

#### Input

`emails`, `urlLista`, `comprobarMx`, `comprobarSpfDmarc`, `sugerirCorreccion`, `soloValidos`, `soloNuevos`, `maxEmails` y `concurrencia`. Con la entrada vacía valida cinco ejemplos.

#### Output

Un registro por email con los campos de la sección inglesa.

#### Precios (pago por evento)

| Evento | Precio | Por 1.000 |
|---|---|---|
| Email comprobado (`email-checked`) | 0,0003 $ | 0,30 $ |

Se cobra cada email único comprobado, aunque `soloValidos` no lo emita.

#### Integraciones (Make, Zapier, Google Sheets)

- **Make**: añade el módulo de Apify «Run an Actor» (Actor `Flets_sv/email-validator-mx`), pega el input JSON y encadena «Get Dataset Items»; después mapea los campos a Google Sheets, Slack, Airtable o tu CRM.
- **Zapier**: la app de Apify ofrece «Run Actor» y «Fetch Dataset Items». Ponle un disparador de horario y envía cada fila a Gmail, Slack o Notion.
- **Google Sheets**: en la pestaña Integrations del Actor activa la integración oficial con Google Sheets para añadir cada ejecución a una hoja, o llama desde Apps Script (`UrlFetchApp`) a `https://api.apify.com/v2/acts/Flets_sv~email-validator-mx/run-sync-get-dataset-items?format=csv` con POST y tu input.
- **API y webhooks**: lanza el Actor por API REST, programa ejecuciones (Schedules) y avisa a tu sistema con un webhook al terminar.

Ejemplo de input para pegar en Make o Zapier:

```json
{"emails":["info@apify.com","john.doe@gmial.com","test@mailinator.com","sales@example.com","not-an-email"],"comprobarMx":true,"comprobarSpfDmarc":false,"sugerirCorreccion":true,"soloValidos":false,"soloNuevos":false,"maxEmails":100,"concurrencia":20}
```

#### Preguntas frecuentes

**¿Usa SMTP?** No: `valid` significa que el dominio puede recibir correo, no que el buzón exista.

**¿Cómo recibo solo los nuevos?** Activa `soloNuevos` en ejecuciones programadas.

### Ejemplos de uso / Usage examples

#### Example output (real run, 2026-11-05)

First rows returned by a real run of this Actor on 2026-11-05 (shortened columns, values truncated):

| email | sintaxisValida | tieneMx | desechable | rol | sugerencia | veredicto |
|---|---|---|---|---|---|---|
| info@apify.com | True | True | False | True | - | valid |
| john.doe@gmial.com | True | False | True | False | gmail.com | risky |
| test@mailinator.com | True | True | True | False | - | risky |

#### Copy-paste inputs

**1. Check a short list with typo suggestions**

```json
{
  "emails": [
    "info@apify.com",
    "john.doe@gmial.com",
    "test@mailinator.com"
  ],
  "comprobarMx": true,
  "sugerirCorreccion": true
}
```

**2. Clean a big list from a URL, keep only valid emails**

```json
{
  "urlLista": "https://example.com/emails.txt",
  "soloValidos": true,
  "maxEmails": 10000
}
```

#### Call it from your code (Apify API)

```bash
curl -X POST "https://api.apify.com/v2/acts/Flets_sv~email-validator-mx/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"emails": ["info@apify.com", "john.doe@gmial.com", "test@mailinator.com"], "comprobarMx": true, "sugerirCorreccion": true}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("Flets_sv/email-validator-mx").call(run_input={"emails": ["info@apify.com", "john.doe@gmial.com", "test@mailinator.com"], "comprobarMx": true, "sugerirCorreccion": true})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

No code? Use the Apify modules for **Make** and **Zapier** (run the Actor, then fetch dataset items), or the **Google Sheets** integration in the Actor's Integrations tab to append each run to a sheet.

# Actor input Schema

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

One per line. Domains (without @) get a domain-only check.

## `urlLista` (type: `string`):

Optional public URL of a CSV or TXT; every email found in it is checked.

## `comprobarMx` (type: `boolean`):

Look up MX (and A fallback) records. Disable for syntax-only speed.

## `comprobarSpfDmarc` (type: `boolean`):

Report whether the domain publishes SPF and DMARC records.

## `sugerirCorreccion` (type: `boolean`):

Suggest `gmail.com` for `gmial.com` and similar.

## `soloValidos` (type: `boolean`):

Output only emails with verdict `valid` (all checked emails are still charged).

## `soloNuevos` (type: `boolean`):

Skip emails already checked in previous runs (and do not charge them again).

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

Hard limit of emails per run. Protects your budget.

## `concurrencia` (type: `integer`):

Parallel requests. Keep it low to be polite with the source.

## Actor input object example

```json
{
  "emails": [
    "info@apify.com",
    "john.doe@gmial.com",
    "test@mailinator.com",
    "sales@example.com",
    "not-an-email"
  ],
  "urlLista": "",
  "comprobarMx": true,
  "comprobarSpfDmarc": false,
  "sugerirCorreccion": true,
  "soloValidos": false,
  "soloNuevos": false,
  "maxEmails": 100,
  "concurrencia": 20
}
```

# Actor output Schema

## `resultados` (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@apify.com",
        "john.doe@gmial.com",
        "test@mailinator.com",
        "sales@example.com",
        "not-an-email"
    ],
    "maxEmails": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("flets_sv/email-validator-mx").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@apify.com",
        "john.doe@gmial.com",
        "test@mailinator.com",
        "sales@example.com",
        "not-an-email",
    ],
    "maxEmails": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("flets_sv/email-validator-mx").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@apify.com",
    "john.doe@gmial.com",
    "test@mailinator.com",
    "sales@example.com",
    "not-an-email"
  ],
  "maxEmails": 100
}' |
apify call flets_sv/email-validator-mx --silent --output-dataset

```

## MCP server setup

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

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/r8BjsCvbSHPiGmlIj/builds/KngcjdozsBYsxOZmA/openapi.json
