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.
Why this shape. Capabilities are organized into ~14 top-level domain keys (one per protocol plus identity and signing infrastructure), with feature flags nested under each domain’s features/execution/etc. sub-namespace. We rejected a flat capability list — it forces every implementer to scan an unbounded surface, and it removes the discoverability that comes from related flags sitting next to each other. New capability flags belong under existing domains, not in new top-level keys; declarations are commitments, not advertisements (the conformance runner probes them). → Capabilities explorer walks the tree before you propose. → Design principle: capabilities are commitments.
Response Time: ~2 seconds (configuration lookup) Purpose:
  • AdCP discovery - Does this agent support AdCP? Which versions?
  • Protocol support - Which protocols (media_buy, signals, governance, sponsored_intelligence, creative, brand)?
  • Auth model - Does this seller trust the agent directly, or must each operator authenticate independently?
  • Detailed capabilities - Features, execution integrations, geo targeting, portfolio
Per-caller authorization is NOT reported here. get_adcp_capabilities returns the seller’s surface — everything it could do for any authorized caller. To discover what you are allowed to do on a specific account (which tasks are callable for your identity, which request fields are modifiable, any named scope like attestation_verifier), read the authorization object on per-account entries in sync_accounts and list_accounts responses. See Caller authorization for the full shape and semantics.
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.
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. :::

Version Negotiation

Sellers declare which major versions they support via adcp.major_versions in the response. Buyers declare which version they’re using via adcp_major_version on the request.
adcp_major_version is an optional field on every AdCP request schema. Buyers SHOULD include it on all requests when interacting with a multi-version seller. Seller behavior:
  • If adcp_major_version is provided and supported → respond using that version’s schemas
  • If adcp_major_version is provided but unsupported → return VERSION_UNSUPPORTED (buyer should call without adcp_major_version to discover supported versions)
  • If adcp_major_version is omitted → assume the highest supported version
Why major versions, not minor? Semver policy guarantees backward compatibility within a major version. A seller at 3.1 can serve a buyer at 3.0 without negotiation. The capability model handles feature-level differences — buyers check specific capabilities (targeting systems, features, extensions) rather than version numbers to determine compatibility.

Request Parameters

Response Structure

adcp

Core AdCP protocol information:

idempotency

Declares whether this seller honors idempotency_key replay protection. From 3.1 onward idempotency_key is required on every AdCP task request (read and mutating alike — staged enforcement for reads: SHOULD-reject in 3.1, MUST-reject in 3.2; see security.mdx § Idempotency). Mirrors the request_signing.supported pattern — a single positive declaration, decoupled from the window detail. Clients MUST NOT assume a default; a seller without this block is non-compliant and should be treated as unsafe for retry-sensitive operations across all call modes.
Sellers that do not support replay dedup declare it explicitly:
Verifying the declaration. idempotency.supported: true is a trust-bearing claim that enables buyers to safely retry spend-committing operations. A compromised or buggy seller could advertise true while silently ignoring keys, causing buyer double-spend on retry. Buyers and conformance runners SHOULD probe the declaration with a deliberate payload-mutation replay: send two requests with the same idempotency_key but different canonical payloads — a conformant seller MUST return IDEMPOTENCY_CONFLICT on the second. Sellers declaring supported: true MUST pass this probe as part of the baseline compliance storyboard before the declaration is considered verified.

supported_protocols

AdCP protocols this agent supports. This is the single capability axis — each value both (a) declares which tools the agent implements and (b) commits the agent to pass the baseline compliance storyboard at /compliance/{version}/protocols/{protocol}/. The runner maps JSON snake_case → URL kebab-case (media_buy/compliance/.../protocols/media-buy/).
Valid values: media_buy, creative, signals, governance, brand, sponsored_intelligence. See the Compliance Catalog for every protocol’s scope. Support for the compliance test controller is declared via the separate compliance_testing capability block (below), not as a protocol value.

specialisms

Optional specialization claims. Each entry corresponds to a narrow storyboard at /compliance/{version}/specialisms/{id}/. Every specialism rolls up to one protocol in supported_protocols — claiming sales-guaranteed requires media_buy. The runner rejects a specialism whose parent protocol is missing.
See the full Compliance Catalog for every specialism and the enum schema for the authoritative list.

Capability slot gaps

SDK helpers such as definePlatform can project a platform implementation into narrower capability slots. Treat those slots as commitments: only declare a slot when the agent can execute the corresponding task path end to end. If a storyboard or local test vector targets a slot the agent does not declare, the expected conformance outcome is not_applicable, not failure. Until runner-side enforcement lands in adcp-client#2244, implementers running custom or prerelease suites should add explicit skip gates for vectors outside the declared slot scope. Do not work around a missing slot by declaring it and returning placeholder responses; that turns an honest coverage gap into a failed capability claim.

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.

