We tell you what we can't verify.
Every verifier advertises one number. It's always measured after the hard addresses have been dropped. We publish both halves: how much of your list we reached a verdict on, and how right those verdicts were.
Building it into a product? Get an API key
How a typical B2B list breaks down
- valid
- 71,40271.4%
- invalid
- 12,88112.9%
- catch-all
- 9,7309.7%
- unknown
- 5,9876.0%
Unknown means the server would not give a straight answer. We report it, and we do not bill it.
An example of the shape, not a measured result. Our own benchmark publishes in full, including where we lose.
- free checks a monthNo card, and it renews every month.
- 100
- for an unknownAddresses we could not get an answer on are labeled and never billed.
- $0
- for 1,000 checksPay as you go. Credits do not expire.
- $5
- per address at volumeAt 1,000,000 credits.
- $0.00095
Where the 99% goes
ZeroBounce publishes 99.6%. NeverBounce says 99.9%. Clearout says 99.73%. Hunter ran 40,000 verifications across the field and measured 63% to 70%.
Both sets of numbers are real. They just count different things. The vendor figure asks how often a returned verdict was correct, and it's calculated after the catch-alls and the servers that refuse to answer have been taken out of the denominator. That's most of the difficulty on a B2B list.
| What gets measured | Typical vendor claim | What it leaves out |
|---|---|---|
| Accuracy of returned verdicts | 99%+ | Every address the verifier declined to judge |
| Share of the list judged at all | Rarely published | Catch-all domains, Yahoo, throttled servers |
| Independent field benchmark | 63–70% | Nothing — it counts the whole list |
Vendor figures checked September 2026 on each company's own pricing page. Field benchmark: Hunter's published 40,000-verification test.
Four verdicts, and one of them is honest
Most verifiers push the addresses they got no answer on into a gray bucket called risky. We give that bucket a name, a color, and a line on your invoice that reads zero.
The receiving server accepted the address when we asked. As close to certain as SMTP allows.
valid · one credit
The server rejected it outright, usually with a 550. Remove these and your bounce rate drops.
invalid · one credit
The domain accepts every address, so nobody can confirm the mailbox exists. Around 28% of a typical B2B list.
catch_all · one credit
The server throttled us, greylisted us, or lied. Yahoo does this deliberately. We say so instead of guessing.
unknown · never billed
How a check actually runs
No message is ever sent to the address. The connection closes before the point where mail would be delivered.
Syntax and domain
We parse the address, then look up the domain's MX records. No mail exchanger and no fallback means nothing can be delivered there, and we stop.
The SMTP conversation
We open a connection, greet the server, name a sender, then ask about the recipient with RCPT TO. Its answer to that one command is the whole test.
Read the response code
250 accepted. 550 no such user. A 4xx usually means greylisting rather than a bad address, which is why a single-shot verifier misreads it.
Test for catch-all, then quit
We ask about an address that cannot exist. If the server accepts that too, the domain takes anything and we label it catch-all rather than valid.
One call, and the answer it returns
curl -s -X POST "https://api.zapbounce.com/v1/verify" \
-H "Authorization: Bearer $ZAPBOUNCE_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"ada@example.com"}'
{
"email": "ada@example.com",
"result": "catch_all",
"reason": "accept_all_domain",
"domain": "example.com",
"mx_found": true,
"mx_host": "mx1.example.com",
"smtp_code": "250",
"role": false,
"disposable": false,
"free_provider": false,
"did_you_mean": null,
"billed": true,
"checked_at": "2026-09-18T10:02:41Z"
}Every response names the result, the reason behind it, and whether it was billed.
The server's answer decides the verdict
A verifier is only as good as its reading of the response code, and most of the disagreement between vendors starts right here.
We read the code the way a mail server means it, which is the subject of the result codes reference.
- A 4xx is a server asking for patience. It says nothing about whether the address exists.
- A 250 from a domain that accepts everything proves nothing, so it is labeled catch-all.
- A refusal to answer is reported as unknown, and it costs you nothing.
| Code | What the server means | How we score it |
|---|---|---|
| 250 | Recipient accepted | valid |
| 550 | No such user | invalid |
| 250 to anything | Domain accepts every recipient | catch-all |
| 421 / 450 | Throttled or greylisted | unknown |
Pricing without the asterisk
Credits don't expire. Duplicates aren't counted twice. Unknowns aren't billed at all. A credit buys one definite answer: valid, invalid or catch-all.
| Credits | Price | Per address |
|---|---|---|
| 1,000 | $5 | $0.00500 |
| 10,000 | $25 | $0.00250 |
| 50,000 | $89 | $0.00178 |
| 100,000 | $139 | $0.00139 |
| 500,000 | $549 | $0.00110 |
| 1,000,000 | $949 | $0.00095 |
Free tier: 100 credits every month, no card. Kickbox and Hunter expire unused credits after twelve months; ours stay until you spend them.
What no verifier can do
Questions we get asked
Does verifying send an email to the address?
No. We close the connection after asking about the recipient and before the stage where a message body would be transmitted. The mailbox owner sees nothing.
Why do two verifiers disagree about the same address?
Usually because one of them guessed. Catch-all domains and throttled servers give ambiguous answers, and vendors differ in whether they resolve that to valid, to risky, or to an honest unknown.
What bounce rate should I be aiming for?
Under 2% is healthy and over 5% puts your sending reputation at risk. Cleaning a list moves the number, but so does how you collected the addresses in the first place.
Do you keep my list?
Retention settings and deletion are covered on the security page, and you can delete an upload from the API.
Can ChatGPT verify an email address?
No. A language model has no way to open an SMTP connection to the receiving server, so any verdict it offers is a guess about the format of the string.
Run a hundred addresses through it
Free every month, no card, and the unknowns come back labeled.