{
  "data": {
    "id": "crp3h5vHYwa6Nlq3f",
    "actId": "n4DH6fL7RqbgyJjEq",
    "userId": "kYoNI3wsaubJKcpfT",
    "startedAt": "2026-10-22T09:06:43.071Z",
    "finishedAt": "2026-10-22T09:06:59.417Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 16215,
      "runTimeSecs": 16.215,
      "computeUnits": 0.018016666666666667,
      "imageSizeBytes": 568524800
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "qWgIvZesMIlfAuet0",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Email Verifier input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"emails\": {\n      \"title\": \"Emails to verify\",\n      \"type\": \"array\",\n      \"description\": \"One email address per line (paste your list, or send an array through the API). Duplicates are removed automatically (case-insensitive) and verified once.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"rand@sparktoro.com\"\n      ]\n    },\n    \"checkCatchAll\": {\n      \"title\": \"Detect catch-all domains\",\n      \"type\": \"boolean\",\n      \"description\": \"Catch-all servers accept every address, so the mailbox cannot be confirmed. On: such emails get the status \\\"catch-all\\\". Off: they are reported as \\\"risky\\\". Both are charged at half price.\",\n      \"default\": true,\n      \"editor\": \"checkbox\"\n    },\n    \"timeoutSecs\": {\n      \"title\": \"Timeout per email (seconds)\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum time to wait for the mail server of one address. Slow servers that do not answer in time are returned as \\\"unknown\\\" (not charged).\",\n      \"default\": 30,\n      \"minimum\": 5,\n      \"maximum\": 120,\n      \"unit\": \"seconds\"\n    },\n    \"concurrency\": {\n      \"title\": \"Parallel checks\",\n      \"type\": \"integer\",\n      \"description\": \"How many emails are verified in parallel.\",\n      \"default\": 5,\n      \"minimum\": 1,\n      \"maximum\": 10\n    }\n  },\n  \"required\": [\n    \"emails\"\n  ]\n}",
    "readme": "# ✅ Email Verifier & Validator — Bulk SMTP Email Verification, Catch-All Check\n\n**Bulk email verifier and email validator** for cleaning email lists before you send. Paste a list (or send it through the API) and get, for every address, a clear verdict — `valid`, `invalid`, `catch-all`, `risky` or `unknown` — with the reason behind it.\n\n<!-- crosssell:start -->\n<table width=\"100%\" style=\"display:table;width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0;border:1px solid #d9d6cf;border-radius:10px\"><tbody><tr><td style=\"padding:9px 14px;background:#3d5a98;border:0;border-radius:9px 9px 0 0\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-profile-XENdzbJ81W-pnda.png\" width=\"20\" height=\"20\" alt=\"PNDA\" style=\"vertical-align:middle;border-radius:5px\"/> <strong style=\"color:#ffffff;font-size:13px;vertical-align:middle\">PNDA · Email suite</strong><span style=\"color:#ffffff;font-size:13px;vertical-align:middle\"> • Find, verify, extract</span></td></tr><tr><td style=\"padding:8px;background:#fbfaf8;border:0;border-radius:0 0 9px 9px\"><span style=\"display:flex;flex-wrap:wrap;gap:8px\"><span style=\"display:flex;flex:1 1 308px;gap:8px\"><a href=\"https://apify.com/pnda/email-finder\" target=\"_blank\" style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#ffffff;border:1px solid #e3e1dc;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-ESMZY2I5ruLO0NZ0U-qtaEUpCahu-cand_email-finder_1.png\" width=\"28\" height=\"28\" alt=\"Email Finder\" style=\"border-radius:7px\"/><br/><strong style=\"color:#1f2328;font-size:13px;line-height:1.3\">Email Finder</strong><br/><span style=\"color:#6b6f76;font-size:12px;line-height:1.4\">Work email from a name + company domain</span></a><span style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#eef2f9;border:1px solid #3d5a98;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-n4DH6fL7RqbgyJjEq-D9RVAZcSPH-cand_email-verifier_1.png\" width=\"28\" height=\"28\" alt=\"Email Verifier\" style=\"border-radius:7px\"/><br/><strong style=\"color:#3d5a98;font-size:13px;line-height:1.3\">Email Verifier</strong><br/><span style=\"color:#3d5a98;font-size:12px\">➤ You are here</span></span></span><span style=\"display:flex;flex:1 1 308px;gap:8px\"><a href=\"https://apify.com/pnda/email-extractor\" target=\"_blank\" style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#ffffff;border:1px solid #e3e1dc;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-XaU5KGYFpVhYMQaYF-snMUEg5Hcz-cand_email-extractor_1.png\" width=\"28\" height=\"28\" alt=\"Email Extractor\" style=\"border-radius:7px\"/><br/><strong style=\"color:#1f2328;font-size:13px;line-height:1.3\">Email Extractor</strong><br/><span style=\"color:#6b6f76;font-size:12px;line-height:1.4\">Emails, phones &amp; socials from any website</span></a><a href=\"https://apify.com/pnda/linkedin-scraper\" target=\"_blank\" style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#ffffff;border:1px solid #e3e1dc;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-btNUul6dyyuLVpSsd-TmkwwGu6FG-logo_linkedin.png\" width=\"28\" height=\"28\" alt=\"LinkedIn Leads Finder\" style=\"border-radius:7px\"/><br/><strong style=\"color:#1f2328;font-size:13px;line-height:1.3\">LinkedIn Leads Finder</strong><br/><span style=\"color:#6b6f76;font-size:12px;line-height:1.4\">Fresh B2B leads with verified work emails</span></a></span></span></td></tr></tbody></table>\n<!-- crosssell:end -->\n\nFor each email the Actor checks the **syntax**, looks up the domain's **MX records**, then runs a **live SMTP mailbox check** (`RCPT TO`) against the recipient's mail server to confirm that the mailbox exists. **No email is ever sent.** It also flags **catch-all domains**, **disposable / temporary email providers**, **role accounts** (`info@`, `sales@`, `support@`) and **free providers** (Gmail, Outlook, Yahoo), and suggests fixes for **typos** like `gmial.com` → `gmail.com`.\n\n**You pay for real answers only:** $0.95 per 1,000 emails returned as `valid` or `invalid`, and **half price** ($0.475 per 1,000) for `catch-all`. Risky, unknown and duplicate emails are **free**.\n\nExport results to **JSON, CSV, Excel or HTML**, or plug the Actor into **n8n, Make, Zapier, Clay, Google Sheets** or your own code through the Apify API.\n\n> 🔎 **Don't have the emails yet?** [Email Finder](https://apify.com/pnda/email-finder) finds the work email of a person from their name and company domain, already verified ($4.99 per 1,000 emails found).\n\n---\n\n## 💡 Who is it for?\n\n- **Cold email & sales teams** cleaning lead lists from Apollo, LinkedIn, Google Maps or any scraper before a campaign — fewer bounces, better sender reputation.\n- **Growth & marketing teams** running email list hygiene on newsletters and CRM exports (HubSpot, Salesforce, Pipedrive, Mailchimp, Brevo).\n- **Agencies** verifying client lists in bulk without a monthly SaaS subscription.\n- **Developers** who need an **email validation API** for sign-up forms, onboarding or data pipelines.\n- **Data teams** enriching and deduplicating contact databases.\n\n---\n\n## ⚙️ How it works\n\nEvery address goes through a **12-layer verification**, in this order:\n\n| # | Check | What it detects | Output field |\n|---|---|---|---|\n| 1 | ✅ **Syntax / format** | Malformed addresses (`john@@acme`, `not-an-email`) | `syntaxValid` |\n| 2 | ✅ **Typo correction** | `gmial.com`, `hotmial.com`, `yahooo.com`, `gmail.con` → corrected address | `suggestion` |\n| 3 | ✅ **DNS / MX lookup** | Domains with no mail server (double-checked to avoid false `invalid`) | `mxFound` |\n| 4 | ✅ **Mail server ID** | Which server handles the mail (Google, Microsoft, custom…) | `mxHost` |\n| 5 | ✅ **Live SMTP mailbox check** | Whether the mailbox really exists (`RCPT TO`, **no email is sent**) | `deliverable`, `smtpCode` |\n| 6 | ✅ **Full inbox** | Mailboxes that exist but can't receive mail right now | `fullInbox` |\n| 7 | ✅ **Disabled mailbox** | Accounts that were closed or suspended | `disabled` |\n| 8 | ✅ **Catch-all detection** | Domains that accept every address (risky to send to) | `catchAll` |\n| 9 | ✅ **Disposable email** | Throwaway providers (Mailinator, Yopmail, 10minutemail…) | `disposable` |\n| 10 | ✅ **Role account** | Generic inboxes (`info@`, `sales@`, `support@`) | `roleAccount` |\n| 11 | ✅ **Mailbox type** | Free provider (Gmail, Outlook, Yahoo) vs professional domain | `freeProvider` |\n| 12 | ✅ **Known hard bounces** | Addresses already reported as bounced by real email sends | `hardBounce` |\n\nEvery row ends with a clear **safe-to-send verdict** in `status`: `valid` (safe to send), `invalid` (do not send), `catch-all`, `risky` or `unknown`.\n\nDuplicates are removed case-insensitively, so every address is verified — and billed — once.\n\n---\n\n## 📥 Input\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `emails` | array of strings | ✅ | The emails to verify — one per line in the Console, an array through the API |\n| `checkCatchAll` | boolean | — | `true` (default): catch-all domains get the status `catch-all`. `false`: they are reported as `risky`. Billed at half price either way. |\n| `timeoutSecs` | integer | — | Max wait per mail server, 5–120 s (default `30`). Servers that don't answer return `unknown` (free). |\n| `concurrency` | integer | — | Emails verified in parallel, 1–10 (default `5`) |\n\n### Example input\n\n```json\n{\n  \"emails\": [\n    \"rand@sparktoro.com\",\n    \"john@gmial.com\",\n    \"info@acme.com\",\n    \"test@mailinator.com\"\n  ],\n  \"checkCatchAll\": true,\n  \"timeoutSecs\": 30,\n  \"concurrency\": 5\n}\n```\n\n---\n\n## 📤 Output\n\nOne row per unique email. Example item:\n\n```json\n{\n  \"email\": \"rand@sparktoro.com\",\n  \"status\": \"valid\",\n  \"reason\": \"Mailbox exists\",\n  \"suggestion\": null,\n  \"syntaxValid\": true,\n  \"domain\": \"sparktoro.com\",\n  \"mxFound\": true,\n  \"mxHost\": \"aspmx.l.google.com\",\n  \"disposable\": false,\n  \"roleAccount\": false,\n  \"freeProvider\": false,\n  \"catchAll\": false,\n  \"smtpConnected\": true,\n  \"deliverable\": true,\n  \"fullInbox\": false,\n  \"disabled\": false,\n  \"smtpCode\": null,\n  \"smtpMessage\": null,\n  \"charged\": true\n}\n```\n\nA typo example:\n\n```json\n{\n  \"email\": \"info@gmial.com\",\n  \"status\": \"invalid\",\n  \"reason\": \"Domain has no mail server (MX)\",\n  \"suggestion\": \"info@gmail.com\",\n  \"mxFound\": false,\n  \"roleAccount\": true,\n  \"charged\": true\n}\n```\n\nA `SUMMARY` record in the run's key-value store counts results per status, duplicates and billed emails.\n\n### Statuses\n\n| Status | Meaning | Billed |\n|---|---|---|\n| `valid` | The mail server confirmed the mailbox exists. Safe to send. Role accounts stay `valid` with `roleAccount: true`. | ✅ yes |\n| `invalid` | Bad syntax, no MX record, mailbox rejected or disabled (SMTP 550–553 \"user unknown\"). Remove it. | ✅ yes |\n| `catch-all` | The domain accepts every address (accept-all), so the single mailbox can't be confirmed. | ½ half price |\n| `risky` | Disposable / temporary email provider, full inbox, or catch-all when `checkCatchAll` is off. | ❌ free (catch-all: half price) |\n| `unknown` | No clear answer: timeout, greylisting, temporary server error. Re-run later. | ❌ free |\n\n### Field reference\n\n| Field | Meaning |\n|---|---|\n| `status` / `reason` | The verdict and a human-readable explanation |\n| `suggestion` | Corrected address when the domain looks like a typo of a common provider |\n| `syntaxValid` | RFC-style syntax check passed |\n| `mxFound` / `mxHost` | The domain has a mail server, and which one (Google Workspace, Microsoft 365…) |\n| `smtpConnected` / `deliverable` | The SMTP server answered / accepted the mailbox |\n| `smtpCode` / `smtpMessage` | Raw SMTP reply code and message when the server rejected the address |\n| `catchAll` | The domain accepts any address |\n| `disposable` | Throwaway / temporary email provider |\n| `roleAccount` | Generic inbox: `info@`, `sales@`, `support@`, `admin@`… |\n| `freeProvider` | Gmail, Outlook, Yahoo, iCloud… |\n| `fullInbox` / `disabled` | Mailbox full / mailbox disabled |\n| `charged` | Whether this row was billed |\n\n---\n\n## 🚀 Why use this Email Verifier\n\n- ✅ **Real SMTP verification**, not just syntax and MX — the mail server itself is asked whether the mailbox exists.\n- ✅ **Pay for real answers only** — catch-all at half price, risky and unknown free. On B2B lists, where 20–40% of addresses sit on catch-all domains, that is a real saving.\n- ✅ **Fewer false `invalid`** — \"no MX\" answers are double-checked with a second DNS lookup before an email is rejected.\n- ✅ **Typo correction** built in — recover leads instead of deleting them.\n- ✅ **Budget-safe** — set *Maximum cost per run* and the Actor never goes over it.\n- ✅ **No API key, no subscription, no credits that expire** — pay per result, export anywhere.\n- ✅ **Pipeline-ready** — chain it after any scraper, or call it from n8n, Make, Zapier or the Apify API.\n\n---\n\n## 📊 Comparison\n\n| | **This Actor** | Typical Store email verifiers | Email verification SaaS |\n|---|---|---|---|\n| Price per 1,000 | **$0.95** | $0.89 – $5.00 | monthly plans or prepaid credits |\n| Catch-all billed | **Half price** | Full price | Usually full price |\n| Unknown / timeout billed | **No** | Yes | Varies |\n| Duplicates billed | **No** (deduplicated) | Often yes | Varies |\n| Live SMTP mailbox check | ✅ | ✅ / partial | ✅ |\n| Typo suggestions | ✅ | Rare | Some |\n\nExample — 1,000 B2B emails with 30% on catch-all domains: ~700 results at full price plus 300 catch-all at half price, about **$0.81**.\n\n---\n\n## 💼 Use cases\n\n- **Clean a cold email list** before uploading it to Instantly, Lemlist, Smartlead or Apollo sequences.\n- **Lower your bounce rate** under 2% to protect domain reputation and deliverability.\n- **Validate emails scraped** from Google Maps, LinkedIn, YouTube channels or websites.\n- **CRM hygiene** — re-verify old contacts quarterly and drop dead mailboxes.\n- **Sign-up form validation** — call the API synchronously and reject disposable or mistyped emails.\n- **Lead enrichment** — keep only `valid` emails, flag `catch-all` for a lower-priority sequence.\n\n---\n\n## 💰 Pricing\n\n**Store discounts:** on Apify Silver, Gold, Platinum and Diamond plans, some events cost up to 20 % less. The Pricing tab of the Store page shows the exact price for each plan.\n\n**Pay per event: $0.95 per 1,000 verified emails** ($0.00095 per email returned `valid` or `invalid`) and **$0.475 per 1,000 catch-all emails** (half price), plus Apify's tiny per-run start fee. Risky, unknown and duplicate emails cost nothing.\n\n| Run | Emails | Max cost |\n|---|---|---|\n| Small list | 100 | ~$0.10 |\n| Campaign list | 1,000 | ~$0.95 |\n| Large list | 10,000 | ~$9.50 |\n| Database cleanup | 100,000 | ~$95 |\n\nCosts are a maximum: every catch-all (half price) or unknown (free) result lowers the bill.\n\n**Works with a free Apify account too.** Free-plan accounts can use every feature at the same per-result prices, paid from their monthly Apify credit. The only limits are your credit and your maximum cost per run.\n\n---\n\n## 🔌 Use it through the API\n\nSynchronous call — send emails, get results back in the same request:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/pnda~email-verifier/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"emails\": [\"rand@sparktoro.com\", \"nobody@example.com\"]}'\n```\n\nPython:\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"YOUR_APIFY_TOKEN\")\nrun = client.actor(\"pnda/email-verifier\").call(run_input={\"emails\": [\"rand@sparktoro.com\"]})\nfor item in client.dataset(run[\"defaultDatasetId\"]).iterate_items():\n    print(item[\"email\"], item[\"status\"], item[\"reason\"])\n```\n\nJavaScript:\n\n```js\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });\nconst run = await client.actor('pnda/email-verifier').call({ emails: ['rand@sparktoro.com'] });\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items);\n```\n\n---\n\n## ❓ FAQ\n\n**Does it send emails to the addresses?**\nNo. The SMTP conversation stops at `RCPT TO`, before any message is sent. Recipients see nothing.\n\n**How accurate is the email verification?**\n`valid` and `invalid` come straight from the recipient's mail server, so they are as reliable as SMTP allows. When the server can't give a definite answer, the email is reported as `catch-all`, `risky` or `unknown` instead of being guessed — catch-all at half price, the others free.\n\n**What is a catch-all email?**\nA catch-all (accept-all) domain accepts mail for any address, so no SMTP verifier can confirm one specific mailbox. Many Google Workspace and Microsoft 365 company domains are configured this way. These results cost half price here.\n\n**Why do I get `unknown`?**\nSome servers delay unknown senders (greylisting) or answer slowly. The Actor retries once; if the answer is still unclear, the result is `unknown` and free. Re-run those emails later or raise `timeoutSecs`.\n\n**Can it detect disposable and temporary emails?**\nYes — Mailinator, Yopmail, 10minutemail, Guerrilla Mail and similar providers are flagged `disposable` and returned as `risky`.\n\n**How fast is it?**\nAbout 60 emails in 12 seconds with `concurrency: 10`. Slow mail servers take longer; lists of tens of thousands run fine in a single run.\n\n**Can I verify a CSV file?**\nPaste the email column into the `emails` field, or read your CSV in code and send the array through the API. Export results back to CSV or Excel from the dataset.\n\n**Is it a ZeroBounce / NeverBounce / Hunter alternative?**\nFor list cleaning, yes: same kind of SMTP verification, pay-as-you-go, no subscription, catch-all at half price and unknown results free.\n\n**Can I use it on the free Apify plan?**\nYes. It works with a free Apify account too, at the same prices, paid from your monthly Apify credit ([pricing](https://apify.com/pricing)).\n\n**How do I control spending?**\nSet *Maximum cost per run* in the run options. The Actor stops before it would exceed it.\n\n**Does it store my data?**\nThe Actor only checks whether a mailbox exists; it doesn't store or enrich personal data beyond your run's dataset, which you control and can delete at any time.\n\n---\n\n## Related actors\n\n- [Email Extractor](https://apify.com/pnda/email-extractor): Need emails first? Extract the contacts published on a list of websites, already verified.\n- [Email Finder](https://apify.com/pnda/email-finder): Have a name and a company? Find the person's work email, verified.\n- [Google Maps API & Scraper](https://apify.com/pnda/google-maps-scraper): Building a local B2B list? Get businesses with their website emails, then verify them here.\n- [Shopify & WooCommerce Stores Database](https://apify.com/pnda/shopify-woocommerce-stores): Building an e-commerce list? Start from Shopify and WooCommerce stores filtered by country and category.\n\n---\n\n## ▶️ Start now\n\nPaste your email list. Click **Run**. Download the clean list.\nValid emails in, bounces out — and you only pay for real answers.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "email-verifier",
      "title": "Email Verifier & Validator - Bulk SMTP & Catch-All Check",
      "version": "1.0",
      "buildTag": "latest",
      "description": "Email verifier and email checker: verify email addresses in bulk with a live SMTP mailbox check, MX, catch-all, disposable and role detection. Email validation that cuts bounces. $0.95 per 1,000, catch-all at half price.",
      "input": {
        "title": "Email Verifier input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "emails": {
            "title": "Emails to verify",
            "type": "array",
            "description": "One email address per line (paste your list, or send an array through the API). Duplicates are removed automatically (case-insensitive) and verified once.",
            "editor": "stringList",
            "prefill": [
              "rand@sparktoro.com"
            ]
          },
          "checkCatchAll": {
            "title": "Detect catch-all domains",
            "type": "boolean",
            "description": "Catch-all servers accept every address, so the mailbox cannot be confirmed. On: such emails get the status \"catch-all\". Off: they are reported as \"risky\". Both are charged at half price.",
            "default": true,
            "editor": "checkbox"
          },
          "timeoutSecs": {
            "title": "Timeout per email (seconds)",
            "type": "integer",
            "description": "Maximum time to wait for the mail server of one address. Slow servers that do not answer in time are returned as \"unknown\" (not charged).",
            "default": 30,
            "minimum": 5,
            "maximum": 120,
            "unit": "seconds"
          },
          "concurrency": {
            "title": "Parallel checks",
            "type": "integer",
            "description": "How many emails are verified in parallel.",
            "default": 5,
            "minimum": 1,
            "maximum": 10
          }
        },
        "required": [
          "emails"
        ]
      },
      "defaultMemoryMbytes": 256,
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Email verifications",
        "description": "One row per unique input email with its status (valid, invalid, catch-all, risky, unknown) and the reasons.",
        "properties": {
          "dataset": {
            "type": "string",
            "title": "Results dataset",
            "description": "All verifications (JSON, CSV, Excel).",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=overview"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Email verifications",
          "fields": {},
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "email",
                  "status",
                  "reason",
                  "deliverable",
                  "catchAll",
                  "disposable",
                  "roleAccount",
                  "freeProvider",
                  "mxHost",
                  "suggestion",
                  "charged",
                  "message"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "email": {
                    "label": "Email",
                    "format": "text"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "reason": {
                    "label": "Reason",
                    "format": "text"
                  },
                  "deliverable": {
                    "label": "Deliverable",
                    "format": "boolean"
                  },
                  "catchAll": {
                    "label": "Catch-all",
                    "format": "boolean"
                  },
                  "disposable": {
                    "label": "Disposable",
                    "format": "boolean"
                  },
                  "roleAccount": {
                    "label": "Role account",
                    "format": "boolean"
                  },
                  "freeProvider": {
                    "label": "Free provider",
                    "format": "boolean"
                  },
                  "mxHost": {
                    "label": "MX host",
                    "format": "text"
                  },
                  "suggestion": {
                    "label": "Did you mean",
                    "format": "text"
                  },
                  "charged": {
                    "label": "Charged",
                    "format": "boolean"
                  },
                  "message": {
                    "label": "Message",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# ✅ Email Verifier & Validator — Bulk SMTP Email Verification, Catch-All Check\n\n**Bulk email verifier and email validator** for cleaning email lists before you send. Paste a list (or send it through the API) and get, for every address, a clear verdict — `valid`, `invalid`, `catch-all`, `risky` or `unknown` — with the reason behind it.\n\n<!-- crosssell:start -->\n<table width=\"100%\" style=\"display:table;width:100%;table-layout:fixed;border-collapse:separate;border-spacing:0;border:1px solid #d9d6cf;border-radius:10px\"><tbody><tr><td style=\"padding:9px 14px;background:#3d5a98;border:0;border-radius:9px 9px 0 0\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-profile-XENdzbJ81W-pnda.png\" width=\"20\" height=\"20\" alt=\"PNDA\" style=\"vertical-align:middle;border-radius:5px\"/> <strong style=\"color:#ffffff;font-size:13px;vertical-align:middle\">PNDA · Email suite</strong><span style=\"color:#ffffff;font-size:13px;vertical-align:middle\"> • Find, verify, extract</span></td></tr><tr><td style=\"padding:8px;background:#fbfaf8;border:0;border-radius:0 0 9px 9px\"><span style=\"display:flex;flex-wrap:wrap;gap:8px\"><span style=\"display:flex;flex:1 1 308px;gap:8px\"><a href=\"https://apify.com/pnda/email-finder\" target=\"_blank\" style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#ffffff;border:1px solid #e3e1dc;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-ESMZY2I5ruLO0NZ0U-qtaEUpCahu-cand_email-finder_1.png\" width=\"28\" height=\"28\" alt=\"Email Finder\" style=\"border-radius:7px\"/><br/><strong style=\"color:#1f2328;font-size:13px;line-height:1.3\">Email Finder</strong><br/><span style=\"color:#6b6f76;font-size:12px;line-height:1.4\">Work email from a name + company domain</span></a><span style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#eef2f9;border:1px solid #3d5a98;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-n4DH6fL7RqbgyJjEq-D9RVAZcSPH-cand_email-verifier_1.png\" width=\"28\" height=\"28\" alt=\"Email Verifier\" style=\"border-radius:7px\"/><br/><strong style=\"color:#3d5a98;font-size:13px;line-height:1.3\">Email Verifier</strong><br/><span style=\"color:#3d5a98;font-size:12px\">➤ You are here</span></span></span><span style=\"display:flex;flex:1 1 308px;gap:8px\"><a href=\"https://apify.com/pnda/email-extractor\" target=\"_blank\" style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#ffffff;border:1px solid #e3e1dc;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-XaU5KGYFpVhYMQaYF-snMUEg5Hcz-cand_email-extractor_1.png\" width=\"28\" height=\"28\" alt=\"Email Extractor\" style=\"border-radius:7px\"/><br/><strong style=\"color:#1f2328;font-size:13px;line-height:1.3\">Email Extractor</strong><br/><span style=\"color:#6b6f76;font-size:12px;line-height:1.4\">Emails, phones &amp; socials from any website</span></a><a href=\"https://apify.com/pnda/linkedin-scraper\" target=\"_blank\" style=\"display:block;flex:1 1 150px;box-sizing:border-box;padding:10px 12px;background:#ffffff;border:1px solid #e3e1dc;border-radius:8px;text-decoration:none;white-space:normal;word-break:normal;overflow-wrap:normal;text-align:left\"><img src=\"https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/kYoNI3wsaubJKcpfT-actor-btNUul6dyyuLVpSsd-TmkwwGu6FG-logo_linkedin.png\" width=\"28\" height=\"28\" alt=\"LinkedIn Leads Finder\" style=\"border-radius:7px\"/><br/><strong style=\"color:#1f2328;font-size:13px;line-height:1.3\">LinkedIn Leads Finder</strong><br/><span style=\"color:#6b6f76;font-size:12px;line-height:1.4\">Fresh B2B leads with verified work emails</span></a></span></span></td></tr></tbody></table>\n<!-- crosssell:end -->\n\nFor each email the Actor checks the **syntax**, looks up the domain's **MX records**, then runs a **live SMTP mailbox check** (`RCPT TO`) against the recipient's mail server to confirm that the mailbox exists. **No email is ever sent.** It also flags **catch-all domains**, **disposable / temporary email providers**, **role accounts** (`info@`, `sales@`, `support@`) and **free providers** (Gmail, Outlook, Yahoo), and suggests fixes for **typos** like `gmial.com` → `gmail.com`.\n\n**You pay for real answers only:** $0.95 per 1,000 emails returned as `valid` or `invalid`, and **half price** ($0.475 per 1,000) for `catch-all`. Risky, unknown and duplicate emails are **free**.\n\nExport results to **JSON, CSV, Excel or HTML**, or plug the Actor into **n8n, Make, Zapier, Clay, Google Sheets** or your own code through the Apify API.\n\n> 🔎 **Don't have the emails yet?** [Email Finder](https://apify.com/pnda/email-finder) finds the work email of a person from their name and company domain, already verified ($4.99 per 1,000 emails found).\n\n---\n\n## 💡 Who is it for?\n\n- **Cold email & sales teams** cleaning lead lists from Apollo, LinkedIn, Google Maps or any scraper before a campaign — fewer bounces, better sender reputation.\n- **Growth & marketing teams** running email list hygiene on newsletters and CRM exports (HubSpot, Salesforce, Pipedrive, Mailchimp, Brevo).\n- **Agencies** verifying client lists in bulk without a monthly SaaS subscription.\n- **Developers** who need an **email validation API** for sign-up forms, onboarding or data pipelines.\n- **Data teams** enriching and deduplicating contact databases.\n\n---\n\n## ⚙️ How it works\n\nEvery address goes through a **12-layer verification**, in this order:\n\n| # | Check | What it detects | Output field |\n|---|---|---|---|\n| 1 | ✅ **Syntax / format** | Malformed addresses (`john@@acme`, `not-an-email`) | `syntaxValid` |\n| 2 | ✅ **Typo correction** | `gmial.com`, `hotmial.com`, `yahooo.com`, `gmail.con` → corrected address | `suggestion` |\n| 3 | ✅ **DNS / MX lookup** | Domains with no mail server (double-checked to avoid false `invalid`) | `mxFound` |\n| 4 | ✅ **Mail server ID** | Which server handles the mail (Google, Microsoft, custom…) | `mxHost` |\n| 5 | ✅ **Live SMTP mailbox check** | Whether the mailbox really exists (`RCPT TO`, **no email is sent**) | `deliverable`, `smtpCode` |\n| 6 | ✅ **Full inbox** | Mailboxes that exist but can't receive mail right now | `fullInbox` |\n| 7 | ✅ **Disabled mailbox** | Accounts that were closed or suspended | `disabled` |\n| 8 | ✅ **Catch-all detection** | Domains that accept every address (risky to send to) | `catchAll` |\n| 9 | ✅ **Disposable email** | Throwaway providers (Mailinator, Yopmail, 10minutemail…) | `disposable` |\n| 10 | ✅ **Role account** | Generic inboxes (`info@`, `sales@`, `support@`) | `roleAccount` |\n| 11 | ✅ **Mailbox type** | Free provider (Gmail, Outlook, Yahoo) vs professional domain | `freeProvider` |\n| 12 | ✅ **Known hard bounces** | Addresses already reported as bounced by real email sends | `hardBounce` |\n\nEvery row ends with a clear **safe-to-send verdict** in `status`: `valid` (safe to send), `invalid` (do not send), `catch-all`, `risky` or `unknown`.\n\nDuplicates are removed case-insensitively, so every address is verified — and billed — once.\n\n---\n\n## 📥 Input\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `emails` | array of strings | ✅ | The emails to verify — one per line in the Console, an array through the API |\n| `checkCatchAll` | boolean | — | `true` (default): catch-all domains get the status `catch-all`. `false`: they are reported as `risky`. Billed at half price either way. |\n| `timeoutSecs` | integer | — | Max wait per mail server, 5–120 s (default `30`). Servers that don't answer return `unknown` (free). |\n| `concurrency` | integer | — | Emails verified in parallel, 1–10 (default `5`) |\n\n### Example input\n\n```json\n{\n  \"emails\": [\n    \"rand@sparktoro.com\",\n    \"john@gmial.com\",\n    \"info@acme.com\",\n    \"test@mailinator.com\"\n  ],\n  \"checkCatchAll\": true,\n  \"timeoutSecs\": 30,\n  \"concurrency\": 5\n}\n```\n\n---\n\n## 📤 Output\n\nOne row per unique email. Example item:\n\n```json\n{\n  \"email\": \"rand@sparktoro.com\",\n  \"status\": \"valid\",\n  \"reason\": \"Mailbox exists\",\n  \"suggestion\": null,\n  \"syntaxValid\": true,\n  \"domain\": \"sparktoro.com\",\n  \"mxFound\": true,\n  \"mxHost\": \"aspmx.l.google.com\",\n  \"disposable\": false,\n  \"roleAccount\": false,\n  \"freeProvider\": false,\n  \"catchAll\": false,\n  \"smtpConnected\": true,\n  \"deliverable\": true,\n  \"fullInbox\": false,\n  \"disabled\": false,\n  \"smtpCode\": null,\n  \"smtpMessage\": null,\n  \"charged\": true\n}\n```\n\nA typo example:\n\n```json\n{\n  \"email\": \"info@gmial.com\",\n  \"status\": \"invalid\",\n  \"reason\": \"Domain has no mail server (MX)\",\n  \"suggestion\": \"info@gmail.com\",\n  \"mxFound\": false,\n  \"roleAccount\": true,\n  \"charged\": true\n}\n```\n\nA `SUMMARY` record in the run's key-value store counts results per status, duplicates and billed emails.\n\n### Statuses\n\n| Status | Meaning | Billed |\n|---|---|---|\n| `valid` | The mail server confirmed the mailbox exists. Safe to send. Role accounts stay `valid` with `roleAccount: true`. | ✅ yes |\n| `invalid` | Bad syntax, no MX record, mailbox rejected or disabled (SMTP 550–553 \"user unknown\"). Remove it. | ✅ yes |\n| `catch-all` | The domain accepts every address (accept-all), so the single mailbox can't be confirmed. | ½ half price |\n| `risky` | Disposable / temporary email provider, full inbox, or catch-all when `checkCatchAll` is off. | ❌ free (catch-all: half price) |\n| `unknown` | No clear answer: timeout, greylisting, temporary server error. Re-run later. | ❌ free |\n\n### Field reference\n\n| Field | Meaning |\n|---|---|\n| `status` / `reason` | The verdict and a human-readable explanation |\n| `suggestion` | Corrected address when the domain looks like a typo of a common provider |\n| `syntaxValid` | RFC-style syntax check passed |\n| `mxFound` / `mxHost` | The domain has a mail server, and which one (Google Workspace, Microsoft 365…) |\n| `smtpConnected` / `deliverable` | The SMTP server answered / accepted the mailbox |\n| `smtpCode` / `smtpMessage` | Raw SMTP reply code and message when the server rejected the address |\n| `catchAll` | The domain accepts any address |\n| `disposable` | Throwaway / temporary email provider |\n| `roleAccount` | Generic inbox: `info@`, `sales@`, `support@`, `admin@`… |\n| `freeProvider` | Gmail, Outlook, Yahoo, iCloud… |\n| `fullInbox` / `disabled` | Mailbox full / mailbox disabled |\n| `charged` | Whether this row was billed |\n\n---\n\n## 🚀 Why use this Email Verifier\n\n- ✅ **Real SMTP verification**, not just syntax and MX — the mail server itself is asked whether the mailbox exists.\n- ✅ **Pay for real answers only** — catch-all at half price, risky and unknown free. On B2B lists, where 20–40% of addresses sit on catch-all domains, that is a real saving.\n- ✅ **Fewer false `invalid`** — \"no MX\" answers are double-checked with a second DNS lookup before an email is rejected.\n- ✅ **Typo correction** built in — recover leads instead of deleting them.\n- ✅ **Budget-safe** — set *Maximum cost per run* and the Actor never goes over it.\n- ✅ **No API key, no subscription, no credits that expire** — pay per result, export anywhere.\n- ✅ **Pipeline-ready** — chain it after any scraper, or call it from n8n, Make, Zapier or the Apify API.\n\n---\n\n## 📊 Comparison\n\n| | **This Actor** | Typical Store email verifiers | Email verification SaaS |\n|---|---|---|---|\n| Price per 1,000 | **$0.95** | $0.89 – $5.00 | monthly plans or prepaid credits |\n| Catch-all billed | **Half price** | Full price | Usually full price |\n| Unknown / timeout billed | **No** | Yes | Varies |\n| Duplicates billed | **No** (deduplicated) | Often yes | Varies |\n| Live SMTP mailbox check | ✅ | ✅ / partial | ✅ |\n| Typo suggestions | ✅ | Rare | Some |\n\nExample — 1,000 B2B emails with 30% on catch-all domains: ~700 results at full price plus 300 catch-all at half price, about **$0.81**.\n\n---\n\n## 💼 Use cases\n\n- **Clean a cold email list** before uploading it to Instantly, Lemlist, Smartlead or Apollo sequences.\n- **Lower your bounce rate** under 2% to protect domain reputation and deliverability.\n- **Validate emails scraped** from Google Maps, LinkedIn, YouTube channels or websites.\n- **CRM hygiene** — re-verify old contacts quarterly and drop dead mailboxes.\n- **Sign-up form validation** — call the API synchronously and reject disposable or mistyped emails.\n- **Lead enrichment** — keep only `valid` emails, flag `catch-all` for a lower-priority sequence.\n\n---\n\n## 💰 Pricing\n\n**Store discounts:** on Apify Silver, Gold, Platinum and Diamond plans, some events cost up to 20 % less. The Pricing tab of the Store page shows the exact price for each plan.\n\n**Pay per event: $0.95 per 1,000 verified emails** ($0.00095 per email returned `valid` or `invalid`) and **$0.475 per 1,000 catch-all emails** (half price), plus Apify's tiny per-run start fee. Risky, unknown and duplicate emails cost nothing.\n\n| Run | Emails | Max cost |\n|---|---|---|\n| Small list | 100 | ~$0.10 |\n| Campaign list | 1,000 | ~$0.95 |\n| Large list | 10,000 | ~$9.50 |\n| Database cleanup | 100,000 | ~$95 |\n\nCosts are a maximum: every catch-all (half price) or unknown (free) result lowers the bill.\n\n**Works with a free Apify account too.** Free-plan accounts can use every feature at the same per-result prices, paid from their monthly Apify credit. The only limits are your credit and your maximum cost per run.\n\n---\n\n## 🔌 Use it through the API\n\nSynchronous call — send emails, get results back in the same request:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/pnda~email-verifier/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"emails\": [\"rand@sparktoro.com\", \"nobody@example.com\"]}'\n```\n\nPython:\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"YOUR_APIFY_TOKEN\")\nrun = client.actor(\"pnda/email-verifier\").call(run_input={\"emails\": [\"rand@sparktoro.com\"]})\nfor item in client.dataset(run[\"defaultDatasetId\"]).iterate_items():\n    print(item[\"email\"], item[\"status\"], item[\"reason\"])\n```\n\nJavaScript:\n\n```js\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });\nconst run = await client.actor('pnda/email-verifier').call({ emails: ['rand@sparktoro.com'] });\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items);\n```\n\n---\n\n## ❓ FAQ\n\n**Does it send emails to the addresses?**\nNo. The SMTP conversation stops at `RCPT TO`, before any message is sent. Recipients see nothing.\n\n**How accurate is the email verification?**\n`valid` and `invalid` come straight from the recipient's mail server, so they are as reliable as SMTP allows. When the server can't give a definite answer, the email is reported as `catch-all`, `risky` or `unknown` instead of being guessed — catch-all at half price, the others free.\n\n**What is a catch-all email?**\nA catch-all (accept-all) domain accepts mail for any address, so no SMTP verifier can confirm one specific mailbox. Many Google Workspace and Microsoft 365 company domains are configured this way. These results cost half price here.\n\n**Why do I get `unknown`?**\nSome servers delay unknown senders (greylisting) or answer slowly. The Actor retries once; if the answer is still unclear, the result is `unknown` and free. Re-run those emails later or raise `timeoutSecs`.\n\n**Can it detect disposable and temporary emails?**\nYes — Mailinator, Yopmail, 10minutemail, Guerrilla Mail and similar providers are flagged `disposable` and returned as `risky`.\n\n**How fast is it?**\nAbout 60 emails in 12 seconds with `concurrency: 10`. Slow mail servers take longer; lists of tens of thousands run fine in a single run.\n\n**Can I verify a CSV file?**\nPaste the email column into the `emails` field, or read your CSV in code and send the array through the API. Export results back to CSV or Excel from the dataset.\n\n**Is it a ZeroBounce / NeverBounce / Hunter alternative?**\nFor list cleaning, yes: same kind of SMTP verification, pay-as-you-go, no subscription, catch-all at half price and unknown results free.\n\n**Can I use it on the free Apify plan?**\nYes. It works with a free Apify account too, at the same prices, paid from your monthly Apify credit ([pricing](https://apify.com/pricing)).\n\n**How do I control spending?**\nSet *Maximum cost per run* in the run options. The Actor stops before it would exceed it.\n\n**Does it store my data?**\nThe Actor only checks whether a mailbox exists; it doesn't store or enrich personal data beyond your run's dataset, which you control and can delete at any time.\n\n---\n\n## Related actors\n\n- [Email Extractor](https://apify.com/pnda/email-extractor): Need emails first? Extract the contacts published on a list of websites, already verified.\n- [Email Finder](https://apify.com/pnda/email-finder): Have a name and a company? Find the person's work email, verified.\n- [Google Maps API & Scraper](https://apify.com/pnda/google-maps-scraper): Building a local B2B list? Get businesses with their website emails, then verify them here.\n- [Shopify & WooCommerce Stores Database](https://apify.com/pnda/shopify-woocommerce-stores): Building an e-commerce list? Start from Shopify and WooCommerce stores filtered by country and category.\n\n---\n\n## ▶️ Start now\n\nPaste your email list. Click **Run**. Download the clean list.\nValid emails in, bounces out — and you only pay for real answers.\n"
    },
    "buildNumber": "1.0.27",
    "imageDigest": "635221b58d2e65eaec18599656e6fa517140744ba0a89a9edc375c04a5d68966",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.018016666666666667
    }
  }
}