Contact Data Cleaner: Phone, Email & Name Validator avatar

Contact Data Cleaner: Phone, Email & Name Validator

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Contact Data Cleaner: Phone, Email & Name Validator

Contact Data Cleaner: Phone, Email & Name Validator

Validate and format phone numbers (libphonenumber, 240+ regions), verify email syntax + MX + disposable/role/typos, clean names, parse money in any locale, normalize countries and postal codes, and dedupe CRM rows. Bulk, offline-fast, agent-ready JSON.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Dodi Abak

Dodi Abak

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Clean and validate messy contact data in bulk, for people and for AI agents. Phone numbers from 240+ countries and regions (Google libphonenumber data), email syntax with MX lookup and disposable/role/typo detection, person names, money and numbers in any locale, country names in 40 languages, postal codes, and whole CRM/CSV rows with duplicate detection. Everything returns as structured JSON, one result per item.

No scraping and no third-party APIs. The only network call is an optional DNS MX lookup. That keeps runs fast (about 20,000 items in 12 seconds) and cheap.

What does it do?

TypeExample inputExample output
phone(415) 555-2671, 0049 30 901820, 4.91701234567E+11+14155552671, +49 30 901820, type mobile / fixed_line / toll_free…, country, calling code, country time zones, extension, and a reason when invalid (TOO_SHORT, INVALID_COUNTRY…)
emailJane.Doe+news@GMAIL.com, jane@gmial.comnormalized and canonical (janedoe@gmail.com), syntax check, MX check, disposable (8,800+ domains), role address (info@, sales@…), free provider, typo suggestion (did you mean jane@gmail.com?), verdict valid / risky / invalid / unknown
nameJOHN MCDONALD JR, Smith, John Paul, Dr. ludwig van beethovenJohn McDonald Jr. split into honorific, first, middle, last and suffix, keeping particles such as van, de la and bin
amount1.234,56 €, CHF 1'234.50, ₹1,23,456.78, (1,200.00), 2.5k1234.56 + EUR, separators detected, ambiguity flagged, re-formatted in your locale
countryDeutschland, U.S.A., السعودية, 日本, DEUDE, US, SA, JP with the English name and time zones
postalCodesw1a1aa (GB), 902101234 (US)SW1A 1AA, 90210-1234, format valid or not (45 countries)
record{"first_name":"mary","email":"…","phone":"020 7946 0958","country":"UK"}the same row with every recognized column cleaned, a list of issues, a dedupe key, and isDuplicate / duplicateOf

Why use it?

  • Better data, better campaigns. Fix numbers before SMS or WhatsApp sends, and catch typos and dead email domains before they bounce.
  • CRM imports without the pain. It repairs numbers that Excel mangled (4.9170E+11), normalizes names and countries, and flags duplicates across the batch.
  • Made for AI agents. Agents can't reliably validate phone numbers or parse 1.234,56 by guessing. Every result has stable field names, error codes and a one-line summary.
  • Worldwide. Phone metadata for every ITU region, country names in 40 languages, and Arabic-Indic and full-width digits.

How to use it

  1. Open the Actor and paste values or rows into Items. The prefilled example covers every type.
  2. Set Default country for local phone numbers without +, for example GB, DE, IN or BR.
  3. Click Start, then open the Overview, Phones, Emails or Records view. Download as JSON, CSV or Excel, or use the API.

Input example

{
"defaultCountry": "US",
"checkMx": true,
"items": [
"+1 (415) 555-2671",
"jane@gmial.com",
"JOHN MCDONALD JR",
"1.234,56 €",
{ "type": "phone", "value": "030 901820", "country": "DE" },
{ "first_name": "mary", "last_name": "O'BRIEN", "email": "Mary.OBrien+crm@GMAIL.com",
"phone": "020 7946 0958", "country": "UK", "zip": "sw1a 1aa", "deal_value": "£12.500,00" },
{ "name": "Mary O'Brien", "email": "maryobrien@gmail.com" }
]
}

