Skip to main content
Discover a seller’s protocol support and capabilities across all AdCP protocols. This is the first call a buyer should make to understand what a seller supports. Response Time: ~2 seconds (configuration lookup) Purpose:
  • AdCP discovery - Does this agent support AdCP? Which versions?
  • Protocol support - Which domain protocols (media_buy, signals, governance, sponsored_intelligence, creative)?
  • Auth model - Does this seller trust the agent directly, or must each operator authenticate independently?
  • Detailed capabilities - Features, execution integrations, geo targeting, portfolio
Request Schema: /schemas/v3/protocol/get-adcp-capabilities-request.json Response Schema: /schemas/v3/protocol/get-adcp-capabilities-response.json

Tool-Based Discovery

AdCP uses native MCP/A2A tool discovery. The presence of get_adcp_capabilities in an agent’s tool list indicates AdCP support.
Discovery Flow:
1. Browse agent's tool list (MCP) or skills (A2A)
2. See 'get_adcp_capabilities' tool → Agent supports AdCP
3. Call get_adcp_capabilities → Get version, protocols, features, capabilities
4. Proceed based on returned capabilities
This approach:
  • Uses standard MCP/A2A mechanisms (no custom extensions)
  • Always returns current capabilities (not stale metadata)
  • Single source of truth for all capability information
:::note The agent card extension (adcp-extension.json) has been removed in v3. Use tool-based discovery instead. :::

Request Parameters

FieldTypeDescription
protocolsstring[]Optional. Filter to specific protocols (media_buy, signals, governance, sponsored_intelligence, creative). If omitted, returns all supported protocols.

Response Structure

adcp

Core AdCP protocol information:
FieldTypeDescription
major_versionsinteger[]Required. AdCP major versions supported (e.g., [1])

supported_protocols

Array of domain protocols this seller supports:
{
  "supported_protocols": ["media_buy"]
}

account

Account and authentication capabilities. All sellers should declare this section — buyers read it before calling sync_accounts, list_accounts, or any authenticated task. Even simple publishers need account management to handle billing relationships and sandbox testing.
FieldTypeDescription
supported_billingstring[]Required. Billing models this seller supports: operator, agent. The buyer must pass one of these values as billing in every sync_accounts entry.
require_operator_authbooleanDefault: false. Determines the account model. When true (explicit accounts): each operator authenticates independently, buyer discovers accounts via list_accounts, passes account_id. When false (implicit accounts): agent is trusted, buyer declares accounts via sync_accounts, passes natural key (brand + operator). For sandbox, the path follows the account model: explicit accounts discover pre-existing test accounts via list_accounts; implicit accounts declare sandbox via sync_accounts with sandbox: true.
authorization_endpointstringOAuth URL for operator authentication. Present when the seller supports OAuth for operator authentication. Relevant when require_operator_auth: true; if absent, operators obtain credentials out-of-band (seller portal, API key).
required_for_productsbooleanDefault: false. When true, the buyer must establish an account before calling get_products. When false, the buyer can browse products without an account — useful for price comparison and discovery before committing to a seller.
account_financialsbooleanDefault: false. When true, the seller supports get_account_financials for querying spend, credit, and invoice status. Only applicable to operator-billed accounts.
sandboxbooleanDefault: false. Strongly recommended for production sales agents. When true, the seller supports sandbox accounts for testing. For sandbox, the path follows the account model: explicit accounts discover pre-existing test accounts via list_accounts; implicit accounts declare sandbox via sync_accounts with sandbox: true — no real platform calls or spend. See Sandbox mode.

Auth models

