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

StateWhat the mail server saidWhat to do with the row
validThe specific mailbox was accepted by a probeSend
invalidThe mailbox was rejected or the domain does not accept mailDrop, and drop the pattern that produced it
unknownCatch-all domain: every address is acceptedTreat 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

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:

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

← Back to TAPAC