Skip to content

Email List Cleaner – Validate, Dedupe & Score Emails

Try for free

Clean email lists in bulk: syntax check, domain and MX (mail server) lookup, disposable, role and free-provider detection, typo fixes like gmial.com to gmail.com, duplicates removed, and a good / risky / bad status with a 0-100 score for every address. Reads lists, pasted text, CSV files and datasets.

📧 Email List Cleaner – Validate, Dedupe & Score Emails

Clean an email list before you send to it. Every address gets a syntax check, a live DNS lookup of its domain and mail servers, disposable, role and free-provider detection, a typo fix when the domain is mistyped (gmial.com → gmail.com) and a clear good / risky / bad status with a 0–100 score. Duplicates are removed for you. Paste a list, drop in a CSV or point it at a dataset. No login, no setup, $0.85 per 1,000 addresses with platform usage included.

✨ Why use Email List Cleaner?

  • ⚡ Fast — DNS answers are shared across the list and slow domains never hold up the rest: a 10,000-address list with about 3,000 different domains took 33 seconds in our tests.
  • 🧹 Clean lists in one step — invalid, disposable and dead-domain addresses, and addresses Gmail, Yahoo or Outlook would never issue, are marked bad; duplicates are removed, and you can save only the rows you want to keep.
  • ✍️ Typo fixes — mistyped domains of big mailbox providers come back with a suggested address (jane@gmial.com → jane@gmail.com, bob@yahoo.con → bob@yahoo.com).
  • 🗑️ Disposable detection two ways — a list of over 10,000 throwaway inbox domains, plus a check of the domain's mail servers, which catches fresh domains that point at a known throwaway service.
  • 🏢 Who runs the mailbox — the mail provider behind each domain (Google, Microsoft, Zoho Mail, Proton Mail, Own mail server ...) and its MX hosts.
  • 📥 Any input — a list, pasted text or CSV, file links (Google Sheets, Drive, Dropbox), uploads, or the results of another run.

🎯 Use cases

  • 📬 Before a newsletter or cold email campaign — drop bad addresses so fewer mails bounce and your sender reputation stays healthy.
  • 🧲 Lead lists from scrapers — check the emails a lead or contact scraper found and keep only the usable ones.
  • 🗂️ CRM clean-up — find dead domains, throwaway inboxes, duplicates and role addresses in old exports.
  • 📝 Sign-up forms — spot typos like gmial.com and throwaway inboxes in new sign-ups and suggest the fix.
  • 🏷️ Segmenting — split personal (free provider) from business addresses and see which company mail provider each domain uses.

🚀 How to use

  1. Paste addresses into Email addresses, one per line, or use More sources: paste text or a CSV, add file links, upload files, or pick a dataset.
  2. Choose which rows to save: all, only good, good and risky, or only the bad ones to remove.
  3. Click Start.
  4. Download the results as JSON, CSV or Excel, or read them through the API.

📥 Input

FieldWhat it does
emailsAddresses, one per line; "Name <email>" and mailto: links are understood
emailTextAny pasted text, CSV or JSON; every address in it is checked
fileUrls / uploadedFilesText, CSV or JSON files with addresses
datasetId / datasetFieldRead addresses from one of your datasets (its email field by default)
keepall (default), good, goodAndRisky or bad
removeDuplicatesCheck each address once (default on)
{
  "emails": ["hello@scrape.ly", "jane.doe@gmial.com", "support@github.com", "test@mailinator.com"],
  "keep": "all",
  "removeDuplicates": true
}

📤 Output

One row per address.

FieldExample
email, normalizedEmail, domainJane.Doe@Gmial.com, jane.doe@gmial.com, gmial.com
status, scoregood / risky / bad / unknown, 0–100
reason, reasons, summarypossible_typo, all reason codes, the result in plain words
suggestionjane.doe@gmail.com
syntaxValid, domainExists, hasMx, mxHoststrue, true, true, ["aspmx.l.google.com", ...]
mailProviderGoogle, Microsoft, Zoho Mail, Own mail server ...
disposable, roleAccount, freeProvider, hasTagfalse, true, false, false
source, errorinput, file:leads.csv, dataset:<id>; why the syntax is invalid