Implicit accounts (require_operator_auth: false) — The seller trusts the agent’s identity claims. The agent authenticates once with its own bearer token, then calls sync_accounts to declare which brands and operators it represents. The seller provisions accounts based on the agent’s claims, optionally verifying operators against brand.json. All subsequent calls use the agent’s single credential and pass natural keys (brand + operator). Explicit accounts (require_operator_auth: true) — Each operator must authenticate with the seller directly. The agent obtains a credential per operator — via OAuth using authorization_endpoint, or out-of-band — opens a per-operator session, and discovers accounts via list_accounts. The buyer passes seller-assigned account_id values on all subsequent requests. For sandbox, the path follows the account model: explicit accounts (require_operator_auth: true) discover pre-existing test accounts via list_accounts; implicit accounts declare sandbox via sync_accounts with sandbox: true. See Accounts and Agents for full workflows and seller patterns for common combinations of auth model and billing support.

media_buy

Media-buy protocol capabilities. Only present if media_buy is in supported_protocols.

features

Optional media-buy features. If declared true, seller MUST honor requests using that feature.
FeatureDescription
inline_creative_managementAccepts creatives inline in create_media_buy requests
property_list_filteringHonors property_list parameter in get_products
content_standardsFull support for content standards configuration (see content_standards_detail for specifics)
audience_targetingSupport for audience targeting and ingestion, including sync_audiences

content_standards_detail

When features.content_standards is true, sellers can provide additional detail about their content standards implementation. This gives buyers pre-buy visibility into local evaluation and artifact delivery capabilities.
FieldTypeDescription
supports_local_evaluationbooleanWhether the seller runs a local evaluation model. When false, local_verdict will always be unevaluated and the failures_only filter on get_media_buy_artifacts is not useful.
supported_channelsstring[]Channels for which the seller can provide content artifacts. Helps buyers understand which parts of a mixed-channel buy will have content standards coverage.
supports_webhook_deliverybooleanWhether the seller supports push-based artifact delivery via artifact_webhook configured at buy creation time.
Example:
{
  "features": {
    "content_standards": true
  },
  "content_standards_detail": {
    "supports_local_evaluation": true,
    "supported_channels": ["display", "olv", "podcast"],
    "supports_webhook_delivery": true
  }
}
If supports_local_evaluation is false, the failures_only filter on get_media_buy_artifacts will return an empty result set — all verdicts will be unevaluated.

execution

Technical execution capabilities:
FieldTypeDescription
trusted_matchobjectTMP support. When present, this seller supports real-time contextual and/or identity matching. Check individual products for per-product TMP capabilities.
axe_integrationsstring[]Deprecated. Legacy AXE URLs this seller can execute through. Use trusted_match for new integrations.
creative_specsobjectCreative specification support (VAST versions, MRAID, etc.)
targetingobjectTargeting capabilities (geo granularity)
axe_integrations
axe_integrations is an array of Agentic Ad Exchange (AXE) endpoint URLs that this seller can execute through. AXE is the real-time execution layer for AdCP campaigns — it connects buyer agents to programmatic inventory via standardized exchanges. When a seller declares AXE URLs in their capabilities, buyers can:
  • Route impression-level execution through the declared exchange
  • Use the exchange’s targeting, optimization, and measurement capabilities
  • Execute alongside the seller’s direct-sold inventory
