Domains
Add domain
Add a sending domain. Returns 201 with the domain (status pending) and the DNS records to publish; required ones have required: true.
POST
https://api.sndr.sh/v1/domainsAdd domain
curl -X POST 'https://api.sndr.sh/v1/domains' \
-H "Authorization: Bearer $SNDR_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"name": "mail.acme.com"}'201Created
{
"id": "dom_a7c2e910-4b1",
"organization_id": "org_8d41c7a2-3f6",
"name": "mail.acme.com",
"status": "pending",
"region": "us-east-1",
"spf_status": "unknown",
"dkim_status": "unknown",
"dmarc_status": "unknown",
"mx_status": "unknown",
"tls_rpt_status": "unknown",
"mta_sts_status": "unknown",
"bimi_status": "unknown",
"records": [
{
"type": "TXT",
"name": "mail.acme.com",
"value": "v=spf1 include:_spf.sndr.sh ~all",
"status": "unknown",
"hint": "Add include:_spf.sndr.sh to your existing SPF record, or use this value if no SPF record exists. Keep one SPF record and retain your other mail providers.",
"required": true,
"label": "SPF"
},
{
"type": "TXT",
"name": "sndr._domainkey.mail.acme.com",
"value": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...",
"status": "unknown",
"hint": "DKIM signing key — every outgoing message is signed with it.",
"required": true,
"label": "DKIM"
},
{
"type": "TXT",
"name": "_dmarc.mail.acme.com",
"value": "v=DMARC1; p=quarantine; rua=mailto:dmarc@mail.acme.com; ruf=mailto:dmarc@mail.acme.com; pct=100; adkim=r; aspf=r",
"status": "unknown",
"hint": "Policy that ties SPF + DKIM together. Tells receivers what to do with messages that fail.",
"required": true,
"label": "DMARC"
}
],
"created_at": "2026-06-01T12:00:00Z"
}Authorization
AuthorizationstringheaderrequiredBearer followed by your API key. Needs the send scope.
Body
application/jsonnamestringrequiredDomain or subdomain to send from, e.g. mail.acme.com.
regionstringRegion label stored on the domain. Defaults to us-east-1.
Errors
401
unauthenticatedMissing or invalid API key.400
invalid_requestBody is not valid JSON, or name is missing or not a valid domain name.402
plan_limit_reachedThe plan’s domain limit is reached.403
insufficient_scopeThe API key is missing the send scope.409
conflictThis domain is already added to your workspace.