Skip to main content
The Brand Protocol enables brands to claim their identity and establish a verifiable source of truth through a standardized discovery mechanism. By hosting a brand.json file at a well-known location, brands can declare their identity, brand hierarchy, and optionally designate official brand agents.

Purpose

The Brand Protocol defines machine-readable organization identity across AdCP. Buyers use brand.json for advertiser identity and authorized operators; sellers use it for operator identity, agent discovery, signing-key discovery, and property relationship declarations. The Property Protocol still remains the publisher authorization surface for inventory. This parallel structure makes brands first-class citizens in AdCP.

How it works

Brands host a brand.json file at /.well-known/brand.json on their domain. The file can take one of four forms:
  1. Brand Agent: Points to an MCP agent that provides brand information
  2. House Portfolio: Contains full brand hierarchy with all brands and properties
  3. House Redirect: Points to a house domain that contains the portfolio
  4. Authoritative Location: Points to a hosted brand.json URL

Brand architecture

The protocol supports Keller’s brand architecture models:

Example: house portfolio

A house domain with multiple brands:
Properties can also represent inventory you sell but don’t own. Use relationship: "delegated" for properties you manage (like a publisher network) or relationship: "ad_network" for properties you sell as an exchange/SSP. See property relationships.

Example: brand agent

A brand with an MCP agent that provides brand information:
The agent provides brand identity data (logos, colors, tone) on behalf of the brand.

Example: house redirect

A brand domain pointing to its house:

Resolution flow

Given any domain, the protocol resolves to a canonical brand:

Brand resolution sources

There are three ways to resolve brand identity, each returning the same data structure: Regardless of source, the result is a brand identity that can be referenced by any AdCP task via a brand reference ({ "domain": "...", "brand_id": "..." }).

Use cases

Creative generation

When a creative agent needs brand assets:
  1. Resolve domain to canonical brand via brand.json
  2. Get brand identity data (from brand.json, agent, or registry)
  3. Generate on-brand creatives

Brand verification

When verifying brand claims:
  1. Fetch brand.json from claimed domain
  2. Follow redirects to house if needed
  3. Verify brand exists in portfolio

Reporting roll-up

When aggregating brand performance:
  1. Resolve all brand domains to canonical IDs
  2. Group by house for corporate-level reporting
  3. Optionally include/exclude sub-brands

Brand context in requests

AdCP tasks accept a brand reference that identifies the brand by domain and optional brand_id. The system resolves this reference to the full brand identity at execution time.
For single-brand domains, brand_id is optional:
Brand identity data is resolved from brand.json or the registry — never passed inline.

Caching

Brand information changes infrequently (logo updates, guideline refreshes). Recommended caching:
  • HTTP headers: Use standard ETag, Last-Modified, and Cache-Control headers
  • Default TTL: 24 hours for validated brand.json files
  • Failed lookups: Cache for 1 hour before retrying
  • last_updated field: Informational timestamp in brand.json for staleness checks
Agents should respect HTTP caching headers when fetching brand.json files.

Brand protocol tasks

Agents that implement the brand protocol declare supported_protocols: ["brand"] in get_adcp_capabilities. The specific tasks they implement define their role:

get_brand_identity

Returns brand identity data that’s richer, more dynamic, or more access-controlled than static brand.json. Core identity (house, names, description, logos) is always public. Linked accounts (via sync_accounts) get deeper data: high-res assets, voice synthesis configs, tone guidelines, and rights availability.

Rights discovery via brand.json

Brands with licensable rights declare a rights_agent in their brand.json. This makes rights crawlable and indexable without MCP calls:
The brand_agent provides identity data (logos, tone, assets). The rights_agent provides licensing (discovery, pricing, acquisition). They can be the same agent or different ones.

get_rights

Search for licensable rights across a brand agent’s roster. Returns matches with pricing. Discovery is natural-language-first — no taxonomy, LLMs interpret intent from the query.

acquire_rights

Binding contractual request to clear rights. The buyer selects a pricing_option_id from get_rights and provides campaign details. Returns terms, generation credentials for LLM providers, and disclosure requirements.

Generation credentials

Rights management agents coordinate with LLM providers (Midjourney, ElevenLabs, etc.) to issue scoped credentials. The rights agent sets up the permission; the provider enforces at generation time. Any creative agent can use the credentials.

Creative lifecycle

Creative manifests carry an optional rights array — each entry is a rights constraint from a different rights holder. A single creative may combine talent likeness + music license, each with different validity periods and country restrictions. For v1, rights constraints are informational metadata. Usage is reported back to the rights agent via report_usage with the rights_id field for cap tracking and billing.

MCP tools

The Brand Protocol provides MCP tools for programmatic access:

Learn more

brand.json spec

Complete technical specification for the brand.json file format.

get_brand_identity

Retrieve brand identity data from a brand agent.

get_rights

Search for licensable rights with pricing.

acquire_rights

Acquire rights with contractual clearance.