{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "/schemas/latest/brand.json",
  "title": "Brand Discovery",
  "description": "Brand identity and discovery file. Hosted at /.well-known/brand.json on house domains. Contains the full brand portfolio with identity, creative assets, and digital properties. Brands are identified by house + brand_id (like properties are identified by publisher + property_id). Supports variants: house portfolio (full brand data), brand agent (agent provides brand info via MCP), house redirect (pointer to house domain), or authoritative location redirect.",
  "definitions": {
    "domain": {
      "type": "string",
      "description": "A valid domain name",
      "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"
    },
    "brand_id": {
      "type": "string",
      "description": "Brand identifier within the house portfolio. Lowercase alphanumeric with underscores. House chooses this ID.",
      "pattern": "^[a-z0-9_]+$"
    },
    "logo_slot": {
      "$ref": "/schemas/latest/enums/logo-slot.json"
    },
    "logo_id": {
      "type": "string",
      "description": "Stable identifier for a logo entry within this brand.json document. Use lowercase words separated by underscores or hyphens; do not key integrations on mutable asset URLs.",
      "pattern": "^[a-z0-9][a-z0-9_-]*$"
    },
    "trademark": {
      "type": "object",
      "description": "A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union — both lists are valid claims about marks the publisher controls.",
      "properties": {
        "registry": {
          "type": "string",
          "description": "Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"
        },
        "number": {
          "type": "string",
          "description": "Registration number as issued by the registry"
        },
        "mark": {
          "type": "string",
          "description": "The registered mark as published"
        },
        "status": {
          "type": "string",
          "enum": ["active", "pending", "abandoned", "cancelled", "expired"],
          "description": "Registration status. Omit for active marks if status tracking is not maintained."
        },
        "license_type": {
          "type": "string",
          "enum": ["owned", "licensed_in", "licensed_out"],
          "description": "Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted."
        },
        "licensor_domain": {
          "$ref": "#/definitions/domain",
          "description": "Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise."
        },
        "countries": {
          "type": "array",
          "items": { "type": "string", "minLength": 2, "maxLength": 2 },
          "description": "ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit."
        },
        "nice_classes": {
          "type": "array",
          "items": { "type": "integer", "minimum": 1, "maximum": 45 },
          "description": "Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry."
        }
      },
      "required": ["registry", "number", "mark"],
      "additionalProperties": true
    },
    "portfolio_entry": {
      "type": "object",
      "description": "A house's ownership entry for a brand that publishes its own canonical brand.json elsewhere. The publisher (the house) asserts 'I own this brand, hosted at this domain, effective on this date.' Mutual-assertion trust requires the child's house_domain to reciprocate. Distinct from core/brand-ref.json (which identifies brands in media-buy plans). See docs/brand-protocol/brand-json.mdx",
      "properties": {
        "domain": {
          "$ref": "#/definitions/domain",
          "description": "Domain where the child's canonical brand.json lives"
        },
        "brand_id": {
          "$ref": "#/definitions/brand_id",
          "description": "Stable brand identifier within the house portfolio. Required so the cross-array uniqueness invariant (brand_id MUST NOT appear in both brands[] and brand_refs[]) is enforceable."
        },
        "managed_by": {
          "$ref": "#/definitions/domain",
          "description": "Optional domain of the entity that operationally manages this brand (e.g., an agency network within a holdco). House-declared. Consumers MUST NOT use it for trust or authorization decisions. Aggregation across houses ('show me everything BBH manages') is the intended use; trust is unaffected."
        },
        "effective_at": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 timestamp when the house established this ownership claim. Consumers age mutual-assertion edges from this date for TTL purposes. Optional; absent means the consumer ages from its own first observation."
        }
      },
      "required": ["domain", "brand_id"],
      "additionalProperties": false
    },
    "localized_name": {
      "type": "object",
      "description": "A localized name with BCP 47 locale code key (e.g., 'en_US', 'fr_CA', 'zh_CN') and name value. Bare language codes ('en') are accepted as wildcards for backwards compatibility.",
      "minProperties": 1,
      "maxProperties": 1,
      "additionalProperties": {
        "type": "string",
        "minLength": 1
      }
    },
    "keller_type": {
      "type": "string",
      "enum": ["master", "sub_brand", "endorsed", "independent"],
      "description": "Brand architecture type from Keller's theory. master: primary brand of house. sub_brand: carries parent name (Nike SB). endorsed: independent identity backed by parent (Air Jordan 'by Nike'). independent: operates separately (Converse under Nike, Inc.)"
    },
    "logo": {
      "type": "object",
      "description": "Brand logo asset with structured fields for orientation, background compatibility, and variant type",
      "properties": {
        "id": {
          "$ref": "#/definitions/logo_id",
          "description": "Stable identifier for this logo entry. Recommended when logo usage rules or mark lockups need to bind to a specific logo asset."
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "URL to the logo asset"
        },
        "orientation": {
          "type": "string",
          "enum": ["square", "horizontal", "vertical", "stacked"],
          "description": "Logo aspect ratio orientation. square: ~1:1, horizontal: wide, vertical: tall, stacked: vertically arranged elements"
        },
        "background": {
          "type": "string",
          "enum": ["dark-bg", "light-bg", "transparent-bg"],
          "description": "Background compatibility. dark-bg: use on dark backgrounds, light-bg: use on light backgrounds, transparent-bg: has transparent background"
        },
        "variant": {
          "type": "string",
          "enum": ["primary", "secondary", "icon", "wordmark", "full-lockup"],
          "description": "Logo variant type. primary: main logo, secondary: alternative, icon: symbol only, wordmark: text only, full-lockup: complete logo"
        },
        "tags": {
          "type": "array",
          "description": "Additional semantic tags for custom categorization beyond the standard orientation, background, and variant fields",
          "items": { "type": "string" }
        },
        "slots": {
          "type": "array",
          "description": "Canonical renderer slots where this logo is appropriate. Consumers SHOULD prefer this over inferring from tags or usage prose when selecting a logo for a specific UI surface.",
          "items": { "$ref": "#/definitions/logo_slot" },
          "uniqueItems": true
        },
        "usage": {
          "type": "string",
          "description": "Human-readable description of when to use this logo variant (e.g., 'Primary logo for use on light backgrounds')"
        },
        "width": { "type": "integer", "description": "Width in pixels" },
        "height": { "type": "integer", "description": "Height in pixels" }
      },
      "required": ["url"],
      "additionalProperties": true
    },
    "hex_color": {
      "type": "string",
      "pattern": "^#[0-9A-Fa-f]{6}$",
      "description": "A single hex color value"
    },
    "color_value": {
      "oneOf": [
        { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" },
        { "type": "array", "items": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, "minItems": 1 }
      ]
    },
    "color_ref": {
      "type": "object",
      "description": "Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.",
      "properties": {
        "kind": {
          "type": "string",
          "enum": ["name", "value", "surface"],
          "description": "Discriminator for the color reference variant."
        },
        "name": {
          "type": "string",
          "description": "Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}."
        },
        "value": {
          "$ref": "#/definitions/hex_color",
          "description": "Literal hex color when no palette key exists."
        },
        "surface": {
          "type": "string",
          "enum": ["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"],
          "description": "Usage surface rather than a specific color value."
        }
      },
      "oneOf": [
        {
          "properties": { "kind": { "const": "name" } },
          "required": ["kind", "name"]
        },
        {
          "properties": { "kind": { "const": "value" } },
          "required": ["kind", "value"]
        },
        {
          "properties": { "kind": { "const": "surface" } },
          "required": ["kind", "surface"]
        }
      ],
      "additionalProperties": false
    },
    "guideline_severity": {
      "type": "string",
      "enum": ["must", "should"],
      "description": "Strength of a machine-readable brand guideline constraint."
    },
    "colors": {
      "type": "object",
      "description": "Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity — heading, body, label, border, divider, surface_1, surface_2, etc.",
      "properties": {
        "primary": { "$ref": "#/definitions/color_value" },
        "secondary": { "$ref": "#/definitions/color_value" },
        "accent": { "$ref": "#/definitions/color_value" },
        "background": { "$ref": "#/definitions/color_value" },
        "text": { "$ref": "#/definitions/color_value" },
        "heading": { "$ref": "#/definitions/color_value" },
        "body": { "$ref": "#/definitions/color_value" },
        "label": { "$ref": "#/definitions/color_value" },
        "border": { "$ref": "#/definitions/color_value" },
        "divider": { "$ref": "#/definitions/color_value" },
        "surface_1": { "$ref": "#/definitions/color_value" },
        "surface_2": { "$ref": "#/definitions/color_value" }
      },
      "additionalProperties": { "$ref": "#/definitions/color_value" }
    },
    "font_file": {
      "type": "object",
      "description": "A font file with weight, style, and variable font metadata",
      "properties": {
        "url": { "type": "string", "format": "uri", "pattern": "^https://", "description": "HTTPS URL to the font file (WOFF2, TTF, or OTF)" },
        "weight": { "type": "integer", "minimum": 100, "maximum": 900, "description": "CSS numeric font-weight for static fonts (100-900)" },
        "weight_range": {
          "type": "array",
          "items": { "type": "integer", "minimum": 100, "maximum": 900 },
          "minItems": 2,
          "maxItems": 2,
          "description": "Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts."
        },
        "style": {
          "type": "string",
          "enum": ["normal", "italic", "oblique"],
          "description": "CSS font-style"
        }
      },
      "required": ["url"],
      "additionalProperties": true
    },
    "font_role": {
      "description": "A font role entry. Either a CSS font-family string (simple) or a structured object with family name and font files (rich).",
      "oneOf": [
        { "type": "string", "description": "CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')" },
        {
          "type": "object",
          "description": "Structured font with family name, downloadable font files, and typographic metadata",
          "properties": {
            "family": { "type": "string", "description": "CSS font-family name (e.g., 'Brand Sans')" },
            "files": {
              "type": "array",
              "items": { "$ref": "#/definitions/font_file" },
              "maxItems": 36,
              "description": "Font files for different weights and styles"
            },
            "opentype_features": {
              "type": "array",
              "items": { "type": "string", "pattern": "^[a-z0-9]{4}$" },
              "maxItems": 20,
              "description": "OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec."
            },
            "fallbacks": {
              "type": "array",
              "items": { "type": "string", "maxLength": 100 },
              "maxItems": 10,
              "description": "Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])"
            }
          },
          "required": ["family"],
          "additionalProperties": true
        }
      ]
    },
    "fonts": {
      "type": "object",
      "description": "Brand typography. Each key is a role name (e.g., 'primary', 'secondary') referenced by type_scale entries. Values are either a CSS font-family string or a structured object with font files for reliable resolution.",
      "maxProperties": 20,
      "properties": {
        "primary": { "$ref": "#/definitions/font_role", "description": "Primary font family" },
        "secondary": { "$ref": "#/definitions/font_role", "description": "Secondary font family" }
      },
      "additionalProperties": { "$ref": "#/definitions/font_role" }
    },
    "asset": {
      "type": "object",
      "description": "Brand asset (image, video, audio, text)",
      "properties": {
        "asset_id": { "type": "string", "description": "Unique identifier" },
        "asset_type": {
          "$ref": "/schemas/latest/enums/asset-content-type.json",
          "description": "Type of asset content"
        },
        "url": { "type": "string", "format": "uri", "description": "URL to CDN-hosted asset file" },
        "tags": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Tags for discovery (e.g., 'hero', 'lifestyle', 'product', 'holiday')"
        },
        "name": { "type": "string", "description": "Human-readable name" },
        "description": { "type": "string", "description": "Asset description or usage notes" },
        "width": { "type": "integer", "description": "Image/video width in pixels" },
        "height": { "type": "integer", "description": "Image/video height in pixels" },
        "duration_seconds": { "type": "number", "description": "Video/audio duration in seconds" },
        "file_size_bytes": { "type": "integer", "description": "File size in bytes" },
        "format": { "type": "string", "description": "File format (e.g., 'jpg', 'mp4', 'mp3')" },
        "metadata": {
          "type": "object",
          "description": "Additional asset-specific metadata",
          "additionalProperties": true
        }
      },
      "required": ["asset_id", "asset_type", "url"],
      "additionalProperties": true
    },
    "property": {
      "type": "object",
      "description": "A digital property associated with a brand. Defaults to owned; use 'relationship' to declare direct, delegated, or ad_network properties. For delegated and network paths, these values match the delegation_type field in adagents.json, creating a bilateral verification chain: the operator declares the relationship here, the publisher confirms by setting the same delegation_type on the agent's authorization in their adagents.json. 'owned' is an inline ownership declaration with no adagents.json counterpart.",
      "properties": {
        "type": {
          "type": "string",
          "enum": ["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "streaming_audio"],
          "description": "Property type"
        },
        "identifier": {
          "type": "string",
          "description": "Property identifier - domain for websites, bundle ID for apps",
          "minLength": 1
        },
        "store": {
          "type": "string",
          "enum": ["apple", "google", "amazon", "roku", "samsung", "lg", "other"],
          "description": "App store for mobile/CTV apps"
        },
        "region": {
          "type": "string",
          "description": "ISO 3166-1 alpha-2 country code or 'global'",
          "pattern": "^([A-Z]{2}|global)$"
        },
        "primary": {
          "type": "boolean",
          "default": false,
          "description": "Whether this is the primary property for the brand"
        },
        "relationship": {
          "type": "string",
          "enum": ["owned", "direct", "delegated", "ad_network"],
          "default": "owned",
          "description": "How this brand relates to the property. 'owned': the brand owns and operates this property (default) and has no adagents.json delegation_type counterpart. 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property — they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange — they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json."
        }
      },
      "required": ["type", "identifier"],
      "additionalProperties": true
    },
    "product_catalog": {
      "type": "object",
      "description": "Product catalog for e-commerce brands",
      "properties": {
        "feed_url": { "type": "string", "format": "uri", "description": "URL to product catalog feed" },
        "feed_format": {
          "$ref": "/schemas/latest/enums/feed-format.json",
          "description": "Format of the product feed"
        },
        "categories": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Product categories available in the catalog"
        },
        "last_updated": {
          "type": "string",
          "format": "date-time",
          "description": "When the product catalog was last updated"
        },
        "update_frequency": {
          "type": "string",
          "enum": ["realtime", "hourly", "daily", "weekly"],
          "description": "How frequently the product catalog is updated"
        },
        "agentic_checkout": {
          "type": "object",
          "description": "Agentic checkout endpoint configuration",
          "properties": {
            "endpoint": { "type": "string", "format": "uri", "description": "Base URL for checkout session API" },
            "spec": { "type": "string", "description": "Checkout API specification identifier. Use a namespaced string to identify the checkout protocol (e.g., vendor-prefixed or custom). Vendor-specific values belong under ext.{vendor}." },
            "supported_payment_providers": {
              "type": "array",
              "description": "Payment providers supported by this checkout endpoint",
              "items": { "type": "string" }
            }
          },
          "required": ["endpoint", "spec"]
        }
      },
      "required": ["feed_url"],
      "additionalProperties": true
    },
    "data_subject_contestation": {
      "type": "object",
      "description": "Contact point where a data subject can request human intervention, express their view, or contest an automated decision — satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "HTTPS URL to a human-accessible contestation form or information page."
        },
        "email": {
          "type": "string",
          "format": "email",
          "description": "Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3))."
        },
        "languages": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns."
        }
      },
      "anyOf": [
        { "required": ["url"] },
        { "required": ["email"] }
      ],
      "additionalProperties": false
    },
    "brand": {
      "type": "object",
      "description": "A brand within a house portfolio. Combines identity (who) with creative assets (how to represent). Referenced as domain + brand_id.",
      "properties": {
        "id": {
          "$ref": "#/definitions/brand_id",
          "description": "Brand identifier within the house. House chooses this ID."
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "Primary brand URL for context and asset discovery"
        },
        "identity_relying_parties": {
          "type": "array",
          "description": "Verified-identity relying parties scoped to this brand/property, for attestation provenance in TMP Identity Match. Use when a brand or property runs its own relying_party_id (per-property pseudonyms); entity-wide relying parties live on the house object. See specs/tmp-verified-identity-attestation.md.",
          "items": { "$ref": "#/definitions/identity_relying_party" }
        },
        "names": {
          "type": "array",
          "description": "Localized brand names. Multiple entries per language allowed for aliases.",
          "items": { "$ref": "#/definitions/localized_name" },
          "minItems": 1
        },
        "keller_type": { "$ref": "#/definitions/keller_type" },
        "parent_brand": {
          "$ref": "#/definitions/brand_id",
          "description": "Parent brand ID for sub-brands and endorsed brands"
        },
        "description": {
          "type": "string",
          "description": "Brand description"
        },
        "industries": {
          "type": "array",
          "items": { "type": "string" },
          "minItems": 1,
          "description": "Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does — not what regulatory regimes apply (use policy_categories for that)."
        },
        "target_audience": {
          "type": "string",
          "description": "Primary target audience"
        },
        "logos": {
          "type": "array",
          "items": { "$ref": "#/definitions/logo" },
          "description": "Brand logo assets"
        },
        "colors": { "$ref": "#/definitions/colors" },
        "fonts": { "$ref": "#/definitions/fonts" },
        "tone": {
          "description": "Brand voice and messaging tone guidelines",
          "oneOf": [
            {
              "type": "string",
              "description": "Simple tone descriptors for backwards compatibility"
            },
            {
              "type": "object",
              "description": "Structured brand voice guidelines",
              "properties": {
                "voice": { "type": "string", "description": "High-level voice descriptor (e.g., 'warm and inviting', 'professional and trustworthy')" },
                "attributes": {
                  "type": "array",
                  "description": "Personality traits that characterize the brand voice",
                  "items": { "type": "string" }
                },
                "dos": {
                  "type": "array",
                  "description": "Guidance for copy generation - what TO do",
                  "items": { "type": "string" }
                },
                "donts": {
                  "type": "array",
                  "description": "Guardrails to avoid brand violations - what NOT to do",
                  "items": { "type": "string" }
                }
              }
            }
          ]
        },
        "tagline": {
          "oneOf": [
            {
              "type": "string",
              "description": "Plain tagline string for backwards compatibility"
            },
            {
              "type": "array",
              "description": "Localized taglines with BCP 47 locale codes",
              "items": { "$ref": "#/definitions/localized_name" },
              "minItems": 1
            }
          ],
          "description": "Brand tagline or slogan. Accepts a plain string or a localized array matching the names pattern."
        },
        "assets": {
          "type": "array",
          "items": { "$ref": "#/definitions/asset" },
          "description": "Brand asset library"
        },
        "properties": {
          "type": "array",
          "items": { "$ref": "#/definitions/property" },
          "description": "Digital properties associated with this brand — owned, managed, or represented"
        },
        "product_catalog": { "$ref": "#/definitions/product_catalog" },
        "privacy_policy_url": {
          "type": "string",
          "format": "uri",
          "description": "URL to the brand's privacy policy"
        },
        "data_subject_contestation": {
          "$ref": "#/definitions/data_subject_contestation"
        },
        "disclaimers": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "text": { "type": "string" },
              "context": { "type": "string" },
              "required": { "type": "boolean", "default": true }
            },
            "required": ["text"]
          },
          "description": "Legal disclaimers for creatives"
        },
        "trademarks": {
          "type": "array",
          "items": { "$ref": "#/definitions/trademark" },
          "description": "Brand-level registered trademarks. Use for marks the brand owns or controls (e.g., a sub-brand's own marks distinct from the corporate parent). House-level trademarks live on the house object; resolution between the two is union — both lists are valid claims."
        },
        "voice_synthesis": {
          "type": "object",
          "description": "TTS voice synthesis configuration for AI-generated audio",
          "properties": {
            "provider": { "type": "string" },
            "voice_id": { "type": "string" },
            "settings": { "type": "object", "additionalProperties": true }
          },
          "additionalProperties": true
        },
        "avatar": {
          "type": "object",
          "description": "Visual avatar configuration",
          "properties": {
            "provider": { "type": "string" },
            "avatar_id": { "type": "string" },
            "settings": { "type": "object", "additionalProperties": true }
          },
          "additionalProperties": true
        },
        "visual_guidelines": {
          "$ref": "#/definitions/visual_guidelines",
          "description": "Structured visual rules for generative creative systems"
        },
        "agents": {
          "$ref": "#/definitions/agents",
          "description": "Agents authorized to act on behalf of this brand. Consumers resolving an agent by URL use the matching brand-level entry; do not infer a type-wide override of unrelated house-level entries when multiple same-type entries exist."
        },
        "brand_agent": {
          "$ref": "#/definitions/brand_agent",
          "description": "Deprecated: use agents array with type 'brand' instead. Brand agent that provides dynamic brand data via MCP.",
          "deprecated": true
        },
        "rights_agent": {
          "$ref": "#/definitions/rights_agent",
          "description": "Deprecated: use agents array with type 'rights' instead. Rights licensing agent for this brand.",
          "deprecated": true
        },
        "contact": {
          "type": "object",
          "description": "Brand-level contact information",
          "properties": {
            "email": { "type": "string", "format": "email", "description": "Contact email" },
            "phone": { "type": "string", "description": "Contact phone number" }
          }
        },
        "collections": {
          "type": "array",
          "description": "Collections this person or brand is associated with. Enables bidirectional linking: a collection's talent references brand.json via brand_url, and brand.json links back to collections.",
          "items": {
            "type": "object",
            "properties": {
              "collection_id": {
                "type": "string",
                "description": "Collection identifier as used in the seller's get_products responses"
              },
              "name": {
                "type": "string",
                "description": "Human-readable collection name"
              },
              "role": {
                "$ref": "/schemas/latest/enums/talent-role.json",
                "description": "This person's role on the collection"
              },
              "seller_agent_url": {
                "type": "string",
                "format": "uri",
                "description": "URL of the sales agent that sells inventory for this collection. Buyer agents can query this agent for collection products."
              }
            },
            "required": ["name"],
            "additionalProperties": true
          }
        }
      },
      "required": ["id", "names"],
      "additionalProperties": true
    },
    "house": {
      "type": "object",
      "description": "Corporate or organizational entity that owns brands",
      "properties": {
        "domain": {
          "$ref": "#/definitions/domain",
          "description": "The house's domain where brand.json is hosted"
        },
        "name": {
          "type": "string",
          "description": "Primary display name of the house",
          "minLength": 1
        },
        "names": {
          "type": "array",
          "description": "Localized house names including legal name, stock symbol, etc.",
          "items": { "$ref": "#/definitions/localized_name" }
        },
        "architecture": {
          "type": "string",
          "enum": ["branded_house", "house_of_brands", "hybrid"],
          "description": "Brand architecture model: branded_house (Google), house_of_brands (P&G), hybrid (Nike)"
        },
        "agents": {
          "$ref": "#/definitions/agents",
          "description": "House-level agents that apply to all brands unless overridden at the brand level"
        },
        "data_subject_contestation": {
          "$ref": "#/definitions/data_subject_contestation",
          "description": "House-level fallback contestation contact. Governance agents resolve in order: brand.data_subject_contestation → house.data_subject_contestation → missing (critical finding when human review required)."
        },
        "identity_relying_parties": {
          "type": "array",
          "description": "Verified-identity relying parties this house/entity operates, so a buyer can verify that a forwarded TMP identity attestation's relying_party_id genuinely belongs to this entity (provenance) rather than being replayed under another owner. For network-as-RP, the network publishes its own relying_party_id here. See specs/tmp-verified-identity-attestation.md.",
          "items": { "$ref": "#/definitions/identity_relying_party" }
        }
      },
      "required": ["domain", "name"],
      "additionalProperties": true
    },
    "identity_relying_party": {
      "type": "object",
      "description": "A verified-identity relying party an entity or brand operates. Used for attestation provenance in TMP Identity Match (the buyer checks a forwarded attestation's relying_party_id against the owner's published list). Issuer-agnostic; World ID is the first issuer.",
      "properties": {
        "issuer": {
          "$ref": "/schemas/latest/core/brand-ref.json",
          "description": "Identity issuer / attestation authority, referenced as a vendor BrandRef (e.g. {\"domain\": \"world.org\"}) — the same vendor-reference shape AdCP uses for measurement and signals vendors. The issuer's canonical domain is the anchor; it need not host a brand.json, but if it does, that is where its verifier metadata (scheme versions, verify endpoint, JWKs) lives. Issuer-agnostic: World ID, ISO 18013-5 mDL, and W3C-VC issuers all reference by domain. The relying party is namespaced by the issuer — identity is the tuple (issuer.domain, issuer.brand_id, relying_party_id), mirroring (vendor.domain, vendor.brand_id, metric_id)."
        },
        "scheme": {
          "type": "string",
          "description": "Proof scheme and version, e.g. \"world_id_v4\"."
        },
        "relying_party_id": {
          "type": "string",
          "x-entity": "identity_relying_party",
          "description": "The relying-party id registered with the issuer (and, for on-chain issuers like World ID, with the issuer's registry). One entity may operate many relying parties (scope=entity vs scope=property); this is the attestation's audience / linkability boundary, not an entity identifier."
        },
        "scope": {
          "type": "string",
          "enum": ["entity", "property"],
          "description": "Whether this relying_party_id is shared across the entity's properties (entity → a within-entity unique-human graph) or scoped to a single property (property → per-property pseudonyms, unlinkable across the entity)."
        }
      },
      "required": ["issuer", "relying_party_id"],
      "additionalProperties": false
    },
    "brand_agent": {
      "type": "object",
      "description": "Reference to a brand agent that provides brand data via MCP",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."
        },
        "id": {
          "type": "string",
          "description": "Agent identifier (useful for logging, multi-tenant DAMs)",
          "pattern": "^[a-z0-9_]+$"
        }
      },
      "required": ["url", "id"],
      "additionalProperties": true
    },
    "rights_agent": {
      "type": "object",
      "description": "Rights licensing agent for this brand. Provides discovery, pricing, and acquisition of licensable rights via MCP. Use get_rights and acquire_rights tasks to interact.",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "Rights agent MCP endpoint URL. Callers comparing this URL against another value (e.g., matching against a brand's declared rights endpoint) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."
        },
        "id": {
          "type": "string",
          "description": "Agent identifier",
          "pattern": "^[a-z0-9_]+$"
        },
        "available_uses": {
          "type": "array",
          "description": "Rights uses available for licensing through this agent",
          "items": { "$ref": "/schemas/latest/enums/right-use.json" },
          "minItems": 1
        },
        "right_types": {
          "type": "array",
          "description": "Types of rights available",
          "items": { "$ref": "/schemas/latest/enums/right-type.json" },
          "minItems": 1
        },
        "countries": {
          "type": "array",
          "description": "Countries where rights are available (ISO 3166-1 alpha-2)",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          }
        }
      },
      "required": ["url", "id", "available_uses"],
      "additionalProperties": true
    },
    "brand_agent_entry": {
      "type": "object",
      "description": "An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.",
      "properties": {
        "type": {
          "$ref": "/schemas/latest/enums/brand-agent-type.json",
          "description": "Functional role of this agent"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."
        },
        "id": {
          "type": "string",
          "description": "Agent identifier (useful for logging, multi-tenant platforms)",
          "pattern": "^[a-z0-9_]+$",
          "maxLength": 100
        },
        "description": {
          "type": "string",
          "description": "Human-readable description of this agent's capabilities or scope",
          "maxLength": 500
        },
        "jwks_uri": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`."
        },
        "available_uses": {
          "type": "array",
          "description": "For rights agents: rights uses available for licensing",
          "items": { "$ref": "/schemas/latest/enums/right-use.json" },
          "minItems": 1
        },
        "right_types": {
          "type": "array",
          "description": "For rights agents: types of rights available",
          "items": { "$ref": "/schemas/latest/enums/right-type.json" },
          "minItems": 1
        },
        "countries": {
          "type": "array",
          "description": "ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          }
        }
      },
      "required": ["type", "url", "id"],
      "additionalProperties": true
    },
    "agents": {
      "type": "array",
      "description": "Agents declared by this brand or house. Multiple entries with the same type are permitted when they have distinct url values, such as one endpoint URL per tenant or property scope. Agent url values MUST be unique within this array; duplicate urls are invalid because signature verifiers resolve a signing key by matching one agent url to one agents[] entry and reject ambiguous matches.",
      "items": { "$ref": "#/definitions/brand_agent_entry" }
    },
    "authorized_operator": {
      "type": "object",
      "description": "An entity authorized to represent brands from this house. Verified by resolving the operator's domain. Optional validity fields let houses time-box agency-of-record and delegated-operator relationships without changing historical entries.",
      "properties": {
        "domain": {
          "$ref": "#/definitions/domain",
          "description": "Domain of the authorized operator (e.g., 'groupm.com')"
        },
        "brands": {
          "type": "array",
          "description": "Brand IDs this operator is authorized for. Use ['*'] for all brands in the portfolio.",
          "items": {
            "type": "string",
            "pattern": "^([a-z0-9_]+|\\*)$"
          },
          "minItems": 1
        },
        "countries": {
          "type": "array",
          "description": "ISO 3166-1 alpha-2 country codes where this authorization applies. Omit for global authorization.",
          "items": {
            "type": "string",
            "pattern": "^[A-Z]{2}$"
          }
        },
        "scopes": {
          "type": "array",
          "description": "Activities this operator is authorized to perform for the listed brands and countries. Omit for backwards-compatible broad authorization. Use ['all'] only when every listed scope is delegated.",
          "items": {
            "type": "string",
            "enum": ["all", "media_buying", "creative_generation", "rights_clearance", "governance", "measurement", "agent_operations"]
          },
          "minItems": 1,
          "uniqueItems": true
        },
        "valid_from": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 timestamp when this operator authorization starts. Omit when authorization is already active or the start date is not tracked."
        },
        "valid_until": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 timestamp when this operator authorization expires. Consumers MUST treat entries at or after this timestamp as inactive for authorization decisions."
        }
      },
      "required": ["domain", "brands"],
      "additionalProperties": true
    },
    "photography_style": {
      "type": "object",
      "description": "Photography style rules for generative creative systems. Defines how brand photography should look when selected or generated.",
      "properties": {
        "realism": {
          "type": "string",
          "enum": ["natural", "stylized", "hyperreal", "abstract"],
          "description": "Level of photographic realism"
        },
        "lighting": {
          "type": "string",
          "description": "Lighting style (e.g., 'soft daylight', 'studio', 'golden hour', 'high-key', 'low-key')"
        },
        "color_temperature": {
          "type": "string",
          "enum": ["warm", "neutral", "cool"],
          "description": "Overall color temperature of photography"
        },
        "contrast": {
          "type": "string",
          "enum": ["low", "medium", "high"],
          "description": "Contrast level in photography"
        },
        "depth_of_field": {
          "type": "string",
          "enum": ["shallow", "medium", "deep"],
          "description": "Depth of field preference. shallow: blurred background with subject isolation, deep: everything in focus"
        },
        "subject": {
          "type": "object",
          "description": "Subject matter guidelines",
          "properties": {
            "people": {
              "type": "object",
              "description": "People photography guidelines",
              "properties": {
                "age_range": { "type": "string", "description": "Target age range (e.g., '20-35')" },
                "diversity": { "type": "string", "description": "Diversity representation (e.g., 'mixed', 'varied')" },
                "mood": {
                  "type": "array",
                  "items": { "type": "string" },
                  "description": "Mood descriptors (e.g., ['confident', 'relaxed'])"
                }
              },
              "additionalProperties": true
            },
            "product_focus": {
              "type": "string",
              "enum": ["in-use", "isolated", "lifestyle", "detail"],
              "description": "How products are shown"
            },
            "setting": {
              "type": "string",
              "description": "Environmental context for photography (e.g., 'indoor', 'outdoor', 'studio', 'urban', 'nature', 'workplace')"
            }
          },
          "additionalProperties": true
        },
        "framing": {
          "type": "object",
          "description": "Camera framing rules",
          "properties": {
            "subject_position": {
              "type": "string",
              "description": "Where the subject sits in frame (e.g., 'center', 'center-left', 'rule-of-thirds')"
            },
            "crop_style": {
              "type": "string",
              "description": "Cropping convention (e.g., 'waist-up', 'full-body', 'close-up', 'wide')"
            },
            "perspective": {
              "type": "string",
              "description": "Camera perspective (e.g., 'eye-level', 'overhead', 'low-angle')"
            }
          },
          "additionalProperties": true
        },
        "preferred_aspect_ratios": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^\\d+:\\d+$"
          },
          "description": "Preferred aspect ratios for brand photography (e.g., '16:9', '4:5', '1:1')"
        },
        "tags": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Additional style descriptors"
        }
      },
      "additionalProperties": true
    },
    "graphic_style": {
      "type": "object",
      "description": "Visual language for brand graphics and illustrations",
      "properties": {
        "style_type": {
          "type": "string",
          "enum": ["flat_illustration", "geometric", "gradient_mesh", "editorial_collage", "hand_drawn", "minimal_line_art", "3d_render", "isometric", "photographic_composite"],
          "description": "Primary graphic style"
        },
        "stroke_style": {
          "type": "string",
          "enum": ["rounded", "square", "mixed", "none"],
          "description": "Stroke end/join style"
        },
        "stroke_weight": {
          "type": "string",
          "description": "Stroke weight (e.g., '2px', 'thin', 'bold')"
        },
        "corner_radius": {
          "type": "string",
          "description": "Default corner radius for graphic and illustration elements (e.g., '12px', '8px', 'sharp'). For UI component radii (buttons, cards, inputs), see visual_guidelines.border_radius."
        },
        "tags": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Additional style descriptors"
        }
      },
      "additionalProperties": true
    },
    "border_radius": {
      "type": "object",
      "description": "Named border radius presets for UI components and layout elements. One of the most visible brand differentiators — Airbnb uses generous 20px, Stripe uses precise 4–8px, Spotify uses pill/999px.",
      "properties": {
        "none": {
          "type": "string",
          "description": "Explicitly sharp corners (e.g., '0')"
        },
        "default": {
          "type": "string",
          "description": "Default border radius for UI components (e.g., '8px', '12px', '0'). For graphic/illustration elements, see graphic_style.corner_radius."
        },
        "small": {
          "type": "string",
          "description": "Small border radius for compact elements (e.g., '4px')"
        },
        "large": {
          "type": "string",
          "description": "Large border radius for cards and containers (e.g., '16px', '24px')"
        },
        "pill": {
          "type": "string",
          "description": "Fully rounded / pill shape (e.g., '999px')"
        }
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "elevation": {
      "type": "object",
      "description": "Named shadow/elevation levels. Brands use elevation as identity — from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.",
      "properties": {
        "none": {
          "type": "string",
          "description": "No shadow (e.g., 'none')"
        },
        "subtle": {
          "type": "string",
          "description": "Subtle shadow for slight lift (e.g., '0 1px 2px rgba(0,0,0,0.05)')"
        },
        "card": {
          "type": "string",
          "description": "Card-level shadow (e.g., '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)')"
        },
        "modal": {
          "type": "string",
          "description": "Modal/overlay shadow (e.g., '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)')"
        }
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "spacing": {
      "type": "object",
      "description": "Spacing system for consistent layout rhythm. Most design systems use an 8px base grid.",
      "properties": {
        "unit": {
          "type": "string",
          "description": "Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational — agents should use the named scale values, not compute from this."
        },
        "scale": {
          "type": "object",
          "description": "Named spacing scale built from the base unit",
          "properties": {
            "xs": { "type": "string", "description": "Extra small spacing (e.g., '4px')" },
            "sm": { "type": "string", "description": "Small spacing (e.g., '8px')" },
            "md": { "type": "string", "description": "Medium spacing (e.g., '16px')" },
            "lg": { "type": "string", "description": "Large spacing (e.g., '24px')" },
            "xl": { "type": "string", "description": "Extra large spacing (e.g., '32px')" },
            "2xl": { "type": "string", "description": "Section-level spacing (e.g., '48px', '64px')" }
          },
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    },
    "brand_shapes": {
      "type": "object",
      "description": "Distinctive shapes used as part of brand visual identity",
      "properties": {
        "primary_shape": {
          "type": "string",
          "description": "Primary brand shape (e.g., 'rounded_rectangle', 'circle', 'hexagon')"
        },
        "secondary_shapes": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Secondary shapes in the brand vocabulary"
        },
        "usage": {
          "type": "object",
          "description": "Shape usage rules",
          "properties": {
            "max_per_layout": {
              "type": "integer",
              "description": "Maximum distinct shapes per layout"
            },
            "overlap_allowed": {
              "type": "boolean",
              "description": "Whether shapes may overlap"
            }
          },
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    },
    "iconography": {
      "type": "object",
      "description": "Icon style system and usage rules",
      "properties": {
        "style": {
          "type": "string",
          "enum": ["outline", "filled", "duotone", "flat", "glyph", "hand_drawn"],
          "description": "Icon rendering style"
        },
        "stroke_weight": {
          "type": "string",
          "description": "Icon stroke weight (e.g., '2px', '1.5px')"
        },
        "corner_style": {
          "type": "string",
          "enum": ["rounded", "square", "mixed"],
          "description": "Corner style for icon paths"
        },
        "usage": {
          "type": "object",
          "description": "Icon usage rules",
          "properties": {
            "max_per_frame": {
              "type": "integer",
              "description": "Maximum icons per creative frame"
            },
            "size_ratio": {
              "type": "string",
              "description": "Icon-to-layout size ratio (e.g., '1:8')"
            }
          },
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    },
    "composition_rules": {
      "type": "object",
      "description": "Layout composition rules including overlays, textures, and backgrounds",
      "properties": {
        "overlays": {
          "type": "object",
          "description": "Graphic overlay rules",
          "properties": {
            "gradient_style": {
              "type": "string",
              "enum": ["linear", "radial", "conic", "none"],
              "description": "Gradient type for overlays"
            },
            "gradient_direction": {
              "type": "string",
              "description": "Gradient direction (e.g., '45deg', 'to-bottom-right')"
            },
            "opacity": {
              "type": "string",
              "description": "Overlay opacity (e.g., '70%')"
            }
          },
          "additionalProperties": true
        },
        "texture": {
          "type": "object",
          "description": "Texture treatment rules",
          "properties": {
            "style": {
              "type": "string",
              "enum": ["none", "subtle_grain", "noise", "paper", "fabric", "concrete"],
              "description": "Texture style applied to creative assets"
            },
            "intensity": {
              "type": "string",
              "enum": ["low", "medium", "high"],
              "description": "Texture intensity"
            }
          },
          "additionalProperties": true
        },
        "backgrounds": {
          "type": "object",
          "description": "Background treatment rules",
          "properties": {
            "types_allowed": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": ["solid_color", "gradient", "blurred_photo", "image", "video", "pattern", "transparent"]
              },
              "description": "Permitted background types"
            }
          },
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    },
    "colorway": {
      "type": "object",
      "description": "A named color pairing that defines how colors work together. Colorways ensure foreground/background combinations are always on-brand and accessible.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Colorway name (e.g., 'primary', 'inverted', 'subtle')"
        },
        "foreground": { "$ref": "#/definitions/hex_color" },
        "background": { "$ref": "#/definitions/hex_color" },
        "accent": { "$ref": "#/definitions/hex_color" },
        "border": { "$ref": "#/definitions/hex_color" },
        "cta_foreground": { "$ref": "#/definitions/hex_color", "description": "CTA text/icon color, if different from foreground" },
        "cta_background": { "$ref": "#/definitions/hex_color", "description": "CTA button/container color, if different from accent" },
        "channels": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Channels or contexts where this colorway applies (e.g., 'online', 'print', 'pos', 'social', 'outdoor'). Omit for universal colorways."
        }
      },
      "required": ["name", "foreground", "background"],
      "additionalProperties": true
    },
    "color_constraint": {
      "type": "object",
      "description": "Machine-readable rule constraining how a brand color may be used or paired. Use for accent-only colors, forbidden foreground/background combinations, and palette pairs that should never appear together.",
      "properties": {
        "color": {
          "$ref": "#/definitions/color_ref",
          "description": "Color role or value this constraint governs."
        },
        "applies_to": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": ["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]
          },
          "description": "Surfaces where this color may be used."
        },
        "allowed_on": {
          "type": "array",
          "items": { "$ref": "#/definitions/color_ref" },
          "description": "Backgrounds, surfaces, or color roles where this color is allowed."
        },
        "forbidden_on": {
          "type": "array",
          "items": { "$ref": "#/definitions/color_ref" },
          "description": "Backgrounds, surfaces, or color roles where this color is forbidden."
        },
        "never_pair_with": {
          "type": "array",
          "items": { "$ref": "#/definitions/color_ref" },
          "description": "Color roles or values that must not be paired with this color."
        },
        "contexts": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Channels or creative contexts where this constraint applies, such as digital, print, social, or ctv_end_card."
        },
        "severity": { "$ref": "#/definitions/guideline_severity" },
        "description": {
          "type": "string",
          "description": "Human-readable rationale or source-language summary for the rule."
        }
      },
      "required": ["color"],
      "additionalProperties": true
    },
    "logo_usage_rule": {
      "type": "object",
      "description": "Machine-readable logo selection and placement rule. Complements logos[].usage by making enforceable minimum size, clear-space, background, and context constraints queryable.",
      "properties": {
        "logo_url": {
          "type": "string",
          "format": "uri",
          "description": "Specific logo asset URL this rule applies to. Omit when the rule applies by variant or tags."
        },
        "logo_id": {
          "$ref": "#/definitions/logo_id",
          "description": "Stable `logos[].id` this rule applies to. Prefer this over logo_url when the rule targets a specific logo entry."
        },
        "logo_variant": {
          "type": "string",
          "enum": ["primary", "secondary", "icon", "wordmark", "full-lockup"],
          "description": "Logo variant this rule applies to."
        },
        "logo_tags": {
          "type": "array",
          "items": { "type": "string" },
          "minItems": 1,
          "description": "Logo tags this rule applies to."
        },
        "contexts": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Creative contexts where this rule applies."
        },
        "slots": {
          "type": "array",
          "items": { "$ref": "#/definitions/logo_slot" },
          "minItems": 1,
          "uniqueItems": true,
          "description": "Canonical renderer slots where this rule applies. Use this for deterministic logo-card, profile-mark, end-card, and lockup selection."
        },
        "minimum_size": {
          "type": "object",
          "description": "Minimum rendered size needed for legibility.",
          "properties": {
            "width": { "type": "string", "description": "Minimum width, such as 48px or 12mm." },
            "height": { "type": "string", "description": "Minimum height, such as 18px or 6mm." }
          },
          "additionalProperties": false
        },
        "clear_space": {
          "type": "string",
          "description": "Minimum clear space around the logo, expressed in brand terms or units."
        },
        "allowed_backgrounds": {
          "type": "array",
          "items": { "$ref": "#/definitions/color_ref" },
          "description": "Background color roles, values, or surfaces where this logo may be placed."
        },
        "forbidden_backgrounds": {
          "type": "array",
          "items": { "$ref": "#/definitions/color_ref" },
          "description": "Background color roles, values, or surfaces where this logo must not be placed."
        },
        "forbidden_contexts": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Contexts where this logo must not be used, such as photography_without_knockout."
        },
        "severity": { "$ref": "#/definitions/guideline_severity" },
        "description": {
          "type": "string",
          "description": "Human-readable rationale or source-language summary for the rule."
        }
      },
      "anyOf": [
        { "required": ["logo_id"] },
        { "required": ["logo_url"] },
        { "required": ["logo_variant"] },
        { "required": ["logo_tags"] },
        { "required": ["slots"] }
      ],
      "additionalProperties": true
    },
    "mark_lockup": {
      "type": "object",
      "description": "Machine-readable layout constraints for co-brand, partner, sponsor, program, or secondary-mark lockups.",
      "properties": {
        "lockup_type": {
          "type": "string",
          "enum": ["co_brand", "secondary_mark", "partner", "sponsor", "program", "talent", "custom"],
          "description": "Type of mark relationship governed by this lockup rule."
        },
        "ordering": {
          "type": "string",
          "enum": ["brand_first", "partner_first", "equal", "contextual"],
          "description": "Required visual ordering of the brand mark relative to partner or secondary marks."
        },
        "contexts": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Creative contexts where this lockup rule applies."
        },
        "brand_logo_id": {
          "$ref": "#/definitions/logo_id",
          "description": "Stable `logos[].id` for the brand logo this lockup rule is anchored on."
        },
        "secondary_logo_ids": {
          "type": "array",
          "items": { "$ref": "#/definitions/logo_id" },
          "uniqueItems": true,
          "description": "Stable `logos[].id` values for secondary, program, sponsor, or partner marks governed by this lockup rule when those marks are represented in this brand.json."
        },
        "separator": {
          "type": "object",
          "description": "Separator between marks, when required.",
          "properties": {
            "type": {
              "type": "string",
              "enum": ["none", "keyline", "space", "divider"],
              "description": "Separator style."
            },
            "color": { "$ref": "#/definitions/color_ref" },
            "width": { "type": "string", "description": "Separator width, such as 1px." }
          },
          "required": ["type"],
          "additionalProperties": true
        },
        "min_gap": {
          "type": "string",
          "description": "Minimum gap between marks, expressed in brand terms or units."
        },
        "brand_min_optical_weight_ratio": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "Minimum optical weight of the brand mark relative to partner marks. 1 means at least equal."
        },
        "partner_max_optical_weight_ratio": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "Maximum optical weight of partner marks relative to the brand mark. 1 means no larger than the brand mark. Enforcement is at layout time, not parse time — this value signals to renderers and creative agents how much space to provision for each mark."
        },
        "severity": { "$ref": "#/definitions/guideline_severity" },
        "description": {
          "type": "string",
          "description": "Human-readable rationale or source-language summary for the lockup rule."
        }
      },
      "required": ["lockup_type"],
      "additionalProperties": true
    },
    "type_scale_entry": {
      "type": "object",
      "description": "A single entry in the type scale",
      "properties": {
        "font": {
          "type": "string",
          "description": "Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback."
        },
        "size": { "type": "string", "description": "Font size (e.g., '48px', '2rem')" },
        "weight": { "type": "string", "description": "Font weight (e.g., '700', 'bold')" },
        "line_height": { "type": "string", "description": "Line height (e.g., '1.2', '56px')" },
        "letter_spacing": { "type": "string", "description": "Letter spacing (e.g., '-0.02em', '0.5px')" },
        "text_transform": {
          "type": "string",
          "enum": ["none", "uppercase", "lowercase", "capitalize"],
          "description": "Text transformation"
        }
      },
      "additionalProperties": true
    },
    "motion_guidelines": {
      "type": "object",
      "description": "Motion and animation rules for video, animated display, and interactive formats",
      "properties": {
        "transition_style": {
          "type": "string",
          "enum": ["cut", "dissolve", "slide", "wipe", "zoom", "fade"],
          "description": "Primary transition style between scenes"
        },
        "animation_speed": {
          "type": "string",
          "enum": ["slow", "moderate", "fast"],
          "description": "Overall animation pacing"
        },
        "easing": {
          "type": "string",
          "description": "Default easing function (e.g., 'ease-in-out', 'spring', 'linear')"
        },
        "text_entrance": {
          "type": "string",
          "enum": ["fade", "typewriter", "slide_up", "slide_left", "scale", "none"],
          "description": "How text enters the frame"
        },
        "pacing": {
          "type": "string",
          "enum": ["lingering", "moderate", "fast_cuts"],
          "description": "Overall editing rhythm"
        },
        "kinetic_typography": {
          "type": "boolean",
          "description": "Whether animated/kinetic typography is allowed"
        },
        "tags": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Additional motion style descriptors"
        }
      },
      "additionalProperties": true
    },
    "logo_placement": {
      "type": "object",
      "description": "Logo placement and clear space rules for automated creative production",
      "properties": {
        "preferred_position": {
          "type": "string",
          "enum": ["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right", "center"],
          "description": "Preferred logo position in layouts"
        },
        "min_clear_space": {
          "type": "string",
          "description": "Minimum clear space around the logo, expressed as a multiple of logo height (e.g., '0.5x', '1x') or fixed value (e.g., '16px')"
        },
        "min_height": {
          "type": "string",
          "description": "Minimum logo height to maintain legibility (e.g., '40px', '24px')"
        },
        "background_contrast": {
          "type": "string",
          "enum": ["light_only", "dark_only", "any"],
          "description": "Permitted background contrast behind logo"
        }
      },
      "additionalProperties": true
    },
    "graphic_element": {
      "type": "object",
      "description": "A reusable decorative or structural visual element that is part of the brand identity (e.g., torn paper edges, watermarks, dividers, background patterns)",
      "properties": {
        "name": {
          "type": "string",
          "description": "Element name (e.g., 'Paper Tear', 'Brand Watermark', 'Section Divider')"
        },
        "type": {
          "type": "string",
          "enum": ["border", "divider", "frame", "watermark", "pattern", "texture_overlay", "decorative"],
          "description": "Element type"
        },
        "description": {
          "type": "string",
          "description": "How the element is used in layouts"
        },
        "orientation": {
          "type": "string",
          "enum": ["horizontal", "vertical", "any"],
          "description": "Preferred orientation when used in layouts"
        },
        "colors": {
          "type": "array",
          "items": { "$ref": "#/definitions/hex_color" },
          "description": "Colors this element may appear in"
        },
        "max_per_layout": {
          "type": "integer",
          "description": "Maximum instances per layout"
        }
      },
      "required": ["name"],
      "additionalProperties": true
    },
    "asset_library": {
      "type": "object",
      "description": "A managed asset library (icon set, illustration system, image collection). The URL is for human access; agent-facing DAM integration is under investigation.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Display name of the asset library"
        },
        "type": {
          "type": "string",
          "enum": ["icon_set", "illustration_system", "image_library", "video_library", "template_library"],
          "description": "Type of asset library"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "URL to the asset library (for human access)"
        },
        "description": {
          "type": "string",
          "description": "Description of the library contents and usage"
        },
        "color_guide": {
          "type": "object",
          "description": "Color guide for the asset library defining roles and palettes",
          "properties": {
            "roles": {
              "type": "array",
              "items": { "type": "string" },
              "description": "Named color roles used in the library (e.g., base, shadow_1, highlight_1, stroke)"
            },
            "palettes": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Palette name"
                  },
                  "colors": {
                    "type": "object",
                    "additionalProperties": { "$ref": "#/definitions/hex_color" },
                    "description": "Map of role names to hex color values"
                  }
                },
                "required": ["name", "colors"],
                "additionalProperties": true
              },
              "description": "Named color palettes mapping roles to specific colors"
            }
          },
          "additionalProperties": true
        }
      },
      "required": ["name", "url"],
      "additionalProperties": true
    },
    "visual_guidelines": {
      "type": "object",
      "description": "Structured visual rules for generative creative systems. Defines how brand photography, graphics, typography, and composition should be produced to maintain brand consistency at scale.",
      "properties": {
        "photography": { "$ref": "#/definitions/photography_style" },
        "graphic_style": { "$ref": "#/definitions/graphic_style" },
        "shapes": { "$ref": "#/definitions/brand_shapes" },
        "iconography": { "$ref": "#/definitions/iconography" },
        "composition": { "$ref": "#/definitions/composition_rules" },
        "border_radius": { "$ref": "#/definitions/border_radius" },
        "elevation": { "$ref": "#/definitions/elevation" },
        "spacing": { "$ref": "#/definitions/spacing" },
        "graphic_elements": {
          "type": "array",
          "items": { "$ref": "#/definitions/graphic_element" },
          "description": "Reusable decorative elements that are part of the brand visual identity (e.g., torn paper edges, watermarks, dividers)"
        },
        "motion": { "$ref": "#/definitions/motion_guidelines" },
        "logo_placement": { "$ref": "#/definitions/logo_placement" },
        "colorways": {
          "type": "array",
          "items": { "$ref": "#/definitions/colorway" },
          "description": "Named color pairings for consistent foreground/background combinations"
        },
        "color_constraints": {
          "type": "array",
          "items": { "$ref": "#/definitions/color_constraint" },
          "description": "Machine-readable constraints for color usage and pairings, such as accent-only rules or forbidden foreground/background combinations."
        },
        "logo_usage_rules": {
          "type": "array",
          "items": { "$ref": "#/definitions/logo_usage_rule" },
          "description": "Machine-readable logo selection and placement constraints for minimum size, clear space, backgrounds, and contexts."
        },
        "mark_lockups": {
          "type": "array",
          "items": { "$ref": "#/definitions/mark_lockup" },
          "description": "Machine-readable co-brand, partner, sponsor, program, or secondary-mark lockup rules."
        },
        "type_scale": {
          "type": "object",
          "description": "Typography scale defining sizes and weights for different text roles. When sizes are in px, use base_width to indicate the reference canvas.",
          "properties": {
            "base_width": {
              "type": "string",
              "description": "Reference canvas width these sizes were designed for (e.g., '1080px'). Generative systems should scale proportionally for other canvas sizes."
            },
            "heading": { "$ref": "#/definitions/type_scale_entry" },
            "subheading": { "$ref": "#/definitions/type_scale_entry" },
            "body": { "$ref": "#/definitions/type_scale_entry" },
            "caption": { "$ref": "#/definitions/type_scale_entry" },
            "cta": { "$ref": "#/definitions/type_scale_entry" }
          },
          "additionalProperties": { "$ref": "#/definitions/type_scale_entry" }
        },
        "asset_libraries": {
          "type": "array",
          "items": { "$ref": "#/definitions/asset_library" },
          "description": "References to managed asset libraries (icon sets, illustration systems, image collections). URLs are intended for human access; agent-facing DAM integration is under investigation."
        },
        "restrictions": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Visual prohibitions and guardrails (e.g., 'Never use black backgrounds', 'Do not crop the logo', 'No stock photography of people on phones')"
        }
      },
      "additionalProperties": true
    },
    "contact": {
      "type": "object",
      "description": "Contact information",
      "properties": {
        "name": { "type": "string", "minLength": 1, "maxLength": 255 },
        "email": { "type": "string", "format": "email", "maxLength": 255 },
        "domain": { "$ref": "#/definitions/domain" }
      },
      "required": ["name"],
      "additionalProperties": true
    }
  },
  "oneOf": [
    {
      "type": "object",
      "title": "Authoritative Location Redirect",
      "description": "Redirects to a hosted brand.json file at another URL",
      "properties": {
        "$schema": { "type": "string" },
        "authoritative_location": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "HTTPS URL of the authoritative brand.json file"
        },
        "redirect_reason": {
          "type": "string",
          "enum": ["acquisition", "divestiture", "rebrand", "regional", "legacy", "consolidation", "other"],
          "description": "Optional structured signal indicating why this redirect was put in place. Consumers SHOULD use this to inform cache TTL decisions: 'acquisition' / 'divestiture' / 'rebrand' / 'consolidation' suggest the resolved target is in transition and consumers SHOULD shorten cache TTL until stable. 'regional' / 'legacy' suggest a stable redirect with no special cache handling needed. Free-text rationale belongs in 'note'."
        },
        "redirect_effective_at": {
          "type": "string",
          "format": "date-time",
          "description": "Optional timestamp when this redirect became effective. Caches MUST treat any entry cached before this timestamp as stale and re-fetch through the redirect."
        },
        "note": {
          "type": "string",
          "description": "Optional human-readable rationale for the redirect."
        },
        "last_updated": { "type": "string", "format": "date-time" }
      },
      "required": ["authoritative_location"],
      "additionalProperties": false
    },
    {
      "type": "object",
      "title": "House Redirect",
      "description": "Redirects to the house domain that contains the full brand portfolio",
      "properties": {
        "$schema": { "type": "string" },
        "house": {
          "$ref": "#/definitions/domain",
          "description": "House domain to fetch brand portfolio from"
        },
        "region": {
          "type": "string",
          "pattern": "^[A-Z]{2}$",
          "description": "ISO 3166-1 alpha-2 country code if this is a regional domain"
        },
        "redirect_reason": {
          "type": "string",
          "enum": ["acquisition", "divestiture", "rebrand", "regional", "legacy", "consolidation", "other"],
          "description": "Optional structured signal indicating why this redirect was put in place. Consumers SHOULD use this to inform cache TTL decisions: 'acquisition' / 'divestiture' / 'rebrand' / 'consolidation' suggest the resolved target is in transition and consumers SHOULD shorten cache TTL until stable. 'regional' / 'legacy' suggest a stable redirect with no special cache handling needed. Free-text rationale belongs in 'note'."
        },
        "redirect_effective_at": {
          "type": "string",
          "format": "date-time",
          "description": "Optional timestamp when this redirect became effective. Caches MUST treat any entry cached before this timestamp as stale and re-fetch through the redirect."
        },
        "note": {
          "type": "string",
          "description": "Optional human-readable rationale for the redirect."
        },
        "last_updated": { "type": "string", "format": "date-time" }
      },
      "required": ["house"],
      "additionalProperties": false
    },
    {
      "type": "object",
      "title": "Brand Agent",
      "description": "Brand represented by agents that provide brand info via MCP",
      "properties": {
        "$schema": { "type": "string" },
        "version": { "type": "string" },
        "agents": { "$ref": "#/definitions/agents" },
        "brand_agent": {
          "$ref": "#/definitions/brand_agent",
          "deprecated": true
        },
        "contact": { "$ref": "#/definitions/contact" },
        "data_subject_contestation": {
          "$ref": "#/definitions/data_subject_contestation"
        },
        "last_updated": { "type": "string", "format": "date-time" }
      },
      "anyOf": [
        { "required": ["agents"] },
        { "required": ["brand_agent"] }
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "title": "House Portfolio",
      "description": "Full house/brand portfolio with hierarchy, creative assets, and properties. May carry inline brands (parent-owned, brands[]) and/or pointer brands (child-owned canonical documents, brand_refs[]). At least one of brands[] or brand_refs[] is required. A brand_id MUST NOT appear in both. See docs/brand-protocol/brand-json.mdx",
      "properties": {
        "$schema": { "type": "string" },
        "version": { "type": "string" },
        "house": { "$ref": "#/definitions/house" },
        "brands": {
          "type": "array",
          "description": "Inline brands owned by this house (parent-owned data). Use for sub-brands without their own canonical document — typically those without a dedicated domain or that the holdco wants to manage centrally. A brand_id MUST NOT appear in both brands[] and brand_refs[].",
          "items": { "$ref": "#/definitions/brand" },
          "minItems": 1
        },
        "brand_refs": {
          "type": "array",
          "description": "Portfolio entries for brands owned by this house that publish their own canonical brand.json elsewhere (child-owned data). Each entry asserts ownership plus where the child's document lives. Mutual-assertion trust: the pointed-to document's house_domain must equal this house's domain. Invariants: a brand_id MUST NOT appear in both brands[] and brand_refs[]; brand_id and domain MUST each be unique within brand_refs[]. See docs/brand-protocol/brand-json.mdx",
          "items": { "$ref": "#/definitions/portfolio_entry" },
          "minItems": 1
        },
        "contact": { "$ref": "#/definitions/contact" },
        "authorized_operators": {
          "type": "array",
          "description": "Entities authorized to represent brands from this house. Third parties (sellers, platforms) can verify an operator's authorization by checking this list. Operators are identified by domain.",
          "items": { "$ref": "#/definitions/authorized_operator" }
        },
        "trademarks": {
          "type": "array",
          "items": { "$ref": "#/definitions/trademark" },
          "description": "House-level (corporate) registered trademarks. Brand-level marks live on individual brand entries; resolution is union."
        },
        "last_updated": { "type": "string", "format": "date-time" }
      },
      "required": ["house"],
      "anyOf": [
        { "required": ["brands"] },
        { "required": ["brand_refs"] }
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "title": "Brand Canonical Document",
      "description": "Self-published brand document where the brand owns its own identity attributes. Optionally declares its house via house_domain; for trust, the named house's brand_refs[] must reciprocate (mutual assertion). Standalone brands (no parent house) omit house_domain. Hosted at the brand's own /.well-known/brand.json (or via authoritative_location indirection). See docs/brand-protocol/brand-json.mdx",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "$schema": { "type": "string" },
            "version": { "type": "string" },
            "house_domain": {
              "$ref": "#/definitions/domain",
              "description": "Optional pointer to the corporate house this brand belongs to. The named house's brand_refs[] MUST reciprocate for mutual-assertion trust. Single-hop only — a brand cannot itself declare brand_refs[]. Omit for standalone brands (no house)."
            },
            "last_updated": { "type": "string", "format": "date-time" }
          },
          "not": {
            "anyOf": [
              { "required": ["house"] },
              { "required": ["brands"] },
              { "required": ["brand_refs"] },
              { "required": ["authorized_operators"] },
              { "required": ["authoritative_location"] },
              { "required": ["redirect_reason"] },
              { "required": ["redirect_effective_at"] },
              { "required": ["region"] },
              { "required": ["note"] }
            ]
          }
        },
        { "$ref": "#/definitions/brand" }
      ]
    }
  ],
  "examples": [
    {
      "$schema": "/schemas/latest/brand.json",
      "authoritative_location": "https://adcontextprotocol.org/brand/abc123/brand.json"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "house": "nikeinc.com",
      "note": "Redirect to house domain for full brand portfolio"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "agents": [
        {
          "type": "brand",
          "url": "https://agent.acme.com/mcp",
          "id": "acme_brand"
        }
      ]
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "house": {
        "domain": "pg.com",
        "name": "Procter & Gamble",
        "architecture": "house_of_brands",
        "agents": [
          {
            "type": "governance",
            "url": "https://agents.pg.com/governance",
            "id": "pg_governance",
            "description": "Brand safety and compliance for all P&G brands",
            "jwks_uri": "https://agents.pg.com/.well-known/jwks.json"
          }
        ]
      },
      "brands": [
        {
          "id": "tide",
          "url": "https://tide.com",
          "names": [{"en_US": "Tide"}, {"es_MX": "Tide"}, {"zh_CN": "汰渍"}],
          "keller_type": "master",
          "industries": ["cpg"],
          "description": "Laundry detergent brand",
          "logos": [
            {
              "url": "https://cdn.pg.com/tide/logo-square.png",
              "orientation": "square",
              "background": "transparent-bg",
              "variant": "primary",
              "usage": "Primary logo for general use"
            },
            {
              "url": "https://cdn.pg.com/tide/logo-horizontal-dark.png",
              "orientation": "horizontal",
              "background": "dark-bg",
              "variant": "full-lockup",
              "usage": "Full lockup for dark backgrounds"
            }
          ],
          "colors": {"primary": "#FF6600", "secondary": "#0066CC", "background": "#FFFFFF", "text": "#1A1A1A", "heading": "#FF6600", "body": "#333333", "label": "#666666", "border": "#E5E5E5", "divider": "#F0F0F0", "surface_1": "#F9F9F9", "surface_2": "#EFEFEF"},
          "tone": {
            "voice": "clean, fresh, trustworthy",
            "attributes": ["reliable", "family-friendly", "confident"],
            "dos": ["Use simple, direct language", "Emphasize cleaning power"],
            "donts": ["Avoid technical jargon", "Don't be overly serious"]
          },
          "tagline": [{"en_US": "Tide's In, Dirt's Out"}],
          "visual_guidelines": {
            "photography": {
              "realism": "natural",
              "lighting": "soft daylight",
              "color_temperature": "warm",
              "contrast": "medium",
              "depth_of_field": "medium",
              "subject": {
                "people": {
                  "age_range": "25-45",
                  "diversity": "mixed",
                  "mood": ["confident", "relaxed", "happy"]
                },
                "product_focus": "in-use",
                "setting": "indoor"
              },
              "framing": {
                "subject_position": "center",
                "crop_style": "waist-up",
                "perspective": "eye-level"
              },
              "preferred_aspect_ratios": ["16:9", "4:5", "1:1"]
            },
            "graphic_style": {
              "style_type": "flat_illustration",
              "stroke_style": "rounded",
              "stroke_weight": "2px",
              "corner_radius": "12px"
            },
            "shapes": {
              "primary_shape": "circle",
              "secondary_shapes": ["rounded_rectangle"],
              "usage": {
                "max_per_layout": 2,
                "overlap_allowed": false
              }
            },
            "iconography": {
              "style": "outline",
              "stroke_weight": "2px",
              "corner_style": "rounded",
              "usage": {
                "max_per_frame": 3,
                "size_ratio": "1:8"
              }
            },
            "composition": {
              "overlays": {
                "gradient_style": "linear",
                "gradient_direction": "180deg",
                "opacity": "60%"
              },
              "texture": {
                "style": "none"
              },
              "backgrounds": {
                "types_allowed": ["solid_color", "gradient", "blurred_photo"]
              }
            },
            "border_radius": {
              "none": "0",
              "default": "12px",
              "small": "4px",
              "large": "20px",
              "pill": "999px"
            },
            "elevation": {
              "none": "none",
              "subtle": "0 1px 3px rgba(0,0,0,0.08)",
              "card": "0 4px 8px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06)",
              "modal": "0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.06)"
            },
            "spacing": {
              "unit": "8px",
              "scale": {
                "xs": "4px",
                "sm": "8px",
                "md": "16px",
                "lg": "24px",
                "xl": "32px",
                "2xl": "48px"
              }
            },
            "motion": {
              "transition_style": "dissolve",
              "animation_speed": "moderate",
              "easing": "ease-in-out",
              "text_entrance": "fade",
              "pacing": "moderate",
              "kinetic_typography": false
            },
            "logo_placement": {
              "preferred_position": "bottom-right",
              "min_clear_space": "0.5x",
              "min_height": "32px",
              "background_contrast": "any"
            },
            "colorways": [
              {
                "name": "primary",
                "foreground": "#FFFFFF",
                "background": "#FF6600",
                "accent": "#0066CC"
              },
              {
                "name": "inverted",
                "foreground": "#FF6600",
                "background": "#FFFFFF",
                "accent": "#0066CC",
                "border": "#FF6600"
              }
            ],
            "type_scale": {
              "base_width": "1080px",
              "heading": {
                "font": "primary",
                "size": "48px",
                "weight": "700",
                "line_height": "1.1",
                "text_transform": "none"
              },
              "subheading": {
                "font": "primary",
                "size": "24px",
                "weight": "600",
                "line_height": "1.3"
              },
              "body": {
                "font": "secondary",
                "size": "16px",
                "weight": "400",
                "line_height": "1.5"
              },
              "cta": {
                "font": "primary",
                "size": "18px",
                "weight": "700",
                "text_transform": "uppercase",
                "letter_spacing": "0.05em"
              }
            },
            "restrictions": [
              "Never place text over the product",
              "Do not use black backgrounds",
              "No stock photography of people on phones"
            ]
          },
          "properties": [
            {"type": "website", "identifier": "tide.com", "primary": true},
            {"type": "mobile_app", "store": "apple", "identifier": "com.pg.tide"}
          ],
          "contact": {
            "email": "brands@pg.com"
          }
        },
        {
          "id": "pampers",
          "url": "https://pampers.com",
          "names": [{"en_US": "Pampers"}],
          "keller_type": "master",
          "industries": ["cpg"],
          "logos": [
            {
              "url": "https://cdn.pg.com/pampers/logo.png",
              "orientation": "horizontal",
              "variant": "primary"
            }
          ],
          "colors": {"primary": "#00A0D2"},
          "properties": [
            {"type": "website", "identifier": "pampers.com", "primary": true}
          ]
        }
      ],
      "contact": {
        "name": "P&G Brand Team",
        "email": "brands@pg.com"
      },
      "last_updated": "2026-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "house": {
        "domain": "nikeinc.com",
        "name": "Nike, Inc.",
        "architecture": "hybrid"
      },
      "brands": [
        {
          "id": "nike",
          "url": "https://nike.com",
          "names": [{"en_US": "Nike"}, {"zh_CN": "耐克"}, {"ja_JP": "ナイキ"}],
          "keller_type": "master",
          "logos": [
            {
              "url": "https://cdn.nike.com/swoosh-dark.svg",
              "orientation": "horizontal",
              "background": "dark-bg",
              "variant": "icon",
              "usage": "Swoosh icon for dark backgrounds"
            },
            {
              "url": "https://cdn.nike.com/logo-full.svg",
              "orientation": "horizontal",
              "background": "light-bg",
              "variant": "full-lockup",
              "usage": "Full logo with wordmark for light backgrounds"
            }
          ],
          "colors": {"primary": "#111111", "accent": "#FF6600"},
          "tone": "inspirational, bold, athletic",
          "tagline": [{"en_US": "Just Do It"}],
          "properties": [
            {"type": "website", "identifier": "nike.com", "primary": true},
            {"type": "website", "identifier": "nike.cn", "region": "CN"},
            {"type": "mobile_app", "store": "apple", "identifier": "com.nike.omega"}
          ]
        },
        {
          "id": "air_jordan",
          "url": "https://jordan.com",
          "names": [{"en_US": "Air Jordan"}, {"en_US": "Jordan"}, {"en_US": "Jumpman"}],
          "keller_type": "endorsed",
          "parent_brand": "nike",
          "logos": [
            {
              "url": "https://cdn.nike.com/jumpman.svg",
              "orientation": "square",
              "background": "transparent-bg",
              "variant": "icon"
            }
          ],
          "colors": {"primary": "#CE1141", "secondary": "#111111"},
          "properties": [
            {"type": "website", "identifier": "jordan.com", "primary": true},
            {"type": "website", "identifier": "jumpman23.com"}
          ],
          "brand_agent": {
            "url": "https://dam.nike.com/mcp",
            "id": "nike_dam"
          }
        },
        {
          "id": "converse",
          "url": "https://converse.com",
          "names": [{"en_US": "Converse"}],
          "keller_type": "independent",
          "logos": [
            {
              "url": "https://cdn.converse.com/star.svg",
              "orientation": "square",
              "variant": "icon"
            }
          ],
          "properties": [
            {"type": "website", "identifier": "converse.com", "primary": true}
          ]
        }
      ],
      "authorized_operators": [
        {
          "domain": "wpp.com",
          "brands": ["nike", "air_jordan"],
          "countries": ["US", "GB", "DE", "FR"],
          "scopes": ["media_buying", "creative_generation"],
          "valid_from": "2026-01-01T00:00:00Z",
          "valid_until": "2027-01-01T00:00:00Z"
        },
        {
          "domain": "dentsu.co.jp",
          "brands": ["nike"],
          "countries": ["JP"],
          "scopes": ["media_buying"]
        },
        {
          "domain": "nike.com",
          "brands": ["*"],
          "scopes": ["all"]
        }
      ],
      "last_updated": "2026-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "house": {
        "domain": "mediavine.com",
        "name": "Mediavine",
        "architecture": "branded_house"
      },
      "brands": [
        {
          "id": "mediavine",
          "url": "https://mediavine.com",
          "names": [{"en_US": "Mediavine"}],
          "keller_type": "master",
          "properties": [
            {"type": "website", "identifier": "mediavine.com", "primary": true},
            {"type": "website", "identifier": "thehollywoodgossip.com", "relationship": "delegated"},
            {"type": "website", "identifier": "foodfanatic.com", "relationship": "delegated"},
            {"type": "website", "identifier": "thebiglead.com", "relationship": "delegated"}
          ],
          "agents": [
            {
              "type": "sales",
              "url": "https://ads.mediavine.com/mcp",
              "id": "mediavine_sales"
            }
          ]
        }
      ],
      "last_updated": "2026-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "house": {
        "domain": "nikeinc.com",
        "name": "Nike, Inc.",
        "architecture": "hybrid"
      },
      "brands": [
        {
          "id": "nike_sb",
          "names": [{"en_US": "Nike SB"}],
          "keller_type": "sub_brand",
          "logos": [
            {"url": "https://nike.com/sb/logo.svg", "variant": "primary"}
          ]
        }
      ],
      "brand_refs": [
        { "domain": "converse.com", "brand_id": "converse" },
        { "domain": "jordan.com", "brand_id": "jordan" }
      ],
      "last_updated": "2026-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "house": {
        "domain": "wpp.com",
        "name": "WPP plc"
      },
      "brand_refs": [
        { "domain": "bbh-sport.com", "brand_id": "bbh_sport", "managed_by": "bbh.com" },
        { "domain": "ogilvy-toyota.com", "brand_id": "ogilvy_toyota", "managed_by": "ogilvy.com" },
        { "domain": "wpp-direct.com", "brand_id": "wpp_direct" }
      ],
      "last_updated": "2026-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "id": "converse",
      "names": [{"en_US": "Converse"}],
      "keller_type": "sub_brand",
      "house_domain": "nikeinc.com",
      "logos": [
        {"url": "https://converse.com/logo.svg", "variant": "primary"}
      ],
      "tagline": "Sneaker for the streets",
      "last_updated": "2026-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/latest/brand.json",
      "version": "1.0",
      "id": "patagonia",
      "names": [{"en_US": "Patagonia"}],
      "keller_type": "independent",
      "logos": [
        {"url": "https://patagonia.com/logo.svg", "variant": "primary"}
      ],
      "tagline": "We're in business to save our home planet.",
      "last_updated": "2026-01-15T10:00:00Z"
    }
  ]
}