Example rows from a test run (trimmed):

[
  {
    "email": "jane.doe+news@gmail.com",
    "normalizedEmail": "jane.doe+news@gmail.com",
    "domain": "gmail.com",
    "status": "good",
    "score": 85,
    "reason": "ok",
    "summary": "Valid address; the domain takes email (Google)",
    "suggestion": null,
    "syntaxValid": true,
    "domainExists": true,
    "hasMx": true,
    "mxHosts": [
      "gmail-smtp-in.l.google.com",
      "alt1.gmail-smtp-in.l.google.com"
    ],
    "mailProvider": "Google",
    "disposable": false,
    "roleAccount": false,
    "freeProvider": true,
    "hasTag": true,
    "source": "input"
  },
  {
    "email": "bob@gmial.com",
    "domain": "gmial.com",
    "status": "bad",
    "score": 20,
    "reason": "possible_typo",
    "reasons": [
      "possible_typo",
      "disposable",
      "no_mx_record"
    ],
    "summary": "The domain looks like a typo of gmail.com; a throwaway inbox domain",
    "suggestion": "bob@gmail.com",
    "domainExists": true,
    "hasMx": false,
    "disposable": true,
    "roleAccount": false,
    "freeProvider": false,
    "source": "input"
  }
]

What the statuses mean

StatusWhenScore
goodWell-formed address on a domain whose mail servers exist85–90
riskyRole address, a domain with no MX record (mail would go to its own address), or a likely typo35–65
badInvalid syntax, an address Gmail, Yahoo or Outlook would never issue (e.g. j_doe@gmail.com), a domain that does not exist or takes no email, mail servers without an address, or a disposable inbox0–20
unknownThe domain's DNS did not answer during the run; run it again later50

The Overview and All checks views show the main columns as tables. The run's OUTPUT record holds the totals: addresses read, duplicates removed, good, risky, bad and saved.

💰 Pricing

You pay per saved row (one checked address); platform usage (compute, DNS, proxy for file downloads) is included.

EventFreeStarterScaleBusiness
Checked email (per 1,000)$0.85$0.85$0.68$0.51

Examples: a 10,000-address list costs $8.50 on the Free plan and $5.10 on Business. Duplicates removed and rows left out by the Rows to save filter are free.

❓ FAQ

Does it check whether a mailbox exists? No. The actor does not contact mail servers, so it does not test single mailboxes and cannot tell whether a domain accepts every address (catch-all). A good address is well formed, not disposable and on a domain whose mail servers exist; the mailbox itself can still be unknown to the server. That is why the best score is 90, not 100.

Is it legal? The actor only looks at the addresses you give it and at public DNS records. Handle the addresses according to the privacy and anti-spam laws that apply to you.

Do I need a login or a proxy? No login. Checks run over DNS and need no proxy; the proxy setting is only used to download file links.

How many addresses can I check? As many as you like in one run; rows are saved as they are checked.

What does unknown mean? The domain's name servers did not answer in time (after three tries). It is usually temporary, so run those addresses again later.

Can I schedule it or use the API? Yes. Run it on a schedule, from the API, or chain it after any lead or contact scraper with the dataset input.

⚠️ Limits

  • Mailbox existence and catch-all domains are not tested (no mail server connections).
  • Disposable detection uses a public list of throwaway domains plus the domain's mail servers; a brand-new throwaway service can be missed until it appears in the list.
  • Role, free-provider and typo checks are list based; typo suggestions cover the big mailbox providers and mistyped endings such as .con and .cmo.
  • File links must be public text, CSV or JSON files; save Excel sheets as CSV first.
//From the blog\\

Latest articles

All articles

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.