Buyers discover AXE support via get_adcp_capabilities and filter products to AXE-enabled sellers using required_axe_integrations on get_products.
creative_specs
FieldTypeDescription
vast_versionsstring[]VAST versions supported (e.g., ["4.0", "4.1", "4.2"])
mraid_versionsstring[]MRAID versions supported
vpaidbooleanVPAID support
simidbooleanSIMID support
targeting
FieldTypeDescription
geo_countriesbooleanCountry-level targeting using ISO 3166-1 alpha-2 codes
geo_regionsbooleanRegion/state-level targeting using ISO 3166-2 codes (e.g., US-NY, GB-SCT)
geo_metrosobjectMetro area targeting with system-specific support
geo_postal_areasobjectPostal area targeting with country and precision support
age_restrictionobjectAge restriction capabilities with supported flag and verification_methods
device_platformbooleanDevice platform targeting (Sec-CH-UA-Platform values)
device_typebooleanDevice form factor targeting (desktop, mobile, tablet, ctv, dooh)
languagebooleanLanguage targeting (ISO 639-1 codes)
audience_includebooleanAudience inclusion targeting (requires features.audience_targeting)
audience_excludebooleanAudience exclusion targeting (requires features.audience_targeting)
keyword_targetsobjectKeyword targeting with supported_match_types array (broad, phrase, exact). Presence indicates support.
negative_keywordsobjectNegative keyword targeting with supported_match_types array. Presence indicates support.
geo_proximityobjectProximity targeting from arbitrary coordinates (see below)
Sellers that support a geographic targeting level SHOULD support both inclusion and exclusion at that level. For example, geo_metros.nielsen_dma: true SHOULD mean the seller supports both geo_metros and geo_metros_exclude with Nielsen DMA codes. If a seller only supports one direction (e.g., inclusion but not exclusion), it MUST return a validation error for unsupported fields rather than silently ignoring them. See Targeting Overlays for exclusion semantics. geo_proximity specifies which proximity targeting methods are supported:
FieldTypeDescription
radiusbooleanSimple radius targeting (distance circle from a point)
travel_timebooleanTravel time isochrone targeting (requires a routing engine)
geometrybooleanPre-computed GeoJSON geometry (buyer provides the polygon)
transport_modesstring[]Transport modes supported for isochrones: driving, walking, cycling, public_transport
geo_metros specifies which metro classification systems are supported:
SystemDescription
nielsen_dmaNielsen DMA codes (US market, e.g., 501 for NYC)
uk_itl1UK ITL Level 1 regions
uk_itl2UK ITL Level 2 regions
eurostat_nuts2Eurostat NUTS Level 2 regions (EU)
geo_postal_areas specifies which postal code systems are supported:
SystemDescription
us_zipUS 5-digit ZIP codes (e.g., 10001)
us_zip_plus_fourUS 9-digit ZIP+4 codes (e.g., 10001-1234)
gb_outwardUK postcode district (e.g., SW1, EC1)
gb_fullUK full postcode (e.g., SW1A 1AA)
ca_fsaCanadian Forward Sortation Area (e.g., K1A)
ca_fullCanadian full postal code (e.g., K1A 0B1)
de_plzGerman Postleitzahl (e.g., 10115)
fr_code_postalFrench code postal (e.g., 75001)
au_postcodeAustralian postcode (e.g., 2000)
ch_plzSwiss Postleitzahl (e.g., 8000)
at_plzAustrian Postleitzahl (e.g., 1010)

audience_targeting

Audience targeting capabilities. Only present when features.audience_targeting is true. Describes what identifier types the seller accepts for audience matching, size constraints, and expected matching latency.
FieldTypeRequiredDescription
supported_identifier_typesstring[]RequiredPII-derived identifier types accepted for audience matching. Buyers should only send identifiers the seller supports. Values: hashed_email, hashed_phone.
minimum_audience_sizeintegerRequiredMinimum matched audience size required for targeting. Audiences below this threshold will have status: too_small. Varies by platform (100–1000 is typical).
supports_platform_customer_idbooleanWhen true, the seller accepts the buyer’s CRM/loyalty ID as a matchable identifier. Only applicable when the seller operates a closed ecosystem with a shared ID namespace (e.g., a retailer matching against their loyalty program). Buyers can include platform_customer_id values in AudienceMember.identifiers. Reporting on matched IDs typically requires a clean room or the seller’s own reporting surface.
supported_uid_typesstring[]Universal ID types accepted for audience matching (MAIDs, RampID, UID2, etc.). MAID support varies significantly by platform — check this field before sending uids with type: maid.
matching_latency_hoursobjectExpected matching latency range in hours after upload. Use to calibrate polling cadence and set appropriate expectations before configuring push_notification_config. Shape: { min: integer, max: integer }.

conversion_tracking

