Use this file to discover all available pages before exploring further.
Discover which publishers a sales agent is authorized to represent. Returns publisher domains only - buyers fetch full property definitions from each publisher’s adagents.json.Response Time: ~2 seconds (database lookup)Purpose:
Authorization discovery - which publishers does this agent represent?
Single source of truth - property definitions come from publisher’s adagents.json
One-time discovery to cache publisher-agent relationships
import { testAgent } from '@adcp/client/testing';// Check if agent represents specific publishersconst result = await testAgent.listAuthorizedProperties({ publisher_domains: ['cnn.com', 'espn.com']});if (result.success && result.data) { if (result.data.publisher_domains.length > 0) { console.log(`Agent represents ${result.data.publisher_domains.length} of requested publishers`); result.data.publisher_domains.forEach(domain => { console.log(`✓ ${domain}`); }); } else { console.log('Agent does not represent any of the requested publishers'); }}
import { testAgent } from '@adcp/client/testing';// Determine what type of agent this is based on portfolioconst result = await testAgent.listAuthorizedProperties({});if (result.success && result.data) { // Check for CTV specialists if (result.data.primary_channels?.includes('ctv')) { console.log('CTV specialist'); } // Check geographic focus if (result.data.primary_countries?.includes('US')) { console.log('US market focus'); } // Check for multi-channel capability if (result.data.primary_channels && result.data.primary_channels.length > 2) { console.log(`Multi-channel agent (${result.data.primary_channels.join(', ')})`); } // Read portfolio description if (result.data.portfolio_description) { console.log(`\nAbout: ${result.data.portfolio_description}`); }}
import { testAgent } from '@adcp/client/testing';// Use last_updated to determine if cache is staleconst result = await testAgent.listAuthorizedProperties({});if (result.success && result.data) { // Example cache from previous fetch (in practice, load from storage) const cache = { 'example-publisher.com': { last_updated: '2024-01-15T10:00:00Z', properties: [] } }; for (const domain of result.data.publisher_domains) { const cached = cache[domain]; if (cached && result.data.last_updated) { const cachedDate = new Date(cached.last_updated); const agentDate = new Date(result.data.last_updated); if (cachedDate >= agentDate) { console.log(`${domain}: Using cached data (still fresh)`); continue; } } console.log(`${domain}: Fetching updated property definitions`); // Fetch from publisher's adagents.json... }}
{ "primary_channels": ["dooh"], "primary_countries": ["US", "CA"], "portfolio_description": "Premium digital out-of-home across airports and transit. Business traveler focus with proof-of-play."}
News Publisher:
{ "primary_channels": ["display", "video", "native"], "primary_countries": ["US", "GB", "AU"], "portfolio_description": "News and business publisher network. Desktop and mobile web with professional audience."}
1. Cache Publisher Property Definitions
Fetch once and cache - properties rarely change. Use last_updated to detect staleness.2. Validate Authorization from Publisher
Always verify agent is in publisher’s authorized_agents array - don’t trust agent claims alone.3. Resolve Authorization Scope
Check property_ids, property_tags, or assume all properties based on publisher’s authorization entry.4. Use Portfolio Metadata for Filtering
Check primary_channels and primary_countries before fetching detailed properties.5. Handle Fetch Failures Gracefully
Publishers may be temporarily unavailable - cache and retry with backoff.