# Bulk Email Verifier $1/1K | Microsoft 365 99% Accuracy (`gorang_m/email-verifier`) Actor

- **URL**: https://apify.com/gorang\_m/email-verifier.md
- **Developed by:** [Gorang\_m](https://apify.com/gorang_m) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Bulk Email Verifier - $1/1K | 99% Accuracy on Microsoft 365 Emails

Verify email lists in bulk before sending cold email campaigns. Tells you which emails are valid, invalid, disposable, role-based, or catch-all. Also detects the email provider (Microsoft 365, Google Workspace, Zoho, etc.) so you can plan your sending strategy.

Just paste your emails and run. No external accounts or API keys to set up.

### What You Get Per Email

| Field | Example | What It Tells You |
|-------|---------|-------------------|
| `result` | valid | Is this email deliverable? (valid / invalid / catch_all / unknown) |
| `quality` | good | Should you send to it? (good / risky / bad) |
| `is_disposable` | false | Is it a throwaway email? (Mailinator, Guerrilla, etc.) |
| `is_role_based` | false | Is it a department email? (info@, support@, sales@) |
| `is_free_provider` | false | Is it Gmail, Yahoo, Outlook? |
| `is_catch_all` | false | Does the domain accept everything? |
| `reason` | mailbox_exists | Why this result was given |
| `provider` | microsoft_365 | What email system the company uses |
| `mx_host` | acme.mail.protection.outlook.com | The actual mail server |

### Why the Provider Field Matters

Most verifiers just tell you valid/invalid. This actor also tells you **what email system the domain runs**: Microsoft 365, Google Workspace, Proofpoint, Mimecast, Zoho, ProtonMail, or custom.

Why that's useful:
- **Deliverability planning** -- Microsoft and Google handle cold email differently. Knowing the provider helps you adjust your sending.
- **Lead intelligence** -- a company on Proofpoint or Mimecast is likely enterprise. A company on Zoho is likely SMB.
- **Infrastructure insight** -- if you manage email domains for clients, knowing the MX host and provider saves you DNS lookups.

### How Verification Works

9 checks run in order. The actor stops at the first definitive answer:

1. **Syntax check** -- is the email formatted correctly?
2. **MX lookup** -- does the domain have a mail server?
3. **Disposable check** -- 5,000+ known throwaway domains
4. **Role-based check** -- department addresses (info@, support@, admin@, sales@)
5. **Free provider check** -- Gmail, Yahoo, Outlook, ProtonMail, etc.
6. **Microsoft 365 check** -- definitive valid/invalid via Microsoft's own API (97-99% accuracy). This is where most other verifiers return "unknown." We don't.
7. **Google Workspace check** -- detects Google-hosted domains, verifies via SMTP
8. **SMTP verification** -- direct mail server check for all other domains
9. **Catch-all detection** -- tests if the domain accepts any address

### Microsoft 365: Our Strongest Check

About 40-50% of B2B companies use Microsoft 365 for email. Standard SMTP verification doesn't work well on these domains because Microsoft blocks it. Most verifiers return "unknown" or "catch_all" for nearly half your business list.

This actor uses Microsoft's GetCredentialType API (the same check Microsoft's own login page uses) to give a definitive valid or invalid answer. 97-99% accuracy on the domains that matter most for B2B outreach.

### Input

