Email Verification API with mailbox-level SMTP checks
Send a list of addresses and get back a verdict for each one: deliverable, undeliverable, risky, disposable, invalid or unknown, with the reason. The check talks to the mail server the way a sending server would, then stops before any message is sent. An address whose mail server never answers comes back unknown and costs nothing.
POST/v1/emails/verify
{
"data": [
{
"email": "info@locomint.io",
"status": "deliverable",
"reason": "mailbox_exists",
"score": 85,
"syntax_valid": true,
"mx_found": true,
"disposable": false,
"role_account": true,
"catch_all": false,
"smtp_checked": true
},
{
"email": "nobody@mailinator.com",
"status": "disposable",
"reason": "disposable_domain",
"score": 5
}
],
"meta": {
"credits_used": 2,
"source": "verifier"
}
}
What you get
Every field in the response.
| Field | Meaning |
|---|---|
status | deliverable, undeliverable, risky (catch-all domain), disposable, invalid, unknown, or valid when only the domain could be checked |
reason, score | mailbox_exists, mailbox_not_found, no_mail_server, domain_accepts_mail, catch_all_domain, bad_syntax and others, plus a 0 to 100 summary for sorting a list |
syntax_valid, mx_found, mx_host | Address shape, whether the domain has a mail server, and the domain's first mail server |
disposable, disposable_service, free_provider, role_account | Flags for throwaway domains (with the service named when we recognise its mail server), webmail providers and role mailboxes |
catch_all, smtp_checked, smtp_code | Whether the domain accepts anything, whether the mailbox was probed, and the server's answer |
How it works
What happens between your request and the response.
Cheap checks first
Syntax, domain, MX records, disposable and free-provider lists. Throwaway services are recognised by their mail servers, so a domain name they invented this morning is still caught. Most bad addresses fail here without touching a mail server.
One conversation per server
EHLO, MAIL FROM, RCPT TO, QUIT. At most two connections to any one mail server at a time, catch-all detected once per domain, and no DATA command ever.
Unknown is free
When a server greylists, stays silent or refuses to answer, the row is unknown with the reason, not a guess, and it is not charged.
Deduplicated
The same address written twice in one call is checked and charged once.
Pricing
One credit system for every endpoint.
One credit per address that gets an answer, up to 100 per call; unknown rows are free. A call that would exceed your monthly quota is refused before any work and costs nothing. The free plan covers 75 addresses a month.
Run it on Apify.
For bigger runs, or without writing any code, the same engine runs on Apify as the listing below. Apify bills per result, so there is no subscription and nothing to pay us, and Apify's own free plan includes $5 of usage a month with no card.
Questions
Things people ask about the Email Verification API.
Does verification send an email to the address?
No. The check ends after the server answers RCPT TO, before any message data is sent. The mailbox owner sees nothing.
What does risky mean?
The domain accepts mail for any address (catch-all), so the server cannot confirm this particular mailbox exists. Send to risky addresses in small batches and watch bounces.
How long does a call take?
Cheap checks are instant. Mailbox probes depend on the mail servers involved. The call stops at 90 seconds: every address answered by then is returned and charged, the rest come back unknown and free, and only a call where nothing answered at all returns 504.