Seller-level conversion tracking capabilities. Declares what the seller supports for kind: "event" optimization goals.
FieldTypeDescription
multi_source_event_dedupbooleanWhether the seller can deduplicate events across multiple event sources within a single goal. When true, the same event_id from multiple sources counts once. When false or absent, buyers should use a single event source per goal.
supported_event_typesstring[]Event types this seller can track. If omitted, all standard event types are supported.
supported_uid_typesstring[]Universal ID types accepted for user matching.
supported_hashed_identifiersstring[]Hashed PII types accepted (hashed_email, hashed_phone). Buyers must hash before sending (SHA-256, normalized).
supported_action_sourcesstring[]Action sources this seller accepts events from.
attribution_windowsobject[]Available attribution windows. Single-element arrays indicate fixed windows; multi-element arrays indicate configurable options the buyer can choose from via attribution_window on optimization goals.

portfolio

Inventory portfolio information:
FieldTypeDescription
publisher_domainsstring[]Required. Publisher domains this seller represents
primary_channelsstring[]Main advertising channels
primary_countriesstring[]Main countries (ISO codes)
descriptionstringMarkdown portfolio description
advertising_policiesstringContent policies and restrictions

signals

Signals protocol capabilities. Only present if signals is in supported_protocols. Reserved for future use.

creative

Creative protocol capabilities. Only present if creative is in supported_protocols.
FieldTypeDescription
supports_compliancebooleanWhen true, this creative agent can process briefs with compliance requirements (required_disclosures, prohibited_claims) and will validate that disclosures can be satisfied by the target format. Use the disclosure_positions filter on list_creative_formats to find compatible formats.

governance

Governance protocol capabilities. Only present if governance is in supported_protocols. Governance agents declare capabilities across four domains: property evaluation, creative evaluation, content standards verification, and policy registry integration.

property_features

Array of property features this governance agent can evaluate. See Property Governance.
FieldTypeDescription
feature_idstringRequired. Unique identifier (e.g., mfa_score, coppa_certified). Use registry:{policy_id} prefix for features mapped to Policy Registry entries.
typestringRequired. Data type: binary, quantitative, or categorical
rangeobjectFor quantitative: { min, max }
categoriesstring[]For categorical: valid values
descriptionstringHuman-readable description
methodology_urlstringURL to methodology documentation

creative_features

Array of creative features this governance agent can evaluate. Same field schema as property_features. See Creative Governance. Creative governance agents evaluate creatives for security, content categorization, and regulatory compliance. Buyers filter creatives by feature requirements — for example, blocking creatives flagged for auto_redirect or requiring registry:eu_ai_act_article_50 compliance.

content_standards

Content standards verification capabilities. See Content Standards.
FieldTypeDescription
supportedbooleanWhether this agent can serve as a content standards verification agent
calibration_formatsstring[]Artifact asset types this agent can evaluate (e.g., text, image, video, audio)

policy_registry

Policy registry integration capabilities. See Policy Registry.
FieldTypeDescription
supportedbooleanWhether this agent consumes policies from the AdCP Policy Registry
domainsstring[]Governance domains this agent covers (e.g., campaign, property, creative, content_standards)
Example governance agent response:
{
  "$schema": "/schemas/protocol/get-adcp-capabilities-response.json",
  "adcp": { "major_versions": [1] },
  "supported_protocols": ["governance"],
  "governance": {
    "property_features": [
      { "feature_id": "mfa_score", "type": "quantitative", "range": { "min": 0, "max": 100 }, "description": "Made For Advertising detection (0=quality content, 100=likely MFA)", "methodology_url": "https://vendor.example.com/methodology/mfa" },
      { "feature_id": "coppa_certified", "type": "binary", "description": "COPPA compliance certification" },
      { "feature_id": "registry:uk_hfss", "type": "binary", "description": "UK HFSS advertising restrictions compliance" },
      { "feature_id": "carbon_score", "type": "quantitative", "range": { "min": 0, "max": 100 }, "description": "Carbon footprint sustainability score", "methodology_url": "https://scope3.com/methodology/carbon-score" }
    ],
    "creative_features": [
      { "feature_id": "registry:eu_ai_act_article_50", "type": "binary", "description": "EU AI Act Article 50 — AI-generated content disclosure" },
      { "feature_id": "registry:ca_sb_942", "type": "binary", "description": "California SB 942 — AI transparency compliance" },
      { "feature_id": "auto_redirect", "type": "binary", "description": "Detects auto-redirect behavior in creative code" },
      { "feature_id": "credential_harvest", "type": "binary", "description": "Detects credential harvesting patterns" }
    ],
    "content_standards": {
      "supported": true,
      "calibration_formats": ["text", "image", "video"]
    },
    "policy_registry": {
      "supported": true,
      "domains": ["campaign", "property", "creative", "content_standards"]
    }
  }
}

