---
title: "Retrieve a domain"
description: "Adds the addresses on it, every DNS record the domain needs with what the last check found, and the DMARC reading."
url: "https://nextmail.sh/docs/api/domains/get"
area: "API"
category: "Mailbox"
---

# Retrieve a domain

Adds the addresses on it, every DNS record the domain needs with what the last check found, and the DMARC reading.

`GET /domains/{id}`

## GET /domains/{id}

Adds the addresses on it, every DNS record the domain needs with what the last check found, and the DMARC reading.

## 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
  },
  "logo": {
    "url": "https://api.nextmail.sh/bimi/acme.com/logo.svg",
    "record": { "type": "TXT", "name": "default._bimi.acme.com", "value": "v=BIMI1; l=https://api.nextmail.sh/bimi/acme.com/logo.svg; a=https://api.nextmail.sh/bimi/acme.com/certificate.pem;", "priority": null, "purpose": "Shows your logo next to mail from this domain in inboxes that support BIMI.", "status": "found" },
    "certificate": { "url": "https://api.nextmail.sh/bimi/acme.com/certificate.pem", "mark": "verified", "expiresAt": "2027-08-14T23:59:59.000Z", "domains": ["acme.com"], "issuer": "DigiCert, Inc." },
    "matchesCertificate": true
  },
  "dmarcPolicy": "quarantine",
  "senderName": "Acme",
  "addresses": [
    { "address": "billing@acme.com", "enabled": true },
    { "address": "old@acme.com", "enabled": false }
  ],
  "createdAt": "2026-08-14T09:55:11.000Z",
  "records": [
    { "type": "MX", "name": "acme.com", "value": "inbound.mail.example", "priority": 10, "purpose": null, "status": "found" },
    { "type": "TXT", "name": "acme.com", "value": "v=spf1 include:_spf.openemail.uk ~all", "priority": null, "purpose": null, "status": "found" },
    { "type": "TXT", "name": "_openemail-challenge.acme.com", "value": "openemail-verify-4f1c9a2b7e8d6053a1c49e2b7d0c8f36", "priority": null, "purpose": "Proves you own this domain", "status": "found" },
    { "type": "TXT", "name": "_dmarc.acme.com", "value": "v=DMARC1; p=quarantine", "priority": null, "purpose": "Tells receivers to keep mail that fails its checks out of the inbox. Inboxes only show your logo at this policy.", "status": "found" },
    { "type": "TXT", "name": "openemail._domainkey.acme.com", "value": "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx7q2…", "priority": null, "purpose": "Lets us sign mail as this domain", "status": "found" },
    { "type": "MX", "name": "bounce.acme.com", "value": "feedback.mail.example", "priority": 10, "purpose": "Puts the return path on your own domain. Without it, recipients see your mail as sent through the mail service rather than by you.", "status": "found" },
    { "type": "TXT", "name": "bounce.acme.com", "value": "v=spf1 include:_spf.openemail.uk ~all", "priority": null, "purpose": "Authorises the return path above. Same value as the record on your domain", "status": "found" }
  ],
  "dmarc": {
    "stage": "quarantine",
    "record": "v=DMARC1; p=quarantine",
    "issues": [],
    "alignmentPossible": true,
    "caveat": "Anything else sending as this domain, such as a help desk or your own servers, must be listed in SPF or signed separately before you tighten this."
  }
}
```

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

## The records to publish

`records` lists every DNS record the domain needs. Publish each one at your DNS host exactly as the response gives it: `type`, `name` and `value`, and `priority` on an MX. The values are specific to your domain and can change when its signing is set up again, so read them from the response rather than from this page, where the hosts are examples.

**Each record**

- `type` (string): `MX`, `TXT` or `CNAME`.
- `name` (string): The full name to publish the record at, such as `_dmarc.acme.com`.
- `value` (string): The value to publish, exactly as given.
- `priority` (number | null): The MX priority. Null on every other type.
- `purpose` (string | null): A sentence on what the record is for, or null for the records every mail domain needs.
- `status` ('found' | 'missing' | null): What the last check saw: `found` when the record answers in public DNS with the right value, `missing` when it does not. Null means it has not been checked yet.

> Verification needs the MX and the SPF record on the domain itself and the `_openemail-challenge` TXT. The DMARC record is recommended. The signing record and the two records on the return-path host are what let mail go out signed as your domain. They are checked once the domain is verified, and `sending` reports the result.

> Reading an unverified domain checks it again when its last check is more than 20 seconds old, and a background sweep checks every unverified domain on its own. To check at once after publishing, call `POST /domains/{id}/verify`. Subscribe to `domain.verified` and `domain.sending_changed` to hear when either state moves instead of polling.

> `dmarc` is null until the domain is verified. Once it is, `stage` is `missing`, `invalid`, `monitor`, `quarantine` or `reject`, `record` is the policy found, `issues` lists what is wrong with it, and `caveat` says what to settle before tightening it.

## Reference

- [`GET /domains/{id}`](https://nextmail.sh/docs/api/reference/domains#get-domains-id): full reference
