Bulk Email Verifier — Validate Emails, MX, Disposable & Role
Pricing
from $0.87 / 1,000 email-verifieds
Bulk Email Verifier — Validate Emails, MX, Disposable & Role
Validate supplied email lists and return one structured record per unique email with syntax, DNS/MX, heuristic, and optional SMTP results. Run with emails and optional checkSmtp; no API key or login. Pricing: $0.0009 per email-verified event on Free.
Pricing
from $0.87 / 1,000 email-verifieds
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
3
Monthly active users
a day ago
Last modified
Categories
Features
Share
Bulk Email Verifier
Bulk Email Verifier checks a supplied email list against public DNS records and, optionally, a standard SMTP handshake, returning one structured record per unique address.
No login or API key is needed: you only supply the email list. Built for B2B lead-list hygiene, it returns normalized results for CRM import or email campaigns, and you can export the dataset as JSON or CSV.
- Clean lead lists before CRM import or email campaigns.
- Review returned free-provider, disposable-domain, and role-account flags before outreach.
- Review suggested domain corrections before contacting addresses.
- Check DNS and MX records in bulk, with an optional SMTP check that does not deliver mail.
- Deduplicate repeated addresses and receive one structured result per unique email.
What you get
| Field | Type | Meaning | When null or empty |
|---|---|---|---|
email | string | The normalized address. Input whitespace is removed and the address is lower-cased during verification. | Never |
result | string | Overall verdict: valid, invalid, or risky. | Never |
reason | string | Short machine-readable explanation such as ok, invalid_syntax, no_mx_record, role_account, disposable_domain, smtp_confirmed, or smtp_rejected. | Never |
isValid | boolean | true only when result is valid; false for invalid and risky. | Never |
syntaxValid | boolean | Whether the address passes the verifier’s syntax checks. | Never |
domain | string | The domain part of the address. | null when the syntax is invalid. |
mxFound | boolean | Whether an MX host was found for the domain. | Never; false when no host is found. |
mxRecord | string | The primary mail host found for the domain. | null when no host is found. |
isFreeProvider | boolean | Whether the domain is in the verifier’s free webmail provider list. | Never; false when it is not in the list. |
isDisposable | boolean | Whether the domain is in the verifier’s disposable or temporary-mail list. | Never; false when it is not in the list. |
isRoleAccount | boolean | Whether the local part matches a role address such as info, admin, support, or sales. | Never; false when it is not a role address. |
didYouMean | string | A suggested domain correction when a likely typo is detected. | null when no suggestion is returned. |
smtpCheck | string | Optional best-effort mailbox check: deliverable, undeliverable, unknown, or skipped when the SMTP probe was not requested, or when the address has invalid syntax or no MX host. | Never; skipped is used when disabled or not attempted. |
The nullable fields above use null when the source does not provide the value.
Sample output
The following is one full record from the dataset sample. The email value is hidden for privacy:
{"email": "<hidden for privacy>","result": "valid","reason": "ok","isValid": true,"syntaxValid": true,"domain": "stripe.com","mxFound": true,"mxRecord": "aspmx.l.google.com","isFreeProvider": false,"isDisposable": false,"isRoleAccount": false,"didYouMean": null,"smtpCheck": "skipped"}
Pricing
Pricing uses pay-per-event billing. The email-verified event covers one email verified with all fields. Duplicates are removed before verification, so repeated addresses are charged once. The apify-actor-start event is charged once per GB of run memory, with a minimum of one event.
| Event | Free plan price per event |
|---|---|
apify-actor-start | $0.00005 |
email-verified | $0.0009 |
For the primary event, 1,000 results = $0.90 on Free and 10,000 results = $9.00 on Free.
Apify Free plan includes $5 of monthly platform usage credit. The Free plan's $5 credit covers 5,555 full email-verification results in a run.
You pay only for the events listed below. This Actor does not use the Pay per event + usage option, so the platform usage of your runs (compute, proxy traffic and storage) is not billed to you separately.
How to use
- Prepare an array of email address strings in the
emailsinput. - Choose whether to enable
checkSmtpfor a best-effort live mailbox probe. - Adjust optional processing controls when needed.
- Run the Actor from your Apify account.
- Inspect one structured dataset record per unique email.
- Repeat the run through Apify Schedules; weekly is a reasonable starting point for recurring lead-list hygiene.
{"emails": ["user@mailinator.com","info@mailinator.com"],"checkSmtp": false,"timeout": 8,"maxItems": 0,"disableUsageStats": false}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
emails | Required array of email address strings. The Actor trims, normalizes, and removes duplicates before verification. | Required |
checkSmtp | Enables a best-effort SMTP mailbox probe. Blocked mail servers or networks produce smtpCheck: "unknown" rather than changing the core syntax, DNS, and heuristic checks. | false |
timeout | Sets the per-email timeout for DNS and SMTP work. The accepted range is 3–30 seconds; network calls use no more than 8 seconds. | 8 |
maxItems | Caps the number of emails verified after normalization and de-duplication. 0 verifies all supplied emails. | 0 |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
| The same address appears more than once, including with different capitalization or surrounding whitespace | The normalized address is verified once and is not charged twice. | No special handling is needed. |
maxItems is greater than 0 | Only the first maxItems addresses after normalization and de-duplication are verified. | Set maxItems to 0 to verify all normalized addresses. |
timeout is outside 3–30 seconds | The input does not meet the schema’s accepted range. | Use a whole-number value from 3 through 30. |
timeout is greater than 8 seconds | The input is accepted, but DNS and SMTP calls are capped at 8 seconds by the verifier. | Use a value from 3 through 8 when you need the setting to represent the effective network timeout. |
| An address fails syntax checks | The record has result: "invalid" and reason: "invalid_syntax". | Correct the address before using it in a campaign or CRM. |
| No MX host is found for the domain | The record has result: "invalid", reason: "no_mx_record", and mxFound: false. | Check the spelling and domain configuration. |
| SMTP is enabled but the mail server or network blocks the probe | smtpCheck is unknown; the syntax, DNS, and heuristic verdict remains available. | Treat unknown as inconclusive or run without SMTP probing. |
| The SMTP server rejects the mailbox probe | The record has smtpCheck: "undeliverable", result: "invalid", and reason: "smtp_rejected". | Remove or separately review the address. |
| An address belongs to a disposable domain or role account | The overall result is risky with the corresponding heuristic reason. | Decide whether that address is appropriate for your use case. |
checkSmtp is on but the address has invalid syntax or no MX host | smtpCheck stays skipped; no SMTP probe is attempted. | Fix the address or domain first. |
checkSmtp is off and the result is valid | valid confirms only syntax, DNS/MX records and the built-in lists; it does not prove the mailbox exists. | Enable checkSmtp for a best-effort mailbox probe, and treat unknown as inconclusive. |
| The free-provider, disposable-domain, or role lists do not cover an address | The lists are compact and not exhaustive, so an unlisted provider, disposable domain, or role name gets a false flag. | Treat the flags as high-precision hints, not complete coverage. |
| You need to check a provider, disposable domain, or typo | Run a one-address job and read the record for that address. | Use the returned record. |
| Verification of the input completes | Records reach the dataset after verification, in batches of up to 100. | Check the dataset after the run. |
| A run is aborted, times out, or fails before a dataset batch is pushed | No verified dataset records have been written. | Run the input again. |
| A run stops or fails after a dataset batch is pushed | Already pushed batches remain in the dataset; later batches may be absent. | Check the dataset and rerun any missing addresses. |
FAQ
How much does it cost to verify an email list?
See the Pricing table for the Free-plan prices and worked example.
Does the Actor send emails?
No. It reads public DNS records and, when checkSmtp is enabled, performs a standard SMTP handshake without delivering a message.
Why can smtpCheck be unknown?
Many mail hosts and networks block best-effort SMTP mailbox probes. In that case, the Actor keeps its syntax, MX/DNS, and heuristic verdict and records unknown for the SMTP check.
Is using public DNS and SMTP data legal?
The Actor uses public DNS records and, when requested, a standard SMTP handshake. Whether a particular use is allowed depends on the source terms and applicable law for your use case; review those requirements before processing or contacting people.
Related actors
- Email Verifier — Bulk SMTP & MX Validation, Catch-all — related email validation with bulk SMTP and MX validation.
- Email Finder — Name + Domain to Work Email + Score — finds a work email from a name and domain before verification.
- Email Finder Bulk — Lists of Domains or People to Emails — processes lists of domains or people to find email addresses.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.