Enrichment API Guide

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.

By Shirley Lou, ResearchPublished 2026-09-17Facts re-checked 2026-09-17Last material change 2026-09-17

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

Six verification routes, ten identical addresses, 17 September 2026. List price is the per-check price on the entry tier as recorded on each vendor's own pricing page.
RouteAnsweredVerdicts returnedp50SlowestList price per check
Routed endpoint (served by Kitt on all 10)10 / 107 valid-risky, 2 valid, 1 invalid3133 ms5033 ms$0.0015
MillionVerifier10 / 107 catch_all, 3 ok1633 ms3591 ms$0.0018
Hunter10 / 1010 valid9824 ms19663 ms$0.0123
LeadMagic10 / 1010 valid4444 ms8026 ms$0.0063
Kitt10 / 107 valid-risky, 2 valid, 1 invalid1936 ms4710 ms$0.0015
Tomba10 / 106 valid, 4 invalid2857 ms58930 ms$0.0089
Verdict per address per route. Three addresses passed everywhere; the rest split.
AddressKitt / routedMillionVerifierHunterLeadMagicTomba
p1valid-riskyokvalidvalidvalid
p2invalidcatch_allvalidvalidinvalid
p3valid-riskycatch_allvalidvalidvalid
p4valid-riskycatch_allvalidvalidvalid
p5validokvalidvalidvalid
p6valid-riskycatch_allvalidvalidvalid
p7validokvalidvalidvalid
p8valid-riskycatch_allvalidvalidinvalid
p9valid-riskycatch_allvalidvalidinvalid
p10valid-riskycatch_allvalidvalidinvalid

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 a validIdentity flag separate from validSMTP, which was null on every catch-all address. Same information, different word.
  • Hunter says valid, deliverable, score 88, accept_all: false on the same addresses MillionVerifier flagged as catch-all. Hunter’s own smtp_check returned true, so this is a genuine difference in how the two read the same SMTP conversation.
  • LeadMagic says valid with is_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

  1. Do not treat “valid” as a boolean. Keep the raw verdict and the catch-all flag, not a filtered list.
  2. 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.
  3. Pick the route that admits uncertainty. MillionVerifier and Kitt both name the catch-all case; Hunter and LeadMagic did not on this cohort.
  4. Verify once, at send time. Verification decays; a check from three months ago is a guess.
  5. 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

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.