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

URL: https://email-validation.org/bulk-email-verification/
Updated: 2026-10-20

> Documentation index: https://email-validation.org/llms.txt

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 list](https://email-validation.org/app/bulk/) [See pricing](https://email-validation.org/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

| Dashboard formats | CSV, XLSX and TXT |
| --- | --- |
| API formats | CSV, TXT and JSON |
| Rows per file | Up to 1,000,000 |
| File size | Up to 1 GB in the dashboard, 100 MB per API request |
| Columns | Up to 512 |
| Uploads in progress | Up to 3 at a time |
| File retention | 30 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.

| Column | Meaning |
| --- | --- |
| `ev_status` | deliverable, undeliverable, risky or unknown |
| `ev_reason` | the reason code, such as no\_mailbox or catch\_all |
| `ev_action` | send, send\_with\_caution, remove or retry\_later |
| `ev_free_email` | true when the address is at a free email provider |
| `ev_role_account` | true for team or function addresses such as info@ |
| `ev_disposable` | true for throwaway inbox services |
| `ev_catch_all_domain` | true when the domain accepts mail for every address |
| `ev_did_you_mean` | a suggested correction for a likely typo |
| `ev_mx_found` | true when the domain has mail records |
| `ev_mx_record` | the domain's preferred mail server |
| `ev_smtp_provider` | the mail provider, from our own list |
| `ev_domain_age_days` | how old the domain is, in days |

- Deliverable The mailbox exists and accepted our check, so mail sent to it should arrive. 1 credit · Send [Deliverable reasons](https://email-validation.org/docs/statuses/deliverable/)
- Undeliverable Mail sent to this address will not arrive, so it should come off your list. 1 credit · Remove [Undeliverable reasons](https://email-validation.org/docs/statuses/undeliverable/)
- Risky The address may accept mail, but sending to it can hurt your bounce rate or sender reputation. 1 credit · Send with caution [Risky reasons](https://email-validation.org/docs/statuses/risky/)
- Unknown We could not get a definite answer this time, so no credit is used and a later retry often succeeds. Free, no credit used · Retry later [Unknown reasons](https://email-validation.org/docs/statuses/unknown/)

## 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.

- New accounts get 500 free credits to try the service on a sample of their own list.
- If your balance is too low, the job waits until you buy a pack, then starts.
- Try the flow with our [sample list](https://email-validation.org/samples/sample-list.csv) of test addresses, which costs nothing.

## 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](https://email-validation.org/legal/dpa/), and we never send email to them. See [security and data handling](https://email-validation.org/security/) 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.
