{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "/schemas/3.1.0-rc.4/adagents.json",
  "title": "AdCP Agents Authorization",
  "description": "Declaration of authorized agents for advertising inventory and data signals. Hosted at /.well-known/adagents.json on publisher domains (for properties) or data provider domains (for signals). Can either contain the full structure inline or reference an authoritative URL.",
  "oneOf": [
    {
      "type": "object",
      "description": "URL reference variant - points to the authoritative location of the adagents.json file",
      "properties": {
        "$schema": {
          "type": "string",
          "description": "JSON Schema identifier for this adagents.json file"
        },
        "authoritative_location": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data. Because one deploy can change authorization across every publisher in the network, validators MUST cap response size, refuse redirects on the fetch, enforce short timeouts, and serve the previously cached file on transient 5xx. Two-tier size cap: pointer files served at `/.well-known/adagents.json` use the general 5 MB SSRF cap; dereferenced authoritative files (this URL's response, after the indirection) use a recommended 20 MB cap because the origin has explicitly opted in to fanning out across a publisher network. See docs/governance/property/managed-networks#security-considerations."
        },
        "last_updated": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 timestamp indicating when this reference was last updated"
        }
      },
      "required": [
        "authoritative_location"
      ],
      "additionalProperties": true
    },
    {
      "type": "object",
      "description": "Inline structure variant - contains full agent authorization data",
      "properties": {
        "$schema": {
          "type": "string",
          "description": "JSON Schema identifier for this adagents.json file"
        },
        "contact": {
          "type": "object",
          "description": "Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)",
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the entity managing this file (e.g., 'Meta Advertising Operations', 'Clear Channel Digital')",
              "minLength": 1,
              "maxLength": 255
            },
            "email": {
              "type": "string",
              "format": "email",
              "description": "Contact email for questions or issues with this authorization file",
              "minLength": 1,
              "maxLength": 255
            },
            "domain": {
              "type": "string",
              "description": "Primary domain of the entity managing this file",
              "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"
            },
            "seller_id": {
              "type": "string",
              "description": "Seller ID from IAB Tech Lab sellers.json (if applicable)",
              "minLength": 1,
              "maxLength": 255
            },
            "tag_id": {
              "type": "string",
              "description": "TAG Certified Against Fraud ID for verification (if applicable)",
              "minLength": 1,
              "maxLength": 100
            },
            "privacy_policy_url": {
              "type": "string",
              "format": "uri",
              "description": "URL to the entity's privacy policy. Used for consumer consent flows when interacting with this sales agent."
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": true
        },
        "catalog_etag": {
          "type": "string",
          "minLength": 1,
          "maxLength": 255,
          "description": "Opaque publisher-controlled cache validator for the public catalog portions of this file (`properties[]`, `collections[]`, `placements[]`, `formats[]`, `signals[]`, and tag metadata). Publishers SHOULD change this value whenever any catalog entry or catalog-scoped authorization changes, even when the hosting URL and HTTP validators stay the same. Buyer SDKs SHOULD cache resolved catalog lookups by URL plus `catalog_etag` (falling back to HTTP ETag/Last-Modified, then bounded TTL when absent) and re-resolve placement, format, collection, property, and signal references when it changes. This value is not a cryptographic digest; it is a compact version token such as a deployment hash, revision ID, or ISO timestamp."
        },
        "properties": {
          "type": "array",
          "description": "Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.",
          "items": {
            "$ref": "/schemas/3.1.0-rc.4/core/property.json"
          },
          "minItems": 1
        },
        "revoked_publisher_domains": {
          "type": "array",
          "description": "Publisher domains explicitly removed from this managed network. Validators MUST treat any publisher domain listed here as no-longer-authorized, taking precedence over any appearance of the same domain in `authorized_agents[].publisher_properties[].publisher_domain` / `.publisher_domains[]`, in `authorized_agents[].properties[].publisher_domain` (`inline_properties` authorization type), or in top-level `properties[].publisher_domain`. Lets a network propagate per-publisher revocations on the next refresh instead of waiting for the file-level 7-day cache cap. Validators MUST hold previously-observed `(publisher_domain, revoked_at)` tuples for 7 days from the validator's first observation, even if the entry vanishes from a subsequent fetch — this closes the rollback gap where an attacker re-serves a stale file with the revocation removed. Networks SHOULD retain entries for at least 7 days after `revoked_at` so validators that didn't observe the original entry still pick it up on refresh.",
          "items": {
            "type": "object",
            "properties": {
              "publisher_domain": {
                "type": "string",
                "description": "Publisher domain being revoked. Matches against the same canonicalized form used in `publisher_properties[].publisher_domain`.",
                "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"
              },
              "revoked_at": {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 timestamp when this publisher was revoked. Validators MAY use this to order revocations against their own cached state."
              },
              "reason": {
                "type": "string",
                "enum": [
                  "relationship_ended",
                  "compliance_violation",
                  "publisher_request",
                  "other"
                ],
                "description": "Reason for revocation. **Operator-internal self-classification for review routing — not a public accusation.** `relationship_ended` is the routine commercial case. `compliance_violation` SHOULD be used only when the network has itself determined the publisher is out of policy; for un-adjudicated third-party allegations (regulator inquiries, advertiser complaints, ongoing investigations), use `other` to avoid making a discoverable adverse statement. `publisher_request` is for publisher-initiated exits. Compare to sellers.json, which deliberately carries no reason field for the same exposure concern."
              }
            },
            "required": [
              "publisher_domain",
              "revoked_at"
            ],
            "additionalProperties": true
          }
        },
        "collections": {
          "type": "array",
          "description": "Collections produced or distributed by this publisher. Declares the content programs whose inventory is sold through authorized agents. Products in get_products responses reference these collections by collection_id.",
          "items": {
            "$ref": "/schemas/3.1.0-rc.4/core/collection.json"
          }
        },
        "placements": {
          "type": "array",
          "description": "Canonical placement definitions for properties in this file. Products SHOULD reuse these placement_id values when exposing inventory in get_products, and authorized agents can scope authorization to these placement IDs.",
          "items": {
            "$ref": "/schemas/3.1.0-rc.4/core/placement-definition.json"
          },
          "minItems": 1
        },
        "formats": {
          "type": "array",
          "description": "Publisher-authoritative format catalog. Declares the 3.1+ canonical format-option shapes the publisher supports across its properties — the single place a publisher (or its community-registry stand-in) asserts \"these are the formats my inventory accepts.\" Products selling this publisher's inventory SHOULD reference these declarations by `format_option_id` on the placement or via inline `format_options` whose `format_option_id` matches an entry here, eliminating the N-copies-of-Meta-Reels-on-N-products drift surface.\n\nEach item is a `ProductFormatDeclaration` (same 3.1+ canonical format-option shape used on Products) plus optional `applies_to_property_ids` / `applies_to_property_tags` for property scoping within the file. A `formats[]` entry without scope applies to all properties in the file; with scope, only to the named subset (e.g., Reels applies to Instagram + Facebook but not WhatsApp).\n\n**Community registry pattern (normative for unadopted platforms).** When a platform hasn't adopted AdCP (Meta, TikTok, Snap, Pinterest, etc.), AAO publishes a community-maintained adagents.json at `https://creative.adcontextprotocol.org/translated/<platform>/adagents.json` carrying that platform's `formats[]`. Buyer SDKs fetch the platform's own `<domain>/.well-known/adagents.json` first; on 404 or absence-of-formats[], they fall back to the AAO mirror. When the platform adopts AdCP and publishes their own adagents.json with `formats[]`, the platform-hosted file takes precedence and the mirror entry becomes redundant (AAO maintainers deprecate it).\n\nThe `v1_format_ref.agent_url` on each declaration SHOULD match the agent_url of the file's hosting location — platform-hosted formats point at the platform's agent, community-mirror formats point at `https://creative.adcontextprotocol.org/translated/<platform>`. This keeps the legacy named-format namespace converged regardless of which side hosts the catalog. See `docs/creative/canonical-formats.mdx` Meta Reels worked example.",
          "items": {
            "allOf": [
              { "$ref": "/schemas/3.1.0-rc.4/core/product-format-declaration.json" },
              {
                "type": "object",
                "properties": {
                  "applies_to_property_ids": {
                    "type": "array",
                    "description": "Optional property IDs from this file's `properties[]` that this format declaration applies to. When omitted, the declaration applies to all properties in the file. Mutually compatible with `applies_to_property_tags` (union is the effective scope). Example: Meta declares Reels with `applies_to_property_ids: [\"instagram\", \"facebook\"]` because WhatsApp doesn't carry Reels inventory.",
                    "items": { "$ref": "/schemas/3.1.0-rc.4/core/property-id.json" },
                    "minItems": 1
                  },
                  "applies_to_property_tags": {
                    "type": "array",
                    "description": "Optional property tags from this file's `tags` map that this format declaration applies to. When omitted, the declaration applies to all properties in the file. Useful for network-wide formats (e.g., a managed network declaring `applies_to_property_tags: [\"premium_video\"]`). Compatible with `applies_to_property_ids` — a property is in scope if it matches either ID list or tag list.",
                    "items": { "$ref": "/schemas/3.1.0-rc.4/core/property-tag.json" },
                    "minItems": 1
                  }
                }
              }
            ]
          },
          "minItems": 1
        },
        "superseded_by": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "description": "Optional pointer indicating this adagents.json file has been superseded by another adagents.json at a different URL. Used by the AAO community-mirror lifecycle: when a platform (e.g., Meta) adopts AdCP and publishes its own adagents.json at `<platform-domain>/.well-known/adagents.json`, the AAO mirror file at `creative.adcontextprotocol.org/translated/<platform>/adagents.json` sets `superseded_by` to the platform-hosted URL. Buyer SDKs encountering a file with `superseded_by` SHOULD short-circuit and re-fetch from the named URL rather than serving stale content from the mirror. The mirror SHOULD continue serving with `superseded_by` set for ≥1 minor release after platform adoption so buyer caches keyed on the mirror URL get an explicit migration signal rather than a silent break."
        },
        "tags": {
          "type": "object",
          "description": "Metadata for each tag referenced by properties. Provides human-readable context for property tag values.",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Human-readable name for this tag"
              },
              "description": {
                "type": "string",
                "description": "Description of what this tag represents"
              }
            },
            "required": [
              "name",
              "description"
            ],
            "additionalProperties": true
          }
        },
        "placement_tags": {
          "type": "object",
          "description": "Metadata for each tag referenced by placements. Provides human-readable context for publisher-defined placement tag values used in grouping and authorization.",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Human-readable name for this placement tag"
              },
              "description": {
                "type": "string",
                "description": "Description of what this placement tag represents"
              }
            },
            "required": [
              "name",
              "description"
            ],
            "additionalProperties": true
          }
        },
        "authorized_agents": {
          "type": "array",
          "description": "Array of sales agents authorized to make inventory from this file available to buyers. Authorization can be scoped to specific properties, collections, countries, and time windows, with optional delegation metadata indicating whether the path is direct, delegated, or network-mediated.",
          "items": {
            "discriminator": {
              "propertyName": "authorization_type"
            },
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "authorization_type": {
                    "type": "string",
                    "const": "property_ids",
                    "description": "Discriminator indicating authorization by specific property IDs"
                  },
                  "property_ids": {
                    "type": "array",
                    "description": "Property IDs this agent is authorized for. Resolved against the top-level properties array in this file",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/property-id.json"
                    },
                    "minItems": 1
                  },
                  "collections": {
                    "type": "array",
                    "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/collection-selector.json"
                    },
                    "minItems": 1
                  },
                  "placement_ids": {
                    "type": "array",
                    "description": "Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1
                  },
                  "placement_tags": {
                    "type": "array",
                    "description": "Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "delegation_type": {
                    "type": "string",
                    "enum": [
                      "direct",
                      "delegated",
                      "ad_network"
                    ],
                    "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint."
                  },
                  "exclusive": {
                    "type": "boolean",
                    "description": "Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory."
                  },
                  "countries": {
                    "type": "array",
                    "description": "Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.",
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z]{2}$"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "effective_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional start time for this authorization window."
                  },
                  "effective_until": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional end time for this authorization window."
                  }
                },
                "required": [
                  "authorization_type",
                  "property_ids"
                ],
                "additionalProperties": true,
                "allOf": [
                  {
                    "$ref": "/schemas/3.1.0-rc.4/core/authorized-agent-base.json"
                  }
                ]
              },
              {
                "type": "object",
                "properties": {
                  "authorization_type": {
                    "type": "string",
                    "const": "property_tags",
                    "description": "Discriminator indicating authorization by property tags"
                  },
                  "property_tags": {
                    "type": "array",
                    "description": "Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/property-tag.json"
                    },
                    "minItems": 1
                  },
                  "collections": {
                    "type": "array",
                    "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/collection-selector.json"
                    },
                    "minItems": 1
                  },
                  "placement_ids": {
                    "type": "array",
                    "description": "Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1
                  },
                  "placement_tags": {
                    "type": "array",
                    "description": "Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "delegation_type": {
                    "type": "string",
                    "enum": [
                      "direct",
                      "delegated",
                      "ad_network"
                    ],
                    "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint."
                  },
                  "exclusive": {
                    "type": "boolean",
                    "description": "Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory."
                  },
                  "countries": {
                    "type": "array",
                    "description": "Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.",
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z]{2}$"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "effective_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional start time for this authorization window."
                  },
                  "effective_until": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional end time for this authorization window."
                  }
                },
                "required": [
                  "authorization_type",
                  "property_tags"
                ],
                "additionalProperties": true,
                "allOf": [
                  {
                    "$ref": "/schemas/3.1.0-rc.4/core/authorized-agent-base.json"
                  }
                ]
              },
              {
                "type": "object",
                "properties": {
                  "authorization_type": {
                    "type": "string",
                    "const": "inline_properties",
                    "description": "Discriminator indicating authorization by inline property definitions. Companion field is `properties` (not `inline_properties`) — the only authorization_type whose companion field name does not mirror the discriminator value."
                  },
                  "properties": {
                    "type": "array",
                    "description": "Specific properties this agent is authorized for, defined inline on the agent entry (alternative to property_ids/property_tags). Note: this is the companion field for `authorization_type: \"inline_properties\"` — the field is named `properties`, not `inline_properties`.",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/property.json"
                    },
                    "minItems": 1
                  },
                  "collections": {
                    "type": "array",
                    "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/collection-selector.json"
                    },
                    "minItems": 1
                  },
                  "placement_ids": {
                    "type": "array",
                    "description": "Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1
                  },
                  "placement_tags": {
                    "type": "array",
                    "description": "Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "delegation_type": {
                    "type": "string",
                    "enum": [
                      "direct",
                      "delegated",
                      "ad_network"
                    ],
                    "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint."
                  },
                  "exclusive": {
                    "type": "boolean",
                    "description": "Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory."
                  },
                  "countries": {
                    "type": "array",
                    "description": "Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.",
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z]{2}$"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "effective_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional start time for this authorization window."
                  },
                  "effective_until": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional end time for this authorization window."
                  }
                },
                "required": [
                  "authorization_type",
                  "properties"
                ],
                "additionalProperties": true,
                "allOf": [
                  {
                    "$ref": "/schemas/3.1.0-rc.4/core/authorized-agent-base.json"
                  }
                ]
              },
              {
                "type": "object",
                "properties": {
                  "authorization_type": {
                    "type": "string",
                    "const": "publisher_properties",
                    "description": "Discriminator indicating authorization for properties from other publisher domains"
                  },
                  "publisher_properties": {
                    "type": "array",
                    "description": "Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/publisher-property-selector.json"
                    },
                    "minItems": 1
                  },
                  "collections": {
                    "type": "array",
                    "description": "Optional collection constraints. When present, authorization only applies to inventory associated with these collections.",
                    "items": {
                      "$ref": "/schemas/3.1.0-rc.4/core/collection-selector.json"
                    },
                    "minItems": 1
                  },
                  "placement_ids": {
                    "type": "array",
                    "description": "Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1
                  },
                  "placement_tags": {
                    "type": "array",
                    "description": "Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "delegation_type": {
                    "type": "string",
                    "enum": [
                      "direct",
                      "delegated",
                      "ad_network"
                    ],
                    "description": "Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint."
                  },
                  "exclusive": {
                    "type": "boolean",
                    "description": "Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory."
                  },
                  "countries": {
                    "type": "array",
                    "description": "Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.",
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z]{2}$"
                    },
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "effective_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional start time for this authorization window."
                  },
                  "effective_until": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional end time for this authorization window."
                  }
                },
                "required": [
                  "authorization_type",
                  "publisher_properties"
                ],
                "additionalProperties": true,
                "allOf": [
                  {
                    "$ref": "/schemas/3.1.0-rc.4/core/authorized-agent-base.json"
                  }
                ]
              },
              {
                "type": "object",
                "description": "Authorization for signals by specific signal IDs",
                "properties": {
                  "authorization_type": {
                    "type": "string",
                    "const": "signal_ids",
                    "description": "Discriminator indicating authorization by specific signal IDs"
                  },
                  "signal_ids": {
                    "type": "array",
                    "description": "Signal IDs this agent is authorized to resell. Resolved against the top-level signals array in this file",
                    "items": {
                      "type": "string",
                      "pattern": "^[a-zA-Z0-9_-]+$"
                    },
                    "minItems": 1
                  }
                },
                "required": [
                  "authorization_type",
                  "signal_ids"
                ],
                "additionalProperties": true,
                "allOf": [
                  {
                    "$ref": "/schemas/3.1.0-rc.4/core/authorized-agent-base.json"
                  }
                ]
              },
              {
                "type": "object",
                "description": "Authorization for signals by tag membership",
                "properties": {
                  "authorization_type": {
                    "type": "string",
                    "const": "signal_tags",
                    "description": "Discriminator indicating authorization by signal tags"
                  },
                  "signal_tags": {
                    "type": "array",
                    "description": "Signal tags this agent is authorized for. Agent can resell all signals with these tags",
                    "items": {
                      "type": "string",
                      "pattern": "^[a-z0-9_-]+$"
                    },
                    "minItems": 1
                  }
                },
                "required": [
                  "authorization_type",
                  "signal_tags"
                ],
                "additionalProperties": true,
                "allOf": [
                  {
                    "$ref": "/schemas/3.1.0-rc.4/core/authorized-agent-base.json"
                  }
                ]
              }
            ]
          },
          "minItems": 1
        },
        "last_updated": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 timestamp indicating when this file was last updated"
        },
        "property_features": {
          "type": "array",
          "description": "[AdCP 3.0] Optional list of agents that provide property feature data (certifications, scores, compliance status). Used for discovery - actual data is accessed through property list filters.",
          "items": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string",
                "format": "uri",
                "description": "The agent's API endpoint URL. Callers comparing this URL against a feature-provider registry MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."
              },
              "name": {
                "type": "string",
                "description": "Human-readable name of the vendor/agent (e.g., 'Scope3', 'TAG', 'OneTrust')"
              },
              "features": {
                "type": "array",
                "description": "Feature IDs this agent provides (e.g., 'carbon_score', 'tag_certified_against_fraud'). Use get_adcp_capabilities on the agent for full definitions.",
                "items": {
                  "type": "string"
                },
                "minItems": 1
              },
              "publisher_id": {
                "type": "string",
                "description": "Optional publisher identifier at this agent (for lookup)"
              }
            },
            "required": [
              "url",
              "name",
              "features"
            ],
            "additionalProperties": true
          }
        },
        "signals": {
          "type": "array",
          "description": "Signal definitions published by this domain. Each entry defines a signal id within this file's publishing-domain namespace; entries do not include signal_ref objects. Signals Protocol discovery and media-buy product targeting reference these through signal_ref scope 'data_provider', with data_provider_domain set to this file's publishing domain and signal_id set to signals[].id.",
          "items": {
            "$ref": "/schemas/3.1.0-rc.4/core/signal-definition.json"
          },
          "minItems": 1
        },
        "signal_tags": {
          "type": "object",
          "description": "Metadata for each tag referenced by signals. Provides human-readable context for signal tag values.",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Human-readable name for this tag"
              },
              "description": {
                "type": "string",
                "description": "Description of what this tag represents"
              }
            },
            "required": [
              "name",
              "description"
            ],
            "additionalProperties": true
          }
        }
      },
      "required": [
        "authorized_agents"
      ],
      "additionalProperties": true
    }
  ],
  "examples": [
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "authoritative_location": "https://cdn.example.com/adagents/v2/adagents.json",
      "last_updated": "2025-01-15T10:00:00Z"
    },
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "properties": [
        {
          "property_id": "example_site",
          "property_type": "website",
          "name": "Example Site",
          "identifiers": [
            {
              "type": "domain",
              "value": "example.com"
            }
          ],
          "publisher_domain": "example.com"
        }
      ],
      "placements": [
        {
          "placement_id": "homepage_banner",
          "name": "Homepage Banner",
          "tags": [
            "homepage",
            "display",
            "premium"
          ],
          "property_ids": [
            "example_site"
          ],
          "format_options": [
            {
              "format_kind": "image",
              "params": {
                "width": 728,
                "height": 90
              }
            }
          ]
        }
      ],
      "placement_tags": {
        "homepage": {
          "name": "Homepage",
          "description": "Placements that render on the homepage"
        },
        "display": {
          "name": "Display",
          "description": "Standard display placements"
        },
        "premium": {
          "name": "Premium",
          "description": "Premium monetization placements"
        }
      },
      "authorized_agents": [
        {
          "url": "https://agent.example.com",
          "authorized_for": "Official sales agent",
          "authorization_type": "property_tags",
          "property_tags": [
            "all"
          ],
          "placement_ids": [
            "homepage_banner"
          ],
          "delegation_type": "direct",
          "exclusive": true,
          "countries": [
            "US",
            "CA"
          ],
          "effective_from": "2025-01-01T00:00:00Z"
        }
      ],
      "tags": {
        "all": {
          "name": "All Properties",
          "description": "All properties in this file"
        }
      },
      "last_updated": "2025-01-10T12:00:00Z"
    },
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "contact": {
        "name": "Meta Advertising Operations",
        "email": "adops@meta.com",
        "domain": "meta.com",
        "seller_id": "pub-meta-12345",
        "tag_id": "12345",
        "privacy_policy_url": "https://www.meta.com/privacy/policy"
      },
      "properties": [
        {
          "property_type": "mobile_app",
          "name": "Instagram",
          "identifiers": [
            {
              "type": "ios_bundle",
              "value": "com.burbn.instagram"
            },
            {
              "type": "android_package",
              "value": "com.instagram.android"
            }
          ],
          "tags": [
            "meta_network",
            "social_media"
          ],
          "supported_channels": [
            "social",
            "display",
            "olv"
          ],
          "publisher_domain": "instagram.com"
        },
        {
          "property_type": "mobile_app",
          "name": "Facebook",
          "identifiers": [
            {
              "type": "ios_bundle",
              "value": "com.facebook.Facebook"
            },
            {
              "type": "android_package",
              "value": "com.facebook.katana"
            }
          ],
          "tags": [
            "meta_network",
            "social_media"
          ],
          "supported_channels": [
            "social",
            "display",
            "olv"
          ],
          "publisher_domain": "facebook.com"
        },
        {
          "property_type": "mobile_app",
          "name": "WhatsApp",
          "identifiers": [
            {
              "type": "ios_bundle",
              "value": "net.whatsapp.WhatsApp"
            },
            {
              "type": "android_package",
              "value": "com.whatsapp"
            }
          ],
          "tags": [
            "meta_network",
            "messaging"
          ],
          "supported_channels": [
            "social",
            "display"
          ],
          "publisher_domain": "whatsapp.com"
        }
      ],
      "tags": {
        "meta_network": {
          "name": "Meta Network",
          "description": "All Meta-owned properties"
        },
        "social_media": {
          "name": "Social Media Apps",
          "description": "Social networking applications"
        },
        "messaging": {
          "name": "Messaging Apps",
          "description": "Messaging and communication apps"
        }
      },
      "authorized_agents": [
        {
          "url": "https://meta-ads.com",
          "authorized_for": "All Meta properties",
          "authorization_type": "property_tags",
          "property_tags": [
            "meta_network"
          ]
        }
      ],
      "last_updated": "2025-01-10T15:30:00Z"
    },
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "contact": {
        "name": "Tumblr Advertising"
      },
      "properties": [
        {
          "property_type": "website",
          "name": "Tumblr Corporate",
          "identifiers": [
            {
              "type": "domain",
              "value": "tumblr.com"
            }
          ],
          "tags": [
            "corporate"
          ],
          "publisher_domain": "tumblr.com"
        }
      ],
      "tags": {
        "corporate": {
          "name": "Corporate Properties",
          "description": "Tumblr-owned corporate properties (not user blogs)"
        }
      },
      "authorized_agents": [
        {
          "url": "https://tumblr-sales.com",
          "authorized_for": "Tumblr corporate properties only",
          "authorization_type": "property_tags",
          "property_tags": [
            "corporate"
          ]
        }
      ],
      "last_updated": "2025-01-10T16:00:00Z"
    },
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "contact": {
        "name": "Example Third-Party Sales Agent",
        "email": "sales@agent.example",
        "domain": "agent.example"
      },
      "authorized_agents": [
        {
          "url": "https://agent.example/api",
          "authorized_for": "CNN CTV properties via publisher authorization",
          "authorization_type": "publisher_properties",
          "publisher_properties": [
            {
              "publisher_domain": "cnn.com",
              "selection_type": "by_id",
              "property_ids": [
                "cnn_ctv_app"
              ]
            }
          ]
        },
        {
          "url": "https://agent.example/api",
          "authorized_for": "All CTV properties from multiple publishers",
          "authorization_type": "publisher_properties",
          "publisher_properties": [
            {
              "publisher_domain": "cnn.com",
              "selection_type": "by_tag",
              "property_tags": [
                "ctv"
              ]
            },
            {
              "publisher_domain": "espn.com",
              "selection_type": "by_tag",
              "property_tags": [
                "ctv"
              ]
            }
          ]
        },
        {
          "url": "https://agent.example/api",
          "authorized_for": "Managed-network display inventory across represented publishers (compact form)",
          "authorization_type": "publisher_properties",
          "publisher_properties": [
            {
              "publisher_domains": [
                "site1.example",
                "site2.example",
                "site3.example"
              ],
              "selection_type": "by_tag",
              "property_tags": [
                "managed_network"
              ]
            }
          ],
          "delegation_type": "ad_network"
        }
      ],
      "last_updated": "2025-01-10T17:00:00Z"
    },
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "contact": {
        "name": "Premium News Publisher",
        "email": "adops@news.example.com",
        "domain": "news.example.com"
      },
      "properties": [
        {
          "property_type": "website",
          "name": "News Example",
          "identifiers": [
            {
              "type": "domain",
              "value": "news.example.com"
            }
          ],
          "tags": [
            "premium",
            "news"
          ],
          "publisher_domain": "news.example.com"
        }
      ],
      "tags": {
        "premium": {
          "name": "Premium Properties",
          "description": "High-quality, brand-safe properties"
        },
        "news": {
          "name": "News Properties",
          "description": "News and journalism content"
        }
      },
      "authorized_agents": [
        {
          "url": "https://sales.news.example.com",
          "authorized_for": "All news properties",
          "authorization_type": "property_tags",
          "property_tags": [
            "news"
          ]
        }
      ],
      "property_features": [
        {
          "url": "https://api.scope3.com",
          "name": "Scope3",
          "features": [
            "carbon_score",
            "sustainability_grade"
          ],
          "publisher_id": "pub_news_12345"
        },
        {
          "url": "https://api.tagtoday.net",
          "name": "TAG",
          "features": [
            "tag_certified_against_fraud",
            "tag_brand_safety_certified"
          ]
        },
        {
          "url": "https://api.onetrust.com",
          "name": "OneTrust",
          "features": [
            "gdpr_compliant",
            "tcf_registered",
            "ccpa_compliant"
          ],
          "publisher_id": "ot_news_67890"
        }
      ],
      "last_updated": "2025-01-10T18:00:00Z"
    },
    {
      "$schema": "/schemas/3.1.0-rc.4/adagents.json",
      "contact": {
        "name": "Polk Automotive Data",
        "email": "partnerships@polk.com",
        "domain": "polk.com"
      },
      "signals": [
        {
          "id": "likely_tesla_buyers",
          "name": "Likely Tesla Buyers",
          "description": "Consumers modeled as likely to purchase a Tesla in the next 12 months based on vehicle registration, financial, and behavioral data",
          "value_type": "binary",
          "category": "purchase_intent",
          "tags": [
            "automotive",
            "premium"
          ]
        },
        {
          "id": "vehicle_ownership",
          "name": "Current Vehicle Ownership",
          "description": "Current vehicle make owned by the consumer",
          "value_type": "categorical",
          "category": "ownership",
          "allowed_values": [
            "tesla",
            "bmw",
            "mercedes",
            "audi",
            "lexus",
            "other_luxury",
            "non_luxury"
          ],
          "tags": [
            "automotive"
          ]
        },
        {
          "id": "purchase_propensity",
          "name": "Auto Purchase Propensity",
          "description": "Likelihood score of purchasing any new vehicle in the next 6 months",
          "value_type": "numeric",
          "category": "purchase_intent",
          "range": {
            "min": 0,
            "max": 1,
            "unit": "score"
          },
          "tags": [
            "automotive"
          ]
        }
      ],
      "signal_tags": {
        "automotive": {
          "name": "Automotive Signals",
          "description": "Vehicle-related audience segments"
        },
        "premium": {
          "name": "Premium Signals",
          "description": "High-value premium audience segments"
        }
      },
      "authorized_agents": [
        {
          "url": "https://liveramp.com/.well-known/adcp/signals",
          "authorized_for": "All Polk automotive signals via LiveRamp",
          "authorization_type": "signal_tags",
          "signal_tags": [
            "automotive"
          ]
        },
        {
          "url": "https://the-trade-desk.com/.well-known/adcp/signals",
          "authorized_for": "Polk premium signals only",
          "authorization_type": "signal_ids",
          "signal_ids": [
            "likely_tesla_buyers"
          ]
        }
      ],
      "last_updated": "2025-01-15T10:00:00Z"
    }
  ]
}
