Products

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

200POST /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.

FieldMeaning
statusdeliverable, undeliverable, risky (catch-all domain), disposable, invalid, unknown, or valid when only the domain could be checked
reason, scoremailbox_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_hostAddress shape, whether the domain has a mail server, and the domain's first mail server
disposable, disposable_service, free_provider, role_accountFlags for throwaway domains (with the service named when we recognise its mail server), webmail providers and role mailboxes
catch_all, smtp_checked, smtp_codeWhether 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.

See pricing

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.