Retrieve a domain's DMARC status

GET
/v1/domains/{id}/dmarc

The domain's published DMARC record, where it is on the path from p=none to p=reject, the record to publish next and whether the last 14 days of aggregate reports say that is safe (ready, with the checks behind it), and a summary of those reports. Mailbox providers send DMARC aggregate reports to the domain's report_address once its _dmarc record names it (rua=mailto:…), usually once a day each.

Authorization

bearerAuth
headerAuthorizationBearer <token>

A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.

Path Parameters

id*string

The domain's id.

Header Parameters

Coss-Version?"2026-10-10"

The API version (a date) to use for this request. Defaults to your organization's version, pinned to the latest one when it first used the API and upgraded from the dashboard. The SDK always sends the version it was built for.

Value in"2026-10-10"

Response Body

The domain's DMARC status.

application/json
  1. response
object*"domain_dmarc"
Value in"domain_dmarc"
domain_id*string
report_address*|

Where the domain's DMARC aggregate reports go (rua=mailto:…). null when this deployment doesn't receive email.

record*|null
policy*|

The policy receivers apply: the record's p (none when it has none), or for a subdomain without a record of its own, its organizational domain's sp (else p).

inherited_from*|

The organizational domain whose DMARC record applies, when this domain publishes none of its own.

policy_since*|

When a DNS check first saw the current policy.

stage*string

Where the domain is on the path to enforcement: not_checked (DNS not checked yet), no_record, monitoring (p=none), quarantine or reject.

Value in"not_checked""no_record""monitoring""quarantine""reject"
partial*boolean

The policy applies only partly (pct below 100, or t=y).

reporting*boolean

The published record sends aggregate reports to report_address.

ready*boolean

Whether next is safe to publish now.

next*|

The next step: publish a first record, add_reporting (send reports to COSS), complete_rollout (drop pct/t=y) or tighten to the next policy. null at p=reject.

checks*array<>

The readiness checks gating next, from the last 14 days of reports.

warnings*array<string>
report_summary*
import { Coss } from "coss";const coss = new Coss({  apiKey: process.env.COSS_API_KEY,  baseUrl: "https://api.coss.com",});const { data, error } = await coss.domains.dmarc.get("dom_01k7c8m4q2f3e9v6t5r1n0p8yz");
{  "object": "domain_dmarc",  "domain_id": "dom_01k7c8m4q2f3e9v6t5r1n0p8yz",  "report_address": "dmarc-k3x9m2pq7rtw4nbc@inbound.coss.com",  "record": {    "value": "v=DMARC1; p=none; rua=mailto:dmarc-k3x9m2pq7rtw4nbc@inbound.coss.com;",    "p": "none",    "sp": null,    "np": null,    "adkim": null,    "aspf": null,    "pct": null,    "t": null,    "rua": [      "mailto:dmarc-k3x9m2pq7rtw4nbc@inbound.coss.com"    ]  },  "policy": "none",  "inherited_from": null,  "policy_since": "2026-09-20T08:00:00.000Z",  "stage": "monitoring",  "partial": false,  "reporting": true,  "ready": true,  "next": {    "kind": "tighten",    "policy": "quarantine",    "record": "v=DMARC1; p=quarantine; rua=mailto:dmarc-k3x9m2pq7rtw4nbc@inbound.coss.com;"  },  "checks": [    {      "id": "coss_pass_rate",      "ok": true,      "message": "100% of mail sent through COSS passes DMARC (99% needed)."    }  ],  "warnings": [],  "report_summary": {    "period_start": "2026-09-26T00:00:00.000Z",    "period_end": "2026-10-10T00:00:00.000Z",    "reports": 28,    "messages": 1846,    "passing": 1840,    "coss_messages": 1840,    "coss_passing": 1840,    "first_report_at": "2026-09-21T00:00:00.000Z",    "last_report_at": "2026-10-09T23:59:59.000Z",    "sources": [      {        "source_ip": "54.240.8.12",        "header_from": "acme.com",        "messages": 1840,        "passing": 1840,        "via_coss": true      }    ]  }}