extensions_supported

Array of extension namespaces this agent supports. Buyers can expect meaningful data in ext.{namespace} fields on responses from this agent.
FieldTypeDescription
extensions_supportedstring[]Extension namespaces (e.g., ["scope3", "garm"])
Extension schemas are published in the AdCP extension registry. When an agent declares support for an extension, buyers know to look for and process ext.{namespace} data in responses. Example:
{
  "extensions_supported": ["scope3", "garm", "iab_tcf"]
}
This tells buyers:
  • Product responses may include ext.scope3 with Scope3 sustainability data
  • Creative policies may include ext.garm with GARM brand suitability categorizations
  • Responses may include ext.iab_tcf with IAB TCF consent data

The Capability Contract

If a capability is declared, the seller MUST honor it.
  • media_buy.execution.targeting.geo_postal_areas.us_zip: true → Buyer can send US ZIP codes, seller MUST honor them
  • media_buy.execution.targeting.geo_metros.nielsen_dma: true → Buyer can send DMA codes, seller MUST honor them
  • media_buy.features.content_standards: true → Seller MUST apply content standards when provided
  • AXE URL in media_buy.execution.axe_integrations → Seller can execute through that exchange (legacy — new integrations use TMP)
No silent ignoring. If a seller can’t support a capability, they should declare false or omit it.

Common Scenarios

Basic Capability Discovery

import { AdcpClient } from '@adcp/client';

const client = new AdcpClient({ baseUrl: 'https://seller.example.com/mcp' });

// Get seller capabilities
const result = await client.getAdcpCapabilities({});

if (result.errors) {
  throw new Error(`Request failed: ${result.errors[0].message}`);
}

// Check protocol support
console.log(`AdCP versions: ${result.adcp.major_versions.join(', ')}`);
console.log(`Supported protocols: ${result.supported_protocols.join(', ')}`);

// Check media-buy capabilities
if (result.supported_protocols.includes('media_buy')) {
  const mediaBuy = result.media_buy;

  // Check feature support
  if (mediaBuy.features?.content_standards) {
    console.log('Content standards supported');
  }

  // Check AXE integrations (legacy — new integrations use TMP via trusted_match on products)
  if (mediaBuy.execution?.axe_integrations?.includes('https://agentic.scope3.com')) {
    console.log('Scope3 AXE integration available');
  }

  // Check geo targeting
  if (mediaBuy.execution?.targeting?.geo_postal_areas?.us_zip) {
    console.log('US ZIP code targeting supported');
  }

  // Portfolio overview
  console.log(`Publishers: ${mediaBuy.portfolio.publisher_domains.length}`);
  console.log(`Channels: ${mediaBuy.portfolio.primary_channels?.join(', ')}`);
}

Check multi-protocol support

const caps = await client.getAdcpCapabilities({});

const sellsMedia = caps.supported_protocols.includes('media_buy');
const managesCreatives = caps.supported_protocols.includes('creative');

if (sellsMedia && managesCreatives) {
  // Single agent handles both protocols — no need to discover a separate service
  const formats = await client.listCreativeFormats({});
  const delivery = await client.getCreativeDelivery({
    media_buy_ids: ['mb_12345']
  });
}

Filter sellers by capability