```json
{
    "emails": [
        "john@acme.com",
        "jane@startup.io",
        "test@mailinator.com",
        "support@company.com"
    ]
}
````

Or paste emails as comma/newline-separated text in the `emailsText` field. Supports up to 10,000 emails per run.

### Output Example

```json
[
    {
        "email": "john@acme.com",
        "result": "valid",
        "quality": "good",
        "is_disposable": false,
        "is_role_based": false,
        "is_free_provider": false,
        "is_catch_all": false,
        "reason": "mailbox_exists",
        "provider": "microsoft_365",
        "mx_host": "acme-com.mail.protection.outlook.com"
    },
    {
        "email": "test@mailinator.com",
        "result": "valid",
        "quality": "bad",
        "is_disposable": true,
        "is_role_based": false,
        "is_free_provider": false,
        "is_catch_all": false,
        "reason": "disposable_domain",
        "provider": "custom",
        "mx_host": "mail.mailinator.com"
    },
    {
        "email": "support@company.com",
        "result": "valid",
        "quality": "risky",
        "is_disposable": false,
        "is_role_based": true,
        "is_free_provider": false,
        "is_catch_all": false,
        "reason": "valid_role_based",
        "provider": "google_workspace",
        "mx_host": "aspmx.l.google.com"
    }
]
```

Download results as CSV, JSON, or Excel from the Dataset tab.

### Pricing

$0.001 per email ($1 per 1,000). No subscription. No minimum.

| Emails | Cost |
|--------|------|
| 1,000 | $1 |
| 5,000 | $5 |
| 10,000 | $10 |
| 50,000 | $50 |

### Two Modes

**Mode 1: Default (no setup)**
Leave SMTP fields empty. Uses Microsoft 365 API verification + syntax/MX/disposable/role checks. Covers ~40-50% of B2B emails with 97-99% accuracy. Other domains get flagged as unknown.

**Mode 2: Full SMTP (with your VPS)**
Add your SMTP verification server URL. Enables direct mail server checks for ALL domains. Set up [Reacher](https://github.com/reacherhq/check-if-email-exists) on a $3-5/month VPS with port 25 open.

### Speed

- Microsoft 365 domains: 500-1,000 emails/minute
- SMTP verification: 100-300 emails/minute
- Adjustable concurrency (1-20 parallel workers)

### FAQ

**How accurate is it?**
97-99% on Microsoft 365 domains (40-50% of B2B). 88-95% on other domains via SMTP. If you only use Mode 1 (no SMTP VPS), non-Microsoft domains will show as "unknown" -- still useful for filtering bad syntax, disposable, and role-based emails.

**What does quality "risky" mean?**
The email might be deliverable, but sending to it carries risk. Catch-all domains, role-based addresses, and unverifiable domains are flagged as risky. You decide whether to include them in your campaign.

**Can I use the results in Smartlead/Instantly?**
Yes. Export as CSV, filter by `quality = good`, and import the clean list.

**What about catch-all domains?**
Detected and flagged. About 15-25% of B2B domains accept all addresses. We flag these as `catch_all` with quality `risky` so you can decide.

# Actor input Schema

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

List of email addresses to verify. Paste one per line or provide a JSON array.

## `emailsText` (type: `string`):

Alternative: paste emails separated by newlines or commas. Use this if the list input is inconvenient.

## `smtpServerUrl` (type: `string`):

URL of your SMTP verification VPS. Required for full SMTP + catch-all verification. Leave empty to use O365-only mode (covers ~40-50% of B2B emails).

## `smtpServerSecret` (type: `string`):

Authentication secret for your SMTP VPS (sent as x-auth-secret header).

## `concurrency` (type: `integer`):

Number of emails to verify in parallel. Higher = faster but may trigger rate limits.

## `includeGravatar` (type: `boolean`):

Check if the email has a Gravatar profile (positive signal for real person). Adds ~200ms per email.

## Actor input object example

```json
{
  "emails": [
    "test@example.com"
  ],
  "smtpServerUrl": "",
  "concurrency": 10,
  "includeGravatar": false
}
```

# 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": [
        "test@example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gorang_m/email-verifier").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": ["test@example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("gorang_m/email-verifier").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "test@example.com"
  ]
}' |
apify call gorang_m/email-verifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gorang_m/email-verifier",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bulk Email Verifier $1/1K | Microsoft 365 99% Accuracy",
        "version": "0.1",
        "x-build-id": "7mf4rZvy39spsMdig"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/gorang_m~email-verifier/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-gorang_m-email-verifier",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/gorang_m~email-verifier/runs": {
            "post": {
                "operationId": "runs-sync-gorang_m-email-verifier",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/gorang_m~email-verifier/run-sync": {
            "post": {
                "operationId": "run-sync-gorang_m-email-verifier",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "emails": {
                        "title": "Email List",
                        "type": "array",
                        "description": "List of email addresses to verify. Paste one per line or provide a JSON array.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "emailsText": {
                        "title": "Emails (Text)",
                        "type": "string",
                        "description": "Alternative: paste emails separated by newlines or commas. Use this if the list input is inconvenient."
                    },
                    "smtpServerUrl": {
                        "title": "SMTP Verification Server URL",
                        "type": "string",
                        "description": "URL of your SMTP verification VPS. Required for full SMTP + catch-all verification. Leave empty to use O365-only mode (covers ~40-50% of B2B emails).",
                        "default": ""
                    },
                    "smtpServerSecret": {
                        "title": "SMTP Server Auth Secret",
                        "type": "string",
                        "description": "Authentication secret for your SMTP VPS (sent as x-auth-secret header)."
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of emails to verify in parallel. Higher = faster but may trigger rate limits.",
                        "default": 10
                    },
                    "includeGravatar": {
                        "title": "Include Gravatar Check",
                        "type": "boolean",
                        "description": "Check if the email has a Gravatar profile (positive signal for real person). Adds ~200ms per email.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
