Skip to content

List a brand's custom domains

The brands.domains.list operation: GET /api/v1/brands/{id}/domains in the REST API and the brands_domains_list tool in the MCP server.

GET/api/v1/brands/{id}/domains

Lists the brand's custom domains (at most one for checkout and one for the customer portal) with their status and the DNS records to create, and how many custom domains the organization uses against its plan's limit (custom_domains.max, counted across all brands).

A pending domain doesn't serve anything yet; links keep using Ownrecord's own address until it is verified. The records shown here are the general ones; brands.domains.verify asks the domain provider again and returns the records it recommends for this domain, including a TXT record when it needs proof of ownership.

At a glance

  • REST: GET /api/v1/brands/{id}/domains
  • MCP tool: brands_domains_list
  • Operation ID: brands.domains.list
  • Scope: Organization, or one of its legal entities or brands
  • Permission: brands:read
  • Risk tier: read
  • Dry run: Not supported
  • Idempotency: Not needed (read only)
  • Modes: Test and live
  • Authentication: API key with the brands:read scope
  • Since: M9

Request

Path parameters

FieldTypeDescription
idbrd_… ID

Query parameters

This operation takes no query parameters.

Response

200 OK with a JSON object:

FieldTypeDescription
object"list"
dataarray of object
data[].object"brand_domain"
data[].hoststringThe host name, lower case (internationalised names in their xn-- form).
data[].purposeone of checkout, portalcheckout serves hosted checkout, portal the customer portal.
data[].brandIdstring
data[].statusone of pending, verifiedverified once the host points at Ownrecord and the challenge TXT record proves it's yours; pending until then.
data[].verifiedAtdate-time or null
data[].urlstringThe domain's base URL; hosted pages are served under it once it's verified.
data[].dnsRecordsarray of objectThe DNS records to create at the domain's DNS provider: routing, Ownrecord's challenge TXT record, and the hosting provider's TXT record when it asks for one.
data[].dnsRecords[].typeone of A, AAAA, CNAME, TXT
data[].dnsRecords[].namestring
data[].dnsRecords[].labelstring
data[].dnsRecords[].valuestring
data[].dnsRecords[].purposeone of routing, ownership
data[].checkobject or null
usageobjectThe organization's custom domains against its plan limit.
usage.usedinteger (at least 0)Custom domains of every brand of the organization.
usage.limitinteger (at least 0)The plan's custom_domains.max.

Examples

A verified checkout domain

HTTP
GET /api/v1/brands/brd_01m4tx5nj8emwbyf7y9vcf47x4/domains
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "object": "brand_domain",
      "host": "pay.acme-app.com",
      "purpose": "checkout",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "status": "verified",
      "verifiedAt": "2026-10-20T09:40:00.000Z",
      "url": "https://pay.acme-app.com",
      "dnsRecords": [
        {
          "type": "CNAME",
          "name": "pay.acme-app.com",
          "label": "pay",
          "value": "cname.vercel-dns.com",
          "purpose": "routing"
        },
        {
          "type": "TXT",
          "name": "_ownrecord-challenge.pay.acme-app.com",
          "label": "_ownrecord-challenge.pay",
          "value": "ownrecord-verify=5e0c9a1b7d3f42e8a6b0c4d2e9f17a35",
          "purpose": "ownership"
        }
      ],
      "check": null
    }
  ],
  "usage": {
    "used": 1,
    "limit": 2
  }
}

A checkout domain waiting for its DNS record

HTTP
GET /api/v1/brands/brd_01m4tx5nj8emwbyf7y9vcf47x4/domains
Authorization: Bearer or_test_…

Response (200):

JSON
{
  "object": "list",
  "data": [
    {
      "object": "brand_domain",
      "host": "pay.acme-app.com",
      "purpose": "checkout",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
      "status": "pending",
      "verifiedAt": null,
      "url": "https://pay.acme-app.com",
      "dnsRecords": [
        {
          "type": "CNAME",
          "name": "pay.acme-app.com",
          "label": "pay",
          "value": "cname.vercel-dns.com",
          "purpose": "routing"
        },
        {
          "type": "TXT",
          "name": "_ownrecord-challenge.pay.acme-app.com",
          "label": "_ownrecord-challenge.pay",
          "value": "ownrecord-verify=5e0c9a1b7d3f42e8a6b0c4d2e9f17a35",
          "purpose": "ownership"
        }
      ],
      "check": null
    }
  ],
  "usage": {
    "used": 1,
    "limit": 2
  }
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400The brand ID is malformed.Fix the fields listed in details.issues and send the request again.
resource_not_found404No brand with this ID is visible to the request.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
permission_denied403You can't see this brand's settings.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, authentication_required, api_key_invalid, dry_run_not_supported, rate_limited, internal_error.