Email verification
Verify a single address in real time.
Verify an address
Verifies one email address and returns the result in the response. Each verification costs 5 credits, charged before the check runs. To verify many addresses at once, create a verification list. Requires an API key with full scope.
/email-verificationsRequest body
emailstringRequiredAddress to verify. A value that isn’t a valid address still returns 200, with result: "invalid" and a score of 0, and is charged.
modestringfast (default) checks syntax, disposable and role-based addresses, free providers, gibberish, MX records and domain age. full also connects to the recipient’s mail server to check whether the mailbox exists, is disabled or is full, and whether the domain accepts all addresses. In fast mode, the mailbox checks are null.
Returns
Returns 200 OK with an email_verification object. Emailit also sends an email_verification.created webhook event.
| Status | When |
|---|---|
400 |
email is missing or mode isn’t fast or full (standard validation error). |
402 |
The workspace doesn’t have 5 credits left. The body is {"error": {"message": "…", "code": 402}}. |
Result
result |
Meaning |
|---|---|
safe |
Passed every check and scored 70 or more. |
invalid |
The syntax is invalid or the domain has no MX records, so it can’t receive email. |
disposable |
The domain belongs to a disposable email service. |
disabled |
The mailbox exists but is disabled. full mode only. |
inbox_full |
The mailbox is full. full mode only. |
role |
A role-based address such as info@ or support@. |
unknown |
No check failed, but the score is below 70. |
Score and risk
score runs from 0 to 100. risk is high when the syntax is invalid, the domain has no MX records, the address is disposable or the mailbox is disabled. Otherwise it follows the score: low from 80, medium from 50, and high below 50.
Fields
statusstringcompleted for single verifications.
checksobjectIndividual checks: valid_syntax, disposable, role_account, free_email, gibberish and has_mx_records (booleans), domain_age (age of the domain in days, or null if unknown), and the full-mode checks smtp_connect, deliverable, disabled, inbox_full and catch_all (null in fast mode).
addressobjectThe address split into mailbox, domain, suffix (the part after +, or null) and root (the address without the suffix).
did_you_meanstring | nullSuggested correction for a likely typo, for example ada@gmail.com for ada@gmial.com.
mx_recordsobject[]The domain’s MX records, each with priority and exchange.
{
"id": "ev_2xLd4Wq8Bn1Ys6Pk3Rm9Tc0Fh5a",
"object": "email_verification",
"email": "ada@example.com",
"status": "completed",
"score": 100,
"risk": "low",
"result": "safe",
"mode": "fast",
"checks": {
"valid_syntax": true,
"disposable": false,
"role_account": false,
"inbox_full": null,
"deliverable": null,
"disabled": null,
"catch_all": null,
"free_email": false,
"smtp_connect": null,
"has_mx_records": true,
"domain_age": 10957,
"gibberish": false
},
"address": {
"mailbox": "ada",
"domain": "example.com",
"suffix": null,
"root": "ada@example.com"
},
"did_you_mean": null,
"mx_records": [
{ "priority": 10, "exchange": "mx1.example.com" }
],
"created_at": "2026-10-01T10:20:31.118000+00:00",
"updated_at": "2026-10-01T10:20:31.118000+00:00"
}{
"error": {
"message": "Workspace has insufficient email credits for email verification. Each verification requires 5 credits.",
"code": 402
}
}