Verify a sender
/api/v1/senders/{sender}/verifyParameters
| Name | In | Type | Description |
|---|---|---|---|
senderrequired | path | string | The sender identifier. |
Request
/api/v1/senders/{sender}/verifycurl -X POST 'https://app.mailyte.com/api/v1/senders/01JBT8XQ2M9WYC3K4F6R7S8T9V/verify' \
-H 'Authorization: Bearer mk_live_YOUR_API_KEY'const response = await fetch('https://app.mailyte.com/api/v1/senders/01JBT8XQ2M9WYC3K4F6R7S8T9V/verify', {
method: 'POST',
headers: {
Authorization: 'Bearer mk_live_YOUR_API_KEY',
},
});
const { data } = await response.json();import requests
response = requests.post(
"https://app.mailyte.com/api/v1/senders/01JBT8XQ2M9WYC3K4F6R7S8T9V/verify",
headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
)
data = response.json()["data"]<?php
$response = Http::withToken('mk_live_YOUR_API_KEY')
->post('https://app.mailyte.com/api/v1/senders/01JBT8XQ2M9WYC3K4F6R7S8T9V/verify');
$data = $response->json('data');require "net/http"
require "json"
uri = URI("https://app.mailyte.com/api/v1/senders/01JBT8XQ2M9WYC3K4F6R7S8T9V/verify")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer mk_live_YOUR_API_KEY"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }Response
Success.
dataobjectThe live verification picture for one sender: what DNS looks like right now and what is missing. **No verification token is published** — verification reads the domain's public DNS and there is no secret in this flow. A token that proves ownership of an address is a credential; if one is ever introduced it must not appear on a read endpoint.
objectstringsender_verificationsender_idstringThe sender this picture describes. **null means UNKNOWN — the id was missing from the payload.** It never means the picture belongs to no sender: both endpoints build it from the sender they have just read, whose id is a NOT NULL primary key, so a null here would be our fault rather than a state a sender can be in.
statestringpending | verified | failedThe same closed set, from the same function, that `GET /senders/{sender}` publishes under `verification.state`, so one sender cannot read `failed` on one endpoint and something else on the other. Note there is deliberately NO timestamp here: when a sender last verified is durable state and is published once, on the sender itself.
errorstringWhy the last check failed. **null means NONE — there is no current failure**, which is the case whenever `state` is not `failed`. A stale error beside a `verified` state is the same contradiction as a stale timestamp beside a failure, and a successful check clears the stored string, so there is nothing withheld here.
checksobjectThe live DNS lookups, each genuinely true or false. There is no third "unknown" state to represent: these resolve the domain's published records, and a record that will not resolve has not been published. This is one of the few places in the API where `false` really does mean false rather than "not measured".
spfbooleandkimbooleandmarcbooleanReported, but never required — see `requires`.
requiresarray<string>Which of `checks` must pass for this sender to verify. NARROWER than `checks`: DMARC is checked and reported but is advisory, not a delivery gate. Published because a caller looking at three booleans would otherwise reasonably conclude all three must be true.
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.