List deliverabilitys
/api/v1/deliverabilityRequest
/api/v1/deliverabilitycurl -X GET 'https://app.mailyte.com/api/v1/deliverability' \
-H 'Authorization: Bearer mk_live_YOUR_API_KEY'const response = await fetch('https://app.mailyte.com/api/v1/deliverability', {
method: 'GET',
headers: {
Authorization: 'Bearer mk_live_YOUR_API_KEY',
},
});
const { data } = await response.json();import requests
response = requests.get(
"https://app.mailyte.com/api/v1/deliverability",
headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
)
data = response.json()["data"]<?php
$response = Http::withToken('mk_live_YOUR_API_KEY')
->get('https://app.mailyte.com/api/v1/deliverability');
$data = $response->json('data');require "net/http"
require "json"
uri = URI("https://app.mailyte.com/api/v1/deliverability")
request = Net::HTTP::Get.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.
dataobjectobjectstringdeliverability_reportscoreinteger0-100.
bandstringneeds_attention | good | excellent`score` bucketed. A VALUE, not a display label: this used to be `"Needs attention"`, Title Case with a space, which no caller could switch on without matching English.
window_daysintegerEverything in this report is computed over this many days, ending now.
volumeobjectCounts -- things that happened. Split from `rates` because the two used to sit flat in one `metrics` bag, told apart only by an `_rate` suffix, so `bounced: 1` read as a contradiction beside `bounce_rate: 50`.
submittedintegerDISTINCT message ids across outbound mail events. An `email.submitted` event type exists but is emitted for only a fraction of mail, so counting those alone understated the figure badly. Mail addressed to a domain reserved by RFC 2606 (.invalid, .test, .example, .localhost, example.com) is excluded here and everywhere below: it cannot reach a real recipient, so it is testing rather than sending.
deliveredintegerDistinct MESSAGES delivered, not delivery events.
bouncedintegerDistinct MESSAGES the recipient refused. Counted per message, not per event, so one message bouncing twice is one bounce -- the numerator and the denominator are the same unit. EXCLUDES routing loops, which are ours (see `routing_loops`).
routing_loopsintegerDistinct messages lost to a 5.4.6 mail routing loop. Deliberately outside `bounced` and outside `rates.bounce`: a bounce is the recipient refusing the message, this is our own transport losing it after accepting it, and the two call for opposite responses. Anything above zero is an infrastructure fault to report, never a reason to clean a contact list.
openedintegerclickedintegercomplaintsinteger`delivery.complaint` events.
unsubscribedinteger
ratesobjectPERCENTAGES, 0-100, not fractions: a bounce rate of 50 is half. The `_rate` suffix is redundant under this key and is gone. They divide by `max(volume.delivered, volume.submitted, 1)`, so a rate can exceed what a naive reading of `volume` suggests when tracking events outnumber known messages.
opennumberclicknumberbouncenumbernegative_engagementnumberComplaints and unsubscribes together.
authenticationobjectPer-domain SPF/DKIM/DMARC. HIDDEN DOMAINS ARE EXCLUDED here, as on the Domains page -- but they still send, so `volume` above DOES count their mail. The two sets differ deliberately, which is why this block names the domains it scored instead of only publishing an average.
average_scorenumber0-100.
domainsarray<object>domainstringThe domain name these three flags are about. NULL WOULD MEAN UNKNOWN and cannot happen: each row is one of your domain records and the column is NOT NULL. An unauthenticated domain still appears here NAMED, with `spf`/`dkim`/`dmarc` false and `score` 0 -- a domain is never anonymised into a null row, because the whole reason this list is published beside `average_score` is to say which domains dragged it down.
scoreinteger0-100.
spfbooleandkimbooleandmarcboolean
recommendationsarray<object>What to fix, worst first. Empty when there is nothing to say.
severitystringcritical | warning | infomessagestringHuman-readable prose. Not a stable identifier -- do not match on it; the wording carries live figures and domain names and is rewritten whenever the advice changes. NULL WOULD MEAN UNKNOWN and cannot happen: every recommendation this report can emit is built with its sentence, so a row without one is not a recommendation with nothing to say. If you need to branch, branch on `severity`, which IS a closed set.
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.