// Find sellers that support specific requirements
async function findCompatibleSellers(sellers, requirements) {
  const compatible = [];

  for (const sellerUrl of sellers) {
    const client = new AdcpClient({ baseUrl: sellerUrl });
    const caps = await client.getAdcpCapabilities({});

    if (caps.errors) continue;

    // Must support media_buy protocol
    if (!caps.supported_protocols.includes('media_buy')) continue;

    const mediaBuy = caps.media_buy;

    // Check AXE integration requirement (legacy — new integrations use TMP)
    if (requirements.axeIntegration) {
      if (!mediaBuy.execution?.axe_integrations?.includes(requirements.axeIntegration)) {
        continue;
      }
    }

    // Check geo targeting requirement
    if (requirements.postalCodeTargeting) {
      if (!mediaBuy.execution?.targeting?.geo_postal_areas?.us_zip) {
        continue;
      }
    }

    // Check feature requirement
    if (requirements.contentStandards) {
      if (!mediaBuy.features?.content_standards) {
        continue;
      }
    }

    compatible.push({ url: sellerUrl, capabilities: caps });
  }

  return compatible;
}

// Usage
const sellers = await findCompatibleSellers(
  ['https://seller1.com/mcp', 'https://seller2.com/mcp'],
  {
    axeIntegration: 'https://agentic.scope3.com',
    postalCodeTargeting: true,
    contentStandards: true
  }
);

Use Capabilities to Build Targeting

Capabilities tell you what you CAN specify in create_media_buy targeting. Use required_geo_targeting to filter products to sellers that support specific geo targeting levels and systems:
// First, check capabilities
const caps = await client.getAdcpCapabilities({});

if (!caps.supported_protocols.includes('media_buy')) {
  throw new Error('Seller does not support media_buy protocol');
}

const mediaBuy = caps.media_buy;

// Filter products to sellers with specific geo targeting capabilities
const products = await client.getProducts({
  brief: "Premium video inventory in US for ZIP-targeted campaign",
  filters: {
    channels: ['olv', 'ctv'],
    countries: ['US'],
    // Require seller supports ZIP targeting (capability filter - no actual ZIPs needed)
    // level = granularity, system = classification taxonomy
    required_geo_targeting: [
      { level: 'postal_area', system: 'us_zip' }
    ],
    // Only include if seller supports this AXE (legacy — new integrations use TMP)
    required_axe_integrations: ['https://agentic.scope3.com']
  }
});

// Then, create media buy with fine-grained targeting
// (if seller supports postal areas, we can target specific ZIP codes)
const buy = await client.createMediaBuy({
  brand: { domain: 'mybrand.com' },
  packages: [{
    product_id: products.products[0].product_id,
    pricing_option_id: products.products[0].pricing_options[0].id,
    budget: 10000,
    // Targeting overlay refines delivery within product coverage
    targeting_overlay: {
      geo_countries: ['US'],
      // Only specify ZIP targeting if seller supports it
      ...(mediaBuy.execution?.targeting?.geo_postal_areas?.us_zip && {
        geo_postal_areas: [{
          system: 'us_zip',
          values: ['10001', '10002', '10003', '10004', '10005']
        }]
      })
    }
  }],
  start_time: { type: 'asap' },
  end_time: '2025-03-01T00:00:00Z'
});
Two models for product geography:
Inventory TypeFilter ByExample
Digital (display, OLV, CTV)Capability: required_geo_targetingProducts have broad coverage, target at buy time
Local (radio, DOOH, local TV)Coverage: metros, regionsProducts ARE geographically bound
  • Digital inventory: Use countries + required_geo_targeting (capability), apply fine-grained targeting in create_media_buy
  • Local inventory: Use metros/regions (coverage) to find products with coverage in your target markets

Local Inventory Example (Radio, DOOH)

For locally-bound inventory, products ARE geographically specific. A radio station in NYC DMA only covers NYC.
// Find radio products in specific DMAs
const radioProducts = await client.getProducts({
  brief: "Radio inventory in NYC and LA markets",
  filters: {
    channels: ['radio'],
    // Coverage filter: products must cover these metros
    metros: [
      { system: 'nielsen_dma', code: '501' },  // NYC
      { system: 'nielsen_dma', code: '803' }   // LA
    ]
  }
});

