Your bounce rate is a timing problem, not a list problem
A cold email bounce rate above 5% is usually blamed on the list vendor. The vendor is a symptom. Bounce rate is decided by when an address was last checked, and almost every list on the market was checked once, at import.
Two campaigns with identical copy, identical offer and identical sending infrastructure come out at 2–5% and 10–35% depending on nothing else. That gap is the whole product argument for verifying at the moment of use rather than at the moment of purchase.
What counts as a bounce
| Type | What happened | What it costs you |
|---|---|---|
| Hard bounce | The mailbox does not exist — the domain accepts mail but has no such user | Permanent. Repeated hard bounces are what get a sending domain filtered |
| Soft bounce | Mailbox full, server busy, greylisted, message too large | Temporary; can clear on its own and is not proof the address is bad |
| Block / deferral | The receiving server refuses your IP or domain reputation | Not a bad address at all — a reputation issue upstream |
| Catch-all acceptance | The server accepts every address, so no verdict is possible | Silent. Counted as delivered even when nothing was read |
Bounce-rate dashboards collapse all four into one number, which is how a list with plenty of live addresses can still look broken — and how a dead list can look fine until the sending domain gets throttled.
The decay behind the number
- 40% of email addresses go dead within two years (NeverBounce) — a stored list is losing mailboxes every month it sits.
- 23% of business contacts change jobs annually (ZoomInfo, 2025) — the title is stale first, then the mailbox follows it out.
- Freshly sourced data outperforms stale stored records by 42% (Harvard Business Review, 2024).
None of those figures describe a bad vendor. They describe time. A list imported in March and sent in September is a different asset from the same list sent in March, and no CSV carries an expiry date.
Checking a mailbox inside the search call
An SMTP handshake asks the receiving server whether a specific mailbox exists. Doing it at send time is too late — the send is already spent. Doing it at search time is free of that trade-off, and it is what TAPAC exposes as a single call:
curl -X POST https://tapacapi.com/v1/contacts/search \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"industry":"logistics","job_titles":["head of operations"],
"company_size":"51-200","location":"poland","source":"website","limit":40}'
Each row comes back with the person, the company, the title, the source it was found in and the verification state of that mailbox. Catch-all domains are labelled unknown rather than dressed up as valid, because a catch-all reply carries no information about an individual mailbox.
What this does not promise. An SMTP check proves the mailbox exists; it does not prove anyone wants your offer. Deliverability and interest are separate problems, and a list that stops bouncing only removes the first one.
Keeping the rate low without guessing
- Verify at the moment of use, not at import — the address state is resolved fresh on every request.
- Treat catch-all domains as unknown, not as valid.
- Search narrower rather than bigger: a tight profile of 200 matched people beats 5 000 scraped rows.
- Re-run the same profile instead of re-sending the same file — nothing is stored between calls.
From an agent this is one tool call: npx -y @tapacapi/mcp or the hosted endpoint https://tapacapi.com/mcp, with tapac_find_contacts and tapac_status. 100 searches are free, then $0.10–0.50 per verified contact, pay-per-use.
Where to go next
- Catch-all email verification · cold email bounce rate · lead scraping tool
- Install the TAPAC MCP server — npx, uvx or hosted endpoint, with the JSON block for Claude, Cursor, Codex and Windsurf.
- Verify email before sending · what an SMTP check proves · verification API
- Compare TAPAC with Apollo, ZoomInfo, Hunter and Lusha · Pricing · Get a free API key