Auth models

Buyer-declared 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). Account-id namespaces (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 passes seller-assigned account_id values on subsequent requests. OAuth is credential acquisition, not an account taxonomy axis. Two namespace patterns use the same wire reference: upstream-managed sellers expose list_accounts, making explicit account resolution mandatory before account-scoped calls; seller-defined namespaces without list_accounts provide account IDs out-of-band. SDKs SHOULD lazily call list_accounts when first needed, auto-select a singleton, cache it per credential/session, and still send explicit AccountRef values on required-account calls. For sandbox, the path follows the account namespace: account-id namespaces discover pre-existing test accounts via list_accounts or out-of-band setup; buyer-declared 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. Sellers declaring media_buy should also include account (with supported_billing) and media_buy.portfolio — buyers need both to establish billing and understand inventory coverage. Compliance testing validates their presence. :::note 3.0 breaking changes The following fields have been removed from the capabilities response:
  • media_buy.reporting — Reporting is implied by media_buy. Use product-level reporting_capabilities instead.
  • features.content_standards — Replaced by media_buy.content_standards object. Presence of the object indicates support.
  • features.audience_targeting — Replaced by media_buy.audience_targeting object. Presence of the object indicates support.
  • features.conversion_tracking — Replaced by media_buy.conversion_tracking object. Presence of the object indicates support.
  • execution.targeting.device_platform, device_type — Implied by media_buy support.
  • execution.targeting.audience_include, audience_exclude — Implied by audience_targeting object presence.
  • execution.trusted_match.supported — Object presence indicates support.
  • brand.identity — Implied by brand in supported_protocols. get_brand_identity is always available. :::

reporting_delivery_methods

Declares which push-based delivery methods are available across the seller’s product portfolio. Polling via get_media_buy_delivery is a required task for all media_buy sellers regardless of this field. When absent, only polling is available. Cadence and metrics are declared per product in reporting_capabilities. When offline is declared, also include offline_delivery_protocols to declare which cloud storage protocols are supported (s3, gcs, azure_blob). Buyers express a protocol preference via preferred_reporting_protocol in sync_accounts; the seller provisions the account’s reporting_bucket using a supported protocol. For offline delivery, the seller provisions a per-account bucket and grants the buyer read access out-of-band. The bucket location (including file_retention_days) appears on the account object returned by sync_accounts as reporting_bucket. See Offline File Delivery for details.

creative_approval_mode

Declares the seller’s tenant-wide creative approval posture after creatives are assigned and automated validation passes. This is not a notification surface or a new approval workflow; it tells buyers and compliance runners whether human review can still block serving eligibility. Compliance runners use this declaration mainly to decide whether auto-approval-dependent storyboards such as media_buy_seller/pending_creatives_to_start apply. Sellers with mixed approval policies SHOULD declare require_human unless every product/account that can be reached by the advertised agent supports automatic eligibility after automated validation. When the field is absent, approval behavior is legacy-unspecified; runners SHOULD NOT treat omission as an affirmative auto_approve claim. ai_assisted is intentionally not a value until the protocol defines what assistance changes in observable behavior.

features

Optional media-buy features. If declared true, seller MUST honor requests using that feature.

content_standards

Content standards implementation details. Presence of this object indicates the seller supports content_standards configuration including sampling rates and category filtering. Gives buyers pre-buy visibility into local evaluation and artifact delivery capabilities. Example:
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:
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
targeting
Device platform and device type targeting are implied by media_buy support. Audience include/exclude targeting is implied by the presence of the audience_targeting capabilities object. 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: geo_metros specifies which metro classification systems are supported: geo_postal_areas specifies which country-local postal code systems are supported. The preferred shape is keyed by ISO 3166-1 alpha-2 country, with each country listing supported systems:
Use postal_code for the normal postal code string in countries without a more specific registered local system. During the 3.x migration, sellers SHOULD emit equivalent deprecated aliases such as us_zip alongside native country keys where an alias exists. Buyers and SDKs SHOULD normalize both shapes before making capability decisions.

audience_targeting

Audience targeting capabilities. Presence of this object indicates the seller supports audience targeting, including sync_audiences and audience_include/audience_exclude in targeting overlays. Describes what identifier types the seller accepts for audience matching, size constraints, and expected matching latency.

conversion_tracking

Seller-level conversion tracking capabilities. Declares what the seller supports for kind: "event" optimization goals.

portfolio

Inventory portfolio information:

signals

Signals protocol capabilities. Only present if signals is in supported_protocols.
catalog_signals is deprecated. Existing 3.x agents may continue to emit it for compatibility, but new agents SHOULD omit it and callers MUST NOT require it before using signal_ref. Treat supported_protocols: ["signals"], signals.data_provider_domains, signals.discovery_modes, and the actual get_signals response as the capability surface.

creative

Creative protocol capabilities. Only present if creative is in supported_protocols.

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.

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.

policy_registry

Policy registry integration capabilities. See Policy Registry. Example governance agent response:

measurement

Experimental measurement protocol capabilities. Only present if measurement is in supported_protocols; agents implementing it must also list measurement.core in experimental_features. The measurement protocol is currently scoped to get_adcp_capabilities for catalog discovery (this block); additional measurement tasks (reporting, attribution, panel queries) and a baseline compliance storyboard land in subsequent minors. The capability block is shipping now so measurement vendors can publish their per-metric catalogs and AAO can crawl them, before the broader task surface is settled. Scope. An agent claiming measurement computes one or more quantitative metrics about ad delivery, exposure, or effect (impression verification, viewability, IVT, attention, brand lift, incrementality, outcomes, emissions — vendors define the surface in metrics[]). Returns metric definitions (this block), not pricing or coverage (negotiated per buy via measurement_terms) and not live values (returned per buy via vendor_metric_values). Same mechanical model as compliance_testing and webhook_signing: presence asserts the capability; the block carries the structured payload. Measurement agents publish a per-metric catalog so buyers know which metrics each vendor offers. This is the canonical source of truth — AAO crawls it to populate the federated measurement-vendor index.

metrics

Array of metrics this measurement agent computes.
Response example
Discovery vs. settlement. Buyers MAY hit a measurement agent’s get_adcp_capabilities directly to see its current catalog (live, canonical, no staleness), or query AAO’s federated index for cross-vendor aggregation. The index trades a TTL refresh window for cross-vendor speed; live calls trade speed for currency. Both are valid — typically planning queries hit the index, settlement/audit queries hit the agent. This is a discovery surface, not a rate card. The catalog tells buyers what a vendor measures and what standards/accreditations back it. Pricing per impression, minimum measurable inventory, attribution windows, geographic coverage, and data-freshness SLAs are negotiated per buy through the seller’s measurement_terms on create_media_buy — not through this catalog.

compliance_testing

Compliance testing capabilities. The presence of this block declares that the agent supports deterministic testing via comply_test_controller. Omit the block if the agent does not support compliance testing. Production deployments MUST NOT include this block. comply_test_controller is sandbox-only at the deployment level; advertising the capability on a production endpoint is non-conformant even if dispatch is gated. See Compliance test controller § Sandbox gating. Storyboard runners check for the compliance_testing block before running deterministic testing steps. If the agent does not include the block, controller-dependent storyboard steps cannot be validated. Agents that implement comply_test_controller SHOULD include the compliance_testing capability block and list supported scenarios. Agents that only support a subset of scenarios (e.g., media buy status but not SI sessions) declare only those scenarios — the runner reports unsupported scenario coverage as skipped or partial rather than as a hidden pass. :::note Compliance testing is sandbox-only at the deployment level — production deployments MUST NOT advertise this block or expose comply_test_controller on any surface. FORBIDDEN is returned only when an in-sandbox caller passes params that reference a non-sandbox account; live-mode probes for the tool by name receive the transport’s standard unknown-tool error. See Sandbox gating. :::

webhook_signing

Declares a seller’s webhook-signing posture. Any seller whose capability surface advertises mutating-webhook emission — including but not limited to media_buy.reporting_delivery_methods containing webhook, media_buy.content_standards.supports_webhook_delivery: true, or wholesale_feed_webhooks.supported: true — MUST include this block with supported: true. A seller that emits no webhooks at all MAY omit the block entirely; the absence of both mutating-webhook emission in other capabilities and this block is an unambiguous “does not emit webhooks” posture. Buyers read the block at onboarding to determine which algorithms to expect per the AdCP webhook-signing profile. Buyers integrating with a seller that advertises mutating-webhook emission while advertising supported: false or omitting this block MUST fail onboarding with a user-actionable error; silent integration with a non-signing-but-webhook-emitting seller is unsafe for any mutating-webhook use case. Example:
The webhook-signing block is parallel to request_signing (inbound) and the two blocks cover the two signing directions between buyer and seller. Buyers SHOULD validate both at onboarding; a seller that signs one direction but not the other has a lopsided security posture that operators need to notice explicitly.

extensions_supported

Array of extension namespaces this agent supports. Buyers can expect meaningful data in ext.{namespace} fields on responses from this agent. 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:
This tells buyers:
  • Responses may include ext.iab_tcf with IAB TCF consent data
  • Responses may include ext.iab_gpp with IAB GPP (Global Privacy Platform) signals
  • Responses may include ext.acmecorp with vendor-specific data from Acme Corp

experimental_features

Array of experimental AdCP surfaces this agent implements. A surface is experimental when its schema carries x-status: experimental — it is part of the core protocol but not yet frozen and may break between 3.x releases with 6 weeks’ notice. Sellers that implement any experimental surface MUST list its feature id here. Buyers should inspect experimental_features before relying on an experimental surface. A seller that does not list a surface is asserting it does not implement it — there is no “silently experimental” mode. Example:
See experimental status for the full stability contract, graduation criteria, and client guidance.

wholesale_feed_versioning

Conditional-fetch token capabilities for get_products and get_signals. Independent of wholesale feed webhooks: an agent MAY support cheap version probes without pushing change payloads, and an agent MAY push change payloads while still requiring reconciliation reads for repair. Example:

wholesale_feed_webhooks

Per-agent wholesale product-feed and wholesale signals-feed webhook capabilities. Declared by sales agents (products) and signals agents (signals). When supported is true, consumers can register sync_accounts.accounts[].notification_configs[] entries for product.*, signal.*, and wholesale_feed.bulk_change events and receive the actual change payload in each webhook. See specs/wholesale-feed-webhooks.md for the full spec. Terminology. Here “wholesale feed” means the agent’s buyable wholesale product feed and wholesale signals feed exposed by get_products and get_signals. It is distinct from sync_catalogs, which pushes buyer-provided campaign input feeds into a seller account for campaign execution. Complementary to (and independent of) wholesale_feed_versioning: webhooks push changed products/signals or bulk-change summaries; version tokens give a cheap repair and reconciliation probe. Adopters MAY ship either, both, or neither. Agents that declare supported: true MUST apply the same account/caller authorization and scope predicate used by the corresponding wholesale read before emitting each webhook. A caller that could not see a product, signal, price, or account overlay through get_products buying_mode: "wholesale" or get_signals discovery_mode: "wholesale" MUST NOT receive a webhook revealing that change. Agents unable to guarantee per-principal filtering MUST NOT declare support. Capability consistency. Agents listing any product.* value in event_types[] MUST declare and support wholesale get_products (media_buy.buying_modes includes "wholesale"). Agents listing any signal.* value MUST declare and support wholesale get_signals (signals.discovery_modes includes "wholesale"). Agents listing wholesale_feed.bulk_change MUST have at least one of those wholesale repair paths, and each bulk-change payload’s affected_entity_type MUST name only a feed family the agent can repair through a declared wholesale read. Consumer precedence. When more than one mechanism is declared, consumers SHOULD prefer them in this order: (1) wholesale_feed_webhooks when maintaining a long-lived mirror (lowest latency, lowest seller cost); (2) wholesale_feed_versioning conditional fetch for occasional polling and webhook repair; (3) wholesale enumeration via buying_modes / discovery_modes for cold start, wholesale_feed.bulk_change, or any missed/distrusted push. Example (sales + signals agent):

The Capability Contract

If a capability is declared, the seller MUST honor it.
  • media_buy.execution.targeting.geo_postal_areas.US contains zip → Buyer can send { country: "US", system: "zip", values: [...] }, seller MUST honor it
  • media_buy.execution.targeting.geo_postal_areas.us_zip: true → Buyer can send the deprecated { system: "us_zip", values: [...] } form, and SDKs can backfill the native { country: "US", system: "zip", values: [...] } form
  • media_buy.execution.targeting.geo_postal_areas.ZA contains postal_code → Buyer can send normal South African postal 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.content_standards object present → Seller MUST apply content standards when provided
  • media_buy.audience_targeting object present → Seller MUST support sync_audiences and audience targeting overlays
  • media_buy.conversion_tracking object present → Seller MUST support sync_event_sources and log_event
  • 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

Check multi-protocol support

Filter sellers by capability

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:
Two models for product geography:
  • 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.

Response Example

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: Vendor-specific data in ext.acmecorp

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.
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

Migration from list_authorized_properties (v2)

The list_authorized_properties task was removed in v3. If migrating from v2: 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

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