Bulk Email & Phone Validator – MX Check, Dedupe, Lead Score avatar

Bulk Email & Phone Validator – MX Check, Dedupe, Lead Score

Pricing

from $0.40 / 1,000 cleaned rows

Go to Apify Store
Bulk Email & Phone Validator – MX Check, Dedupe, Lead Score

Bulk Email & Phone Validator – MX Check, Dedupe, Lead Score

Clean and validate any contact or lead list: dedupe, email syntax + domain MX check, disposable/role/free-mail flags, E.164 phone formatting, website check and a 0–100 quality score. No SMTP mailbox probing. $0.60 per 1,000 rows; duplicates are free.

Pricing

from $0.40 / 1,000 cleaned rows

Rating

0.0

(0)

Developer

Chris Elder

Chris Elder

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Clean and validate a contact or lead list in one run. Upload a CSV, paste JSON or point at an Apify dataset, and this Actor removes duplicates, checks every email's syntax and domain MX records, flags role (info@), free-mail and disposable addresses, formats and validates phone numbers to E.164, checks each website is reachable, and gives every row a 0–100 quality score with a plain-English issues list.

It is a validator, not an SMTP mailbox verifier: it tells you which emails can never work (bad syntax, disposable, domain with no mail server) without probing inboxes, which is unreliable from cloud IPs and harms sender reputation.

Store page: apify.com/chris_elder/dataset-dedupe-enrich

✅ Pay per result: $0.60 per 1,000 cleaned rows · 🆓 Merged duplicates, dropped rows and input errors are never charged · 🔑 No API key

Formerly listed as Dataset Dedupe & Enrich. This is the generalist sibling of Google Maps Lead Cleaner: same hygiene pipeline, but Store-positioned for any CSV / JSON / Apify dataset (CRM exports, form dumps, contact extractors, job boards), not only Maps scrapes.

What it does

  • 🧹 Dedupes by placeId (if present), else website domain+path, else phone, else name+address; merges contact fields from duplicates
  • 📞 E.164 phones with national format, type and invalid list
  • 📧 Email hygiene: split lists, fix name @domain.com, strip mailto:, syntax check
  • 🌐 Domain MX check (cached per domain): no SMTP mailbox probing
  • 🏷️ Role / free-mail / disposable flags; website alive check
  • ⭐ 0–100 quality score + issues list for sorting

What it does not do: SMTP / mailbox verification (unreliable from cloud IPs and bad for sender reputation).

How to use it

Works with any columns: it auto-detects common names such as email/emails, phone/phoneNumber/mobile, website/domain/homepage, name/company/title and address (Apify CSV exports with emails/0, emails/1 columns work too). Use fieldMapping if your headers are unusual.

  1. Click Try for free: prefill has 8 public hotel contact rows (one duplicate, mistyped email, no-MX domain). A few seconds, about $0.004.
  2. Or set datasetId / csvUrl / paste items.
  3. Set defaultCountry (e.g. US) when phones lack country codes.
  4. Download CSV/Excel/JSON from Storage. RUN_SUMMARY is in the key-value store.
{
"datasetId": "YOUR_DATASET_ID",
"defaultCountry": "GB",
"dedupeMode": "auto",
"checkMx": true,
"checkWebsites": true
}

Real example output

Public run on 20 Oct 2026 (run cQIQIxtnCC8uVeccQ, defaultCountry: "GB"): 5 rows in, 4 rows out (one duplicate merged, not charged). Fields trimmed for space.

Input rows:

[
{ "title": "Apify", "email": "hello@apify.com", "website": "https://apify.com" },
{ "title": "Apify", "email": "HELLO@apify.com ", "website": "https://apify.com/" },
{ "title": "Throwaway Ltd", "email": "test123@mailinator.com", "phone": "07700 900123" },
{ "title": "No Mail Co", "email": "info@no-mx-domain-xyz123.com", "website": "https://no-mx-domain-xyz123.com" },
{ "title": "GOV.UK", "emails": "mailto:info@gov.uk; sales @gov.uk", "phone": "020 7946 0000", "website": "https://www.gov.uk" }
]

What came back:

RowEmail resultPhone resultWebsiteScoreIssues
Apify (2 rows merged)hello@apify.com → valid-mx, role addressnonealive (200)65 mediumemail-role-address-only, missing-phone, missing-address
Throwaway Ltdtest123@mailinator.com → disposable07700 900123 → invalid (Ofcom drama range)none5 lowno-usable-email, email-disposable, phone-invalid, no-contact-method
No Mail Coinfo@no-mx-domain-xyz123.com → no-mxnonedns-not-found5 lowemail-domain-no-mx, website-unreachable, no-contact-method
GOV.UKmailto: stripped and sales @gov.uk repaired; both → no-mx-a-record020 7946 0000 → +442079460000 (fixed line)alive (200)55 mediumemail-domain-a-record-only, email-repaired, missing-address

One output row in full shape (Apify):

{
"name": "Apify",
"website": "https://apify.com/",
"primaryEmail": "hello@apify.com",
"primaryEmailStatus": "valid-mx",
"primaryEmailIsRole": true,
"phone": null,
"invalidPhones": [],
"websiteAlive": true,
"websiteStatus": 200,
"leadQuality": 65,
"leadQualityLabel": "medium",
"issues": ["email-role-address-only", "missing-phone", "missing-address"],
"duplicatesMerged": 1,
"mergedRowNumbers": [2],
"emailDetails": [
{ "email": "hello@apify.com", "status": "valid-mx", "role": true, "freeMail": false, "disposable": false, "matchesWebsite": true,
"mxHosts": ["aspmx.l.google.com", "alt1.aspmx.l.google.com", "alt2.aspmx.l.google.com"] }
]
}

Email statuses

StatusMeaning
valid-mxSyntax OK and the domain publishes MX records
no-mx-a-recordNo MX record; the domain only has an A record (mail may still be accepted, treat with care)
no-mxDomain has no mail server: the address cannot receive email
disposableKnown throwaway-inbox domain
invalid-syntaxNot a valid email address
placeholderObvious placeholder or junk address
unknownDNS lookup failed, so the domain could not be checked
not-checkedMX checking was switched off (checkMx: false)

Pricing

PlanPer cleaned rowPer 1,000
Free / Bronze$0.0006$0.60
Silver$0.0005$0.50
Gold+$0.0004$0.40

Actor start is a tiny one-time fee. Duplicates merged into another row and rows you drop are free.

Support

Built by GPT Shop Ltd. Questions: chris@gptshopltd.com