Documentation

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

FieldTypeDescription
emailstringThe 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
}
FieldTypeDescription
emailstringThe address, normalized (lowercased and trimmed)
statusstringThe verdict. One of four values, see below
reasonstringWhy we reached that verdict. More specific than the status
did_you_meanstring?A corrected address when the domain looks misspelled, otherwise null
disposablebooleanA throwaway or temporary provider
rolebooleanA 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.

ValueWhat it meansWhat to do
deliverableThe mail server accepts mail for this addressAccept it
probably_deliverableThe mailbox is unconfirmed, and nothing recent argues against the addressAccept it. Expect a small bounce rate
probably_undeliverableThe mailbox is unconfirmed, and something argues against the addressAsk the user to confirm, or do not send to it
undeliverableThe address is dead, fake, or has already failed for usReject 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.

ReasonMeaning
deliverable
acceptedThe mail server accepts mail for this address
probably_deliverable
provider_accept_allThe domain accepts every address, so no check can confirm this mailbox
probe_unavailableNo server would confirm the mailbox, and nothing on record stands against the address
previously_bouncedThis address has worked before, and the bounce looks like a blip
probably_undeliverable
gibberishThe part before the @ reads as random characters
domain_typoThe domain looks like a misspelling. See did_you_mean
previously_bouncedThis address bounced and nothing in its history says it ever worked
recently_bouncedA bounce we are still holding for, such as a full mailbox. It may recover
undeliverable
invalid_syntaxNot a valid email address
does_not_existNo mailbox at this address, or the domain cannot receive mail
blockedWe 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.

StatusCodeWhen
400VALIDATION_ERRORMissing or malformed request body
400TENANT_NOT_FOUNDThe organization this key belongs to no longer exists
401UNAUTHORIZEDMissing, expired, or invalid bearer token
402ACCOUNT_PAYMENT_OVERDUEThe account has an unpaid invoice
403FORBIDDENThe service account lacks the email:validate permission
403ACCOUNT_SUSPENDED, TENANT_SUSPENDEDThe account or tenant is suspended
429MONTHLY_QUOTA_EXCEEDEDThe monthly allowance is spent
429DAILY_QUOTA_EXCEEDEDThe daily allowance is spent
429RATE_LIMITEDToo many requests in a short window. Retry after the delay in Retry-After
500INTERNAL_ERRORSomething 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.