// For local inventory, targeting_overlay is optional -
// the product's coverage IS the geography
const buy = await client.createMediaBuy({
  brand: { domain: 'mybrand.com' },
  packages: [{
    product_id: radioProducts.products[0].product_id,
    pricing_option_id: radioProducts.products[0].pricing_options[0].id,
    budget: 5000
    // No targeting_overlay needed - product covers NYC DMA
  }],
  start_time: { type: 'asap' },
  end_time: '2025-03-01T00:00:00Z'
});

Response Example

{
  "$schema": "/schemas/protocol/get-adcp-capabilities-response.json",
  "adcp": {
    "major_versions": [1]
  },
  "supported_protocols": ["media_buy"],
  "account": {
    "require_operator_auth": false,
    "supported_billing": ["operator", "agent"]
  },
  "media_buy": {
    "features": {
      "inline_creative_management": true,
      "property_list_filtering": true,
      "content_standards": false,
      "audience_targeting": true
    },
    "execution": {
      "axe_integrations": ["https://agentic.scope3.com"],
      "creative_specs": {
        "vast_versions": ["4.0", "4.1", "4.2"],
        "mraid_versions": ["3.0"],
        "vpaid": false,
        "simid": true
      },
      "targeting": {
        "geo_countries": true,
        "geo_regions": true,
        "geo_metros": {
          "nielsen_dma": true,
          "uk_itl2": false,
          "eurostat_nuts2": false
        },
        "geo_postal_areas": {
          "us_zip": true,
          "us_zip_plus_four": false,
          "gb_outward": true,
          "gb_full": false,
          "ca_fsa": true
        },
        "device_platform": true,
        "device_type": true,
        "language": true,
        "audience_include": true,
        "audience_exclude": true,
        "keyword_targets": {
          "supported_match_types": ["broad", "phrase", "exact"]
        },
        "negative_keywords": {
          "supported_match_types": ["broad", "exact"]
        }
      }
    },
    "audience_targeting": {
      "supported_identifier_types": ["hashed_email", "hashed_phone"],
      "supports_platform_customer_id": false,
      "supported_uid_types": ["uid2", "rampid"],
      "minimum_audience_size": 500,
      "matching_latency_hours": { "min": 1, "max": 24 }
    },
    "conversion_tracking": {
      "multi_source_event_dedup": false,
      "supported_event_types": ["purchase", "lead", "add_to_cart", "view_content"],
      "supported_action_sources": ["website", "app"],
      "attribution_windows": [
        { "post_click": [{ "interval": 7, "unit": "days" }, { "interval": 28, "unit": "days" }], "post_view": [{ "interval": 1, "unit": "days" }, { "interval": 7, "unit": "days" }] }
      ]
    },
    "portfolio": {
      "publisher_domains": ["example.com", "news.example.com"],
      "primary_channels": ["display", "olv"],
      "primary_countries": ["US", "CA"]
    }
  },
  "extensions_supported": ["scope3"],
  "last_updated": "2025-01-23T10:00:00Z"
}
This tells buyers:
  • AdCP versions: Version 1
  • Protocols: Media buy only
  • Auth model: Agent-trusted (require_operator_auth: false) — authenticate once, declare brands via sync_accounts
  • Billing: Operator or agent billing; default is operator
  • Country targeting: Available (ISO 3166-1 alpha-2: US, GB, etc.)
  • Region targeting: Available (ISO 3166-2: US-NY, GB-SCT, etc.)
  • Metro targeting: Nielsen DMA only (US market)
  • Postal targeting: US ZIP, UK outward codes, Canadian FSA
  • Audience targeting: Accepts hashed email, hashed phone, UID2, and RampID; minimum matched audience size of 500; matching latency 1–24 hours
  • Conversion tracking: Accepts purchase, lead, add_to_cart, view_content events from website/app; no multi-source dedup
  • Extensions: Scope3 sustainability data in ext.scope3

Multi-protocol agent

