Email verification API
A REST API that tells you whether an email address can receive mail: a status, a reason and a recommended action for every address, in real time or for whole lists. Results with the status unknown never cost a credit, and new accounts start with 500 free credits.
Get an API key Read the quickstart
Your first request
curl
curl https://api.email-validation.org/v1/validate \
-H "Authorization: Bearer $EV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "accepted@sandbox.email-validation.org"}'JavaScript
// Node.js 18+, Deno, Bun or Cloudflare Workers: fetch is built in.
const res = await fetch('https://api.email-validation.org/v1/validate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EV_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email: 'accepted@sandbox.email-validation.org' }),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.status, body.reason, body.action);Python
import os
import requests
resp = requests.post(
"https://api.email-validation.org/v1/validate",
headers={"Authorization": f"Bearer {os.environ['EV_API_KEY']}"},
json={"email": "accepted@sandbox.email-validation.org"},
timeout=20,
)
body = resp.json()
if not resp.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["status"], body["reason"], body["action"])The answer looks like this:
{
"email": "accepted@sandbox.email-validation.org",
"status": "deliverable",
"reason": "accepted",
"action": "send",
"account": "accepted",
"domain": "sandbox.email-validation.org",
"did_you_mean": null,
"free_email": false,
"role_account": false,
"disposable": false,
"catch_all_domain": false,
"mx_found": true,
"mx_record": "mx.sandbox.email-validation.org",
"smtp_provider": "other",
"domain_age_days": 3650,
"processed_at": "2026-11-02T09:30:00.000Z",
"credits_used": 0,
"request_id": "req_7Hq2LmX9cV4bN8tR1zK6wD"
}accepted@sandbox.email-validation.org is a free test address; every reason has one, so you can build and test your integration without spending credits.
Results you can act on
| Status | What it means | Default action | Credit |
|---|---|---|---|
deliverable | The mailbox exists and accepted our check, so mail sent to it should arrive. | send (send) | 1 |
undeliverable | Mail sent to this address will not arrive, so it should come off your list. | remove (remove) | 1 |
risky | The address may accept mail, but sending to it can hurt your bounce rate or sender reputation. | send_with_caution (send with caution) | 1 |
unknown | We could not get a definite answer this time, so no credit is used and a later retry often succeeds. | retry_later (retry later) | Free |
Each status comes with a reason such as no_mailbox, catch_all or disposable, flags for free, role, disposable and catch-all addresses, a typo suggestion when one applies, and the domain's mail server and provider.
What you get
- Real-time checks with
POST /v1/validate: up to 500 requests per second on paid accounts, and atimeoutyou choose between 5 and 15 seconds. Checks that run out of time are free. - Bulk jobs for lists of up to 1,000,000 rows, with filtered CSV downloads and webhooks when they finish. See the bulk jobs API.
- Official SDKs for JavaScript and TypeScript and Python, with retries and typed errors, plus code samples for curl, PHP, Ruby, Go, Java, C# and Rust.
- An OpenAPI 3.1 document at https://api.email-validation.org/openapi.json and a generated API reference.
- An MCP server so AI agents can use the same checks with your key: MCP setup.
- Key controls: scopes, per-key daily credit caps and rate limits, browser-origin lists and key rolling. See authentication.
Pricing
One credit per result, bought in one-time packs that last 24 months, down to $0.45 per 1,000 checks with the 1,000,000-credit pack. Unknown results, errors and test addresses are free. See pricing and credits and billing.