Domains

Domains are verified host bindings for a publication. A verified host resolves to its active publication; pending challenges do not reserve the host.

Authentication

Management routes require a bearer token and the listed publication capability. User and delegate principals also need an active publication membership; trusted internal principals use their service-wide scope. /domain/resolve is public. Use domain_id or verification_id when available; otherwise a management request needs a publication selector and host.

Routes

Route Methods Authorization Required input Optional input and behavior Success result
/domain/list GET, POST domain.list Publication selector Pagination Verified domains and pending challenges.
/domain/get POST domain.list domain_id, verification_id, or publication selector plus host domain.
/domain/save POST domain.save Publication selector, host verification_method Verification instructions.
/domain/verify POST domain.verify verification_id, or publication selector plus host Verified or pending domain.
/domain/delete POST domain.delete domain_id, verification_id, or publication selector plus host Deleted identifier.
/domain/resolve GET, POST None host public_domain.

Save a verification challenge

Field Required Type Description
publication_id / publication_slug Yes UUID / String Selects the publication.
host Yes DNS host name Host to bind. URLs, ports, paths, wildcards, and IP addresses are invalid.
verification_method No http or dns Defaults to http.
curl -sS https://api.blog.service.m7.org/v1/domain/save \
  -H 'Authorization: Bearer ACCESS_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"publication_slug":"engineering-notes","host":"notes.example.com","verification_method":"dns"}'

The response's domain contains a pending verification object. For DNS, publish the supplied TXT record_name and record_value. For HTTP, return the supplied response_body at the supplied HTTPS url with a 200 response. Hosts are normalized to lowercase with a trailing dot removed. A pending token expires in seven days; save the host again to issue a replacement.

{
  "domain": {
    "domain_id": null,
    "verification_id": "VERIFICATION_UUID",
    "host": "notes.example.com",
    "verified": false,
    "verification_method": "dns",
    "verification_status": "pending",
    "verification": {
      "method": "dns",
      "record_name": "_m7-domain-verification.notes.example.com",
      "record_type": "TXT",
      "record_value": "m7-domain-verification=VERIFICATION_TOKEN"
    }
  }
}

Verify, delete, and resolve

Call /domain/verify with the returned verification_id after publishing the challenge. A missing challenge returns a successful verified: false result; a matching challenge returns verified: true and a domain_id. If the host is already bound to another publication, save or verification returns 409.

Delete a verified binding with domain_id, or cancel a pending challenge with verification_id. Removing a verified domain immediately prevents public resolution.

{ "host": "notes.example.com" }

/domain/resolve returns the verified host's public publication identity:

{
  "public_domain": {
    "host": "notes.example.com",
    "publication_id": "PUBLICATION_UUID",
    "publication_slug": "engineering-notes",
    "publication_name": "Engineering Notes"
  }
}

Only a verified host for an active, unarchived publication resolves. Use the returned publication selector with public read routes.