An agent can implement multiple protocols from a single endpoint. This is common for sellers that manage both media buying and creative generation — the buyer calls all tasks on the same URL.
{
  "$schema": "/schemas/protocol/get-adcp-capabilities-response.json",
  "adcp": {
    "major_versions": [3]
  },
  "supported_protocols": ["media_buy", "creative"],
  "account": {
    "require_operator_auth": false,
    "supported_billing": ["operator"]
  },
  "media_buy": {
    "features": {
      "inline_creative_management": true
    },
    "portfolio": {
      "publisher_domains": ["news.example.com"],
      "primary_channels": ["display", "olv"]
    }
  },
  "creative": {
    "has_creative_library": true,
    "supports_generation": true,
    "supports_transformation": false,
    "supports_compliance": false
  }
}
This agent supports:
  • Media Buy Protocol: Product discovery, media buying, delivery reporting
  • Creative Protocol: Creative library management, AI-powered creative generation, variant-level delivery analytics via get_creative_delivery
  • Shared account: A single account established via sync_accounts applies to both protocols
When supported_protocols includes "creative", the buyer can call Creative Protocol tasks (list_creative_formats, sync_creatives, get_creative_delivery, etc.) on this agent. See Creative capabilities on sales agents.

Geo Standards Reference

LevelSystemExamples
CountryISO 3166-1 alpha-2US, GB, DE, CA
RegionISO 3166-2US-NY, GB-SCT, DE-BY, CA-ON
Metro (US)nielsen_dma501 (NYC), 803 (LA), 602 (Chicago)
Metro (UK)uk_itl2UKI (London), UKD (North West)
Metro (EU)eurostat_nuts2DE30 (Berlin), FR10 (Île-de-France)
Postal (US)us_zip10001, 90210
Postal (US)us_zip_plus_four10001-1234
Postal (UK)gb_outwardSW1, EC1, M1
Postal (UK)gb_fullSW1A 1AA
Postal (CA)ca_fsaK1A, M5V

Migration from list_authorized_properties (v2)

The list_authorized_properties task was removed in v3. If migrating from v2:
Old FieldNew Location
publisher_domainsmedia_buy.portfolio.publisher_domains
primary_channelsmedia_buy.portfolio.primary_channels
primary_countriesmedia_buy.portfolio.primary_countries
portfolio_descriptionmedia_buy.portfolio.description
advertising_policiesmedia_buy.portfolio.advertising_policies
last_updatedlast_updated (top level)
New fields:
  • adcp.major_versions - Version compatibility
  • supported_protocols - Which domain protocols are supported
  • media_buy.features - Optional feature support
  • media_buy.execution.axe_integrations - Ad exchange support
  • media_buy.execution.creative_specs - VAST/MRAID versions
  • media_buy.execution.targeting - Geo targeting granularity

Error Handling

Error CodeDescriptionResolution
AUTH_REQUIREDAuthentication neededProvide credentials
INTERNAL_ERRORServer errorRetry with backoff

Best Practices

1. Cache Capabilities Capabilities rarely change. Cache results and use last_updated for staleness detection. 2. Check Protocol Support First Before accessing protocol-specific fields, verify the protocol is in supported_protocols. 3. Check Before Requesting Don’t send postal areas for a system the seller doesn’t support. Don’t request features the seller doesn’t support. 4. Fail Fast on Incompatibility If a seller doesn’t support required capabilities, skip them early rather than discovering failures later. 5. Read the Auth Model Before Proceeding Check account.require_operator_auth immediately after discovery. Agent-trusted and operator-scoped flows diverge significantly: the former uses a single credential for all brands and operators, the latter requires per-operator credentials and sessions. 6. Use Protocol Version for Routing Route requests to appropriate API versions based on adcp.major_versions.

Next Steps

After discovering capabilities:
  1. Set up accounts: Follow the auth model from account.require_operator_auth — see Accounts and Agents
  2. Filter products: Use get_products with capability-aware filters
  3. Validate properties: Fetch publisher adagents.json files for property definitions
  4. Create buys: Use create_media_buy with supported features

Learn More