adagents.json file provides a standardized way for publishers to declare their properties and authorize sales agents. This is the foundation of Property Governance - it defines what properties exist and who can sell them.
File Location
Publishers must host theadagents.json file at:
Basic Structure
The file must be valid JSON with UTF-8 encoding and return HTTP 200 status.Schema Fields
$schema (optional): JSON Schema reference for validation
contact (optional): Contact info for entity managing this file
name(required): Name of managing entity (may be publisher or third-party)email(optional): Contact email for questions/issuesdomain(optional): Primary domain of managing entityseller_id(optional): Seller ID from IAB Tech Lab sellers.jsontag_id(optional): TAG Certified Against Fraud IDprivacy_policy_url(optional): URL to entity’s privacy policy for consumer consent flows
properties (optional): Array of properties covered by this file (canonical property definitions)
supported_channels(optional): Advertising channels this property supports (e.g.,["display", "olv", "social"]). See Media Channel Taxonomy.
tags (optional): Tag metadata providing human-readable context and enabling efficient grouping
authorized_agents (required): Array of authorized sales agents
url(required): Agent’s API endpoint URLauthorized_for(required): Human-readable authorization descriptionauthorization_type(optional): One ofproperty_ids,property_tags,inline_properties,publisher_properties- Additional fields: Depends on authorization_type (see patterns below)
last_updated (optional): ISO 8601 timestamp of last modification
property_features (optional): Array of governance agents that provide data about properties in this file
url(required): Agent’s API endpoint URL (governance agent implementing property governance tasks)name(required): Human-readable name of the vendor/agentfeatures(required): Array of feature IDs this agent provides (e.g.,["carbon_score", "mfa_score"])publisher_id(optional): Publisher’s identifier at this agent (for lookup)
URL Reference Pattern
For publishers with complex infrastructure or CDN distribution,adagents.json can reference an authoritative URL instead of containing the full structure inline.
When to Use URL References
- CDN Distribution: Serve authorization data from a global CDN for better performance
- Centralized Management: Single source of truth across multiple domains
- Large Files: When authorization data is too large for inline embedding
- Dynamic Updates: When authorization needs frequent updates without touching domain files
URL Reference Structure
Requirements
- HTTPS Required: The
authoritative_locationmust use HTTPS - No Nested References: The authoritative file cannot itself be a URL reference (prevents infinite loops)
- Same Schema: The authoritative file must be a valid inline adagents.json structure
- Single Hop: Only one level of URL indirection is allowed
Example Use Case: Multi-Domain Publisher
A publisher with multiple domains can maintain one authoritative file: On each domain (https://domain1.com/.well-known/adagents.json, https://domain2.com/.well-known/adagents.json, etc.):
https://cdn.publisher.com/adagents/v2/adagents.json):
Validation Behavior
When AdCP validators encounter a URL reference:- Fetch Reference: Retrieve the file at
/.well-known/adagents.json - Detect Reference: Check for
authoritative_locationfield - Validate URL: Ensure
authoritative_locationis HTTPS and valid - Fetch Authoritative: Retrieve content from
authoritative_location - Prevent Loops: Reject if authoritative file is also a reference
- Validate Structure: Validate the authoritative file as normal inline structure
Caching Recommendations
- Cache reference files for 24 hours minimum
- Cache authoritative files separately with their own TTL
- Use
last_updatedtimestamp to detect when cache should be invalidated - Implement exponential backoff for failed fetches
Authorization Patterns
AdCP supports four authorization patterns, each optimized for different use cases:Pattern 1: Property IDs (Direct References)
Best for: Specific, enumerable property lists. Direct and unambiguous. Structure:property_ids array. The properties must be defined in the top-level properties array.
Pattern 2: Property Tags (Efficient Grouping)
Best for: Large networks where one tag can reference hundreds/thousands of properties. Provides grouping efficiency without listing every property ID. Key Insight: Tags are not just “human-readable metadata” - they’re a performance optimization. A publisher with 500 properties can use one tag to authorize all of them, rather than listing 500 property IDs. Structure:tags array in each property definition.
Pattern 3: Inline Properties
Best for: Small, specific property sets without top-level property declarations. Structure:properties array. Useful when each agent has unique property definitions.
Pattern 4: Publisher Property References
Best for: Third-party agents representing multiple publishers. Single source of truth for property definitions. Structure:publisher_domain points to the publisher, and selection_type determines how to resolve properties (by_id or by_tag).
Domain Matching Rules
For website properties with domain identifiers, AdCP follows web conventions:Base Domain (example.com)
Matches domain plus standard web subdomains:
- ✅
example.com - ✅
www.example.com(standard web) - ✅
m.example.com(standard mobile) - ❌
subdomain.example.com(requires explicit authorization)
Specific Subdomain (subdomain.example.com)
Matches only that exact subdomain:
- ✅
subdomain.example.com - ❌ All other domains/subdomains
Wildcard (*.example.com)
Matches ALL subdomains but NOT base:
- ✅ Any subdomain
- ❌
example.com(base domain requires separate authorization)
Real-World Examples
Example 1: Meta Network (Tag-Based)
Large network using tags for grouping efficiency:meta_network) authorizes all properties without listing individual property IDs. As Meta adds properties, they just tag them - no need to update agent authorization.
Example 2: CNN (Channel Segmentation)
Different agents for different channels:Example 3: Publisher with Governance Agent References
Publishers can declare which governance agents have data about their properties usingproperty_features. This enables buyers to discover where to get sustainability, quality, and suitability data.
- Publishers declare relationships with governance agents upfront
- Buyers discover governance agents by reading adagents.json (no need to query every possible agent)
- The
publisher_idfield helps agents look up the publisher’s data efficiently - Feature IDs tell buyers what data types are available without querying
Governance Agent Discovery
Theproperty_features field solves a key discovery problem: how does a buyer know which governance agents have data about a given property?
When to Use property_features
| Scenario | Use property_features? |
|---|---|
| Publisher has carbon scoring from a sustainability vendor | ✅ Yes |
| Publisher has MFA score measured by a quality vendor | ✅ Yes |
| Publisher has content classification from a suitability vendor | ✅ Yes |
| Publisher self-reports brand suitability | ❌ No - use property tags |
| Sales agent provides quality data | ❌ No - that’s agent capability |
Vendor Extensions
Governance agents can include vendor-specific data in feature definitions via anext block. See get_adcp_capabilities for details.
Fetching and Validating
Using the AdAgents.json Builder
The easiest way to validate or create an adagents.json file is using the AdAgents.json Builder web tool. It provides:- Domain validation (fetches and checks
/.well-known/adagents.json) - Structure validation against the JSON schema
- Agent card endpoint verification (checks if agent URLs respond correctly)
- Guided file creation with proper formatting
Programmatic Validation
For programmatic validation, use the validation API:https://{domain}/.well-known/adagents.json, validates its structure, follows URL references if present, and optionally checks agent card endpoints.
Using AdCP Client Libraries
The AdCP client libraries provide built-in validation and authorization checking:AdagentsValidationError.
Best Practices
1. Use Appropriate Authorization Pattern
- Property IDs: Small, enumerable lists (< 20 properties)
- Property Tags: Large networks (100+ properties)
- Inline Properties: Simple cases without top-level properties
- Publisher Properties: Third-party agents representing multiple publishers
2. Cache Files Appropriately
- Cache for 24 hours minimum
- Use
last_updatedtimestamp to detect staleness - Handle 404 as “no file” (not an error - proceed without validation)
- Implement retry logic with exponential backoff for network errors
3. Validate Structure
- Validate against JSON schema before processing
- Check required fields exist (
authorized_agentsarray) - Verify authorization scope matches product claims
- Cross-reference with seller.json if available
4. Handle Missing Files Gracefully
- 404 status = No file present (not an authorization failure)
- Absence of file does not mean agent is unauthorized
- Use adagents.json as verification, not requirement
Next Steps
After implementing adagents.json validation:- Integrate with Product Discovery: Use
get_productsto discover inventory - Validate at Purchase: Check authorization before calling
create_media_buy - Cache Property Mappings: Store resolved properties for efficient validation
- Monitor Authorization: Track validation success rates and unauthorized attempts
Learn More
- AdCP Basics: Authorized Properties - Accessible introduction to AdCP authorization
- get_adcp_capabilities - Discover agent capabilities and portfolio
- Property Schema - Property definition structure
- AdAgents.json Builder - Web-based validator and creator