# Bulk Email Verifier & Finder - Mailbox Exists, SPF/DKIM/DMARC (`apivault_labs/email-deliverability-checker`) Actor

Bulk email verifier & finder: live mailbox check (accepted/rejected/catch-all), SPF/DKIM/DMARC, spam-trap & blacklist, typo fix, find emails by name+company. Pay only for definitive results.

- **URL**: https://apify.com/apivault\_labs/email-deliverability-checker.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 email verifieds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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 & Finder — Mailbox Exists Check + SPF, DKIM, DMARC

<!-- n8n-node-callout -->
> ### ⚡ Use this Actor in n8n — no code
> Building no-code workflows in **[n8n](https://n8n.io)**? Install our official community node and drop this Actor straight onto your canvas:
>
> **📦 [`n8n-nodes-apivault-email-verifier`](https://www.npmjs.com/package/n8n-nodes-apivault-email-verifier)**
>
> **Setup (30 seconds):** in n8n go to **Settings → Community Nodes → Install**, paste `n8n-nodes-apivault-email-verifier` and confirm → add the new node to your workflow → paste your **Apify API token** → fill in the input and run.
<!-- /n8n-node-callout -->

![Email Verifier & Finder](https://api.apify.com/v2/key-value-stores/E76hLVOROveornuAY/records/email-verifier-hero-ai.jpg)

> **Two tools in one.** *Verify* whether an email really exists with a live mailbox check (`accepted` / `rejected` / `catch-all`), or *find* a person's email from their **name + company** (domain *or* company name). Plus syntax, MX/deliverability, free/role/disposable/gibberish flags, typo fixes, sender authentication (SPF, DKIM, DMARC), **spam-trap & DNS-blacklist risk**, a Gravatar signal and a 0-100 score. No login, no API keys, no proxy. **You only pay for definitive results — catch-all and unknown are free.**

![Three tools in one run](https://api.apify.com/v2/key-value-stores/E76hLVOROveornuAY/records/email-verifier-features-ai.jpg)

---

### 🔎 Email Finder (name + company → verified email)

Provide people and the Actor resolves the **company domain (from a domain *or* a company name)**, tries the common address patterns (`first.last`, `flast`, `first`, …), and returns the one the mail server accepts — with a **confidence** score:

```json
{
  "people": [
    { "name": "John Doe", "domain": "acme.com" },
    { "name": "Jane Smith", "company": "Apify" },
    { "firstName": "Bo", "lastName": "Lee", "domain": "bigcorp.com",
      "knownContacts": [{ "email": "al.ray@bigcorp.com", "firstName": "Al", "lastName": "Ray" }] }
  ]
}
````

Output (extra fields like `crmId` are passed through):

```json
{ "fullName": "Jane Smith", "domain": "apify.com", "domainResolvedFrom": "Apify",
  "foundEmail": "jane.smith@apify.com", "pattern": "jane.smith", "confidence": 0.95,
  "mailboxStatus": "accepted", "mailboxExists": true, "status": "found" }
```

`status` is `found` (verified), `catch_all_guess` (domain accepts all — best guess), or `not_found`. **Billed only for a confirmed `found` mailbox.** Provide `knownContacts` to auto-detect the company's email pattern.

***

***

### ✨ What you get per address

**Mailbox existence (live check)**

- `mailboxExists` — `true` (server accepts it), `false` (server rejects it), or `null` (couldn't confirm)
- `mailboxStatus` — `accepted` / `rejected` / `catch-all` / `disposable` / `no-mx` / `unknown`

**Validation**

- `syntaxValid` (RFC-aware) + `normalizedEmail` (Gmail dot/+tag aware)
- `hasMx`, `mxProvider`, `mxRecords`, `domainResolves`
- `freeProvider`, `roleBased`, `disposable`, `gibberish`
- `suggestedCorrection` (e.g. `gmial.con` → `gmail.com`)
- `status` (`valid` / `risky` / `invalid` / `unknown`) + `deliverabilityScore` (0-100) + `reasons[]`

**Sender authentication (domain audit)**

- `spf` — domain publishes an SPF record
- `dkim` — DKIM key found (+ `dkimSelector`)
- `dmarc` — DMARC policy present (+ `dmarcPolicy`: none / quarantine / reject)

**Sender reputation & risk**

- `blacklisted` + `blacklists[]` — domain listed on a DNS blacklist (Spamhaus DBL / SURBL)
- `spamTrapRisk` — `low` / `medium` / `high` (+ `spamTrapReason`) — protect your sender reputation
- greylisting-aware: temporary "unknown" verdicts are retried into definitive answers

**Identity signal**

- `hasGravatar` — the address has a public Gravatar (likely a real, used inbox)

A final **list-quality report** record summarises the run: an **A–F grade**, deliverable %, and the full valid / risky / invalid / catch-all / disposable / role breakdown.

***

### 📥 Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `emails` | array | required\* | Email addresses to check (one per line). |
| `records` | array | — | Objects with an email field + any extra columns; all columns are passed through to the output (verify CRM/CSV exports). |
| `emailColumn` | string | `email` | Which field in `records` holds the address. |
| `emailsText` | string | — | Paste a list / CSV column; merged + de-duplicated. |
| `checkMx` | boolean | `true` | Look up MX/DNS deliverability. |
| `verifyMailbox` | boolean | `true` | Live mailbox check (does the address exist?). Paced ~1 address/sec; turn off for a fast domain-only pass. |
| `resolveCatchAll` | boolean | `true` | For catch-all domains, probe a fake address to try to confirm the real one. |
| `deepCheck` | boolean | `true` | Audit SPF/DKIM/DMARC + Gravatar. Turn off for a faster, lighter pass. |
| `deduplicate` | boolean | `true` | Provider-aware de-duplication. |
| `onlyValid` / `onlyDeliverable` | boolean | `false` | Keep only valid / deliverable addresses. |
| `dropDisposable` / `dropRoleBased` | boolean | `false` | Drop throwaway / group mailboxes. |
| `exportFormat` | string | `default` | `default` JSON, `csv` flat columns, or `both`. |

```json
{
  "emails": ["john.doe@acme.com", "info@apify.com", "test@gmial.con"],
  "verifyMailbox": true,
  "deepCheck": true
}
```

***

### 📤 Sample output

```json
{
  "email": "john.doe@acme.com",
  "status": "valid",
  "deliverabilityScore": 95,
  "mailboxExists": true,
  "mailboxStatus": "accepted",
  "syntaxValid": true,
  "domain": "acme.com",
  "hasMx": true,
  "mxProvider": "Google Workspace",
  "spf": true,
  "dkim": true,
  "dkimSelector": "google",
  "dmarc": true,
  "dmarcPolicy": "reject",
  "hasGravatar": true,
  "freeProvider": false,
  "roleBased": false,
  "disposable": false,
  "reasons": ["mailbox accepted by the mail server (exists)", "domain enforces DMARC (p=reject)"]
}
```

***

### 💡 Use cases

- **Catch fake / dead addresses** — the live mailbox check flags addresses the server rejects.
- **List cleaning before outreach** — drop invalid/disposable, keep deliverable.
- **Lead quality scoring** — mailbox + Gravatar + MX + auth signals rank real, reachable contacts.
- **Domain trust / security audit** — flag domains with no SPF/DMARC (spoofable, low trust).
- **CRM enrichment** — attach existence + provider + auth posture to every contact.

### 🤖 For AI agents (MCP / Standby)

Run the Actor as a low-latency HTTP/MCP server for lead-gen agents (Claude, Cursor, OpenAI). Enable **Standby** in the Actor settings, then:

- REST: `GET /?email=john@acme.com` or `GET /?name=Jane%20Smith&domain=apify.com`
- MCP tools: **`verify_email`** and **`find_email`** (JSON-RPC over the Standby endpoint)

### 💸 Don't pay twice

Set `cacheDays` (e.g. `7`) and any address verified within that window is returned instantly from your **private** cache and is **not charged again** — ideal for overlapping CRM/CSV lists.

***

### ⚙️ Notes & limits

- **You only pay for definitive results.** Three pay-per-event charges: **`result`** (one verified email — `valid`/`invalid`), **`found`** (a confirmed Finder email — *only* when a mailbox is found), and **`domain-auth`** (SPF/DKIM/DMARC audit, once per unique domain). **Catch-all, risky, unknown and not-found are free**, and cached re-checks (`cacheDays`) are free too.
- No API key or external account needed — the live mailbox check is built in. Great for cleaning **Apollo, ZoomInfo, Clay or CRM exports** before outreach.
- The **live mailbox check** asks the destination mail server whether it accepts the address (`accepted` / `rejected` / `catch-all`). For **catch-all** domains and a few providers that hide their answer, existence can't be confirmed and is returned as `null` / `catch-all` — exactly as every reputable verifier reports it. **Speed:** checks run **in parallel across different domains** while each single domain is paced politely; with `mailboxConcurrency: 0` (default) the Actor **auto-scales workers to the number of domains in your list**, so big multi-domain CRM/Apollo/ZoomInfo exports are processed fast (single-domain lists are paced and slower by design).
- DKIM is detected by probing common selectors; a `false` means no key was found on those selectors, not that DKIM is absent everywhere.

***

***

### ⚖️ Acceptable use & disclaimer

- **What this Actor returns:** email addresses, mailbox-existence and deliverability/authentication signals (SPF/DKIM/DMARC). It **never** returns, guesses, or exposes passwords, account credentials, or mailbox contents, and it does **not** attempt to log in to any account.
- **Intended use:** legitimate email-list hygiene and B2B contact verification — cleaning your own lists before outreach, anti-fraud and deliverability checks, and verifying addresses you have a lawful basis to process.
- **Your responsibility:** you must use the results lawfully and in compliance with applicable regulations (e.g. **GDPR, CAN-SPAM, CCPA**) and obtain any required consent. Do **not** use the Actor or its output for spam, harassment, credential attacks, unsolicited bulk mail, scraping for resale, or any unlawful purpose.
- **No warranty:** the Actor is provided **"as is"**, without warranties of any kind. Verification reflects what mail servers report at the time of the check and may be incomplete (catch-all, greylisting, providers that hide results). The developer accepts no liability for misuse or for decisions made from the results.

*This is general information, not legal advice — consult your own counsel for your specific compliance needs.*

***

Built and maintained by **Apivault** — reliable data Actors, fair pricing.

# Actor input Schema

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

Email addresses to verify (one per line), e.g. john.doe@acme.com. Leave empty if you are using 'people' to find emails.

## `people` (type: `array`):

Email FINDER mode. Provide people as objects like \[{"name":"John Doe","domain":"acme.com"}] (or use firstName/lastName). The Actor tries common patterns and returns the address the mail server accepts. Extra fields you include are passed through to the output.

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

Optional. Paste many addresses at once (one per line, or comma/semicolon separated — e.g. a copied spreadsheet column). They are merged with the list above and de-duplicated.

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

Optional. Array of objects each carrying an email field plus any other columns, e.g. \[{"email":"a@x.com","name":"Ann","crmId":7}]. All extra columns are passed through to the output - ideal for verifying CRM/CSV exports.

## `emailColumn` (type: `string`):

Which field in your records holds the email address (default: email).

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

Look up each domain's MX records over DNS-over-HTTPS to confirm it can receive mail and detect the mail provider. Turn off for a pure offline syntax-only pass (faster).

## `deepCheck` (type: `boolean`):

Audit each domain's email authentication (SPF, DKIM, DMARC) over DNS, and check whether the address has a public Gravatar (a real, used-identity signal). Adds a few lookups per address.

## `verifyMailbox` (type: `boolean`):

Confirm at the mail server whether each mailbox actually accepts mail - returns accepted / rejected / catch-all / disposable. This is the real existence check. Checks run in parallel across different domains while each single domain is paced politely (see Live-check parallel workers), so large multi-domain lists are processed quickly. Turn off for a fast domain-only pass.

## `proxyFallback` (type: `boolean`):

Run the live mailbox check directly first; if it gets rate-limited or blocked, automatically switch to a standard (datacenter) proxy and retry. No proxy is used while direct works.

## `resolveCatchAll` (type: `boolean`):

When a domain looks catch-all, probe a guaranteed-fake address on the same domain. If the server rejects the fake but accepts the real one, the address is upgraded to valid. Adds one cached check per catch-all domain.

## `deduplicate` (type: `boolean`):

Remove duplicate addresses using provider-aware normalization (Gmail dots and +tags are ignored). Keeps the first occurrence.

## `onlyValid` (type: `boolean`):

If on, drop addresses that fail the syntax check from the output.

## `onlyDeliverable` (type: `boolean`):

If on, keep only addresses whose status is valid or risky (drops invalid/undeliverable). Best run right before sending.

## `dropDisposable` (type: `boolean`):

If on, remove addresses on known temporary-mailbox domains.

## `dropRoleBased` (type: `boolean`):

If on, remove group mailboxes like info@, sales@, support@ (keep only personal addresses).

## `exportFormat` (type: `string`):

default = full JSON. csv = flat CSV-friendly columns. both = JSON + nested \_csv.

## `cacheDays` (type: `integer`):

If > 0, results are remembered in a private key-value store. Re-verifying the same address within this many days returns the cached verdict instantly and is NOT charged — you never pay twice for the same email. 0 = always re-check fresh.

## `greylistRetries` (type: `integer`):

Many mail servers return a temporary failure on first contact (greylisting). Retry addresses that came back 'unknown' after a short backoff to turn them into a definitive valid/invalid verdict — more accuracy. 0 = no retry.

## `greylistBackoffSecs` (type: `integer`):

How long to wait before each greylisting retry pass.

## `mailboxConcurrency` (type: `integer`):

Mailboxes are checked in parallel across DIFFERENT domains while each single domain is paced (never hammered). 0 = AUTO: the Actor scales workers with the number of distinct domains in your list — big multi-domain lists run much faster automatically. Set a fixed 1-10 to override (each worker uses its own proxy IP). 1 = slowest/sequential.

## `autoCorrect` (type: `boolean`):

When an address looks like a typo (e.g. gmial.con) and isn't valid, also live-check the suggested correction and report it in `correctedEmail` if the fixed mailbox exists.

## `fileUrl` (type: `string`):

Optional. A public URL to a CSV / TSV / plain-text file; every email address found in it is added to the list and de-duplicated. (For XLSX, export to CSV first.)

## Actor input object example

```json
{
  "emails": [
    "john.doe@gmail.com",
    "info@apify.com",
    "test@gmial.con",
    "user@mailinator.com",
    "bad email@@example"
  ],
  "people": [],
  "records": [],
  "emailColumn": "email",
  "checkMx": true,
  "deepCheck": true,
  "verifyMailbox": true,
  "proxyFallback": true,
  "resolveCatchAll": true,
  "deduplicate": true,
  "onlyValid": false,
  "onlyDeliverable": false,
  "dropDisposable": false,
  "dropRoleBased": false,
  "exportFormat": "default",
  "cacheDays": 0,
  "greylistRetries": 1,
  "greylistBackoffSecs": 30,
  "mailboxConcurrency": 0,
  "autoCorrect": true
}
```

# 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": [
        "john.doe@gmail.com",
        "info@apify.com",
        "test@gmial.con",
        "user@mailinator.com",
        "bad email@@example"
    ],
    "people": [],
    "records": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/email-deliverability-checker").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": [
        "john.doe@gmail.com",
        "info@apify.com",
        "test@gmial.con",
        "user@mailinator.com",
        "bad email@@example",
    ],
    "people": [],
    "records": [],
}

# Run the Actor and wait for it to finish
run = client.actor("apivault_labs/email-deliverability-checker").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": [
    "john.doe@gmail.com",
    "info@apify.com",
    "test@gmial.con",
    "user@mailinator.com",
    "bad email@@example"
  ],
  "people": [],
  "records": []
}' |
apify call apivault_labs/email-deliverability-checker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bulk Email Verifier & Finder - Mailbox Exists, SPF/DKIM/DMARC",
        "description": "Bulk email verifier & finder: live mailbox check (accepted/rejected/catch-all), SPF/DKIM/DMARC, spam-trap & blacklist, typo fix, find emails by name+company. Pay only for definitive results.",
        "version": "1.5",
        "x-build-id": "lgfHHEZ8HdCxB9m6j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apivault_labs~email-deliverability-checker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apivault_labs-email-deliverability-checker",
                "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/apivault_labs~email-deliverability-checker/runs": {
            "post": {
                "operationId": "runs-sync-apivault_labs-email-deliverability-checker",
                "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/apivault_labs~email-deliverability-checker/run-sync": {
            "post": {
                "operationId": "run-sync-apivault_labs-email-deliverability-checker",
                "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 addresses (to verify)",
                        "type": "array",
                        "description": "Email addresses to verify (one per line), e.g. john.doe@acme.com. Leave empty if you are using 'people' to find emails.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "people": {
                        "title": "Find emails by name + domain (optional)",
                        "type": "array",
                        "description": "Email FINDER mode. Provide people as objects like [{\"name\":\"John Doe\",\"domain\":\"acme.com\"}] (or use firstName/lastName). The Actor tries common patterns and returns the address the mail server accepts. Extra fields you include are passed through to the output."
                    },
                    "emailsText": {
                        "title": "…or paste a list / CSV column",
                        "type": "string",
                        "description": "Optional. Paste many addresses at once (one per line, or comma/semicolon separated — e.g. a copied spreadsheet column). They are merged with the list above and de-duplicated."
                    },
                    "records": {
                        "title": "…or records with extra columns (CSV passthrough)",
                        "type": "array",
                        "description": "Optional. Array of objects each carrying an email field plus any other columns, e.g. [{\"email\":\"a@x.com\",\"name\":\"Ann\",\"crmId\":7}]. All extra columns are passed through to the output - ideal for verifying CRM/CSV exports."
                    },
                    "emailColumn": {
                        "title": "Email column name (for records)",
                        "type": "string",
                        "description": "Which field in your records holds the email address (default: email).",
                        "default": "email"
                    },
                    "checkMx": {
                        "title": "Check domain deliverability (MX / DNS)",
                        "type": "boolean",
                        "description": "Look up each domain's MX records over DNS-over-HTTPS to confirm it can receive mail and detect the mail provider. Turn off for a pure offline syntax-only pass (faster).",
                        "default": true
                    },
                    "deepCheck": {
                        "title": "Deep check: sender auth (SPF/DKIM/DMARC) + Gravatar",
                        "type": "boolean",
                        "description": "Audit each domain's email authentication (SPF, DKIM, DMARC) over DNS, and check whether the address has a public Gravatar (a real, used-identity signal). Adds a few lookups per address.",
                        "default": true
                    },
                    "verifyMailbox": {
                        "title": "Live mailbox check (does the mailbox exist?)",
                        "type": "boolean",
                        "description": "Confirm at the mail server whether each mailbox actually accepts mail - returns accepted / rejected / catch-all / disposable. This is the real existence check. Checks run in parallel across different domains while each single domain is paced politely (see Live-check parallel workers), so large multi-domain lists are processed quickly. Turn off for a fast domain-only pass.",
                        "default": true
                    },
                    "proxyFallback": {
                        "title": "Auto-fallback to proxy if the live check is blocked",
                        "type": "boolean",
                        "description": "Run the live mailbox check directly first; if it gets rate-limited or blocked, automatically switch to a standard (datacenter) proxy and retry. No proxy is used while direct works.",
                        "default": true
                    },
                    "resolveCatchAll": {
                        "title": "Resolve catch-all domains (extra probe)",
                        "type": "boolean",
                        "description": "When a domain looks catch-all, probe a guaranteed-fake address on the same domain. If the server rejects the fake but accepts the real one, the address is upgraded to valid. Adds one cached check per catch-all domain.",
                        "default": true
                    },
                    "deduplicate": {
                        "title": "De-duplicate addresses",
                        "type": "boolean",
                        "description": "Remove duplicate addresses using provider-aware normalization (Gmail dots and +tags are ignored). Keeps the first occurrence.",
                        "default": true
                    },
                    "onlyValid": {
                        "title": "Return only syntactically valid emails",
                        "type": "boolean",
                        "description": "If on, drop addresses that fail the syntax check from the output.",
                        "default": false
                    },
                    "onlyDeliverable": {
                        "title": "Return only deliverable emails",
                        "type": "boolean",
                        "description": "If on, keep only addresses whose status is valid or risky (drops invalid/undeliverable). Best run right before sending.",
                        "default": false
                    },
                    "dropDisposable": {
                        "title": "Drop disposable / throwaway emails",
                        "type": "boolean",
                        "description": "If on, remove addresses on known temporary-mailbox domains.",
                        "default": false
                    },
                    "dropRoleBased": {
                        "title": "Drop role-based emails",
                        "type": "boolean",
                        "description": "If on, remove group mailboxes like info@, sales@, support@ (keep only personal addresses).",
                        "default": false
                    },
                    "exportFormat": {
                        "title": "Export format",
                        "enum": [
                            "default",
                            "csv",
                            "both"
                        ],
                        "type": "string",
                        "description": "default = full JSON. csv = flat CSV-friendly columns. both = JSON + nested _csv.",
                        "default": "default"
                    },
                    "cacheDays": {
                        "title": "Don't re-charge for emails verified in the last N days",
                        "minimum": 0,
                        "maximum": 90,
                        "type": "integer",
                        "description": "If > 0, results are remembered in a private key-value store. Re-verifying the same address within this many days returns the cached verdict instantly and is NOT charged — you never pay twice for the same email. 0 = always re-check fresh.",
                        "default": 0
                    },
                    "greylistRetries": {
                        "title": "Greylisting retries (convert 'unknown' to a verdict)",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Many mail servers return a temporary failure on first contact (greylisting). Retry addresses that came back 'unknown' after a short backoff to turn them into a definitive valid/invalid verdict — more accuracy. 0 = no retry.",
                        "default": 1
                    },
                    "greylistBackoffSecs": {
                        "title": "Greylisting retry backoff (seconds)",
                        "minimum": 5,
                        "maximum": 300,
                        "type": "integer",
                        "description": "How long to wait before each greylisting retry pass.",
                        "default": 30
                    },
                    "mailboxConcurrency": {
                        "title": "Live-check parallel workers (0 = auto)",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Mailboxes are checked in parallel across DIFFERENT domains while each single domain is paced (never hammered). 0 = AUTO: the Actor scales workers with the number of distinct domains in your list — big multi-domain lists run much faster automatically. Set a fixed 1-10 to override (each worker uses its own proxy IP). 1 = slowest/sequential.",
                        "default": 0
                    },
                    "autoCorrect": {
                        "title": "Auto-verify typo corrections",
                        "type": "boolean",
                        "description": "When an address looks like a typo (e.g. gmial.con) and isn't valid, also live-check the suggested correction and report it in `correctedEmail` if the fixed mailbox exists.",
                        "default": true
                    },
                    "fileUrl": {
                        "title": "Email list file URL (CSV / TSV / text)",
                        "type": "string",
                        "description": "Optional. A public URL to a CSV / TSV / plain-text file; every email address found in it is added to the list and de-duplicated. (For XLSX, export to CSV first.)"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
