Nobody sells a lead list as a perishable good. It arrives as a file, and a file looks permanent. But a contact list is the most perishable asset in a sales stack, and the decay is measurable rather than rhetorical:
- 40% of email addresses go dead within two years (NeverBounce).
- 23% of business contacts change jobs every year (ZoomInfo, 2025) — the title goes stale first, then the mailbox follows.
- Freshly sourced data outperforms stale stored records by 42% (Harvard Business Review, 2024).
Put those three together and the business model of "buy a list once, send for a year" stops making sense. You are not paying for contacts; you are paying for a decaying fraction of them, and the invoice does not tell you which fraction.
The two numbers that describe the same campaign
Here is the part that gets skipped in every comparison table: a stored list typically bounces at 10–35%, while addresses checked over SMTP at the moment of use bounce at 2–5%.
Same sender. Same offer. Same copy. The only difference is when the address was validated. Everything downstream — domain reputation, warmup progress, whether the second campaign can send at all — is decided by that timing choice, not by the size of the list.
What a list is actually made of
Three categories, and only one of them is worth money:
- Mailboxes that exist now. Delivered, nobody knows if they read it. This is the ceiling on any outreach, and it is a smaller ceiling than most people assume.
- Strings that look like addresses. Guessed patterns, role accounts that were never created, people who left. These are the bounces.
- Unknowns. Catch-all domains accept every address, so the server's reply carries no information about the individual mailbox. Most tools report these as valid. They are not valid; they are unmeasured.
Category 3 is where the numbers in a nice-looking list quietly turn into 10–35%. A catch-all reply is not evidence, and a pipeline that treats it as evidence has no way to tell a list with 90% live addresses from one with 40%.
Building the list at the moment it is used
The reason stale lists get bought at all is that building a fresh one used to mean per-request work: scrape, dedupe, guess, verify, reconcile — five steps that a human does once a quarter and an agent does never.
An API call collapses those steps into one:
curl -X POST https://tapacapi.com/v1/contacts/search \
-H "Authorization: Bearer $TAPAC_KEY" \
-H "Content-Type: application/json" \
-d '{"industry":"b2b saas","job_titles":["head of growth"],
"company_size":"11-200","location":"germany","source":"website","limit":25}'
Each returned row carries the person, the company, the title, the source the contact was found in, and the SMTP verdict for that address — produced inside the same request. There is no second enrichment vendor and no window in which the data can age. Nothing is stored between calls, which is a feature: a cache of contacts is just another list with a half-life.
For lists you already own, POST /v1/contacts/verify takes a batch of addresses and returns the same verdicts, so the old file can be triaged before it does more damage to a sending domain.
From an agent
npx -y @tapacapi/mcp
Two tools: tapac_find_contacts and tapac_status. With no key set, the server returns onboarding instead of an error, which is what you want if the caller is an autonomous loop: it can tell the user what to do rather than retrying a 401 forever.
Pricing is pay-per-use — 100 free searches, then $0.10–0.50 per verified contact, no seat licence. Verification is inside the search price rather than billed as a separate enrichment line, because separating the two is precisely what creates the gap where the list decays.
The honest limit
An SMTP 250 proves the mailbox existed at the moment of the handshake. It does not promise a reply, a meeting or a contract — and any tool that implies otherwise is selling the same overconfidence that filled your last list.
The list is not the asset. The timestamp on the verification is.
Top comments (0)