Docs

Domains

Add, verify, and monitor sending domains: DKIM/SPF/DMARC records, domain health scoring, and DMARC aggregate-report summaries. Full /domains API reference.

POST/domainsAdd a sending domain

Returns the DNS records you need to add — a DKIM TXT record, an SPF MX and TXT pair on the sending subdomain, and an optional DMARC record. There is no webhook for domain status changes yet: poll GET /domains/:id or call POST /domains/:id/verify to re-check records on demand and see them move from not_started to verified. The response's capabilities object ({ sending, receiving }) reflects whether this domain sends, receives, or both — see Receiving to turn receiving on.

curl -X POST https://api.irisend.com/domains \
  -H "Authorization: Bearer $IRISEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "yourdomain.com", "region": "eu-west-1" }'
ResponseJSON
{
  "object": "domain",
  "id": "dom_4kP1qR9zL7vT2yB6wC0nS3x",
  "name": "yourdomain.com",
  "status": "not_started",
  "created_at": "2026-09-25T09:00:12.481Z",
  "region": "eu-west-1",
  "capabilities": { "sending": "enabled", "receiving": "disabled" },
  "records": [
    { "record": "DKIM", "type": "TXT", "name": "irisend._domainkey", "value": "p=MIGfMA0GCSq...", "ttl": "Auto", "status": "not_started", "required": true },
    { "record": "SPF", "type": "MX", "name": "send", "value": "feedback-smtp.eu-west-1.amazonses.com", "priority": 10, "ttl": "Auto", "status": "not_started", "required": true },
    { "record": "SPF", "type": "TXT", "name": "send", "value": "v=spf1 include:amazonses.com ~all", "ttl": "Auto", "status": "not_started", "required": true },
    { "record": "DMARC", "type": "TXT", "name": "_dmarc", "value": "v=DMARC1; p=none;", "ttl": "Auto", "status": "not_started", "required": false }
  ],
  "open_tracking": false,
  "click_tracking": false,
  "tls": "opportunistic",
  "reputation_status": "ok",
  "bimi_logo_url": null,
  "bimi_vmc_url": null
}
GET/domains/:idRetrieve a domain

Same shape as create, with each record's current verification status. GET /domains lists every domain on the team, but omits records — fetch a single domain to see the DNS records.

curl https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x \
  -H "Authorization: Bearer $IRISEND_API_KEY"
PATCH/domains/:idUpdate tracking settings

Accepts open_tracking, click_tracking, tls (opportunistic or enforced), bimi_logo_url/bimi_vmc_url, and capabilities ({ sending?, receiving? }, each "enabled"/"disabled", at least one must stay enabled) — see Receiving for the MX record and webhook this turns on. Omitted fields keep their current value. Returns the { object, id } mutation shape.

curl -X PATCH https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x \
  -H "Authorization: Bearer $IRISEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "open_tracking": true, "click_tracking": true }'
POST/domains/:id/unpauseLift a reputation pause

Manual override once the bounce/complaint issue behind a domain_reputation_paused error is resolved.

curl -X POST https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x/unpause \
  -H "Authorization: Bearer $IRISEND_API_KEY"
GET/domains/:id/healthDomain health score

Irisend extension, no Resend equivalent. A 0–100 score from two weighted factors (60% bounce/complaint reputation, 40% live DNS record verification) — each factor carries its own 0–100 score and a human-readable detail string. This endpoint doesn't return a band label (that only appears in domain.health.* webhook payloads) — derive one yourself if you need it: score ≥ 80 good, ≥ 50 degraded, below that critical.

curl https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x/health \
  -H "Authorization: Bearer $IRISEND_API_KEY"
ResponseJSON
{
  "object": "domain_health",
  "domain_id": "dom_4kP1qR9zL7vT2yB6wC0nS3x",
  "score": 92,
  "factors": [
    { "key": "reputation", "label": "Bounce/complaint reputation", "weight": 0.6, "score": 100, "detail": "hard-bounce rate 0.41%, complaint rate 0.02% over last 500 sends (ok)" },
    { "key": "dns", "label": "DNS record verification", "weight": 0.4, "score": 66, "detail": "drifted: SPF" }
  ],
  "reputation": {
    "sample_size": 500,
    "hard_bounces": 2,
    "complaints": 0,
    "hard_bounce_rate": 0.0041,
    "complaint_rate": 0.0002,
    "status": "ok"
  },
  "dns": { "status": "verified", "drifted_records": ["SPF"] }
}
GET/domains/:id/dmarc/summaryDMARC summary

Irisend extension. Aggregate pass rates and a ramp recommendation computed from received DMARC aggregate reports — useful for deciding when it's safe to move published_policy from none toward quarantine/reject.

curl https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x/dmarc/summary \
  -H "Authorization: Bearer $IRISEND_API_KEY"
ResponseJSON
{
  "object": "dmarc_summary",
  "domain_id": "dom_4kP1qR9zL7vT2yB6wC0nS3x",
  "published_policy": "none",
  "pass_rate_7d": 0.98,
  "pass_rate_30d": 0.97,
  "total_messages_7d": 4310,
  "unknown_source_count_7d": 1,
  "recommended_policy": "quarantine",
  "recommendation_reason": "ramp_ready",
  "last_report_at": "2026-09-25T04:00:00.000Z",
  "reports_received_total": 212
}
GET/domains/:id/dmarc/sourcesSending sources seen in DMARC reports

window is 7d (default), 30d, or 90d. Cursor is the source IP address, ordered lexicographically rather than by recency.

curl https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x/dmarc/sources?window=30d&limit=20 \
  -H "Authorization: Bearer $IRISEND_API_KEY"
ResponseJSON
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "dmarc_source",
      "source_ip": "54.240.0.12",
      "reverse_dns": "a12-0.smtp-out.eu-west-1.amazonses.com",
      "classification": "ours",
      "messages": 4288,
      "pass_rate": 0.99,
      "first_seen": "2026-08-27T00:00:00.000Z",
      "last_seen": "2026-09-25T04:00:00.000Z"
    }
  ]
}
GET/domains/:id/dmarc/reportsRaw DMARC aggregate reports
curl https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x/dmarc/reports?limit=20 \
  -H "Authorization: Bearer $IRISEND_API_KEY"
ResponseJSON
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "dmarc_report",
      "id": "c2f7a910-1e4d-4b7a-9c3f-5a0e8d2b6f41",
      "org_name": "google.com",
      "report_id": "12345678901234567890",
      "date_range_begin": "2026-09-24T00:00:00.000Z",
      "date_range_end": "2026-09-25T00:00:00.000Z",
      "policy_p": "none",
      "policy_pct": 100,
      "total_messages": 318,
      "aligned_pass_messages": 318,
      "created_at": "2026-09-25T04:00:00.000Z"
    }
  ]
}
DELETE/domains/:idRemove a domain

Returns { object, id, deleted: true }.

curl -X DELETE https://api.irisend.com/domains/dom_4kP1qR9zL7vT2yB6wC0nS3x \
  -H "Authorization: Bearer $IRISEND_API_KEY"