Verify

Check syntax, typos, blocked domains, and mail routing for one address.

MethodPOST
/api/v2/verify

POST /api/v2/verify · lumail.verify()

Checks syntax, disposable and blocked domains, free mailbox providers, privacy aliases, recurring suspicious domains, spam-like or role-based mailbox names, domain typos, trusted global history, and DNS mail routing. Permission: emails. Dashboard, API, CLI, and verify_email share one monthly organization quota.

HTTP 200 for both accept and reject. Transport / auth failures use { name, message, statusCode }. Every problem lives in issues. suggestion is the corrected address when the domain looks like a typo ([email protected][email protected]).

accept is the policy decision. It can be true when the monthly quota is exhausted (status: "skipped", issues[0].code: "quota_exceeded", score: null). That fallback skips history and DNS and does not change sending eligibility elsewhere.

DNS routing does not prove the mailbox exists. A clean address on a domain that routes mail is result: "risky" with accept: true. result: "deliverable" only appears on historical SMTP-confirmed rows.

Disposable domains are rejected with disposable_email. Free providers are informational. Privacy aliases stay accepted and return a privacy_alias warning because they can forward to a real mailbox. Recurring suspicious domains return suspicious_domain for manual review without being rejected. These list checks are local and do not call another verification service.

Score

score is a deterministic 0–100 confidence from the signals that ran. It is not a delivery guarantee. Use it to rank or threshold addresses; use accept for the hard policy decision.

RangeMeaning
80Every executed check passed (syntax, lists, history, DNS routing). Mailbox not proven. result: "risky".
90+Historical SMTP-confirmed rows only.
30DNS could not be resolved. result: "unknown".
0–15Rejected, including no mail destination and null MX. mailbox_full scores 15 and previously_complained 5 because the mailbox existed when those events were recorded.
nullNothing was checked (quota exhausted or internal failure).

Spam-like mailbox names subtract 30, domain typos 35, role-based mailboxes (info@, support@) 10.

Routing cache

MX + resolved addresses are cached per domain (12 h; 7 days for pinned consumer providers such as Gmail, Outlook, Yahoo, iCloud, Orange, Free, SFR, La Poste, Proton, and GMX). Temporary DNS failures are not cached. No SMTP session is opened and no email is sent.

Body Parameters

NameTypeDescription
emailstringRequired. Address to check.

Response Fields

FieldTypeDescription
object"email_verification"Resource type.
idstringTenant-owned verify_result id.
emailstringNormalized address that was checked.
resultstringdeliverable, risky, undeliverable, or unknown.
acceptbooleanPolicy decision. Can be true when quota is exhausted.
statusstringcompleted, skipped, or failed.
scoreinteger | null0–100 deliverability confidence.
suggestionstring | nullBetter address when the domain looks like a typo.
traitsobjectStable booleans for disposable, free-provider, privacy-alias, role-based, and suspicious-domain classification.
issuesobject[]Errors and warnings only. Empty when the address is clean. Primary reason is first.
quotaobject{ limit, used, remaining, resets_at } for the UTC month.
retry_atstring | nullISO timestamp when a retryable check should be tried again.
cache_hitbooleantrue when the result was served from cache.

issues[]

FieldTypeDescription
codestringStable reason (mailbox_not_found, domain_typo, catch_all, …).
messagestringHuman-readable reason.
severity"error" | "warning"error blocks accept. warning does not.
retryablebooleantrue for mailbox_full, mailbox_unknown, quota_exceeded, internal_error.

Common code values: invalid_format, disposable_email, spam_domain, invalid_domain, test_email, mailbox_not_found, mailbox_full, mailbox_unknown, previously_bounced, previously_complained, globally_suppressed, quota_exceeded, internal_error, domain_typo, role_based, spam_like, privacy_alias, suspicious_domain, catch_all.

Errors

StatusnameWhen
401missing_api_keyMissing or invalid bearer token
403missing_permissionToken lacks the emails permission
422validation_errorMissing email

Older emails.verify path: emails.verify.