---
title: "Get domain"
method: GET
path: "/api/v1/me/domains/{id}"
tags: ["Domains"]
---

# Get domain

`GET /api/v1/me/domains/{id}`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/me/domains/{id}`
- Auth: API key in cookie `auth_token`

Get details of a specific domain, including the control proof's identity (`proof_id`/`proof_status`/`proof_revoked_reason`). Fails CLOSED on an unreadable proof registry, exactly as the list does.

## Path parameters

- `id` string, required: MongoDB ObjectId

## Response `200`

Domain details

- Domain: Domain record
  - `id` string, required: MongoDB ObjectId
  - `domain` string, required
  - `status` 'pending' | 'verified' | 'failed', required: Domain verification status
  - `verification_method` string
  - `provider` string
  - `email_sending_enabled` boolean
  - `profile_id` string: MongoDB ObjectId
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `verified_at` string, date-time
  - `proof_id` string, nullable: Public handle of the control proof backing this domain (`ph_ctl_<32 hex>`), resolved through the domain's mirroring asset — the same source `GET /me/assets` reads, so the two surfaces cannot disagree. Null when the domain has no proof, or when its proof predates the registry.
  - `proof_status` 'active' | 'revoked' | 'expired' | 'suspended' | 'null', nullable: Registry status of that proof. A domain row can read `verified` while its proof is `revoked` — the row records that control was once shown, the proof records whether it still stands — so a client showing domain control must render THIS. Null means no registry record, which is NOT a revocation.
  - `proof_revoked_reason` string, nullable: Reason the registry recorded, present only while `proof_status` is `revoked`.
  - `proof_expires_at` string, date-time, nullable: When that proof expires — the signed token's own `exp`. `proof_status` stays `active` after this instant (nothing rewrites it), so a client must compare against the clock to tell a live proof from an expired one. Proofs inside 30 days of expiry are renewed automatically while control can still be confirmed. Carried even when `proof_id` is null (a proof that predates the registry still has a signed expiry); null when the domain has no proof, or its proof never stored one.

## Other responses

- `404`: Domain not found
- `503`: `domain_proof_status_unavailable` — the proof registry could not be read. Retryable.

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/b15f506de696?raw)
