---
title: "List domains"
description: "Every domain on the workspace, with its receiving, sending, tracking and files state."
url: "https://openemail.uk/docs/api/domains/list"
area: "API"
category: "Mailbox"
---

# List domains

Every domain on the workspace, with its receiving, sending, tracking and files state.

`GET /domains`

## 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**

```
curl "$OE/domains" -H "$AUTH"
```

**Response**

```
{
  "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.
