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, not `email.submitted` events -- nothing emits those on the ingest path, so counting them showed 0 forever beside non-zero rates.
deliveredintegerbouncedintegeropenedintegerclickedintegercomplaintsinteger`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.