> ## 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.

# Bulk resolve brands

> Resolve up to 25 domains to their canonical brand identities in a single request. Unresolvable domains map to `null`.

**Rate limits:** 20 requests and 100 unique domain resolutions per minute per IP address. Request bodies are capped at 16 KB.



## OpenAPI

````yaml https://agenticadvertising.org/openapi/registry.yaml post /api/brands/resolve/bulk
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/bulk:
    post:
      tags:
        - Brand Resolution
      summary: Bulk resolve brands
      description: >-
        Resolve up to 25 domains to their canonical brand identities in a single
        request. Unresolvable domains map to `null`.


        **Rate limits:** 20 requests and 100 unique domain resolutions per
        minute per IP address. Request bodies are capped at 16 KB.
      operationId: resolveBrandsBulk
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                domains:
                  type: array
                  items:
                    type: string
                  maxItems: 25
              required:
                - domains
      responses:
        '200':
          description: Bulk resolution results
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: object
                    additionalProperties:
                      allOf:
                        - $ref: '#/components/schemas/ResolvedBrand'
                        - type:
                            - object
                            - 'null'
                required:
                  - results
        '400':
          description: Invalid domain list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Request body over 16 KB
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Too much resolution work is already queued
          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

````