Skip to content

Enroll a domain

POST /v1/dmarc/domains
Field Type Required Description
domain string Yes The domain to monitor, e.g. example.com.
org_id string No Your own grouping key, echoed back on reads.
is_subdomain boolean No Mark this as a subdomain enrollment.
parent_domain string No The parent, when is_subdomain is true.
ruf_enabled boolean No Also provision a forensic (RUF) address.
tlsrpt_enabled boolean No Also provision a TLS-RPT address.
retention_days integer No How long to keep reports (1–3650).
Terminal window
curl -X POST https://api.tryverifyemail.com/v1/dmarc/domains \
-H "Authorization: Bearer sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"domain": "example.com"}'

201 Created on first enrollment.

{
"created": true,
"domain": {
"id": "665f1c2a9b4e7d0012ab34cd",
"domain": "example.com",
"status": "pending",
"is_subdomain": false,
"parent_domain": null,
"org_id": null,
"ruf_enabled": false,
"tlsrpt_enabled": false,
"retention_days": 90,
"published_policy": null,
"reporting": {
"rua": "a1b2c3d4e5f6...@dmarc.tryverifyemail.com",
"ruf": null,
"tlsrpt": null
},
"created_at": "2026-08-19T10:04:11.000Z",
"updated_at": "2026-08-19T10:04:11.000Z"
},
"dns_records": [
{
"record": "dmarc",
"host": "_dmarc.example.com",
"type": "TXT",
"action": "create",
"value": "v=DMARC1; p=none; rua=mailto:a1b2c3d4e5f6...@dmarc.tryverifyemail.com",
"current": null
}
]
}

dns_records is generate-or-merge, not a blind template. We read whatever is currently published at _dmarc.<domain> first:

  • "action": "create" — nothing is published yet. value is a safe monitoring-only starter (p=none), so enrolling cannot affect delivery.
  • "action": "update" — a DMARC record already exists. value is that record with our reporting address spliced into its rua= list and every one of your existing policy tags preserved (p, pct, sp, adkim, aspf). current shows what is published today so you can diff before applying.

Publish value verbatim at host.