Changelog
Dated changes to the API contract and the documentation.
Changes to the v1 API contract and the guides that document it, newest first.
2026-10-07
GET /domains/{domain}/health:dns.mta_stscarries an optionalhosted_cta(label,url) when the domain’s MTA-STS record is missing or failing, or a hosted setup is still in progress. Theurlis a path on the app. Thedns_mta_stsaction item now links there too, and a missing record raises alowitem it did not before.
2026-10-02
GET /reports/{id}no longer adds aparse_warningsentry for a report whoseversionis1or0.1. Large reporters send both routinely and neither says anything about the report’s structure. Any other unexpected version is still flagged.
2026-09-19
GET /enumsreturns every category the product uses, not only the ones the reference documents. The documented categories and their shape are unchanged; read the ones your integration needs by name.
2026-09-16
- Timestamps are RFC 3339 in UTC with whole seconds on every endpoint in the
reference. A field naming a day rather than a moment is
YYYY-MM-DD. An instant a reporter got wrong, one no RFC 3339 date can hold, rendersnull. See the conventions. - A request that authenticates with an API key is refused with
403onDELETE /api-keys/{id}, matching the existing rule for creating keys: a full key getscode: "api_key_cannot_revoke", a read key is stopped earlier withpermission_denied. See authentication. - An unknown path under the base URL returns a JSON
404instead of an HTML page. - Lists in documented responses are never
null; an empty list is[]. GET /enumsreturns the categories the reference documents.gradedocuments itsN/Avalue, returned before the first report.GET /domainsandGET /top-sourcesnow return a paged envelope (total,limit,offset) instead of a bare array.GET /eventsechoes back thelimitandoffsetit actually applied.- A
403permission denial now carriescode: "permission_denied"and arequiredfield naming the permission the key lacked. See reading a rejection. GET /sources/{ip}gainedspam_signals, renamed from an earlier field.GET /enumsis now documented in the reference.- A malformed
fromortoonGET /reportsnow returns400instead of being silently dropped. - The
domainfilter on statistics, compliance score, trends, top sources and sources is now case-insensitive, and a malformed value returns400instead of an empty result. GET /api-keys/usagedocuments its503.