List domains
Every domain on the workspace, with its receiving, sending, tracking and files state.
Runs the real call against your workspace, with your own key.
GET /domains
Every domain on the workspace, with its receiving, sending, tracking and files state.
Receiving and sending are separate
Every domain reports receiving and sending as two independent state objects. receiving.verified means the domain’s MX brings its mail here and its ownership challenge is published, so the domain can take delivery. It says nothing about outbound.
sending is the outbound half, read from the domain’s stored signing check rather than a fresh one. sending.status is one of verified, pending, failed, no_identity or unknown, sending.canSend says whether a send from the domain would be accepted right now, sending.checkedAt dates that verdict, sending.error carries the last failure, and sending.note is a sentence explaining the state. A negative verdict older than a day is treated as unknown rather than as a refusal, so canSend can be true while status is pending.
tracking is a third object, about the domain’s optional custom tracking domain rather than its mail. tracking.status is none until one is set, in the app or with PATCH /domains/{id}, whose page describes every field.
storage is a fourth object with the same fields, about the domain’s optional custom files domain: the name the download links for files sent from the domain use. It is set the same way and on the same page, and storage.status is none until one is set.
Example
Needs domains:read.
curl "$OE/domains" -H "$AUTH"{ "object": "list", "data": [ { "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 }, "createdAt": "2026-08-14T09:55:11.000Z" } ]}lastCheckedAt null means DNS has never been looked at: "we have not looked yet", not "it failed". The two read very differently thirty seconds after adding a domain.