Bulk lists

Bulk email verification for lists up to 1,000,000 rows

Upload a CSV, XLSX or TXT file with up to 1,000,000 rows. We find the email column, set duplicates aside, check every unique address and give you the results by status with your original columns kept. Files are deleted 30 days after upload.

Upload a listSee pricing

How bulk verification works

Five steps, and you can close the page while the job runs.

  1. Upload

    Drop a CSV, XLSX or TXT file into your dashboard, or send CSV, TXT or JSON to the API. XLSX files are converted to CSV in your browser, and you pick the sheet.

  2. Check the columns

    We detect the email column and show a preview. You confirm the column and whether the first row is a header.

  3. See the cost first

    Before anything runs you see how many unique addresses need a check. Duplicates, malformed addresses and test addresses cost nothing.

  4. Follow progress

    The job runs in the background. We email you when it finishes, and call your webhook if you registered one.

  5. Download

    Download every row or only the statuses you want, with your original columns plus our result columns. Values that look like spreadsheet formulas are neutralised so they cannot run.

Limits and formats

Bulk limits
Dashboard formatsCSV, XLSX and TXT
API formatsCSV, TXT and JSON
Rows per fileUp to 1,000,000
File sizeUp to 1 GB in the dashboard, 100 MB per API request
ColumnsUp to 512
Uploads in progressUp to 3 at a time
File retention30 days after upload, then deleted automatically

What you get back

Your file comes back with these columns added after your own. Every status is explained in the docs.

Result columns
ColumnMeaning
ev_statusdeliverable, undeliverable, risky or unknown
ev_reasonthe reason code, such as no_mailbox or catch_all
ev_actionsend, send_with_caution, remove or retry_later
ev_free_emailtrue when the address is at a free email provider
ev_role_accounttrue for team or function addresses such as info@
ev_disposabletrue for throwaway inbox services
ev_catch_all_domaintrue when the domain accepts mail for every address
ev_did_you_meana suggested correction for a likely typo
ev_mx_foundtrue when the domain has mail records
ev_mx_recordthe domain's preferred mail server
ev_smtp_providerthe mail provider, from our own list
ev_domain_age_dayshow old the domain is, in days

Credits for lists

Each unique address that gets a definite result uses one credit. When a job starts we reserve one credit per unique address; credits for unknown results come back when the job ends.

Your data

Uploaded files and their results are deleted 30 days after upload, or sooner when you delete your account. We process the addresses only to run your job, under our data processing agreement, and we never send email to them. See security and data handling for details.

Frequently asked questions

How big a list can I upload?

Up to 1,000,000 rows per file, in CSV, XLSX or TXT format. You can follow progress in your dashboard and download the results when the job finishes. You can also get a webhook call when it completes.

How long do you keep my files?

Uploaded lists and their result files are deleted automatically 30 days after upload. Checks you run in the dashboard stay in your history for 30 days. API checks are not stored. To answer repeat checks, we keep only the result of a completed check for 12 months, under a keyed hash of the address, never the address itself.

Am I charged for unknown results?

No. Any result with the status unknown is free. That includes checks where the receiving mail server does not answer within 15 seconds. Requests that fail with an error, malformed addresses and test addresses are free too.

Do you support webhooks?

Yes. We call a URL you register when a bulk job finishes or when your credits run low. Each call is signed so you can verify it came from us.

How much does it cost?

Credits come in one-time packs: 10,000 for $35 ($3.50 per 1,000), 25,000 for $49 ($1.96 per 1,000), 50,000 for $79 ($1.58 per 1,000) and 1,000,000 for $450 ($0.45 per 1,000). One credit checks one address. There is no subscription. Prices in USD, excluding tax. VAT or sales tax is added at checkout where applicable.

What does catch-all mean?

A catch-all domain accepts mail for any address at that domain, real or not. No verifier can confirm a specific mailbox there without sending a message. We mark these results risky with the reason catch_all. Keep them in a separate segment, send to them carefully and watch your bounces.

Updated · Maintained by the email-validation.org team