Everything you need to know about verifying a large email list: when to do it, how to prepare your file, what each result field means, how to handle catch-all addresses, re-verification schedules, and the bounce-rate math that justifies the cost.
invalid rate on typical opt-in lists
invalid rate on purchased or scraped B2B lists
B2B list decay per year (≈2%/month)
Sending to a dirty list doesn’t just waste spend - it generates hard bounces that damage your sending domain’s reputation with Gmail and Microsoft. Once bounce rate exceeds 3-5% on a domain, subsequent emails from that domain go to spam for everyone, even clean addresses. Bulk verification removes invalid addresses before that damage occurs.
Export as CSV
Single column labelled email is ideal. Multi-column CSVs work - you’ll select which column to verify. Do not upload .xlsx directly.
Remove blank rows
Blank rows consume credits if not stripped. Most spreadsheet apps let you filter and delete blanks.
Deduplicate
Sending duplicates through verification wastes credits. Excel: Data › Remove Duplicates. Python: df.drop_duplicates('email').
Normalise casing
Lowercase all addresses before upload. email.strip().lower() is enough - addresses are case-insensitive in practice.
Strip trailing whitespace
Common in CSV exports. Whitespace causes lookups to fail and the address appears invalid.
| Field | Values | What to do |
|---|---|---|
| result | valid, invalid, unknown | Send to valid. Suppress invalid. Review unknown with catch_all_score. |
| is_disposable | true / false | Suppress all true - these are throwaway addresses. |
| is_role_address | true / false | Suppress from personal cold outreach. OK for newsletter mass sends. |
| catch_all_score | 0.0-1.0 | >0.65: include. 0.4-0.65: judgment call. <0.4: suppress. |
| mx_found | true / false | false means the domain has no mail server - always invalid. |
| smtp_code | e.g. 250, 550 | 250 = accepted. 550/551 = definitive rejection. |
| free_provider | true / false | Signals consumer vs business address - useful for segmentation. |
A catch-all domain returns “250 OK” for every SMTP probe - real or fake. This means SMTP alone can’t determine whether the specific mailbox exists. BounceZero assigns a catch_all_score (0-1) based on pattern matching, domain reputation, and historical probe data.
Low delivery risk. The mailbox pattern and domain history suggest this address is real.
Medium risk. Consider the value of the prospect vs. the domain’s bounce exposure.
High risk. Statistical likelihood is that the mailbox doesn’t exist.
| Segment | Filter | Send strategy |
|---|---|---|
| Tier 1 - High confidence | result=valid AND is_disposable=false AND catch_all_score>0.65 | Send immediately on primary domain |
| Tier 2 - Catch-all mid-score | result=unknown AND catch_all_score 0.40-0.65 | Send via secondary domain; monitor bounce rate |
| Tier 3 - Role addresses | is_role_address=true AND result=valid | Newsletter / mass send only; not cold personal outreach |
| Suppress | result=invalid OR is_disposable=true OR catch_all_score<0.40 | Do not send; remove from all lists |
Example: 100,000-address list at $3/1K = $300 to verify. Typical 15% invalid rate means 15,000 addresses removed.
Speed depends on list size and domain mix. A 10,000-address list typically completes in 5-15 minutes. A 1,000,000-address list typically takes 1-4 hours. Lists heavy with catch-all domains take longer because each address requires a live SMTP probe that can’t be cached.
Industry averages: 5-15% invalid on lists collected via web forms without real-time validation; 15-30% invalid on purchased or scraped B2B lists; 2-5% invalid on double opt-in lists. Additionally 10-30% of B2B addresses are catch-all.
At minimum: reverify any list older than 90 days before a campaign. For cold outreach: monthly. For newsletters: quarterly. Triggered: any time bounce rate exceeds 2% on a send. B2B lists decay at roughly 25-30% per year - about 2% per month.
CSV with a single column labelled email is ideal. Multi-column CSVs work if you identify the email column. BounceZero also accepts .txt files with one address per line. Do not upload .xlsx - export to CSV first.
Upload CSV or paste addresses. BounceZero verifies each one via live SMTP and returns result, catch_all_score, is_disposable, and more. $3/1K. 100 free credits.
Ayoub built BounceZero's 5-stage validation pipeline, its dedicated BGP-announced IP infrastructure, and the Patroni HA PostgreSQL cluster behind every verification. Previously built high-volume email delivery infrastructure. Trained at 1337 Benguerir (École 42 network, 2019). Open-source: bgp_analyzer.
Deep-dive guides on how email verification and inbox placement work
272,446-domain census: DMARC gap, provider divide, catch-all rates
10.2M verifications: 12.3% of addresses are dead, and where they hide
826K re-verifications: only 19% of valid addresses survive 90 days
True catch-all is 1.4% - most of what looks catch-all is unprobeable providers
info@ bounces 4.5x more than personal addresses - measured, not guessed
The 3x invalid-rate gap that vanishes when you control for domain size
Explore other topics