Bulk email verification: the answer is three-valued, and the list keeps moving
Upload a file of 10,000 addresses to a bulk verifier and you get back a report with a verification rate on it. The number is usually presented as a percentage of rows checked. The rows themselves split three ways, and the split is where the budget lives.
Valid, invalid, unknown
| State | What the mail server said | What to do with the row |
|---|---|---|
valid | The specific mailbox was accepted by a probe | Send |
invalid | The mailbox was rejected or the domain does not accept mail | Drop, and drop the pattern that produced it |
unknown | Catch-all domain: every address is accepted | Treat as unproven; segment it out of your main sends |
Bulk tools that print a single "verified" figure are merging the second and third rows, or merging the third into the first. Both make the report look cleaner than the file is.
The catch-all share does not shrink
A catch-all mail server answers the same way for a real employee and for a string someone invented. That property belongs to the domain configuration, not to your list, so no amount of re-checking lowers it. What a proper verifier can do is name it: an address on a catch-all domain comes back unknown forever, which is a usable answer — it tells you not to burn a warmed sending domain on it.
The file decays while you look at it
- 40% of email addresses are dead within two years (NeverBounce).
- 23% of business contacts change jobs annually (ZoomInfo, 2025).
- Freshly collected data outperforms stored databases by 42% on response (Harvard Business Review, 2024).
A verification report is a timestamped snapshot. If the file sits for a quarter before the campaign runs, the report describes a list that no longer exists — which is the argument for verifying at the moment of use rather than in a batch that finishes days before the send.
The arithmetic on 10,000 rows
Two models, same file:
- Per check: 10,000 credits are consumed no matter which state each row lands in. Unknown rows cost full price and return no usable contact.
- Per usable contact: you pay for the addresses you can actually send to. TAPAC prices it this way: $0.10-0.50 per verified contact, first 100 searches free, no seat licence and no re-check line item.
The comparison only becomes honest when the denominator is the count of confirmed mailboxes, not the count of rows submitted. Ask any vendor for that split in writing before signing; a vendor that reports only a verification percentage is not showing which half of the file you paid for.
Doing it inside the search
curl -s -X POST https://tapacapi.com/v1/contacts/search \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"industry":"logistics","job_titles":["operations manager"],"company_size":"51-200","location":"netherlands","source":"website","limit":100}'
Each returned contact carries the source the address was found in and the SMTP state of the mailbox, so a large run is a stream of already-verified rows rather than a file to be cleaned later. From an agent, the same call is tapac_find_contacts via npx -y @tapacapi/mcp or the hosted endpoint at https://tapacapi.com/mcp.
Where to go next
- Email list cleaning · Email verification cost · Catch-all verification
- LinkedIn email finder · B2B lead list · Contact finder API
- Install the TAPAC MCP server — npx, uvx or the hosted endpoint, with the JSON block for Claude, Cursor, Codex and Windsurf.
- Compare TAPAC with Apollo, ZoomInfo, Hunter and Lusha · Pricing · Get a free API key