Record columns are recognized by name: email; phone, mobile, tel, whatsapp; name, first_name, last_name, surname; country; zip, postal_code, plz; price, amount, total, value. Map other names with fieldMap, for example {"Handy": "phone", "Land": "country"}.

Output example (record)

{
"index": 5,
"type": "record",
"ok": true,
"record": {
"first_name": "Mary", "last_name": "O'Brien", "email": "Mary.OBrien+crm@gmail.com",
"phone": "+442079460958", "country": "GB", "zip": "SW1A 1AA", "deal_value": 12500
},
"issues": [],
"dedupeKey": "maryobrien@gmail.com",
"isDuplicate": false,
"summary": "7 field(s) cleaned, no issues"
}

Output example (email)

{
"type": "email",
"ok": true,
"clean": "jane@gmial.com",
"email": {
"normalized": "jane@gmial.com", "validSyntax": true, "isDisposable": true, "isRoleBased": false,
"suggestion": "jane@gmail.com", "mx": { "checked": true, "hasMx": false, "acceptsMailViaA": true }, "verdict": "risky"
},
"summary": "jane@gmial.com: risky (did you mean jane@gmail.com?), disposable"
}

Use it with AI agents (Apify MCP server)

https://mcp.apify.com?tools=actors,dodiabak/contact-data-cleaner

Add this URL to Claude, Cursor, VS Code, n8n or any MCP client. Example prompts:

  • "Validate these 300 phone numbers for an SMS campaign in Brazil and drop the landlines."
  • "Clean this CSV of leads, fix the names and tell me which emails will bounce."
  • "What is 1.234,56 € as a number?"

Tip: send many items in one run. It's cheaper and faster.

API example:

curl -X POST "https://api.apify.com/v2/acts/dodiabak~contact-data-cleaner/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"defaultCountry":"GB","items":["07700 900123","bob@example.com"]}'

How much does it cost?

You pay $0.001 per result, which is $1 per 1,000 items, plus Apify's tiny start fee. A whole CRM row with phone, email, name and country counts as one result. MX lookups are included. Set Max cost per run to cap spending; the Actor stops when the limit is reached.

FAQ

Does it check that a mailbox exists? No. It checks syntax, that the domain exists and has a mail server (MX, or an A record per RFC 5321), the RFC 7505 "null MX", disposable domains, role addresses and typos. It never connects to mail servers (no SMTP probing), which is slow, often blocked, and can harm sender reputation. verdict: "valid" means deliverable domain, no red flags.

Can it tell me the phone carrier or owner? No. It gives the number type (mobile, fixed line, VoIP, toll-free…) from official numbering-plan metadata. There's no carrier lookup, HLR lookup or owner lookup.

What does fixed_line_or_mobile mean? In some countries, such as the US and Canada, the numbering plan doesn't distinguish mobile from landline numbers.

How are ambiguous numbers like 1,234 handled? By default a single separator followed by exactly three digits is read as a thousands separator, and the result says separatorAmbiguous: true. Set numberLocale (for example de-DE) to read it as a decimal comma.

Is my data stored? Only in your own run's dataset. Email domains are sent to a DNS-over-HTTPS resolver (Cloudflare, with Google as fallback) for MX lookups. Turn checkMx off or use dnsMode: "system" if you prefer.

Limitations

  • Phone validity uses numbering-plan metadata. A valid number may still be unassigned or disconnected.
  • Name parsing is rule-based and tuned for Western, Hispanic, Dutch/German and Arabic name patterns. Names in scripts without letter case (Chinese, Japanese, Arabic…) are cleaned but not re-cased, and no first/last split is guessed for them.
  • Postal codes are checked for format only, in 45 countries. Street addresses are not parsed; full global address parsing needs very large models.
  • Up to 50,000 items per run. Duplicate detection works within a run.

Data sources

  • Phone metadata: libphonenumber-js "max" metadata, derived from Google's libphonenumber.
  • Disposable domains: disposable-email-domains (CC0), via disposable-email-domains-js.
  • Country names: Unicode CLDR via ICU in Node.js. Country time zones: countries-and-timezones (IANA tz database).

Found a wrong result? Open an issue in the Issues tab.