# MX Record Checker API - Does This Domain Accept Mail? (`vonsensey/mx-record-checker-api`) Actor

Check domains for mail records in bulk: MX hosts in priority order, A-record fallback, whether the domain accepts mail at all, and whether it is a disposable or free-mail provider. Website URLs accepted. Cheapest event in the suite.

- **URL**: https://apify.com/vonsensey/mx-record-checker-api.md
- **Developed by:** [Blackcube](https://apify.com/vonsensey) (community)
- **Categories:** Developer tools, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 email verified (with mailbox check)s

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## MX Record Checker API - Does This Domain Accept Mail?

#### The contact validation suite

- [Email Verifier & Validator API](https://apify.com/vonsensey/email-verifier-validator-api) — emails and phone numbers verified in one run, priced by what could be checked
- [Bulk Email List Cleaner API](https://apify.com/vonsensey/bulk-email-list-cleaner-api) — paste a whole list, get it back deduplicated, verified and scored
- [Disposable Email Checker API](https://apify.com/vonsensey/disposable-email-checker-api) — the fast, cheap check: throwaway providers, role addresses, free mail, typos, MX
- [Phone Number Validator API](https://apify.com/vonsensey/phone-number-validator-api) — numbers in any format in, validity, line type, country and E.164 out

Paste domains or website URLs and get their mail records: MX hosts in priority order, A-record fallback, an accepts-mail flag, and whether the provider is disposable or free mail. Pure computation — nothing is scraped, nothing is sent, no proxy, no API key. **Invalid input is free**, and **you pay less when less could be checked**.

### Quick start

1. Press **Start** — the defaults are a working run that shows every verdict.
2. Replace them with your own domains or website URLs, one per line.
3. Take the dataset as JSON, CSV or Excel, or via the API. Every row has a `type`; the free `coverage` row says what was asked for, what arrived, and whether mailbox checks were possible from this network.

### What people use it for

- **Enrichment.** Which mail provider a company uses (Google, Microsoft, Proton…) is visible in the MX hosts.
- **Feeding an AI agent or workflow.** Send objects from n8n, Make or a sheet as `records`; the email or phone field is found by name and every other field comes back on the row as `passthrough`.

### What the rows look like

#### A domain row

```json
{
  "type": "domain",
  "input": "https://www.wikipedia.org/",
  "domain": "wikipedia.org",
  "hasMx": true,
  "mxHosts": [{ "exchange": "mx-in1234.wikimedia.org", "priority": 10 }],
  "hasA": false,
  "acceptsMail": true,
  "isDisposable": false,
  "isFreeMail": false
}
```

### What it costs

| You pay for | Price |
|---|---|
| Each domain's mail records checked | **$0.50 per 1,000 domains** |

**Free, always:** an input that is not an email, a phone number or a domain at all, a duplicate of something already in the run (one inbox spelled three ways is one charge), every input the run did not reach, every error row, the coverage row and the run summary. A run that checks nothing costs nothing.

Set **Cost ceiling (USD)** to stop any run before it passes a number you choose; the free summary row reports what the run actually spent.

### FAQ

#### Do I need an API key for anything?

No. Everything is handled for you and there is nothing to buy on top. Pure computation — no website is scraped, no proxy is used.

#### Can I send my CRM rows instead of a plain list?

Yes. Put objects in **Records**. The email, phone or domain field is found by name (email, e-mail, phone, mobile, tel, domain, website…) and every other field is returned on the row as `passthrough`, so your ids come back attached.

#### Will I be charged twice for the same address?

No. Addresses are collapsed on their normalised form — Gmail dots and +tags, upper and lower case — so one inbox is one row and one charge.

### Limits, stated plainly

Nothing here contacts WhatsApp, Telegram or any messaging service — those checks need an unofficial client and are not sold.

### Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is `vonsensey/mx-record-checker-api`; every snippet below sends `{}`, which runs the defaults shown on the form — replace it with your own input.

#### n8n

Install the **Apify** community node (`@apify/n8n-nodes-apify` under *Settings → Community Nodes*, or search "Apify" on n8n Cloud). Add **Apify → Run Actor** with Actor `vonsensey/mx-record-checker-api` and your input JSON, then **Apify → Get Dataset Items** on the run's `defaultDatasetId` and pipe the rows anywhere. For scheduled runs, the **On new Apify Event** trigger fires when a run of this Actor finishes.

#### MCP (Claude, Cursor, VS Code, any MCP client)

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=vonsensey/mx-record-checker-api",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

Your agent then calls `vonsensey/mx-record-checker-api` as a tool with the same input the form takes and reads the dataset back.

#### REST API (one call, rows in the response)

```bash
curl -X POST "https://api.apify.com/v2/acts/vonsensey~mx-record-checker-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{}'
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/mx-record-checker-api").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

#### JavaScript

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/mx-record-checker-api').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Make, Zapier, LangChain, CrewAI

The Apify app in **Make** and **Zapier** has a *Run an Actor* module: pick `vonsensey/mx-record-checker-api`. In **LangChain** and **CrewAI** the Apify tool wrappers take the same Actor id. A daily **schedule** needs nothing but the Console: *Schedules → Create → this Actor → cron*, and the dataset fills on its own.

# Actor input Schema

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

One address per line. Each is checked for syntax, the domain's mail records, disposable and role addresses, free-mail providers, a typo suggestion, and — when the mail server answers — whether the mailbox exists. Anything that is not an email at all is a free row.

## `phones` (type: `array`):

One number per line, in any format. Numbers without a + prefix are read in the default country below. Each returns valid/possible, E.164, national and international formats, country, and the line type (mobile, fixed line, toll-free, VoIP…).

## `domains` (type: `array`):

Domains or website URLs to check for mail records only: MX hosts in priority order, A-record fallback, whether it accepts mail, disposable or free-mail provider.

## `records` (type: `array`):

For pipelines: an array of objects such as rows from a CRM or a sheet. The email / phone / domain field is found by name (case-insensitive: email, e-mail, phone, mobile, tel, domain, website…) and every other field is returned on the row as `passthrough`, so you get your own ids back.

## `defaultCountry` (type: `string`):

Two-letter ISO code used for numbers written without a + prefix (US when left empty). Numbers with an international prefix ignore it.

## `smtpCheck` (type: `boolean`):

Connect to the domain's mail server and ask whether the mailbox exists (deliverable, undeliverable, or catch-all). Turn it off for a faster, cheaper check of syntax, domain and lists only. When a server does not answer, the row says so and is billed at the cheaper 'checked' price.

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

Hard cap on billable rows for this run. Inputs not reached get a free row saying so.

## `maxCostUsd` (type: `integer`):

Stop the run before it spends more than this. Leave empty for no ceiling. The free summary row always reports what the run actually spent.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "github.com",
    "https://www.wikipedia.org/",
    "gmail.com",
    "mailinator.com",
    "example.com",
    "this-domain-does-not-exist-4f7a9.com",
    "proton.me",
    "microsoft.com",
    "not a domain"
  ],
  "defaultCountry": "US",
  "smtpCheck": true,
  "maxItems": 1000
}
```

# Actor output Schema

## `dataset` (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 = {
    "domains": [
        "apify.com",
        "github.com",
        "https://www.wikipedia.org/",
        "gmail.com",
        "mailinator.com",
        "example.com",
        "this-domain-does-not-exist-4f7a9.com",
        "proton.me",
        "microsoft.com",
        "not a domain"
    ],
    "defaultCountry": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vonsensey/mx-record-checker-api").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 = {
    "domains": [
        "apify.com",
        "github.com",
        "https://www.wikipedia.org/",
        "gmail.com",
        "mailinator.com",
        "example.com",
        "this-domain-does-not-exist-4f7a9.com",
        "proton.me",
        "microsoft.com",
        "not a domain",
    ],
    "defaultCountry": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("vonsensey/mx-record-checker-api").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 '{
  "domains": [
    "apify.com",
    "github.com",
    "https://www.wikipedia.org/",
    "gmail.com",
    "mailinator.com",
    "example.com",
    "this-domain-does-not-exist-4f7a9.com",
    "proton.me",
    "microsoft.com",
    "not a domain"
  ],
  "defaultCountry": "US"
}' |
apify call vonsensey/mx-record-checker-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vonsensey/mx-record-checker-api"
        }
    }
}

```

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/QVzNMwWPxJZdLbWi0/builds/OyPBBLLDlqyUE19Cj/openapi.json
