> ## Documentation Index
> Fetch the complete documentation index at: https://agenticadvertisingorg-feature-feedback.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Publisher lookup

> Given a domain, returns the inventory this entity publishes and which agents it authorizes.

**This endpoint is unauthenticated and returns the same response shape for every caller.** Compare to `/api/registry/operator`, where AAO membership tier and profile ownership unlock additional agent visibility (`members_only`, `private`). AAO membership does not change the `/publisher` response today.

**Property source precedence:** publisher-attested adagents.json properties win first. When no publisher-attested adagents properties exist for the domain, brand.json properties supplement and override lower-trust rows, followed by approved community catalogs, then crawler-discovered rows. Each property carries a `source` field (`adagents_json` / `brand_json` / `community` / `discovered`).

**Per-agent rollup:** each entry in `authorized_agents` may carry `properties_authorized` + `properties_total` + `publisher_wide`. The rollup is suppressed (fields absent) when (a) properties are entirely brand.json-hydrated — no adagents.json claim has been made — or (b) the publisher has more than 50 authorized agents (above-cap entries are returned without rollup; `rollup_truncated` is set with `{ cap, total_agents }`). Use `/api/registry/publisher/authorization?domain=X&agent=Y` for the per-agent count when the index rollup is absent.



## OpenAPI

````yaml /static/openapi/registry.yaml get /api/registry/publisher
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: >-
      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.
