Benchmark
Six email verification APIs, ten identical addresses, five different answers
The same ten work emails sent through six verification routes within seconds of each other: what each called them, what each charged, how long each took, and why 'valid' is not a shared definition.
Written for people asking: What is the cheapest email verification service?How can I verify bulk emails for free?Which email verification API is most accurate?
On 17 September 2026 we found ten work emails and immediately sent each one through six verification routes. They did not agree. Hunter and LeadMagic called all ten valid. MillionVerifier called seven of them catch-all and three ok. Tomba called six valid and four undeliverable. Kitt called seven valid-risky, two valid and one invalid. Only three addresses got a clean pass from every route. The cheapest check that answered was Kitt at $0.0015, then MillionVerifier at $0.00178, LeadMagic at $0.00625, Tomba at $0.0089 and Hunter at $0.01225; MillionVerifier was also the fastest at 1.6 seconds against Hunter's 9.8. The disagreement is not a bug: seven of the ten addresses sit on catch-all domains, where no verifier can prove deliverability, and each vendor picks a different word for that.
What we ran
Ten public-company executives, name plus company domain. For each, one call found the work email, and within a few seconds the same address went through six verification routes: a routed endpoint that picks a provider, plus MillionVerifier, Hunter, LeadMagic, Kitt and Tomba directly. Finding the ten addresses cost $0.054; the sixty verification calls cost under a cent in total.
The addresses themselves are never stored. They exist in memory for the length of the run, every stored response is masked to the first letter, and that is why this comparison had to find and verify in one pass rather than reuse an earlier run’s receipts. The masked responses and the call log are on the evidence page.
What each route said
| Route | Answered | Verdicts returned | p50 | Slowest | List price per check |
|---|---|---|---|---|---|
| Routed endpoint (served by Kitt on all 10) | 10 / 10 | 7 valid-risky, 2 valid, 1 invalid | 3133 ms | 5033 ms | $0.0015 |
| MillionVerifier | 10 / 10 | 7 catch_all, 3 ok | 1633 ms | 3591 ms | $0.0018 |
| Hunter | 10 / 10 | 10 valid | 9824 ms | 19663 ms | $0.0123 |
| LeadMagic | 10 / 10 | 10 valid | 4444 ms | 8026 ms | $0.0063 |
| Kitt | 10 / 10 | 7 valid-risky, 2 valid, 1 invalid | 1936 ms | 4710 ms | $0.0015 |
| Tomba | 10 / 10 | 6 valid, 4 invalid | 2857 ms | 58930 ms | $0.0089 |
| Address | Kitt / routed | MillionVerifier | Hunter | LeadMagic | Tomba |
|---|---|---|---|---|---|
| p1 | valid-risky | ok | valid | valid | valid |
| p2 | invalid | catch_all | valid | valid | invalid |
| p3 | valid-risky | catch_all | valid | valid | valid |
| p4 | valid-risky | catch_all | valid | valid | valid |
| p5 | valid | ok | valid | valid | valid |
| p6 | valid-risky | catch_all | valid | valid | valid |
| p7 | valid | ok | valid | valid | valid |
| p8 | valid-risky | catch_all | valid | valid | invalid |
| p9 | valid-risky | catch_all | valid | valid | invalid |
| p10 | valid-risky | catch_all | valid | valid | invalid |
Why they disagree
Seven of the ten addresses belong to domains that accept mail for any local part. A verifier connects, offers the address, and the server says yes regardless of whether a mailbox exists. From that single fact the six routes produce four different outputs:
- MillionVerifier says
catch_all. It tells you the test could not decide, which is the most useful thing a verifier can say here. - Kitt says
valid-risky, with avalidIdentityflag separate fromvalidSMTP, which was null on every catch-all address. Same information, different word. - Hunter says
valid,deliverable, score 88,accept_all: falseon the same addresses MillionVerifier flagged as catch-all. Hunter’s ownsmtp_checkreturned true, so this is a genuine difference in how the two read the same SMTP conversation. - LeadMagic says
validwithis_domain_catch_all: null, meaning it did not determine catch-all status at all. - Tomba says
invalid,undeliverable, score 11 on four addresses every other route accepted, including two that MillionVerifier called ok. Tomba was also the only route with a pathological outlier: one check took 59 seconds.
The practical consequence: if you filter your list on status == "valid", Hunter and LeadMagic hand you all ten, Tomba drops four good ones, and MillionVerifier drops seven that are probably fine. None of those is the correct answer, because the correct answer for a catch-all domain is “unknown, send carefully”.
What this costs at list price
Verifying 1,000 addresses, entry tier, no subscription commitment:
| Route | 1,000 checks | Notes |
|---|---|---|
| Kitt | $1.50 | $0.0015 a completed check, including invalid and catch-all results |
| MillionVerifier | $1.78 | Credit returned for unknown and catch-all on eligible accounts |
| LeadMagic | $6.25 | 0.25 credits per definitive result; “unknown” is free |
| Tomba | $8.90 | 1 credit per verification; bundled with its finder plan |
| Hunter | $12.25 | 0.5 verification credits per call, a separate pool from search credits |
The routed endpoint was served by Kitt on all ten calls at Kitt’s own rate, which is the behaviour to expect when the cheapest eligible provider answers first.
How to use this
- Do not treat “valid” as a boolean. Keep the raw verdict and the catch-all flag, not a filtered list.
- Split your list three ways: confirmed deliverable, catch-all or risky, and confirmed bad. Send to the first, send carefully to the second, drop the third.
- Pick the route that admits uncertainty. MillionVerifier and Kitt both name the catch-all case; Hunter and LeadMagic did not on this cohort.
- Verify once, at send time. Verification decays; a check from three months ago is a guess.
- If a verifier is unusually slow, cap it. Hunter’s median was 9.8 seconds and Tomba’s worst call was 59 seconds. In a batch of thousands that is the difference between minutes and hours.
What this run cannot tell you
Ten addresses, all at well-known companies, all found seconds earlier by the same finder. A cohort of older or lower-quality addresses would produce more hard invalids and fewer catch-alls. We did not send mail to any address, so nobody here knows the ground truth, including the vendors; this measures agreement and price, not accuracy. Prices are list prices at the entry tier on the run date.
Next step
- The 100-email find-and-verify workflow puts this step in a full run with its own receipt.
- The 17-provider terms table has each vendor’s billing model, free tier and miss rule with dated sources.
- Reproduce it: the fixture and the runner script are on the evidence page; the whole run cost under seven cents.
Questions this page answers
What is the cheapest email verification API?
Of the six routes that answered on 17 September 2026, Kitt at $0.0015 a check and MillionVerifier at $0.00178, against LeadMagic $0.00625, Tomba $0.0089 and Hunter $0.01225. Price and verdict are unrelated: the two cheapest routes were also the two that flagged the catch-all domains the expensive ones called valid.
Which email verification API is most accurate?
Nobody can tell you from a verdict alone, and this run shows why: the same ten addresses produced five different answer sets. On a catch-all domain the receiving server accepts every address, so a verifier cannot distinguish a real mailbox from an invented one. The honest measure is whether the vendor tells you the domain is catch-all rather than calling it valid.
How can I verify bulk emails for free?
Free bulk verification does not really exist at useful volume. MillionVerifier, Hunter, LeadMagic and Tomba all include a small free allowance on signup (tens to hundreds of checks), and ContactOut's verification is currently unmetered on its plans, but a free tier that verifies thousands is a trial, not a tier. At $0.0015 to $0.012 a check, verifying 1,000 addresses costs between $1.50 and $12.
Relationship: the people who run this site also work on Treg, one of the routes compared on this page. Every Treg figure here is a call we paid for, with the raw response downloadable, and the same fixture is run against the alternatives where their terms allow.
Spotted an error or a changed price? Email corrections@enrichmentapiguide.com with the page URL and a source. Corrections are logged on the corrections page.