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.Documentation Index
Fetch the complete documentation index at: https://agenticadvertisingorg-changeset-release-main.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
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.- 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./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 ofget_adcp_capabilities in an agentโs tool list indicates AdCP support.
- Uses standard MCP/A2A mechanisms (no custom extensions)
- Always returns current capabilities (not stale metadata)
- Single source of truth for all capability information
adcp-extension.json) has been removed in v3. Use tool-based discovery instead.
:::
Version Negotiation
Sellers declare which major versions they support viaadcp.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_versionis provided and supported โ respond using that versionโs schemas - If
adcp_major_versionis provided but unsupported โ returnVERSION_UNSUPPORTED(buyer should call withoutadcp_major_versionto discover supported versions) - If
adcp_major_versionis omitted โ assume the highest supported version
Request Parameters
| Field | Type | Description |
|---|---|---|
adcp_major_version | integer | Optional. The AdCP major version the buyerโs payloads conform to. When provided, the seller validates against its major_versions and returns VERSION_UNSUPPORTED if not in range. When omitted, the seller assumes the highest major version it supports. |
protocols | string[] | Optional. Filter to specific protocols (media_buy, signals, governance, sponsored_intelligence, creative, brand). If omitted, returns all supported protocols. |
Response Structure
adcp
Core AdCP protocol information:| Field | Type | Description |
|---|---|---|
major_versions | integer[] | Required. AdCP major versions supported (e.g., [3]) |
idempotency | object | Required. Idempotency semantics. See idempotency. |
idempotency
Declares whether this seller honorsidempotency_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.
| Field | Type | Description |
|---|---|---|
supported | boolean | Required. Whether the seller deduplicates replays. When false, sending an idempotency_key is a no-op โ the seller will NOT return IDEMPOTENCY_CONFLICT or IDEMPOTENCY_EXPIRED, and a naive retry WILL double-process. Buyers MUST use natural-key checks (e.g., get_media_buys by buyer_ref) before retrying spend-committing operations. |
replay_ttl_seconds | integer | Required when supported: true. How long the seller retains a canonical response for a key. Minimum 3600 (1h); recommended 86400 (24h); maximum 604800 (7d). |
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/).
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.
account
Account and authentication capabilities. All sellers should declare this section โ buyers read it before callingsync_accounts, list_accounts, or any authenticated task. Even simple publishers need account management to handle billing relationships and sandbox testing.
| Field | Type | Description |
|---|---|---|
supported_billing | string[] | 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_auth | boolean | Default: 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_endpoint | string | OAuth 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_products | boolean | Default: 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_financials | boolean | Default: false. When true, the seller supports get_account_financials for querying spend, credit, and invoice status. Only applicable to operator-billed accounts. |
sandbox | boolean | Default: 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 ifmedia_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 bymedia_buy. Use product-levelreporting_capabilitiesinstead.features.content_standardsโ Replaced bymedia_buy.content_standardsobject. Presence of the object indicates support.features.audience_targetingโ Replaced bymedia_buy.audience_targetingobject. Presence of the object indicates support.features.conversion_trackingโ Replaced bymedia_buy.conversion_trackingobject. Presence of the object indicates support.execution.targeting.device_platform,device_typeโ Implied bymedia_buysupport.execution.targeting.audience_include,audience_excludeโ Implied byaudience_targetingobject presence.execution.trusted_match.supportedโ Object presence indicates support.brand.identityโ Implied bybrandinsupported_protocols.get_brand_identityis always available. :::
reporting_delivery_methods
Declares which push-based delivery methods are available across the sellerโs product portfolio. Polling viaget_media_buy_delivery is a required task for all media_buy sellers regardless of this field.
| Method | Description | Configuration |
|---|---|---|
webhook | Seller pushes to buyer-provided URL | Buyer configures reporting_webhook per media buy |
offline | Seller pushes batch files to a cloud storage bucket | Seller provisions reporting_bucket per account |
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.
features
Optional media-buy features. If declared true, seller MUST honor requests using that feature.| Feature | Description |
|---|---|
inline_creative_management | Accepts creatives inline in create_media_buy requests |
property_list_filtering | Honors property_list parameter in get_products |
catalog_management | Supports sync_catalogs for catalog feed management |
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.| Field | Type | Description |
|---|---|---|
supports_local_evaluation | boolean | Whether 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_channels | string[] | 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_delivery | boolean | Whether the seller supports push-based artifact delivery via artifact_webhook configured at buy creation time. |
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:| Field | Type | Description |
|---|---|---|
trusted_match | object | TMP support. When present, this seller supports real-time contextual and/or identity matching. Check individual products for per-product TMP capabilities. |
axe_integrations | string[] | Deprecated. Legacy AXE URLs this seller can execute through. Use trusted_match for new integrations. |
creative_specs | object | Creative specification support (VAST versions, MRAID, etc.) |
targeting | object | Targeting 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
get_adcp_capabilities and filter products to AXE-enabled sellers using required_axe_integrations on get_products.
creative_specs
| Field | Type | Description |
|---|---|---|
vast_versions | string[] | VAST versions supported (e.g., ["4.0", "4.1", "4.2"]) |
mraid_versions | string[] | MRAID versions supported |
vpaid | boolean | VPAID support |
simid | boolean | SIMID support |
targeting
| Field | Type | Description |
|---|---|---|
geo_countries | boolean | Country-level targeting using ISO 3166-1 alpha-2 codes |
geo_regions | boolean | Region/state-level targeting using ISO 3166-2 codes (e.g., US-NY, GB-SCT) |
geo_metros | object | Metro area targeting with system-specific support |
geo_postal_areas | object | Postal area targeting with country and precision support |
age_restriction | object | Age restriction capabilities with supported flag and verification_methods |
language | boolean | Language targeting (ISO 639-1 codes) |
keyword_targets | object | Keyword targeting with supported_match_types array (broad, phrase, exact). Presence indicates support. |
negative_keywords | object | Negative keyword targeting with supported_match_types array. Presence indicates support. |
geo_proximity | object | Proximity targeting from arbitrary coordinates (see below) |
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:
| Field | Type | Description |
|---|---|---|
radius | boolean | Simple radius targeting (distance circle from a point) |
travel_time | boolean | Travel time isochrone targeting (requires a routing engine) |
geometry | boolean | Pre-computed GeoJSON geometry (buyer provides the polygon) |
transport_modes | string[] | Transport modes supported for isochrones: driving, walking, cycling, public_transport |
| System | Description |
|---|---|
nielsen_dma | Nielsen DMA codes (US market, e.g., 501 for NYC) |
uk_itl1 | UK ITL Level 1 regions |
uk_itl2 | UK ITL Level 2 regions |
eurostat_nuts2 | Eurostat NUTS Level 2 regions (EU) |
| System | Description |
|---|---|
us_zip | US 5-digit ZIP codes (e.g., 10001) |
us_zip_plus_four | US 9-digit ZIP+4 codes (e.g., 10001-1234) |
gb_outward | UK postcode district (e.g., SW1, EC1) |
gb_full | UK full postcode (e.g., SW1A 1AA) |
ca_fsa | Canadian Forward Sortation Area (e.g., K1A) |
ca_full | Canadian full postal code (e.g., K1A 0B1) |
de_plz | German Postleitzahl (e.g., 10115) |
fr_code_postal | French code postal (e.g., 75001) |
au_postcode | Australian postcode (e.g., 2000) |
ch_plz | Swiss Postleitzahl (e.g., 8000) |
at_plz | Austrian Postleitzahl (e.g., 1010) |
audience_targeting
Audience targeting capabilities. Presence of this object indicates the seller supports audience targeting, includingsync_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.
| Field | Type | Required | Description |
|---|---|---|---|
supported_identifier_types | string[] | Required | PII-derived identifier types accepted for audience matching. Buyers should only send identifiers the seller supports. Values: hashed_email, hashed_phone. |
minimum_audience_size | integer | Required | Minimum 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_id | boolean | When 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_types | string[] | 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_hours | object | Expected 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 forkind: "event" optimization goals.
| Field | Type | Description |
|---|---|---|
multi_source_event_dedup | boolean | Whether 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_types | string[] | Event types this seller can track. If omitted, all standard event types are supported. |
supported_uid_types | string[] | Universal ID types accepted for user matching. |
supported_hashed_identifiers | string[] | Hashed PII types accepted (hashed_email, hashed_phone). Buyers must hash before sending (SHA-256, normalized). |
supported_action_sources | string[] | Action sources this seller accepts events from. |
attribution_windows | object[] | 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:| Field | Type | Description |
|---|---|---|
publisher_domains | string[] | Required. Publisher domains this seller represents |
primary_channels | string[] | Main advertising channels |
primary_countries | string[] | Main countries (ISO codes) |
description | string | Markdown portfolio description |
advertising_policies | string | Content policies and restrictions |
signals
Signals protocol capabilities. Only present ifsignals is in supported_protocols.
| Field | Type | Description |
|---|---|---|
data_provider_domains | string[] | Data provider domains this signals agent is authorized to resell. Buyers should fetch each providerโs adagents.json for signal catalog definitions and to verify authorization. |
discovery_modes | string[] | Discovery modes the agent supports on get_signals. "brief" (semantic discovery via signal_spec / signal_ids) is implicit and always supported. Declare "wholesale" to advertise that callers can omit signal_spec / signal_ids and enumerate the full priced signals feed. Agents not declaring "wholesale" MAY return INVALID_REQUEST for wholesale calls. Absent declaration is treated as ["brief"]. |
features.catalog_signals | boolean | Supports signals from data provider catalogs with structured signal_id references. |
creative
Creative protocol capabilities. Only present ifcreative is in supported_protocols.
| Field | Type | Description |
|---|---|---|
supports_compliance | boolean | When 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. |
bills_through_adcp | boolean | When true, this creative agent bills through the AdCP rate-card surface โ list_creatives returns pricing_options (with include_pricing=true and an authenticated account), build_creative populates pricing_option_id and vendor_cost, and report_usage accepts records against the rate card. When false or absent, the agent bills out of band (flat license, SaaS contract, bundled enterprise agreement); buyers should skip pricing fields and tolerate report_usage returning accepted: 0 with BILLING_OUT_OF_BAND errors. Pre-call discriminator for routing across creative agents. |
governance
Governance protocol capabilities. Only present ifgovernance 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.| Field | Type | Description |
|---|---|---|
feature_id | string | Required. Unique identifier (e.g., mfa_score, coppa_certified). Use registry:{policy_id} prefix for features mapped to Policy Registry entries. |
type | string | Required. Data type: binary, quantitative, or categorical |
range | object | For quantitative: { min, max } |
categories | string[] | For categorical: valid values |
description | string | Human-readable description |
methodology_url | string | URL to methodology documentation |
creative_features
Array of creative features this governance agent can evaluate. Same field schema asproperty_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.| Field | Type | Description |
|---|---|---|
supported | boolean | Whether this agent can serve as a content standards verification agent |
calibration_formats | string[] | Artifact asset types this agent can evaluate (e.g., text, image, video, audio) |
policy_registry
Policy registry integration capabilities. See Policy Registry.| Field | Type | Description |
|---|---|---|
supported | boolean | Whether this agent consumes policies from the AdCP Policy Registry |
domains | string[] | Governance domains this agent covers (e.g., campaign, property, creative, content_standards) |
measurement
Measurement protocol capabilities. Only present ifmeasurement is in supported_protocols. The measurement protocol is in development โ 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.| Field | Type | Description |
|---|---|---|
metric_id | string | Required. Vendor-scoped identifier (attention_units, gco2e_per_impression, etc.) โ matches the metric_id populated in vendor_metric_values on delivery. The full identity is the tuple (vendor.domain, vendor.brand_id, metric_id). Each metric_id MUST be unique within a single agentโs catalog. |
standard_reference | string (URI) | Optional URI pointing at the published standard this metric implements (IAB Attention Measurement Guidelines, MRC Viewable Impression Measurement, GARM emissions framework). Distinct from accreditations below โ standard_reference is what the metric is built against; accreditations is third-party certification of conformance. |
accreditations | object[] | Optional list of third-party accreditations this metric holds (MRC, ARF, JIC bodies, ABC, BARB, AGOF, etc.). Each entry: accrediting_body (required), optional certification_id, valid_until, evidence_url. Buyers asking โis this MRC-accredited?โ SHOULD check this array โ implementing a standard is not the same as being independently accredited. |
unit | string | Unit of the value when reported in vendor_metric_values.value (score, seconds, persons, gCO2e, lift_percent, USD, etc.). Sellers populating vendor_metric_values.unit MUST match this declaration. |
description | string | Human-readable description of what the metric measures and any methodology notes. AAO and buyer agents normalize across catalogs from this field plus the structured fields above; classification facets are not declared at the metric level. |
methodology_url | string (URI) | URL to vendorโs full methodology documentation. Mirrors governance.property_features[].methodology_url. |
methodology_version | string | Optional version identifier (semver, ISO date, or vendor-defined string) for the methodology. When present, buyer agents can pin a contracted version so silent methodology changes are detectable; absence means the vendor does not version their methodology and buyers MUST treat any change as untracked. |
ext | object | Vendor extensions per the AdCP ext convention. |
Response example
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 viacomply_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.
| Field | Type | Description |
|---|---|---|
scenarios | string[] | Compliance testing scenarios this agent supports. Possible values: force_creative_status, force_account_status, force_media_buy_status, force_session_status, simulate_delivery, simulate_budget_spend, seed_product, seed_pricing_option, seed_creative, seed_plan, seed_media_buy. Runners MUST accept unknown scenario strings โ new scenarios may be added in additive minor bumps. |
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 skips unsupported ones.
:::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 tomedia_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.
| Field | Type | Description |
|---|---|---|
supported | boolean | Required when the seller advertises mutating-webhook emission elsewhere in its capability surface. true iff the seller signs outbound webhooks. false means the seller emits webhooks but does not sign them; buyers MUST fail onboarding. Sellers that emit no webhooks SHOULD omit the entire block rather than set supported: false โ false is reserved for the unsafe posture of unsigned-webhook emission, not absence-of-webhooks. |
profile | string | Required when supported: true. The profile version string. Currently "adcp/webhook-signing/v1". Future versions bump the string. |
algorithms | string[] | Required when supported: true. Subset of ["ed25519", "ecdsa-p256-sha256"] โ the algorithms this seller will sign webhooks with. Matches the webhook-signing verifier allowlist (see Verifier checklist for webhooks, step 4). Buyers MUST be prepared to verify any algorithm listed AND MUST reject onboarding with a user-actionable error if an advertised algorithm is outside this enumerated set โ a seller advertising an out-of-set algorithm (e.g., hs256) is either misconfigured or signalling a non-conforming profile. |
legacy_hmac_fallback | boolean | Required when supported: true. true iff the seller supports the legacy HMAC-SHA256 scheme when the buyer populates push_notification_config.authentication.credentials or accounts[].notification_configs[].authentication.credentials. false is the recommended posture in 3.x โ the HMAC scheme is removed in AdCP 4.0. |
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 inext.{namespace} fields on responses from this agent.
| Field | Type | Description |
|---|---|---|
extensions_supported | string[] | Extension namespaces (e.g., ["iab_tcf", "iab_gpp"]) |
ext.{namespace} data in responses.
Example:
- Responses may include
ext.iab_tcfwith IAB TCF consent data - Responses may include
ext.iab_gppwith IAB GPP (Global Privacy Platform) signals - Responses may include
ext.acmecorpwith vendor-specific data from Acme Corp
experimental_features
Array of experimental AdCP surfaces this agent implements. A surface is experimental when its schema carriesx-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.
| Field | Type | Description |
|---|---|---|
experimental_features | string[] | Experimental feature ids (e.g., ["brand.rights_lifecycle", "governance.campaign", "trusted_match.core", "sponsored_intelligence.core"]) |
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:
wholesale_feed_versioning
Conditional-fetch token capabilities forget_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.
| Field | Type | Description |
|---|---|---|
supported | boolean | Required. Whether the agent returns wholesale_feed_version on responses and honors if_wholesale_feed_version on requests. When absent or false, buyers can still probe by reading the response (the field-presence detection path) but canโt pre-flight-decide which agents to cache versions for. |
pricing_version_separate | boolean | Whether the agent tracks pricing_version independently of wholesale_feed_version. When true, callers can send if_pricing_version alongside if_wholesale_feed_version for finer-grained โdid prices change?โ probes. When false or absent, the agent collapses both into wholesale_feed_version โ sending if_pricing_version is wasted bytes. |
cache_scope_account | boolean | Whether the agent ever returns cache_scope: "account" (i.e., publishes per-account overlays distinct from the public rate card). When true, buyers MUST be prepared to maintain account-overlay caches alongside the public layer. When false or absent, all responses are cache_scope: "public" โ the agentโs rate card is universal across accounts. Note: declaring true advertises that the agent runs custom-pricing deals, which is itself a small market-posture signal; agents preferring confidentiality MAY omit the field and detect-on-call instead. |
wholesale_feed_webhooks
Per-agent wholesale product-feed and wholesale signals-feed webhook capabilities. Declared by sales agents (products) and signals agents (signals). Whensupported 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.
| Field | Type | Description |
|---|---|---|
supported | boolean | Required. Whether this agent can push wholesale feed change payloads through account-level sync_accounts.accounts[].notification_configs[]. When false or this stanza is absent, consumers fall back to wholesale polling, optionally with if_wholesale_feed_version probes. |
event_types | string[] | Event types this agent can emit. Sales agents emit product.* events; signals agents emit signal.* events; agents that are both can emit both event families. product.* requires wholesale get_products; signal.* requires wholesale get_signals; wholesale_feed.bulk_change requires at least one declared wholesale repair path and names one affected feed the consumer repairs by re-reading via get_products or get_signals. |
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 themmedia_buy.execution.targeting.geo_metros.nielsen_dma: trueโ Buyer can send DMA codes, seller MUST honor themmedia_buy.content_standardsobject present โ Seller MUST apply content standards when providedmedia_buy.audience_targetingobject present โ Seller MUST supportsync_audiencesand audience targeting overlaysmedia_buy.conversion_trackingobject present โ Seller MUST supportsync_event_sourcesandlog_event- AXE URL in
media_buy.execution.axe_integrationsโ Seller can execute through that exchange (legacy โ new integrations use TMP)
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. Userequired_geo_targeting to filter products to sellers that support specific geo targeting levels and systems:
| Inventory Type | Filter By | Example |
|---|---|---|
| Digital (display, OLV, CTV) | Capability: required_geo_targeting | Products have broad coverage, target at buy time |
| Local (radio, DOOH, local TV) | Coverage: metros, regions | Products ARE geographically bound |
- Digital inventory: Use
countries+required_geo_targeting(capability), apply fine-grained targeting increate_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
- AdCP versions: Version 1
- Protocols: Media buy only
- Auth model: Agent-trusted (
require_operator_auth: false) โ authenticate once, declare brands viasync_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.- 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_accountsapplies to both protocols
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
| Level | System | Examples |
|---|---|---|
| Country | ISO 3166-1 alpha-2 | US, GB, DE, CA |
| Region | ISO 3166-2 | US-NY, GB-SCT, DE-BY, CA-ON |
| Metro (US) | nielsen_dma | 501 (NYC), 803 (LA), 602 (Chicago) |
| Metro (UK) | uk_itl2 | UKI (London), UKD (North West) |
| Metro (EU) | eurostat_nuts2 | DE30 (Berlin), FR10 (รle-de-France) |
| Postal (US) | us_zip | 10001, 90210 |
| Postal (US) | us_zip_plus_four | 10001-1234 |
| Postal (UK) | gb_outward | SW1, EC1, M1 |
| Postal (UK) | gb_full | SW1A 1AA |
| Postal (CA) | ca_fsa | K1A, M5V |
Migration from list_authorized_properties (v2)
Thelist_authorized_properties task was removed in v3. If migrating from v2:
| Old Field | New Location |
|---|---|
publisher_domains | media_buy.portfolio.publisher_domains |
primary_channels | media_buy.portfolio.primary_channels |
primary_countries | media_buy.portfolio.primary_countries |
portfolio_description | media_buy.portfolio.description |
advertising_policies | media_buy.portfolio.advertising_policies |
last_updated | last_updated (top level) |
adcp.major_versions- Version compatibilitysupported_protocols- Which domain protocols are supportedmedia_buy.features- Optional feature supportmedia_buy.execution.axe_integrations- Ad exchange supportmedia_buy.execution.creative_specs- VAST/MRAID versionsmedia_buy.execution.targeting- Geo targeting granularity
Error Handling
| Error Code | Description | Resolution |
|---|---|---|
AUTH_MISSING | No credentials presented | Provide credentials via auth header |
AUTH_INVALID | Credentials rejected (expired / revoked) | Human credential rotation required |
VERSION_UNSUPPORTED | Declared adcp_major_version not in sellerโs major_versions | Call without adcp_major_version to discover supported versions, then retry |
INTERNAL_ERROR | Server error | Retry with backoff |
Best Practices
1. Cache Capabilities Capabilities rarely change. Cache results and uselast_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:- Set up accounts: Follow the auth model from
account.require_operator_authโ see Accounts and Agents - Filter products: Use
get_productswith capability-aware filters - Validate properties: Fetch publisher
adagents.jsonfiles for property definitions - Create buys: Use
create_media_buywith supported features
Learn More
- Accounts and Agents - Auth models, account setup, billing
- adagents.json Specification - Publisher authorization files
- Product Filters - Capability-aware filtering
- Content Standards - Brand safety configuration