paths:
  /api/registry/publisher:
    get:
      tags:
        - Authorization Lookups
      summary: Publisher lookup
      description: >-
        Given a domain, returns the inventory this entity publishes and which
        agents it authorizes.


        **This endpoint is unauthenticated and returns the same response shape
        for every caller.** Compare to `/api/registry/operator`, where AAO
        membership tier and profile ownership unlock additional agent visibility
        (`members_only`, `private`). AAO membership does not change the
        `/publisher` response today.


        **Property source precedence:** publisher-attested adagents.json
        properties win first. When no publisher-attested adagents properties
        exist for the domain, brand.json properties supplement and override
        lower-trust rows, followed by approved community catalogs, then
        crawler-discovered rows. Each property carries a `source` field
        (`adagents_json` / `brand_json` / `community` / `discovered`).


        **Per-agent rollup:** each entry in `authorized_agents` may carry
        `properties_authorized` + `properties_total` + `publisher_wide`. The
        rollup is suppressed (fields absent) when (a) properties are entirely
        brand.json-hydrated — no adagents.json claim has been made — or (b) the
        publisher has more than 50 authorized agents (above-cap entries are
        returned without rollup; `rollup_truncated` is set with `{ cap,
        total_agents }`). Use
        `/api/registry/publisher/authorization?domain=X&agent=Y` for the
        per-agent count when the index rollup is absent.
      operationId: lookupPublisher
      parameters:
        - schema:
            type: string
            example: voxmedia.com
          required: true
          name: domain
          in: query
      responses:
        '200':
          description: Publisher lookup result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublisherLookupResult'
        '400':
          description: Missing domain
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    PublisherLookupResult:
      type: object
      properties:
        domain:
          type: string
          example: voxmedia.com
        member:
          type:
            - object
            - 'null'
          properties:
            slug:
              type: string
            display_name:
              type: string
            membership_tier:
              type: string
              description: >-
                Raw AAO membership tier enum (e.g. `individual_professional`,
                `company_leader`). Present only when the profile owner has set
                their member card to public (`is_public=true`) AND the org has a
                resolvable tier. Absent for private profiles and for orgs
                without an active tier-bearing subscription.
            membership_tier_label:
              type: string
              description: >-
                Human-readable label for `membership_tier` (e.g. `Professional`,
                `Partner`, `Leader`). Matches the AAO pricing page. Use this for
                UI display; the raw enum is for programmatic gating. Presence
                rules match `membership_tier`.
            is_founding_member:
              type: boolean
              description: >-
                True when the profile owner carries the Founding Member badge
                (joined before the founding-cohort cutoff). Surfaced when the
                profile owner has set their member card to public
                (`is_public=true`). Absent for private profiles. Founding Member
                is orthogonal to tier — founding orgs typically display both
                (e.g. Scope3 shows `Partner` + `Founding Member`).
        adagents_valid:
          type:
            - boolean
            - 'null'
        discovery_method:
          type:
            - string
            - 'null'
          enum:
            - direct
            - authoritative_location
            - ads_txt_managerdomain
            - adagents_authoritative
            - community_catalog
            - null
          description: >-
            How the publisher's adagents.json was discovered on the most recent
            successful crawl or registry write. `direct`: publisher's own
            /.well-known/ served the document. `authoritative_location`:
            publisher's stub redirected to a canonical URL.
            `ads_txt_managerdomain`: manifest was discovered via ads.txt
            MANAGERDOMAIN delegation. `adagents_authoritative`: manager file
            named this publisher through publisher_properties fan-out.
            `community_catalog`: moderator-approved community catalog. Null
            until first crawl after migration 470.
        manager_domain:
          type:
            - string
            - 'null'
          description: >-
            The manager domain whose adagents.json was used to authorize this
            publisher's agents. Non-null only when `discovery_method` is
            `ads_txt_managerdomain`. Matches the MANAGERDOMAIN value from the
            publisher's ads.txt.
        hosting:
          type: object
          properties:
            mode:
              type: string
              enum:
                - self
                - self_invalid
                - aao_hosted
                - self_redirected
                - none
              description: >-
                Where this publisher's adagents.json lives. `self` = publisher
                hosts a valid file at their own /.well-known. `self_invalid` =
                publisher's /.well-known returns a file that fails validation
                (fixable misconfiguration, not absence). `aao_hosted` = the
                publisher hosts a stub at their own /.well-known whose
                `authoritative_location` points at AAO's canonical document.
                `self_redirected` = the publisher's stub
                `authoritative_location` resolves to a third-party HTTPS origin
                (a CDN, partner CMS, or sibling host) — verifiers should audit
                the TLS chain at `resolved_url`, not at the publisher's own
                origin. `none` = no adagents.json configured yet.
            hosted_url:
              type: string
              description: >-
                Canonical AAO-hosted adagents.json URL. Present iff `mode ===
                'aao_hosted'`. Publishers reference this URL from their own
                /.well-known stub via the `authoritative_location` field (see
                https://docs.adcontextprotocol.org/docs/governance/property/adagents).
            expected_url:
              type: string
              description: >-
                Where adagents.json *should* live for this domain — the
                publisher's own /.well-known path. Always populated, regardless
                of `mode`.
            resolved_url:
              type:
                - string
                - 'null'
              description: >-
                Where the canonical adagents.json document actually lives after
                following the publisher's `authoritative_location` stub or any
                HTTP-layer redirects. Populated when `mode ===
                'self_redirected'` (the third-party HTTPS origin verifiers
                should audit) and when `mode === 'aao_hosted'` AND the publisher
                has actively set up the redirect (`authoritative_location` in
                the manifest body or a network-layer redirect to AAO's hosted
                URL). NULL when there's no resolved-URL evidence to report.
            last_validated:
              type:
                - string
                - 'null'
              description: >-
                ISO timestamp of the last successful validation crawl. Lets
                verifiers sanity-check freshness. NULL when never crawled.
            last_http_status:
              type:
                - integer
                - 'null'
              minimum: 100
              maximum: 599
              description: >-
                HTTP status code returned by AAO's most recent fetch attempt of
                the publisher's `/.well-known/adagents.json`. Verifier-grade
                chrome — lets a buy-side scraper confirm they see the same
                response AAO does. NULL until the first crawl records or for
                transient errors that never produced an HTTP response.
            last_bytes:
              type:
                - integer
                - 'null'
              minimum: 0
              description: >-
                Response body byte length from the most recent fetch
                (post-decompression). When `authoritative_location` was
                followed, measures the canonical document body, not the stub.
                NULL until the first crawl records.
            origin_verified_at:
              type:
                - string
                - 'null'
              description: >-
                ISO timestamp of the last successful origin verification — AAO
                fetched the publisher's own /.well-known/adagents.json and
                confirmed `authoritative_location` points at our hosted URL.
                When set, the publisher's authorization rows have been promoted
                to `source='adagents_json'` (origin-attested). NULL when never
                verified or last attempt failed. Only populated when `mode ===
                'aao_hosted'`.
            origin_last_checked_at:
              type:
                - string
                - 'null'
              description: >-
                ISO timestamp of the last verification attempt regardless of
                result. Lets a caller render "checked X minutes ago, not yet
                verified" vs "never checked." Only populated when `mode ===
                'aao_hosted'`.
          required:
            - mode
            - expected_url
        files:
          type: object
          properties:
            adagents_json:
              type: object
              properties:
                status:
                  type: string
                  enum:
                    - valid
                    - community
                    - invalid
                    - unknown
                    - checking
                  description: >-
                    What we know about the publisher's adagents.json right now.
                    `valid` = crawler fetched a parsing-and-shape-valid file
                    from the publisher origin. `community` = moderators approved
                    a community adagents.json catalog for this domain. `invalid`
                    = crawler fetched a file that failed validation. `unknown` =
                    never crawled or last result is stale. `checking` = an
                    auto-crawl was kicked off by this request; the page should
                    poll for fresh data shortly.
                expected_url:
                  type: string
                  description: >-
                    Where adagents.json should live on the publisher's own
                    origin.
                registry_url:
                  type: string
                  description: >-
                    Registry-served adagents.json URL when the document is
                    community or AgenticAdvertising.org hosted rather than
                    served by the publisher origin.
              required:
                - status
                - expected_url
            brand_json:
              type: object
              properties:
                status:
                  type: string
                  enum:
                    - present
                    - unknown
                    - checking
                  description: >-
                    What we know about the publisher's brand.json. `present` = a
                    brand record with manifest data exists. `unknown` = no
                    record yet. `checking` = an auto-crawl was kicked off.
                name:
                  type: string
              required:
                - status
          required:
            - adagents_json
            - brand_json
          description: >-
            Plain-English summary of what AAO has found at the publisher's
            origin. The publisher page leads with this — `you have a valid
            adagents.json` is the primary signal, not `mode === self`. Optional
            in the schema for backwards compatibility; the handler always
            populates it.
        properties:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              type:
                type: string
              name:
                type: string
              identifiers:
                type: array
                items:
                  $ref: '#/components/schemas/PropertyIdentifier'
              tags:
                type: array
                items:
                  type: string
                description: >-
                  Arbitrary string tags on this property. The `relationship:`
                  prefix tag (e.g. `relationship:owned`) is deprecated in favour
                  of the `delegation_type` field and will be removed in a future
                  release.
              source:
                type: string
                enum:
                  - adagents_json
                  - community
                  - discovered
                  - brand_json
                description: >-
                  Where this property came from. `adagents_json` comes from the
                  publisher's own adagents.json, `community` from an approved
                  community adagents.json catalog, `discovered` from crawler or
                  third-party signals, and `brand_json` from the publisher's
                  brand.json when no federated-index data exists yet.
              delegation_type:
                type: string
                enum:
                  - direct
                  - delegated
                  - ad_network
                description: >-
                  Delegation relationship declared in brand.json. Populated only
                  when `source` is `brand_json` — for `adagents_json` and
                  `discovered` sources the authoritative value is on the
                  matching `authorized_agents` entry. Mirrors adagents.json
                  `delegation_type` for bilateral verification: `direct` =
                  publisher treats this as a direct buying path, even if a third
                  party operates the software; `delegated` = a rep firm or
                  manager is authorized to sell on the publisher's behalf
                  (operator-declared, unilateral until corroborated by the
                  publisher's adagents.json); `ad_network` = sold as part of a
                  network/exchange package. `owned` properties have no
                  `delegation_type` — ownership is implicit and has no
                  adagents.json counterpart.
        brand:
          type: object
          properties:
            name:
              type: string
              description: Display name from brand.json or the registered brand row.
            description:
              type: string
              description: Short brand or house description when present in brand.json.
            logo_url:
              type: string
              description: First usable logo URL from brand.json.
            colors:
              type: array
              items:
                type: string
              description: Representative hex colors from brand.json, capped for display.
            industries:
              type: array
              items:
                type: string
              description: Industry labels from brand.json when present.
          description: >-
            Display-oriented brand identity summary from brand.json. The full
            raw document remains available from the publisher's
            /.well-known/brand.json or hosted registry URL.
        formats:
          type: array
          items:
            type: object
            properties:
              format_option_id:
                type: string
                description: >-
                  Stable format option identifier from adagents.json
                  `formats[]`.
              display_name:
                type: string
                description: >-
                  Human-readable format label for catalog and publisher UI
                  display.
              format_kind:
                type: string
                description: >-
                  Canonical format discriminator, such as `image`,
                  `video_hosted`, `native_in_feed`, or `custom`.
              params:
                type: object
                additionalProperties: {}
                description: >-
                  Canonical format params from the publisher's adagents.json
                  declaration.
              applies_to_property_ids:
                type: array
                items:
                  type: string
                description: >-
                  Property IDs this format applies to; absent means all
                  properties.
              applies_to_property_tags:
                type: array
                items:
                  type: string
                description: >-
                  Property tags this format applies to; absent means all
                  properties.
              seller_preference:
                type: string
                description: >-
                  Seller preference hint from the format declaration, when
                  present.
              experimental:
                type: boolean
                description: >-
                  Whether this seller's format declaration is marked
                  experimental.
            required:
              - display_name
              - format_kind
          description: >-
            Display-oriented summary of top-level adagents.json `formats[]`,
            normalized for publisher pages and agent discovery clients. Each
            entry preserves `format_kind`, `format_option_id`, and canonical
            params.
        authorized_agents:
          type: array
          items:
            type: object
            properties:
              url:
                type: string
              authorized_for:
                type: string
              source:
                type: string
                enum:
                  - adagents_json
                  - aao_hosted
                  - agent_claim
                description: >-
                  How strongly this authorization is attested. `adagents_json`:
                  the publisher's origin actually serves a valid adagents.json
                  (origin-verified). `aao_hosted`: AAO is hosting the canonical
                  document on the publisher's behalf — represents publisher
                  intent but origin has NOT been verified to redirect to AAO.
                  `agent_claim`: the agent claimed it; publisher has not
                  confirmed.
              properties_authorized:
                type: integer
                minimum: 0
                description: >-
                  Count of this publisher's properties the agent is authorized
                  to sell. Absent when `rollup_truncated` is set (call
                  `/api/registry/publisher/authorization` for the per-agent
                  count) or when properties are entirely brand.json-hydrated (no
                  adagents.json claim has actually been made about them).
              properties_total:
                type: integer
                minimum: 0
                description: >-
                  Total number of properties this publisher exposes through the
                  registry. Same value across all agents in the response. Absent
                  when `properties_authorized` is absent.
              publisher_wide:
                type: boolean
                description: >-
                  True when the agent has only a publisher-wide authorization
                  row and `properties_authorized` was synthesized as
                  `properties_total`. False when the agent has property-level
                  authorization rows. Absent when the rollup is absent.
            required:
              - url
              - source
        rollup_truncated:
          type: object
          properties:
            cap:
              type: integer
              exclusiveMinimum: 0
              description: >-
                Maximum number of agents for which the rollup is computed in a
                single response.
            total_agents:
              type: integer
              minimum: 0
              description: >-
                Total authorized-agent count for this publisher (the full
                population the cap was applied to).
          required:
            - cap
            - total_agents
          description: >-
            Set when the publisher has more authorized agents than the per-agent
            rollup cap. Above the cap, agents beyond `cap` are returned without
            `properties_authorized` / `properties_total` / `publisher_wide`;
            call `/api/registry/publisher/authorization?domain=X&agent=Y` for
            the per-agent count. Lets a caller decide whether to fan out
            individual calls or stop reading.
        auto_crawl_triggered:
          type: boolean
          description: >-
            Set to `true` when this request triggered a background crawl of the
            publisher's origin (we hadn't crawled before). The client should
            refetch in ~3-5s to pick up fresh data. Debounced per-domain so a
            tight refresh loop won't keep firing crawls.
      required:
        - domain
        - member
        - adagents_valid
        - hosting
        - properties
        - authorized_agents
    Error:
      type: object
      properties:
        error:
          type: string
      required:
        - error
    PropertyIdentifier:
      type: object
      properties:
        type:
          type: string
          example: domain
        value:
          type: string
          example: examplepub.com
      required:
        - type
        - value

````