Bulk Email Address Verifier
Pricing
from $0.38 / 1,000 email checkeds
Bulk Email Address Verifier
Validate email lists with syntax, normalized domains, MX records, disposable-domain and role-address signals, plus bounded diagnostics. No mailbox ownership or guaranteed-delivery claims.
Pricing
from $0.38 / 1,000 email checkeds
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Bulk Email Address Verifier performs bulk email address verification for CRM hygiene and lead-list qualification. Supply up to 5,000 addresses and receive one typed row per input with normalized address, syntax status, domain, MX status and records, a conservative disposable-domain signal, a role-address signal, and bounded diagnostics.
The Actor does not open a browser, send mail, contact a mailbox, prove mailbox ownership, or guarantee delivery. It reports address structure and public domain mail-routing evidence.
What does Bulk Email Address Verifier do?
For each supplied value, the Actor:
- Trims surrounding whitespace.
- Validates a practical dot-atom email syntax.
- Converts internationalized domain names to lowercase ASCII.
- Resolves public MX records for syntactically valid domains.
- Distinguishes found, missing, null-MX, skipped, and resolver-error outcomes.
- Checks a bounded list of widely used disposable-email domains.
- Detects common team inboxes such as support, billing, sales, and postmaster.
- Emits one result per input, including malformed and duplicate values.
This makes it suitable for repeatable list review before CRM imports or outreach cycles.
Who is it for?
- Revenue operations teams reviewing CRM exports before campaigns.
- Lead generation teams adding domain-level evidence to prospect lists.
- Marketing operations teams separating shared inboxes and malformed values.
- Data engineers normalizing address columns before warehouse ingestion.
- Agencies running the same hygiene check for recurring client lists.
- Developers integrating deterministic syntax and MX checks into workflows.
Choose this Actor when row-level evidence matters. It intentionally avoids SMTP-level mailbox claims.
Why use this bulk email address checker?
- Process 1–5,000 inputs per run.
- Preserve duplicates so output can join back to source rows.
- Return invalid inputs instead of silently dropping them.
- Include ordered MX hostnames and priorities.
- Use stable diagnostic codes for filtering.
- Detect common functional inbox names conservatively.
- Avoid login, proxy, and browser dependencies.
- Configure resolver timeout, concurrency, or custom DNS servers.
What email verification data is returned?
| Field | Meaning |
|---|---|
input | Original supplied string |
normalizedEmail | Trimmed address with normalized ASCII domain, or null |
syntaxStatus | valid or invalid |
syntaxValid | Boolean syntax result |
domain | Parsed normalized domain |
mxStatus | found, missing, null_mx, skipped, or error |
hasMx | Whether usable MX records were found |
mxRecords | Exchanges and priorities sorted deterministically |
isDisposable | Match against the bounded known-disposable list |
isRoleAddress | Match against a common functional local part |
roleType | Role category, such as support or billing |
diagnostics | At most five stable signal or failure codes |
errorCode | Resolver code when MX resolution fails |
checkedAt | ISO 8601 result timestamp |
durationMs | Per-address processing duration |
Boolean disposable and role signals are null when syntax is invalid because no reliable domain/local part was parsed.
How to run your first email list check
- Open the Actor in Apify Console.
- Paste addresses into Email addresses.
- Keep the default DNS settings for a first run.
- Click Start.
- Open the Dataset tab.
- Filter by
syntaxStatus,mxStatus,isDisposable, orisRoleAddress. - Export JSON, CSV, Excel, XML, or RSS as needed.
Example input:
{"emails": ["support@apify.com","sales@github.com","visitor@mailinator.com","not-an-email"],"concurrency": 25,"timeoutMs": 5000}
Input parameters
emails
Required array containing 1–5,000 strings. Each entry produces one charged result and dataset row. Duplicate values remain duplicates by design.
The supported syntax accepts common unquoted dot-atom local parts. Quoted local parts, comments, display-name wrappers, and address groups are not accepted. Supply plain addresses rather than strings such as Person <person@domain.tld>.
concurrency
Optional integer from 1 to 100. Default: 25. Lower it when a custom resolver has strict rate limits.
timeoutMs
Optional DNS attempt timeout from 500 to 30,000 milliseconds. Default: 5,000.
dnsServers
Optional list of recursive DNS server IPv4 or IPv6 addresses. When provided, the Actor uses those servers and does not switch to public fallback resolvers.
Example output
A result has this shape:
{"input": "support@apify.com","normalizedEmail": "support@apify.com","syntaxStatus": "valid","syntaxValid": true,"domain": "apify.com","mxStatus": "found","hasMx": true,"mxRecords": [{ "exchange": "aspmx.l.google.com", "priority": 1 }],"isDisposable": false,"isRoleAddress": true,"roleType": "support","diagnostics": ["role_address"],"errorCode": null,"checkedAt": "2026-08-26T12:00:00.000Z","durationMs": 24}
MX answers can change, so hostnames and priorities above are illustrative of the current output shape.
Understanding statuses and diagnostics
syntaxStatus: invalid means deterministic parsing failed. In that case, mxStatus is skipped and no DNS query is made.
mxStatus: found means at least one usable MX exchange was returned. missing means no MX answer was found. null_mx means the domain explicitly states that it accepts no email. error means a resolver failure prevented a conclusion.
Possible diagnostics include:
empty_addressaddress_too_longinvalid_at_separatorlocal_part_too_longinvalid_local_partinvalid_domainknown_disposable_domainrole_addressmx_not_founddomain_does_not_accept_emailmx_lookup_failed
Diagnostics are bounded to five values per row.
How much does it cost to verify email addresses?
The Actor uses pay-per-event pricing:
- one
startevent per run; - one
emailevent for every emitted input result.
Current pricing is a $0.0001 start fee plus the per-email rate for your Apify plan:
| Apify plan | Price per email result |
|---|---|
| Free | $0.000736 |
| Bronze | $0.00064 |
| Silver | $0.0004992 |
| Gold | $0.000384 |
| Platinum | $0.000256 |
| Diamond | $0.0001792 |
Calculate a Bronze run as the one-time start fee plus input rows × Bronze email price. Duplicate and malformed inputs still produce useful diagnostic rows and therefore trigger the email event.
CRM hygiene workflow
Create an Apify Task with the addresses exported from your CRM, then schedule it before monthly or quarterly outreach reviews.
A practical workflow is:
- Export the email column plus your internal row key.
- Preserve source order when building the Actor input.
- Run this Actor.
- Join output rows back by position or input value.
- Route invalid syntax and null-MX rows for correction.
- Review missing-MX and resolver-error rows separately.
- Treat disposable and role signals as review flags, not automatic rejection rules.
- Store timestamped datasets for downstream comparison.
Apify schedules and webhooks provide orchestration. The Actor itself does not send alerts or retain cross-run history.
Export and integrations
Results use the default Apify dataset and work with:
- Google Sheets for manual list review;
- Make and Zapier for conditional routing;
- BigQuery, Snowflake, and PostgreSQL for enrichment;
- webhooks for completed-run notifications;
- JavaScript and Python API clients;
- dataset exports in JSON, JSONL, CSV, Excel, XML, or RSS.
Run with the Apify API
Keep APIFY_TOKEN in an environment variable.
cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~bulk-email-address-verifier/runs" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"emails":["support@apify.com","not-an-email"]}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/bulk-email-address-verifier').call({emails: ['support@apify.com', 'sales@github.com', 'not-an-email'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/bulk-email-address-verifier').call(run_input={'emails': ['support@apify.com', 'sales@github.com', 'not-an-email'],})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with Apify MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/bulk-email-address-verifier"
Claude Desktop, Cursor, and VS Code setup
Use this MCP configuration in Claude Desktop, Cursor, or VS Code:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/bulk-email-address-verifier"}}}
Example prompts:
- “Check these CRM email addresses and summarize invalid syntax and missing MX rows.”
- “Run the bulk email verifier and return only disposable-domain or role-address signals.”
- “Export the verification dataset as CSV for a list-hygiene review.”
Reliability and DNS behavior
The runtime resolver is used first. On transient resolver failures only, the Actor makes one bounded recovery attempt through public Cloudflare and Google resolvers unless custom servers were supplied.
Authoritative no-record answers are not retried as transient failures. Deterministic malformed inputs never consume a DNS request.
Public DNS changes over time and recursive caches can briefly differ. Use a custom resolver when consistency with your own infrastructure matters.
Limitations
- Syntax validity does not prove a mailbox exists.
- An MX record does not guarantee that a recipient accepts mail.
- No SMTP handshake, message, or mailbox login occurs.
- Catch-all behavior is not tested.
- Disposable-domain coverage is intentionally bounded and can miss new services.
- Role detection uses exact common local parts and can miss organization-specific roles.
- Valid quoted local parts are outside the supported syntax subset.
- DNS outages can produce explicit
errorrows. - The Actor does not create, find, or extract email addresses.
Do not label syntaxValid or hasMx as a guaranteed deliverability verdict.
Legality and responsible use
Only process addresses you are authorized to handle. Apply applicable privacy, direct-marketing, anti-spam, employment, and data-retention rules. Minimize input, restrict dataset access, configure retention appropriately, and delete exports when no longer needed.
The Actor provides technical signals. It does not provide consent to contact a person and does not determine whether outreach is lawful or appropriate.
Troubleshooting
Why is a syntactically valid address marked missing?
The domain returned no MX answer. Recheck the spelling and retry later if DNS was recently changed. The Actor does not assume an A record is equivalent to an advertised MX route.
Why is mxStatus equal to error?
Inspect errorCode. Increase timeoutMs, lower concurrency, or supply a reliable recursive resolver. Do not treat a transient error as proof that the domain cannot receive email.
Why was a valid-looking address rejected?
Provide a plain address without a display name. Quoted local parts and comments are outside the supported parser subset.
Why is a disposable service not flagged?
The embedded list is conservative rather than exhaustive. Use the signal as one review input, not a complete disposable-email database.
Frequently asked questions
Does this Actor guarantee delivery?
No. It explicitly excludes guaranteed-delivery and mailbox-ownership claims.
Does it send verification emails?
No. It never sends a message or contacts the recipient mailbox.
Are duplicates removed?
No. One row is emitted per input so source-list cardinality remains available for downstream joins.
Can I check internationalized domains?
Yes. Valid Unicode domains are converted through IDNA to lowercase ASCII before MX lookup.
Can I schedule recurring checks?
Yes. Save the input as an Apify Task and add a schedule. Each run creates a new timestamped dataset.
Is a role address invalid?
No. A role address can be completely valid. The signal only identifies common functional inbox names for segmentation or review.
Related Automation Lab Actors
- Bulk DNS Records Lookup for broader DNS record inventory.
- MX Record Checker when only mail-exchanger discovery is needed.
- Bulk DMARC Record Checker for domain email-authentication policy audits.
- Website Email Extractor when you need to collect publicly displayed addresses before validation.
These Actors solve adjacent jobs. This Actor focuses on user-supplied address-list hygiene.