Email Verification API — Bulk Deliverability & MX Checks avatar

Email Verification API — Bulk Deliverability & MX Checks

Pricing

from $20.00 / 1,000 email verifications

Go to Apify Store
Email Verification API — Bulk Deliverability & MX Checks

Email Verification API — Bulk Deliverability & MX Checks

Verify email addresses in bulk with syntax validation and MX-record checks, detect disposable and role addresses, and clean your email lists. Reduce bounce rates and improve sender reputation. No API key. Pay per record.

Pricing

from $20.00 / 1,000 email verifications

Rating

0.0

(0)

Developer

NexGenData

NexGenData

Maintained by Community

Actor stats

0

Bookmarked

41

Total users

4

Monthly active users

6 days ago

Last modified

Share

✅ Email Verification Tool — syntax + DNS MX checking, no subscription

Bulk-check email addresses for syntax validity and DNS MX records, with disposable-domain, free-provider and role-account flags. Pay per result, no monthly plan, no API key beyond your Apify token.

What this Actor checks — and what it does not

CheckDone?How
Address syntaxRFC-shaped pattern, length-capped local part and domain labels
Domain accepts maillive DNS MX record lookup at run time
Disposable / temp-mail domainmatched against a curated list of 142 known throwaway domains
Free provider (gmail, outlook, …)matched against a curated list of 32 consumer providers
Role account (info@, sales@, …)matched against a list of 45 function-address local parts
Mailbox actually existsnot checked
SMTP / RCPT TO probenot performed
Catch-all detectionnot performed
Spam-trap / bounce-history scoringnot performed

This Actor performs no SMTP connection of any kind. A status of valid means "well-formed address at a domain that is configured to receive mail" — not "this mailbox exists". Every row carries "verificationMethod": "syntax+dns_mx" so the limitation travels with the data.

That distinction matters when you compare it to ZeroBounce, NeverBounce or Kickbox: those run SMTP-level checks that this Actor does not. Use this when you want to strip malformed addresses, dead domains, throwaway domains and role accounts out of a list cheaply and without a subscription — the bulk of what makes a list bounce.

Pricing — the live, current prices

EventPrice
Actor start$0.00005 (per GB of run memory, minimum one)
Result row in the dataset$0.02

One address that gets a verdict = one row = $0.02.

Worked examples at the live price:

  • 1,000-address list = $0.00005 + (1,000 × $0.02) = $20.00005
  • 500 signup checks a day = $10.00005/day

You are not charged for:

  • an address whose domain's DNS lookup never completed (timeout / SERVFAIL) — it produces no row
  • retries and failed sub-requests — those are absorbed by the platform

A malformed address and a dead domain are real verdicts, so they do produce a row and are charged.

What you get per address

FieldMeaning
emailthe address, lowercased
statusvalid / risky / invalid
reasonaccepted / role / disposable / no_mx / syntax
isValidboolean shorthand: MX present and not a disposable domain
syntaxValidaddress is well-formed
mxValidthe domain has MX records
domain, localPart (alias local_part)split address parts
mxRecordsup to 5 {priority, server} entries, lowest priority first
mx_recordsthe same servers as a flat list of hostnames
isDisposable / is_disposablethrowaway domain
isFreeProvider / is_free_providerconsumer mail provider
isRoleAccount / is_role_accountfunction address rather than a person
verificationMethodalways syntax+dns_mx
checkedAtUTC timestamp of the check

Both the camelCase and snake_case spellings are present in every row, so either naming convention works downstream.

Input

ParameterTypeDescription
emailsstring / arrayAddresses, one per line or comma-separated. Aliases: email, emailList, addresses.
singleEmailstringA single address, for one-off API calls.

Quick start (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("nexgendata/email-verification-tool").call(run_input={
"emails": "jane.doe@stripe.com\ninfo@apify.com\nuser@mailinator.com\nnot-an-email"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["email"], item["status"], item["reason"])

Example row (real shape, from a live run — the MX records below were resolved live):

{
"email": "jane.doe@stripe.com",
"status": "valid",
"reason": "accepted",
"isValid": true,
"syntaxValid": true,
"mxValid": true,
"domain": "stripe.com",
"localPart": "jane.doe",
"local_part": "jane.doe",
"mxRecords": [
{"priority": 10, "server": "aspmx.l.google.com"},
{"priority": 20, "server": "alt1.aspmx.l.google.com"}
],
"mx_records": ["aspmx.l.google.com", "alt1.aspmx.l.google.com"],
"isDisposable": false,
"isFreeProvider": false,
"isRoleAccount": false,
"verificationMethod": "syntax+dns_mx",
"checkedAt": "2026-09-05T12:47:39Z"
}

Verdict table

AddressStatusReasonWhy
jane.doe@acme.comvalidacceptedwell-formed, domain has MX
info@acme.comriskyrolefunction address, not a person
user@mailinator.cominvaliddisposablethrowaway domain (it does have MX)
user@nonexistentdomain-zzz-12345.cominvalidno_mxdomain resolves to no mail server
not-an-emailinvalidsyntaxmalformed
someone@gmail.comvalidacceptedvalid; also flagged isFreeProvider

How the run ends

The Actor always says what happened, in plain English, in the run's status message:

  • Rows returned — "Checked N of M address(es) by syntax and DNS MX record (no SMTP probe): X valid, Y risky, Z invalid…", plus how many were skipped because their DNS lookup did not complete. Only delivered rows were charged.
  • Resolver dead — if DNS did not answer for any domain in the list, the run fails with a message naming the cause. Nothing was charged, so a broken resolver can never masquerade as a clean list.
  • No input — the run succeeds with 0 rows and names the fields to supply (emails / singleEmail). Nothing was charged.
  • Time limit — the run stops cleanly and says it stopped early at the run time limit; only rows already delivered were charged.

Use cases

  • Cold-email hygiene — strip malformed addresses, dead domains and throwaways before a campaign
  • CRM cleanup — bulk-check existing contacts and quarantine the ones with no mail server
  • Signup-form validation — reject typos and disposable domains at registration, via /run-sync-get-dataset-items
  • Lead-list QA — sanity-check a purchased or scraped list before handing it to sales
  • Fraud / abuse triage — flag disposable and role-account signups for review

FAQ

Q: Is this the same as ZeroBounce / NeverBounce / Kickbox? A: No. Those perform SMTP-level mailbox checks. This Actor does syntax + DNS MX only, and says so in every row. It removes the majority of hard-bounce causes without a subscription, but it cannot tell you whether an individual mailbox exists.

Q: Why is a valid-looking address marked risky? A: It is a role account (info@, sales@, support@…). Those deliver, but they are usually poor outbound targets and are more likely to mark mail as spam.

Q: Why did an address get no row at all? A: Its domain's DNS lookup never completed. That is not a verdict, so it is not delivered and not charged. The status message counts these.

Q: How fresh is the data? A: MX records are resolved live at run time.

Q: GDPR / CCPA? A: The check is metadata about an address's mail configuration. You are the data controller for downstream outreach.

Use caseActor
Extract emails from websiteswebsite-email-extractor
Contact info scraper (emails + phones + socials)contact-info-scraper
Find emails on a domaincompany-email-finder
Company enrichment from domaincompany-enrichment-tool
Lead-list enricher (CSV in → CSV out)lead-list-enricher

Integration surface

Apify console, Apify API (REST + webhooks), Python / JS SDKs, Zapier, Make.com, n8n, MCP, and built-in schedules.

Support

NexGenData ships updates regularly. Bug reports via the Apify console issues tab get a response within 24 hours.

Home: thenextgennexus.com Full catalog: apify.com/nexgendata