Email Validation
Check an address before you send to it. One address in, one verdict out, fast enough for a signup form.
How it works
Each address runs through the checks in order and stops at the first clear answer: syntax, whether the domain is a throwaway or one we block, whether the address has already failed for us, then whether the domain can receive mail or looks misspelled.
If nothing settles it, we ask the recipient's server whether the mailbox exists. Some answer, some do not. Only a confirmation earns deliverable; otherwise the status says which way the evidence leans.
Authentication
Same bearer token as the rest of the API. See Authentication.
The service account needs email:validate, separate from email:send so a key embedded in a signup flow can check addresses without sending mail. Create a validate-only key from the portal.
Validate an address
curl -X POST https://api.mailverick.com/v1/validate-email \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "email": "user@example.com" }' Request body
| Field | Type | Description |
|---|---|---|
email | string | The address to check. Required. |
One reason appears under two statuses. previously_bounced is the same past bounce either way: read status for whether the address is worth sending to, and reason for what happened to it.
Response
{
"email": "user@example.com",
"status": "deliverable",
"reason": "accepted",
"did_you_mean": null,
"disposable": false,
"role": false
} | Field | Type | Description |
|---|---|---|
email | string | The address, normalized (lowercased and trimmed) |
status | string | The verdict. One of four values, see below |
reason | string | Why we reached that verdict. More specific than the status |
did_you_mean | string? | A corrected address when the domain looks misspelled, otherwise null |
disposable | boolean | A throwaway or temporary provider |
role | boolean | A shared mailbox such as info@, not a person |
Status
Four values, ordered by confidence. If you branch on one field, branch on this one. The two probably_ values mean no server confirmed the mailbox either way; they differ only in which way the evidence points.
| Value | What it means | What to do |
|---|---|---|
deliverable | The mail server accepts mail for this address | Accept it |
probably_deliverable | The mailbox is unconfirmed, and nothing recent argues against the address | Accept it. Expect a small bounce rate |
probably_undeliverable | The mailbox is unconfirmed, and something argues against the address | Ask the user to confirm, or do not send to it |
undeliverable | The address is dead, fake, or has already failed for us | Reject it |
Quality flags
disposable and role ask whether you want the address, not whether mail will arrive. Both kinds usually do receive mail, so neither changes the status. What you do with them is your call.
Reason
status is derived from reason. New reasons may appear within the existing statuses: treat an unrecognized one as its status.
| Reason | Meaning |
|---|---|
| deliverable | |
accepted | The mail server accepts mail for this address |
| probably_deliverable | |
provider_accept_all | The domain accepts every address, so no check can confirm this mailbox |
probe_unavailable | No server would confirm the mailbox, and nothing on record stands against the address |
previously_bounced | This address has worked before, and the bounce looks like a blip |
| probably_undeliverable | |
gibberish | The part before the @ reads as random characters |
domain_typo | The domain looks like a misspelling. See did_you_mean |
previously_bounced | This address bounced and nothing in its history says it ever worked |
recently_bounced | A bounce we are still holding for, such as a full mailbox. It may recover |
| undeliverable | |
invalid_syntax | Not a valid email address |
does_not_exist | No mailbox at this address, or the domain cannot receive mail |
blocked | We know this address or its domain should not be sent to |
Examples
A misspelled domain, with a suggestion:
{
"email": "user@gmial.com",
"status": "probably_undeliverable",
"reason": "domain_typo",
"did_you_mean": "user@gmail.com",
"disposable": false,
"role": false
} A confirmed dead mailbox:
{
"email": "nobody@example.com",
"status": "undeliverable",
"reason": "does_not_exist",
"did_you_mean": null,
"disposable": false,
"role": false
} Errors
Every verdict comes back as 200. A non-2xx response means the request itself could not be processed.
| Status | Code | When |
|---|---|---|
400 | VALIDATION_ERROR | Missing or malformed request body |
400 | TENANT_NOT_FOUND | The organization this key belongs to no longer exists |
401 | UNAUTHORIZED | Missing, expired, or invalid bearer token |
402 | ACCOUNT_PAYMENT_OVERDUE | The account has an unpaid invoice |
403 | FORBIDDEN | The service account lacks the email:validate permission |
403 | ACCOUNT_SUSPENDED, TENANT_SUSPENDED | The account or tenant is suspended |
429 | MONTHLY_QUOTA_EXCEEDED | The monthly allowance is spent |
429 | DAILY_QUOTA_EXCEEDED | The daily allowance is spent |
429 | RATE_LIMITED | Too many requests in a short window. Retry after the delay in Retry-After |
500 | INTERNAL_ERROR | Something went wrong on our side |
What's next
For what happens after you send, read Email Events: delivery status, bounces, opens, clicks, and spam reports in real time.