One domain's full Deliverability Score

Search Documentation

Search across all developer documentation

deliverability

One domain's full Deliverability Score

GET /v1/deliverability/{domain}
Auth required api.reports.view

The domain's latest snapshot in full: score, band, coverage, pillars, every check (measured beside threshold, basis, source, provider rule with its provenance) and the ranked tasks — each saying WHERE it is done (sendops, dns with the literal records to publish, aws with a console link, or third_party) — plus latest_probe, what SendOps's own receiver saw when it last received a message from this domain's SES.

unknown checks are returned, with the task that would measure them, and are excluded from the score's denominator. Any blocking task forces the band to failing. score is never returned without coverage and checks.

202 not_yet_assessed with next_nightly_at before the first snapshot — no score, never zeros. {domain} is the domain name (case-insensitive) or its id; a domain the org does not own is a 404.

Path parameters

domain string required

The domain, by NAME (acme.com), matched case-insensitively; its id is also accepted. Scoped to the calling org — a domain belonging to another org is a 404, never a 403.

Responses

Errors follow the RFC 7807 problem format — see the error reference.

200 The domain's assessment application/json
status string enum required

One of: assessed

domain_id string<uuid> required
domain string required
taken_at string<date-time> required
score integer | null required

Constraints: 0–100

band string enum required

One of: healthy, at_risk, failing, unassessed

band_label string required
low_confidence boolean required

Fewer than three checks were scored; read the number as an anecdote.

coverage object required

The weighted checks behind a score. scored of total were decided; unknown were not and are EXCLUDED from the score — never counted as zero, never counted as a pass. not_applicable checks are outside total. Informational (weight 0) checks are not counted.

Fields of coverage:

scored integer required
total integer required
unknown integer required
not_applicable integer required
pillars array<object> required

Each entry in pillars:

pillar string enum required

One of: authentication, reputation, compliance, hygiene, infrastructure

label string required
weight integer required

The pillar's nominal share of the score.

score integer | null required

0–100 over the pillar's decided checks; null when none was decided.

not_applicable boolean required

Every check in the pillar is not applicable (e.g. below every provider's volume floor).

coverage object required

The weighted checks behind a score. scored of total were decided; unknown were not and are EXCLUDED from the score — never counted as zero, never counted as a pass. not_applicable checks are outside total. Informational (weight 0) checks are not counted.

Fields of coverage:

scored integer required
total integer required
unknown integer required
not_applicable integer required
summary string optional

One plain sentence on what the pillar means for this domain right now — why it does not apply (e.g. "You send about 8 a day to Outlook; these rules apply only above 5,000 a day to Outlook, Gmail or Yahoo."), or what its unmeasured checks need and when they will be measured. Omitted when the score and coverage say it all.

checks array<object> required

Each entry in checks:

key string required
pillar string enum required

One of: authentication, reputation, compliance, hygiene, infrastructure

status string enum required

warn scores as a pass and carries an advisory task. unknown and not_applicable are outside the score.

One of: pass, warn, fail, unknown, not_applicable

weight integer required

Effective weight in points as scored.

measured string required
threshold string required
basis string required
source object required

Where a check's evidence was read, and when.

Fields of source:

name string required
read_at string<date-time> | null required
error string optional

The reader's error class when it failed; the check is then unknown. Absent otherwise.

rule object | null required
task object | null required
covered_by string | null required
tasks array<object> required

Ranked by severity, then the owning check's weight.

Each entry in tasks:

key string required

Stable. The owning check's key, or <check>.<variant>.

check_key string required
title string required
body string required
where string enum required

One of: sendops, dns, aws, third_party

where_label string required
then string enum | null required

One of: sendops, dns, aws, third_party

records array<object> required

The literal DNS records to publish. Empty unless the task is done in DNS.

Each entry in records:

type string required
name string required
value string required
link string | null required
verifies boolean required
severity string enum required

blocking means mail is being lost now, and forces the band to failing.

One of: blocking, important, advisory

opened_at string<date-time> | null required
acknowledged_until string<date-time> | null required

Set while the task is marked handled.

latest_probe object | null required
next_nightly_at string<date-time> required
202 The domain has not been assessed yet application/json
status string enum required

One of: not_yet_assessed

domain_id string<uuid> required
domain string required
next_nightly_at string<date-time> required
401 Missing, malformed, or unknown API key application/problem+json
403 Key lacks the required scope or plan limit violated application/problem+json
404 Resource not found application/problem+json
429 Per-org rate limit exceeded application/problem+json
500 Unexpected server-side failure. The code is internal_error. The request_id field can be quoted to SendOps support to investigate. application/problem+json