Skip to the documentation
API

Retrieve a domain

Adds the addresses that exist on it and whether each is enabled.

GETapi.openemail.uk/domains/{id}

Runs the real call against your workspace, with your own key.

GET /domains/{id}

Adds the addresses that exist on it and whether each is enabled.

Example

Needs domains:read.

curl
curl "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f" -H "$AUTH"
Response
{  "object": "domain",  "id": "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f",  "domain": "acme.com",  "receiving": {    "verified": true,    "verifiedAt": "2026-08-14T10:02:00.000Z",    "catchAll": false,    "lastCheckedAt": "2026-08-29T06:00:00.000Z",    "error": null  },  "sending": {    "status": "verified",    "canSend": true,    "checkedAt": "2026-08-29T06:00:00.000Z",    "error": null,    "note": "Mail from this domain is signed and can be sent."  },  "tracking": {    "host": "links.acme.com",    "status": "active",    "active": true,    "target": "oelinks3f9a1c7e2b8d4a60.edge.openemail.uk",    "record": { "type": "CNAME", "name": "links.acme.com", "value": "oelinks3f9a1c7e2b8d4a60.edge.openemail.uk" },    "checkedAt": "2026-08-29T06:10:00.000Z",    "verifiedAt": "2026-08-29T06:10:00.000Z",    "error": null  },  "storage": {    "host": "files.acme.com",    "status": "active",    "active": true,    "target": "oefiles81c40d6b2f7e9a35.edge.openemail.uk",    "record": { "type": "CNAME", "name": "files.acme.com", "value": "oefiles81c40d6b2f7e9a35.edge.openemail.uk" },    "checkedAt": "2026-08-29T06:10:00.000Z",    "verifiedAt": "2026-08-29T06:10:00.000Z",    "error": null  },  "addresses": [    { "address": "[email protected]", "enabled": true },    { "address": "[email protected]", "enabled": false }  ],  "createdAt": "2026-08-14T09:55:11.000Z"}

A disabled address stops being deliverable. Mail to it is refused at SMTP time, so the sender gets a bounce rather than silence.

What you cannot do here yet

Not shipped yet

The writes this resource takes are the custom tracking domain and the custom files domain, both through PATCH /domains/{id}. The rest of a domain’s setup is app-only for now.

  • Adding a domain, and reading the DNS records to publish. GET reports that a domain is unverified but not which record is missing.
  • Triggering a re-check of receiving or sending. Neither has an endpoint, and neither needs one: an hourly sweep re-checks every unverified domain on its own, so publishing the records and leaving them is the whole job. Subscribe to domain.verified and domain.sending_changed rather than polling GET /domains, and you are told the moment either moves. PATCH /domains/{id} checks only the tracking domain and the files domain.
  • Creating, disabling or routing an address. SHARING one is built, since POST /members/{userId}/addresses hands an existing address to somebody at member or viewer level. It is bringing the address into existence that this resource cannot do.

All of it exists in the app under Settings → Domains. It is the API surface that is missing, not the capability.