Verify a list of addresses
/api/v1/verificationsChecks whether each address has a mailbox — without sending anything. We ask the recipient's mail server directly, the way a sending server would, and stop before any message is sent.
Uses one check per unique address, taken when the verification starts: this month's
plan checks first, then checks you bought, then send credits bought before checks launched
(10 credits a check). Duplicates and letter case are removed first, so Ada@x.com and
ada@x.com are one address. If you have fewer checks than the list needs, nothing starts
and nothing is used: a 402 whose data.quote says how many you need and which pack
covers the rest. An address we could not confirm gives its check back. The reply carries
X-Mailyte-Checks-Remaining.
Before checks launch on your account, a list is paid in send credits instead, priced by its
size, after the list checks your plan includes this month; with too few credits nothing
starts (a 402).
Most answers arrive within seconds. Gmail mailboxes are checked at a steady pace, so a large
list can take a while; addresses still being checked read pending. Anything we cannot
answer within a day is refunded.
Send an Idempotency-Key header so a retried request is never charged twice. Up to
50,000 addresses per verification, and up to 3 running at once.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | Makes this request safe to retry. Use <app>-<ULID>, such as crm-01JBT8XQ2M9WYC3K4F6R7S8T9V; any other shape is a 422. Send the same key on every retry: a repeat gets the first answer with Idempotency-Replayed: true, a key reused for a different request is a 422, and one still running is a 409 with Retry-After. Keys last 24 hours, per organization. |
Request body
emailsarray<string>requiredThe addresses to check.
labelstringYour own name for this verification.
Request
/api/v1/verificationscurl -X POST 'https://app.mailyte.com/api/v1/verifications' \
-H 'Authorization: Bearer mk_live_YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"emails": [
"ada@example.com"
]
}'const response = await fetch('https://app.mailyte.com/api/v1/verifications', {
method: 'POST',
headers: {
Authorization: 'Bearer mk_live_YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"emails": [
"ada@example.com"
]
}),
});
const { data } = await response.json();import requests
response = requests.post(
"https://app.mailyte.com/api/v1/verifications",
headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
json={
"emails": [
"ada@example.com"
]
},
)
data = response.json()["data"]<?php
$response = Http::withToken('mk_live_YOUR_API_KEY')
->post('https://app.mailyte.com/api/v1/verifications', [
'emails' => [
'ada@example.com',
],
]);
$data = $response->json('data');require "net/http"
require "json"
uri = URI("https://app.mailyte.com/api/v1/verifications")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer mk_live_YOUR_API_KEY"
request["Content-Type"] = "application/json"
request.body = {
"emails": [
"ada@example.com"
]
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }Response
Started. Poll the verification until `status` is `finished`.
dataobjectobjectstringverificationidstringstatusstringrunning | finished | expired | failedrunninguntil every address has an answer, thenfinished.expired: the checker could not answer some addresses within a day; they staypendingand their checks or credits were given back.sourcestringlist | contacts | import | campaign | automatic | singleWhere the addresses came from: -
list: addresses you sent (1 check each; older runs used send credits). -contacts: your contacts that were never checked (free). -import,campaign: checks we run when you import contacts or start a campaign (free). -automatic: the day's checks of new contacts while Bounce protection is on. -single: the day's one-address checks.labelstring or nulltotalintegerUnique addresses in the run.
countsobjectAlways sums to
total.validintegerThe mailbox exists.
invalidintegerDoes not exist, cannot receive mail, or is not an address. Mail to these is refused.
riskyintegerThrowaway, catch-all or role address: may not reach a person.
unknownintegerThe provider would not confirm either way (Yahoo and AOL never do). Sent as normal.
pendingintegerStill being checked.
credits_chargedintegerSend credits this run cost (older runs, or checks paid from credits bought or granted before launch, at 10 credits a check).
credits_refundedintegerSend credits given back.
checks_chargedintegerChecks drawn for this run.
checks_refundedintegerChecks given back (couldn't confirm, or never answered).
charge_unitstring or nullchecks, or null for a run paid in send credits.by_mailytebooleanTrue for a free check Mailyte ran on your contacts, such as the one-time check of existing contacts at launch.
created_atstringfinished_atstring or null
Returned inside the standard envelope.
Errors
| Status | When |
|---|---|
401 | The API key is missing, unknown, revoked or expired. All four answer identically, on purpose: distinguishing them would confirm which keys exist. |
403 | The key is valid but may not do this: it lacks the required scope, its IP allowlist does not include you, or this endpoint does not accept API keys. |
404 | No such resource in this organization. |
422 | The request was understood but the values were not acceptable. |
429 | Too many requests, or the organization has spent its sending allowance. `Retry-After` says how long to wait. |
Every status, with what causes it and what to do, is on the error reference.