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 "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f" -H "$AUTH"{ "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 yetThe 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.
GETreports that a domain is unverified but not which record is missing. - Triggering a re-check of
receivingorsending. 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 todomain.verifiedanddomain.sending_changedrather than pollingGET /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}/addresseshands an existing address to somebody atmemberorviewerlevel. 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.