> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Resolve brand

> Resolve a domain to its canonical brand identity. Follows brand.json redirects and returns the resolved brand with its house, architecture type, and optional manifest. The domain must be a bare DNS hostname.

A domain is authoritative for its own identity, so `source` tells you who published the record and `relationship_trust` tells you whether a brand-to-house relationship was confirmed by both sides. Only `mutual` and `inline` are reciprocated; treat everything else as a claim.
Record selection is deterministic: `hosted` > `brand_json` > `community` > `enriched`. `source` reports provenance only and must not be used as a substitute for `relationship_trust`.
The v3 hierarchy is one level deep. There is no ordered-chain endpoint: third-party verifiers use the reciprocated `house_domain` edge returned here. `claimed_house_domain` is unilateral and never extends trust.

**Rate limit:** 60 requests per minute per IP address.



## OpenAPI

````yaml https://agenticadvertising.org/openapi/registry.yaml get /api/brands/resolve
openapi: 3.1.0
info:
  title: AgenticAdvertising.org Registry API
  description: >-
    REST API for the AgenticAdvertising.org registry. Resolve brands,

    discover properties, look up agents, and validate authorization in the

    AdCP ecosystem.


    Most endpoints are public and require no authentication. Endpoints marked

    with a lock icon accept either an organization API key or a user JWT

    obtained via the OAuth 2.1 flow — see
    [Authentication](https://agenticadvertising.org/docs/registry/index#authentication).


    **Base URL:** `https://agenticadvertising.org`
  version: 1.0.0
  contact:
    name: AgenticAdvertising.org
    url: https://agenticadvertising.org
servers:
  - url: https://agenticadvertising.org
    description: Production
security: []
tags:
  - name: Onboarding
    description: >-
      Explicitly bootstrap a third-party integration into the AAO registry. Most
      callers don't need this tag — `POST /api/me/agents` auto-creates the org
      (for fresh users) and the member profile (for first-time agent
      registration) without a separate round trip. Use `POST /api/organizations`
      only when you need to override the auto-derived org name / company_type /
      revenue_tier. Tier transitions happen via the billing flow only; the
      Stripe webhook is the sole writer of `organizations.membership_tier`.
  - name: Member Agents
    description: >-
      Register, list, update, and remove agents on the caller's organization
      member profile. Authenticated programmatic surface for CI / scripts that
      don't want to round-trip the full member profile.
  - name: Brand Resolution
    description: Resolve advertiser domains to canonical brand identities.
  - name: Property Resolution
    description: >-
      Resolve publisher domains to their property configurations and authorized
      agents.
  - name: Agent Discovery
    description: >-
      Browse the federated agent network, search agent inventory profiles,
      publisher index, and registry statistics.
  - name: Change Feed
    description: Poll cursor-based registry change events for local sync.
  - name: Lookups & Authorization
    description: >-
      Look up agents by domain or property, and validate ad-serving
      authorization.
  - name: Validation Tools
    description: >-
      Validate publisher adagents.json files and generate compliant
      configurations.
  - name: Community Mirrors
    description: >-
      Propose, review, publish, fetch, list, and retire catalog-only
      adagents.json mirrors for platforms that have not adopted AdCP.
  - name: Search
    description: Cross-entity search across brands, publishers, agents, and properties.
  - name: Agent Probing
    description: >-
      Connect to live agents and inspect their capabilities, formats, and
      inventory.
  - name: Brand Discovery
    description: Discover and crawl brand.json files across domains.
  - name: Agent Compliance
    description: Agent compliance status, storyboard test results, and compliance history.
  - name: Policy Registry
    description: >-
      Browse, resolve, and contribute governance policies for campaign
      compliance.
  - name: Property Catalog
    description: >-
      Contribute facts to the property fact-graph: resolve identifiers to stable
      property_rids (which also contributes them, with provenance) and dispute
      catalog claims.
paths:
  /api/brands/resolve:
    get:
      tags:
        - Brand Resolution
      summary: Resolve brand
      description: >-
        Resolve a domain to its canonical brand identity. Follows brand.json
        redirects and returns the resolved brand with its house, architecture
        type, and optional manifest. The domain must be a bare DNS hostname.


        A domain is authoritative for its own identity, so `source` tells you
        who published the record and `relationship_trust` tells you whether a
        brand-to-house relationship was confirmed by both sides. Only `mutual`
        and `inline` are reciprocated; treat everything else as a claim.

        Record selection is deterministic: `hosted` > `brand_json` > `community`
        > `enriched`. `source` reports provenance only and must not be used as a
        substitute for `relationship_trust`.

        The v3 hierarchy is one level deep. There is no ordered-chain endpoint:
        third-party verifiers use the reciprocated `house_domain` edge returned
        here. `claimed_house_domain` is unilateral and never extends trust.


        **Rate limit:** 60 requests per minute per IP address.
      operationId: resolveBrand
      parameters:
        - schema:
            type: string
            example: acmecorp.com
          required: true
          name: domain
          in: query
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
            description: >-
              Bypass the resolution cache and refetch from the origin. When a
              fresh fetch fails and a stored record is returned instead,
              `live_brand_json` carries that fetch's diagnostics.
          required: false
          description: >-
            Bypass the resolution cache and refetch from the origin. When a
            fresh fetch fails and a stored record is returned instead,
            `live_brand_json` carries that fetch's diagnostics.
          name: fresh
          in: query
      responses:
        '200':
          description: Brand resolved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResolvedBrand'
        '400':
          description: Invalid or missing domain
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Brand not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  domain:
                    type: string
                  file_status:
                    type: number
                    description: >-
                      HTTP status code from brand.json fetch (e.g. 404 vs 200
                      with invalid data)
                required:
                  - error
                  - domain
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    ResolvedBrand:
      type: object
      properties:
        canonical_id:
          type: string
          example: acmecorp.com
        canonical_domain:
          type: string
          example: acmecorp.com
        brand_name:
          type: string
          example: Acme Corp
        names:
          type: array
          items:
            $ref: '#/components/schemas/LocalizedName'
        keller_type:
          type: string
          enum:
            - master
            - sub_brand
            - endorsed
            - independent
        parent_brand:
          type: string
        house_domain:
          type: string
        claimed_house_domain:
          type: string
          description: >-
            House the requested domain claims. This field never extends trust on
            its own; `relationship_trust` reports whether the reciprocal
            declaration is current enough to do so.
        house_name:
          type: string
        relationship_trust:
          type: string
          enum:
            - inline
            - mutual
            - leaf_only
            - house_only
            - standalone
            - unverifiable
          description: >-
            How the brand-to-house relationship was established. `inline`: the
            house's own document defines the brand. `mutual`: both sides publish
            the relationship — the trust-extending edge. `leaf_only`: the brand
            claims a house whose reciprocal declaration is missing, not yet
            active, or too old to extend trust. `house_only`: a house claims the
            brand, which has not reciprocated. `standalone`: the brand claims no
            house. `unverifiable`: a claimed house could not be checked.
        relationship_verified_at:
          type: string
          format: date-time
          description: >-
            When both sides of a mutual relationship were last seen agreeing.
            Present only for `mutual`, and it does not advance while the house
            side is unreachable, so callers can apply their own edge-aging
            policy.
          example: '2026-07-28T12:00:00.000Z'
        relationship_declared_at:
          type: string
          format: date-time
          description: >-
            When the house declared the relationship in
            `brand_refs[].effective_at`, or the resolver's durable first
            observation if the publisher omitted that field. Callers can apply a
            declaration-age ceiling independently of `relationship_verified_at`.
          example: '2026-01-29T12:00:00.000Z'
        promoted_from_schema:
          type: string
          description: >-
            Set when a pre-v3 document was promoted to a canonical v3 document
            for this response. Identity only — legacy relationship data is
            preserved opaquely, never promoted to a trust claim.
        migration_warnings:
          type: array
          items:
            type: object
            properties:
              field:
                type: string
              message:
                type: string
              suggestion:
                type: string
            required:
              - field
              - message
          description: >-
            Loss or ambiguity encountered while promoting a pre-v3 document. A
            `house` warning means the legacy house object was preserved only as
            opaque metadata and did not establish a trusted relationship.
        brand_agent_url:
          type: string
        brand_manifest:
          type: object
          additionalProperties: {}
        source:
          type: string
          enum:
            - hosted
            - brand_json
            - community
            - enriched
          description: >-
            Provenance of the selected record, not relationship authorization.
            Deterministic precedence is `hosted` > `brand_json` > `community` >
            `enriched`; normal reads prefer the durable stored winner on a
            source tie, while `fresh=true` lets a successful live origin read
            win a tie. `brand_json`: the domain's own /.well-known/brand.json.
            `hosted`: registered by an owner whose control of the domain was
            verified. `community`: contributed by a member. `enriched`:
            third-party enrichment.
        live_brand_json:
          type: object
          properties:
            valid:
              type: boolean
            url:
              type: string
            status_code:
              type: integer
            errors:
              type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
                  severity:
                    type: string
                    enum:
                      - error
                required:
                  - field
                  - message
                  - severity
            warnings:
              type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
                  suggestion:
                    type: string
                required:
                  - field
                  - message
          required:
            - valid
            - url
            - errors
            - warnings
          description: >-
            This request's origin-validation diagnostics when `fresh=true` falls
            back to a stored registry record. Presence means the response is
            stored evidence, not a successful live-origin read.
      required:
        - canonical_id
        - canonical_domain
        - brand_name
        - source
    Error:
      type: object
      properties:
        error:
          type: string
      required:
        - error
    LocalizedName:
      type: object
      additionalProperties:
        type: string

````