Skip to content

Domains

You may only send from a domain you have proved you control. Adding one returns every record you need to publish.

Add a domain

POST/v1/domains
request · json
{ "name": "yourdomain.com" }

A domain can belong to exactly one organization. If another account has already claimed it, the request is refused — otherwise two tenants could send as each other.

Records

PurposeTypeRequiredWhat it does
dkim (×3)CNAMEYesCryptographically signs your mail
mail_from_mxMXYesRoutes bounces to a subdomain you own
mail_from_spfTXTYesAuthorises the sending infrastructure
dmarcTXTNoTells receivers what to do with failures

Do not skip the MAIL FROM records

DKIM alone is not enough. Without a custom MAIL FROM your Return-Path sits on a shared bounce domain, SPF authenticates that domain rather than yours, and DMARC alignment fails even though DKIM passes. Verification will not complete until both records resolve.

Check verification

GET/v1/domains/{name}/records

Every record is resolved live over DNS and returned with a published flag. This is the endpoint to build your setup UI against: almost every failed onboarding is one mistyped record, and an aggregate “pending” gives the customer nothing to act on.

json
{
  "domain": "yourdomain.com",
  "verificationState": "pending",
  "records": [
    {
      "type": "CNAME",
      "name": "abc123._domainkey.yourdomain.com",
      "value": "abc123.dkim.example.net",
      "purpose": "dkim",
      "required": true,
      "published": true
    }
  ]
}

States

StateMeaning
pendingRecords not yet all visible. Polled every minute.
verifiedDKIM and MAIL FROM both confirmed. You can send.
temporary_failureA record disappeared. Restore it and it recovers.
failedRejected, or unverified after 72 hours. Delete and re-add.

DNS propagation is usually minutes but can take a day. Verification becomes effective within about a minute of the records appearing.

List and remove

GET/v1/domains
DELETE/v1/domains/{id}

Deleting a domain stops you sending from it immediately. Messages already queued are not recalled.