Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.
Every AdCP agent declares its supported_protocols and specialisms in get_adcp_capabilities. Each declaration maps to a compliance bundle at /compliance/{version}/ that the storyboard runner executes to verify the claim.
supported_protocols is not exhaustive. The accounts surface (sync_accounts, list_accounts, sync_governance) is a foundation implicit in every media_buy, creative, and signals agent and is intentionally not a supported_protocols value. See Accounts tasks for the full account surface.
This page is the human-readable index of that taxonomy. The machine-readable equivalent is /compliance/{version}/index.json.
Every agent runs every graded storyboard in /compliance/{version}/universal/ regardless of which protocols or specialisms it claims. A few are capability-gated — they only run when the agent advertises the relevant capability — but the storyboard is still universal in scope: any agent claiming the capability is graded by it. Failing a universal storyboard fails overall compliance. Non-executable schemas and support fixtures shipped in the universal bundle are not runner scenarios and do not appear in this table.
Graded storyboard
Purpose
Source
account-identity-reconciliation
Validates revision-guarded operator identity rekeying, collision safety, and former-key redirects for sellers that advertise identity updates.
Validates that account.supported_billing is declared and honored by sync_accounts, including out-of-set BILLING_NOT_SUPPORTED rejection, recovery-value consistency, and the distinct per-buyer-agent BILLING_NOT_PERMITTED_FOR_AGENT gate.
Validates AdCP 3.2 ctv_ad_experience matrix pairings, duration/interactivity constraint profiles, the menu focus/video pairing, and non-blocking activation-copy warnings via validate_input against seeded CTV products.
Validates get_products wholesale-mode pagination by walking a seeded product feed from continuation to terminal, while documenting that brief/refine pagination caps returned products in curated results.
Validates that mutating requests enforce idempotency_key — replays return cached responses even after resource purge, key reuse with a different payload returns IDEMPOTENCY_CONFLICT, fresh keys create new resources, and concurrent retries with the same key produce exactly one resource (first-insert-wins under rule 9).
When an agent still exposes deprecated list_creative_formats compatibility, validates its cursor↔has_more invariant by seeding two formats and walking pages with max_results=1.
Validates that read-only AdCP tasks and the 3.x get_products compatibility facade tolerate an optional idempotency_key without claiming read-response replay.
Every AdCP agent MUST require authentication on protected operations. At least one of static credentials or OAuth MUST be implemented and correctly advertised.
Agent verifies RFC 9421 HTTP Signatures on incoming AdCP requests per the 3.1-compatible transport-layer profile. Universal capability-gated storyboard — runs for any agent advertising regardless of . Graded against the legacy wire suite covering every 3.1 checklist step and canonicalization-edge rule; a verifier advertising (every 3.2+ verifier) is graded against the mirror, which carries a counterpart of every legacy vector (positive and collapse into ) except ( is illegal in 3.2).
Validates that STALE_RESPONSE rides in errors[] on a populated success response with transport success preserved, and that STALE_RESPONSE is absent on healthy upstream responses.
Verifies that a TMP router deployment rejects schema-valid Context Match and Identity Match requests with absent or invalid publisher authentication using HTTP 401 and a WWW-Authenticate challenge.
Any agent that emits webhooks MUST echo the caller-supplied operation_id in every payload, carry a stable idempotency_key across retries, avoid duplicate webhook side effects on request replay, and — when the buyer has not opted into the deprecated HMAC fallback — MUST sign deliveries under the RFC 9421 webhook profile. Sellers MUST NOT emit task webhooks for inline terminal responses; any future sync-completion notification mode would be explicit and capability-advertised. Graded by a runner hosting a webhook receiver during storyboard execution.
Buyer webhook receivers MUST accept full MCP webhook envelopes, reject bare delivery-result payloads, preserve raw-body signature verification, and dedupe retries by a stable idempotency_key.
Validates that get_products conditional-fetch is keyed by cache_scope: a wholesale_feed_version minted under one cache_scope must not short-circuit (unchanged: true) a request the seller resolves to a different cache_scope.
Validates that get_signals conditional-fetch is keyed by cache_scope: a wholesale_feed_version minted under one cache_scope must not short-circuit (unchanged: true) a request the agent resolves to a different cache_scope.
Capability-gated rows (deterministic-testing, oauth-setup, signed-requests) are skipped when the corresponding capability is absent or advertises supported: false; they cannot be claimed and partially implemented. Declaring supported: true and failing the storyboard is non-conformant — omit the capability or declare false rather than ship a partial implementation. The billing-gate-dispatch and comply-controller-mode-gate rows are precondition-gated rather than ordinary capability-gated rows: each phase grades not_applicable when its precondition is not met. Sellers wanting full coverage of the per-agent billing gate SHOULD ship a test kit with commercial_relationship: passthrough_only declared so the per-agent phases run.
The compliance suite verifies that standard errors use the recovery classifications and remediation guidance defined by the canonical error-code.json source taxonomy. The vocabulary remains open: agents must also handle unknown codes using the response’s recovery value.
Code
Recovery
Suggested action
ACCOUNT_AMBIGUOUS
correctable
pass explicit account_id or a more specific natural key
ACCOUNT_IDENTITY_CONFLICT
correctable
choose a different operator or operator_unit identity, or retain the account’s current identity; do not retry the same desired identity unchanged
ACCOUNT_MOVED
correctable
replace the stale reference with error.details.current_account, refresh through list_accounts, and retry with a fresh idempotency key
ACCOUNT_NOT_FOUND
terminal
for a natural key, provision through sync_accounts or omit account for public discovery; for an account_id, verify via list_accounts or contact seller
ACCOUNT_PAYMENT_REQUIRED
terminal
buyer must resolve billing
ACCOUNT_REQUIRED
correctable
pass account, or reference an existing resource whose owning account the service can resolve
ACCOUNT_SETUP_REQUIRED
correctable
check details.setup for URL or instructions
ACCOUNT_SUSPENDED
terminal
contact seller to resolve suspension
ACTION_NOT_ALLOWED
correctable
branch on error.details.reason: for wrong_status, wait for or transition to a status listed under the action’s allowed_statuses; for mode_mismatch, this is a flow switch (not a retry against update_media_buy) — follow the mode named in available_actions[<action>].mode; for condition_unresolved, wait until the seller advertises the action after resolving its opaque condition; for not_supported_on_product or not_supported_on_buy, do not retry — the action is unavailable on this buy and buyer must select a different product or renegotiate, using error.details.decline_reason when present to inform that renegotiation
AGENT_BLOCKED
terminal
surface to a human at the buyer — the relationship is permanently denied and is reinstated only through offline operator action with the seller, not via any seller-callable AdCP task
AGENT_SUSPENDED
terminal
surface to a human at the buyer — the agent cannot unilaterally lift a suspension; re-onboarding with the seller offline may resolve
AMBIGUOUS_BIDDING_POLICY
correctable
remove either the canonical bidding block or all legacy bidding fields from the effective package
AUDIENCE_TOO_SMALL
correctable
broaden targeting or upload more audience members
AUTHORIZATION_REQUIRED
correctable
complete or restore the required downstream platform connection, identity, creator, or post authorization; use error.details.missing_connections, authorization_url, authorization_instructions, or reference_authorization when present
AUTH_INVALID
terminal
do NOT auto-retry — credentials were rejected; rotate keys, refresh OAuth tokens once if applicable, otherwise escalate to a human
AUTH_MISSING
correctable
provide credentials via the auth header and retry
AUTH_REQUIRED
correctable
provide credentials when missing; do NOT auto-retry rejected credentials — escalate for rotation
BIDDING_PLACEMENT_CONFLICT
correctable
align media-buy and package bidding scopes with the provider’s supported placement, or choose a compatible budget mode/product combination
BILLING_NOT_PERMITTED_FOR_AGENT
correctable
retry with error.details.suggested_billing (typically ‘operator’) when present; when absent, surface to a human at the buyer — the agent cannot unilaterally extend its commercial relationship and MUST NOT auto-retry
BILLING_NOT_SUPPORTED
correctable
check get_adcp_capabilities for supported_billing and resubmit with a supported value, or omit billing to accept the seller’s default
BILLING_OUT_OF_BAND
terminal
do not retry — billing for this account runs through a non-AdCP channel. Pre-filter via capabilities.creative.bills_through_adcp before sending report_usage; flag the account in the buyer’s routing table and fall back to the ad server’s native billing export for cost reconciliation
BRAND_REQUIRED
correctable
include brand (domain plus optional brand_id) on the request
BUDGET_CAP_REACHED
correctable
raise max_spend, or reduce max_creatives/max_variants, to produce the remaining items
BUDGET_EXCEEDED
correctable
reduce requested amount or increase budget allocation
BUDGET_EXHAUSTED
terminal
buyer must add funds or increase budget cap
BUDGET_TOO_LOW
correctable
increase budget or check capabilities.media_buy.limits
CAMPAIGN_SUSPENDED
transient
wait for the escalation to resolve; contact the plan operator if the suspension persists
CATALOG_LIMIT_EXCEEDED
correctable
remove unused catalogs, or contact the seller to raise the limit
COMMITTED_RESOURCE_PURGED
terminal
do not automatically retry with the same or a fresh idempotency_key; reconcile through the resource read task and seller audit or operator records before deciding whether to initiate a new operation
COMPLIANCE_UNSATISFIED
correctable
choose a format that supports the required disclosure positions and persistence modes, remove the disclosure requirement, or revise the refinement instruction
CONFIGURATION_ERROR
terminal
surface to a human at the seller — the buyer cannot resolve a seller-side deployment misconfiguration and MUST NOT auto-retry
CONFLICT
transient
re-read the resource and retry with current state
CONFLICTING_SELECTORS
correctable
emit one canonical format selector route, or make every required legacy 3.x compatibility projection select the same product format contract under the canonical v2-narrows-v1 comparison
CREATIVE_DEADLINE_EXCEEDED
correctable
check creative_deadline via get_media_buys before submitting changes, or negotiate a deadline extension with the seller
CREATIVE_INACCESSIBLE
correctable
verify the asset URLs in creative_manifest are reachable without agent-side credentials, then re-submit
CREATIVE_LOCALE_NOT_ACCEPTED
correctable
supply or assign a creative variant matching every in-scope format option’s accepted_language_ranges, narrow placement scope, choose a compatible format option, or change an ineligible serve_default
CREATIVE_MERGE_REJECTED
correctable
confirm the pairing via list_creatives, or use a replace assignment operation to traffic creative_id as a new serving object
CREATIVE_MISSING_CLICK_URL
correctable
add the required destination URL and resubmit the creative
CREATIVE_NOT_FOUND
correctable
verify creative_id via list_creatives, or sync_creatives to register it
CREATIVE_REJECTED
correctable
revise the creative according to the applicable advertising policy or validated accessibility criteria
CREATIVE_REPRESENTATION_UNRESOLVED
correctable
inspect every error.details.representation_rejections entry, then choose a compatible format option or supply a compatible representation
CREATIVE_REVISION_CONTENT_MISMATCH
correctable
resend the exact content previously bound to this revision_id, or mint a new revision_id for changed content
CREATIVE_SIZE_MISMATCH
correctable
resize or replace the creative with a size accepted by every selected package that may serve it
CREATIVE_VALIDATION_FAILED_GENERIC
correctable
correct the buyer-visible validation problem and resubmit the creative
CREATIVE_VALUE_NOT_ALLOWED
correctable
pick a value from error.details.allowed_values (or re-fetch the format) and resubmit
CREDENTIAL_IN_ARGS
terminal
do NOT auto-retry — auto-retry re-logs the credential on each attempt. Move authentication material or caller-supplied trust material out of request args (top-level, , , any nested location) onto the relevant transport authentication/trust channel or account provisioning path (Authorization: Bearer, RFC 9421 signature/JWKS, mTLS, MCP/A2A authentication framing); rotate any leaked credential, then resubmit
CURSOR_EXPIRED
correctable
obtain a latest checkpoint, rebuild authoritative account snapshots, then drain changes after the checkpoint
EVALUATOR_AGENT_NOT_ACCEPTED
correctable
replace the evaluator agent_url (evaluator.feature_agent.agent_url or the evaluator agent-form agent_url) with one from the seller’s published accepted_verifiers, or drop the evaluator agent pointer to fall back to seller-default ranking
FEED_FETCH_FAILED
correctable
check URL accessibility, authentication, and that content matches the declared feed_format
FIELD_NOT_PERMITTED
correctable
drop the disallowed field(s) and retry
FORMAT_DECLARATION_DIVERGENT
correctable
advisory — seller-side fix needed: producer is emitting disagreeing format_ids and format_options for the same product. Buyer SDK SHOULD prefer format_options and surface the divergent product to operators; do not auto-retry
FORMAT_DECLARATION_V1_AMBIGUOUS
correctable
advisory — seller-side fix needed: the v2 declaration’s canonical has only family-level structural registry entries (no invertible literal). Seller MUST author v1_format_ref on the v2 declaration to disambiguate; SDKs MUST NOT synthesize. Do not auto-retry
FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE
correctable
advisory — emitted alongside the partial v1 emission, NOT in place of it: the v2 declaration carries with N entries but only M v1_format_ref entries (M < N), so v1 buyers see partial size coverage on the product. Seller-side fix: add v1_format_ref entries for the missing sizes. SDK MAY (non-normative) fan out automatically by catalog lookup. Non-fatal — do not auto-retry
FORMAT_NOT_SUPPORTED
correctable
refresh get_adcp_capabilities creative.supported_formats[] and retry with a capability_id whose operations contains the intended build, preview, or validate operation
FORMAT_OPTION_UNRESOLVED
correctable
advisory — publisher-side fix needed: a placement’s references a that does not exist in this file’s top-level . Buyer SDK MUST fail closed for that placement (drop the format from the placement’s accepted set) and surface this code. Publisher fix: either declare the missing format option in or remove the reference from the placement. Do not auto-retry
FORMAT_PROJECTION_FAILED
correctable
advisory — seller-side fix needed: ask the seller to add an explicit field on the legacy format declaration, or contribute a registry entry (format_id_glob or structural match) to v1-canonical-mapping.json. Do not auto-retry; the product is still valid on the legacy named-format path
FORMAT_SHAPE_PROMOTED
correctable
advisory — migrate the legacy custom format_shape to error.details.promoted_to before error.details.transition_end; dual emission is allowed during the transition window. Do not auto-retry
GOVERNANCE_AGENT_NOT_ACCEPTED
correctable
select a governance agent matching , then retry with a fresh idempotency key
GOVERNANCE_DENIED
correctable
restructure the buy, escalate to human spending authority, or contact the governance agent for details
GOVERNANCE_UNAVAILABLE
transient
retry with backoff; if the agent remains unreachable, the buyer MUST contact the plan’s governance operator
IDEMPOTENCY_CONFLICT
correctable
use a fresh UUID v4 for the new request, or resend the exact original payload to get the cached response
IDEMPOTENCY_EXPIRED
correctable
perform a natural-key check to determine whether the original request succeeded; if no evidence of success, generate a fresh idempotency_key for a new attempt
IDEMPOTENCY_IN_FLIGHT
transient
wait top-level error.retry_after seconds and retry with the SAME idempotency_key — MUST NOT mint a fresh key (turns a safe retry into a double-execution race)
INVALID_FEED_FORMAT
correctable
verify the feed content matches the declared format
INVALID_PRICING_OPTION
correctable
verify pricing_option_id against the product’s pricing_options from get_products or the vendor’s discovery response, then resubmit with a valid ID
INVALID_REQUEST
correctable
check request parameters and fix
INVALID_STATE
correctable
check current status via get_media_buys and adjust request
INVALID_USAGE_DATA
correctable
check required fields for the vendor type (vendor_cost, currency, account at minimum), fix invalid values, and resubmit
IO_REQUIRED
correctable
review the proposal’s insertion_order, accept terms, and include io_acceptance on accept_proposal; use create_media_buy only for 3.x compatibility
ITEM_VALIDATION_FAILED
correctable
check item_issues for per-item rejection reasons and fix the offending items
MACRO_RESOLUTION_FAILED
correctable
inspect error.details.macro_resolution_results and route to a resolver that supports the declared dialect, semantic, owner, and encoding depth
MEDIA_BUY_NOT_FOUND
correctable
verify media_buy_id; for legacy correlation use get_media_buys plus context, such as context.internal_campaign_id
MULTI_FINALIZE_UNSUPPORTED
correctable
sequence single-proposal finalize calls — one finalize entry per get_products refine[] call or per refine_proposals refinements[] call
NOT_CANCELLABLE
correctable
check the seller’s cancellation policy or contact the seller
PACKAGE_NOT_FOUND
correctable
verify package_id; for legacy package correlation use get_media_buys plus package context, such as context.buyer_ref
PAYMENT_TERMS_NOT_SUPPORTED
correctable
omit payment_terms to accept the seller’s default, retry with a different supported value, or negotiate offline
PERMISSION_DENIED
correctable
call check_governance to mint a valid token, or contact the seller to resolve the underlying permission; when error.details.scope is ‘agent’ (reason ‘sandbox_only’ or ‘grant_absent’) the rejection is terminal-pending-onboarding — surface to a human rather than auto-retrying. For suspended/blocked agent relationships, sellers emit AGENT_SUSPENDED / AGENT_BLOCKED instead (those codes carry recovery: terminal directly).
PIXEL_TRACKER_LOSSY_DOWNGRADE
correctable
advisory — emitted alongside the v1 downgrade emission: SDK collapsed a pixel_tracker asset to v1 for a seller that doesn’t support pixel_tracker natively. The URL still fires; what’s lost is in (event variant, method:js execution context, or custom event timing). Buyer decision: accept the loss (most counter pixels survive), or fail the buy and route to a 3.1-capable seller. Non-fatal — do not auto-retry
PIXEL_TRACKER_UPGRADE_INFERRED
correctable
advisory — emitted when a 3.1 SDK upgrades a v1 url+tracker_pixel asset to pixel_tracker by inferring event and method from asset_id conventions. The inference may not match the buyer’s original intent; check / and re-prompt the seller for explicit values if precise measurement matters. Non-fatal — do not auto-retry
PLACE_TARGET_UNAVAILABLE
correctable
resolve the pinned value against the current catalog, review any replacement, and submit an intentional package targeting update
PLAN_NOT_FOUND
correctable
verify plan_id via sync_plans, or register the plan first
POLICY_VIOLATION
correctable
review policy requirements in the error details
PRIVATE_FIELD_IN_PUBLIC_PLACEMENT
correctable
seller-side fix needed: remove private operational fields (, , , , or similar) from public placement objects. Consumers MUST fail closed for the affected placement and alert operators; do not echo private field values in logs or error details
PRODUCT_EXPIRED
correctable
re-discover with get_products to find current inventory
PRODUCT_NOT_FOUND
correctable
remove invalid IDs and retry, or re-discover with get_products
PRODUCT_UNAVAILABLE
correctable
choose a different product
PROPOSAL_EXPIRED
correctable
call request_proposals and finalize a fresh proposal, or re-discover and finalize through legacy get_products
PROPOSAL_NOT_COMMITTED
correctable
finalize the draft through refine_proposals, or through the legacy get_products refine action
PROPOSAL_NOT_FOUND
correctable
request and finalize a fresh proposal, then retry
PROVENANCE_CLAIM_CONTRADICTED
correctable
revise the provenance claim to match the verifier’s observation or replace the creative; auto-retry without correction will not pass
PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING
correctable
set provenance.digital_source_type to a value from the digital-source-type enum and resubmit
PROVENANCE_DISCLOSURE_MISSING
correctable
set provenance.disclosure.required and, when true, populate disclosure.jurisdictions
PROVENANCE_EMBEDDED_MISSING
correctable
attach at least one embedded_provenance entry from a supported provider and resubmit
PROVENANCE_REQUIRED
correctable
attach a provenance object - at minimum digital_source_type - and resubmit
PROVENANCE_SYNTHETIC_DEPICTION_MISSING
correctable
assess the creative, set provenance.synthetic_depiction to true or false, and resubmit
PROVENANCE_VERIFIER_NOT_ACCEPTED
correctable
replace verify_agent.agent_url with one from the seller’s published accepted_verifiers, drop verify_agent if the embedding is self-verifiable, or re-embed with a verifier the seller accepts
RATE_LIMITED
transient
wait top-level error.retry_after seconds when present, then retry
READ_ONLY_SCOPE
correctable
use a non-mutating alternative, or surface to the operator to request a scope that permits mutation
REFERENCE_DEFINITION_CHANGED
correctable
refine the proposal so the seller re-resolves the pinned definitions and issues fresh pins, review the changed definition, then finalize and accept the new proposal
REFERENCE_NOT_FOUND
correctable
verify the referenced identifier exists and is accessible to the caller
REQUOTE_REQUIRED
correctable
use error.details.decline_reason when present to inform recovery, then refine accepted_proposal_id and apply the amendment through accept_proposal, or keep control_media_buy inside the accepted envelope; some policies require a free-text ask or human negotiation, and 3.1 compatibility callers must adjust or rediscover
RIGHTS_CHANNEL_VIOLATION
correctable
advisory — inspect error.details.rights_id and the requested channel against rights[].channels / excluded_channels; target a capability on a permitted channel, confirm the rights entry applies to this output, or have the holder grant the channel (a human or holder action)
SCOPE_INSUFFICIENT
correctable
the agent cannot broaden its own scope - surface to the operator rather than auto-retry
SERVICE_UNAVAILABLE
transient
retry with exponential backoff
SESSION_NOT_FOUND
correctable
initiate a new session via si_initiate_session
SESSION_TERMINATED
correctable
initiate a new session via si_initiate_session
SIGNAL_NOT_FOUND
correctable
verify signal_id via get_signals, or confirm the signal is available from this agent
SIGNAL_TARGETING_INCOMPATIBLE
correctable
assign the creative to a package whose signal targeting matches the creative’s signal_condition, or rebuild the creative for the package’s condition; match on shared signal_ref identity (compare signal_agent_segment_id exactly when both carry it, else categorical signal_ref + value)
SIGNED_RESPONSE_ENVELOPE_EXPIRED
transient
re-invoke the designated task (verify_brand_claim or verify_brand_claims) to obtain a freshly signed response with a current exp window
SIGNED_RESPONSE_REQUEST_HASH_MISMATCH
correctable
re-invoke the designated task with the intended request parameters — the signed response’s request_hash does not match the verifier’s recomputed hash of the actual request; if the mismatch persists across retries, investigate JCS request-binding canonicalization between caller and responder
SIGNED_RESPONSE_TENANT_MISMATCH
correctable
verify the request targeted the correct brand domain and agent_url, then re-invoke; if the mismatch persists, the responding agent’s server-side tenant resolution may be misconfigured
SOURCE_ACCESS_FAILED
correctable
error.field source.locator/source.segment_ref: fix the reference; error.field source: grant the seller’s declared consumer identity and retry; no error.field: vendor outage, retry with backoff
STALE_RESPONSE
transient
advisory — emitted alongside a populated payload that was served from cache past the seller’s freshness target because an upstream or sub-agent was unreachable. The response is usable; treat as non-fatal. Inspect to decide whether to immediately retry for fresh data or accept the cached value; the seller’s own service is healthy, so retry is safe (it does not amplify the upstream failure)
TERMS_REJECTED
correctable
adjust the proposed terms and retry, or omit measurement_terms to accept the product’s defaults
UNPRICEABLE_OUTPUT
correctable
target an output format the transformer prices, or have the seller add a pricing option covering it
UNSUPPORTED_FEATURE
correctable
check get_adcp_capabilities (or the product’s overlay_support for a rejected targeting dimension), remove unsupported fields, and use details.replacement_dimension when present
UNSUPPORTED_GRANULARITY
correctable
pick a granularity from the product’s reporting_capabilities.windowed_pull_granularities (via get_adcp_capabilities) and resubmit, or omit time_granularity to fall back to cumulative date-range pulls
UNSUPPORTED_PROVISIONING
correctable
re-issue with the entry shape the seller supports — for settings-update sellers with account-id namespaces, or for provisioning sellers; check seller documentation or capability declaration for which modes are implemented
VALIDATION_ERROR
correctable
review error details and fix field values
VAST_PARSE_FAILED
correctable
inspect error.details.reason (not_xml, no_vast_root, no_ad, no_media_file), fix the VAST document, and resubmit
VAST_VERSION_MISMATCH
correctable
inspect error.details.mismatch_reason and the corresponding acceptance-set or observed-document fields; select a compatible source representation or correct the offending VAST document
VAST_WRAPPER_DEPTH_EXCEEDED
correctable
inspect error.details.reason (depth, loop, timeout); flatten the wrapper chain, reduce redirects below the format’s max_wrapper_depth, or fix the failing hop
VERSION_UNSUPPORTED
correctable
re-pin to a release in supported_versions and retry, or call get_adcp_capabilities without a version pin to discover supported_versions
Suggested action: pass explicit account_id or a more specific natural keyNatural key resolves to multiple accounts. Recovery: correctable (pass explicit account_id or a more specific natural key).
ACCOUNT_IDENTITY_CONFLICT — correctable
Suggested action: choose a different operator or operator_unit identity, or retain the account’s current identity; do not retry the same desired identity unchangedThe complete operator_identity requested through sync_accounts would rekey the account onto a natural key already owned by another account. The seller MUST reject the change atomically, MUST NOT merge the accounts, and MUST preserve both accounts and every account-scoped resource unchanged. Distinct from CONFLICT, which reports a transient stale revision or concurrent write. Recovery: correctable (choose a different operator or operator_unit identity, or retain the account’s current identity; do not retry the same desired identity unchanged).
ACCOUNT_MOVED — correctable
Suggested action: replace the stale reference with error.details.current_account, refresh through list_accounts, and retry with a fresh idempotency keyAn authorized caller used a former natural key that was tombstoned after the same account was rekeyed through sync_accounts. The seller MUST return the current canonical reference in error.details.current_account, conforming to error-details/account-moved.json, and MUST NOT provision or resolve a second account from the former key. Sellers retain the tombstone while the account or any account-scoped historical resources are retained. To avoid a cross-tenant existence oracle, sellers return ACCOUNT_MOVED only when the caller is authorized to resolve the current account; otherwise they return ACCOUNT_NOT_FOUND. Recovery: correctable (replace the stale account reference with details.current_account, refresh through list_accounts, and retry with a fresh idempotency key).
ACCOUNT_NOT_FOUND — terminal
Suggested action: for a natural key, provision through sync_accounts or omit account for public discovery; for an account_id, verify via list_accounts or contact sellerThe account reference could not be resolved: an account_id that does not exist, a buyer-declared natural key the seller has not provisioned, or an account outside the caller’s authorized set. Sellers return it on tasks where account is optional too, rather than ignoring the reference, unless a lazy-provisioning seller answers a discovery task for the account it would create. Recovery: terminal (for a natural key, provision through sync_accounts or omit account for public discovery; for an account_id, verify via list_accounts or contact seller).
ACCOUNT_PAYMENT_REQUIRED — terminal
Suggested action: buyer must resolve billingAccount has an outstanding balance requiring payment before new buys. Recovery: terminal (buyer must resolve billing).
ACCOUNT_REQUIRED — correctable
Suggested action: pass account, or reference an existing resource whose owning account the service can resolveThe service must resolve the commercial account before it can determine governance applicability, but the request and referenced resource do not identify one. Recovery: correctable (pass account, or use a resource bound to an account).
ACCOUNT_SETUP_REQUIRED — correctable
Suggested action: check details.setup for URL or instructionsNatural key resolved but the account needs setup before use. Recovery: correctable (check details.setup for URL or instructions).
ACCOUNT_SUSPENDED — terminal
Suggested action: contact seller to resolve suspensionAccount has been suspended. Recovery: terminal (contact seller to resolve suspension).
ACTION_NOT_ALLOWED — correctable
Suggested action: branch on error.details.reason: for wrong_status, wait for or transition to a status listed under the action’s allowed_statuses; for mode_mismatch, this is a flow switch (not a retry against update_media_buy) — follow the mode named in available_actions[<action>].mode; for condition_unresolved, wait until the seller advertises the action after resolving its opaque condition; for not_supported_on_product or not_supported_on_buy, do not retry — the action is unavailable on this buy and buyer must select a different product or renegotiate, using error.details.decline_reason when present to inform that renegotiationThe requested mutation maps to an action that is not currently available on this media buy. Sellers MUST populate with (the structured available-action identifier the request maps to), (an value: , , , , or ), and (echo of the buy’s resolved so the buyer SDK can offer recovery without a separate get_media_buys round-trip). For , sellers SHOULD also populate from when they have a structured reason and disclosure does not expose private thresholds or enforcement controls. SHOULD be omitted for structural reasons. All producer-authored explanatory text, including message, suggestion, and extension detail values, MUST remain buyer-safe and MUST NOT contain vendor identifiers, internal object names, internal IDs, stack traces, or other producer-private implementation details. Recovery: correctable when is (wait for or transition to an allowed status), (re-issue through the appropriate flow), or (wait until the seller can resolve the condition and advertises the action). Terminal-for-this-buy when is or — buyers select a different product or renegotiate buy terms.
AGENT_BLOCKED — terminal
Suggested action: surface to a human at the buyer — the relationship is permanently denied and is reinstated only through offline operator action with the seller, not via any seller-callable AdCP taskThe calling buyer agent’s commercial relationship with the seller is permanently denied — the agent is blocked. Sibling to on the agent-relationship axis but with no recovery path (a suspension may lift via re-onboarding; a block does not). The code itself is the discriminator — same posture as : no payload, no per-agent commercial state, cross-tenant onboarding oracle clamp + channel-coverage requirements normative in error-handling.mdx Per-Agent Authorization Gate. Recovery: terminal (no autonomous recovery — the agent MUST surface to a human at the buyer; relationships are reinstated only through offline operator action with the seller, not via any seller-callable AdCP task).
AGENT_SUSPENDED — terminal
Suggested action: surface to a human at the buyer — the agent cannot unilaterally lift a suspension; re-onboarding with the seller offline may resolveThe calling buyer agent’s commercial relationship with the seller is temporarily paused — the agent is onboarded but currently suspended. Sibling to (account-wide) and (per-plan) but scoped to the agent-relationship axis (orthogonal to any specific account on that agent). The code itself is the discriminator — it does NOT carry an payload (mirroring ‘s discriminator-by-code pattern), and MUST NOT carry per-agent commercial state (rate cards, payment terms, credit limit, billing entity, contact channels) since full disclosure of per-agent state in a single probe is a per-agent oracle. Cross-tenant onboarding oracle clamp + channel-coverage requirements (response shape, HTTP/A2A/MCP status, headers, side effects, observability, latency parity, retry-counter side channel) are normative in error-handling.mdx Per-Agent Authorization Gate; this description does not restate them to avoid drift. Recovery: terminal (re-onboarding may resolve the suspension; the agent MUST surface to a human at the buyer rather than auto-retrying — the agent cannot unilaterally lift a suspension, and re-attempts only reinforce the gate).
AMBIGUOUS_BIDDING_POLICY — correctable
Suggested action: remove either the canonical bidding block or all legacy bidding fields from the effective packageThe same effective package combines the canonical bidding block with legacy bid_price or monetary optimization-goal target fields, so two bidding interpretations are present. Sellers MUST reject rather than choosing a winner. Recovery: correctable (emit only the 3.2 bidding block or only one legacy representation).
AUDIENCE_TOO_SMALL — correctable
Suggested action: broaden targeting or upload more audience membersAudience segment is below the minimum required size for targeting. Recovery: correctable (broaden targeting or upload more audience members).
AUTHORIZATION_REQUIRED — correctable
Suggested action: complete or restore the required downstream platform connection, identity, creator, or post authorization; use error.details.missing_connections, authorization_url, authorization_instructions, or reference_authorization when presentThe caller is authenticated, but the referenced object requires an additional downstream platform connection, identity, creator, or post authorization before the seller can complete the requested action. Typical use: with a reference where the seller can resolve the post but the owning identity has not authorized paid serving, or authorization has expired/revoked and can be restored. Distinct from / (caller credentials) and from (seller policy denies the caller). Sellers SHOULD include recovery details conforming to , especially when the caller needs to complete one of several platform connections. Legacy recovery hints such as , , or remain valid when safe to disclose. Recovery: correctable (complete or restore the required authorization, then retry).
AUTH_INVALID — terminal
Suggested action: do NOT auto-retry — credentials were rejected; rotate keys, refresh OAuth tokens once if applicable, otherwise escalate to a humanCredentials were presented but rejected — revoked, malformed signature, or a key no longer in the seller’s keystore. Sellers MUST return this code when an header was present but verification failed. Recovery: terminal. Exception: agents with a valid OAuth 2.1 refresh grant MAY treat this as correctable when the rejection reason is token expiry — silently refresh and retry once; if the refresh fails or the seller explicitly signals revocation, escalate to human.
AUTH_MISSING — correctable
Suggested action: provide credentials via the auth header and retryNo credentials were presented. Sellers MUST return this code when no header was included in the request. Recovery: correctable (provide credentials via the auth header and retry).
AUTH_REQUIRED — correctable
Suggested action: provide credentials when missing; do NOT auto-retry rejected credentials — escalate for rotationDeprecated — use (no credentials presented) or (credentials presented and rejected). Retained as a backward-compatible alias during the 3.x deprecation window. Recovery: correctable.
BIDDING_PLACEMENT_CONFLICT — correctable
Suggested action: align media-buy and package bidding scopes with the provider’s supported placement, or choose a compatible budget mode/product combinationThe authored media-buy/package bidding scopes cannot be represented by the provider’s native campaign, package, or shared-strategy placement rules. Sellers MUST detect this before any provider mutation and SHOULD identify the conflicting scopes and provider constraint in error.details. Recovery: correctable (remove or align package overrides, move the policy to the supported scope, or choose a compatible budget mode/product combination).
BILLING_NOT_PERMITTED_FOR_AGENT — correctable
Suggested action: retry with error.details.suggested_billing (typically ‘operator’) when present; when absent, surface to a human at the buyer — the agent cannot unilaterally extend its commercial relationship and MUST NOT auto-retryThe seller’s capability accepts the requested model, but the calling buyer agent’s commercial relationship with the seller does not — e.g., the agent is onboarded as passthrough-only (no payments relationship — only the operator can be invoiced) and or is rejected even though the seller supports both at the capability level. Distinct from (seller-wide capability) by being narrowly per-buyer-agent: the gate is the seller’s onboarding record for this caller, not the seller’s global wire capability. Sellers MUST emit this code only after agent identity has been established via signed-request derivation or a credential-to-agent mapping in the seller’s onboarding record; callers without established identity MUST receive instead, to prevent the distinct code from acting as an onboarding oracle. The recovery shape is deliberately minimal — MUST conform to ( plus an optional single retry value, typically ) and MUST NOT carry the agent’s full permitted-billing subset, rate cards, payment terms, credit limit, billing entity, or any other per-agent commercial state. Recovery: correctable (retry with when present; when absent, surface to a human at the buyer — the agent cannot unilaterally extend its commercial relationship and MUST NOT auto-retry, since payments-relationship onboarding with the seller is offline).
BILLING_NOT_SUPPORTED — correctable
Suggested action: check get_adcp_capabilities for supported_billing and resubmit with a supported value, or omit billing to accept the seller’s defaultThe seller declines the requested value either at the seller-wide capability level ( does not include the value) or at the per-account-relationship level (e.g., the seller accepts billing in general but has no direct billing relationship with the operator on this specific account). The default reject code for billing-value mismatches; SHOULD conform to ( ∈ plus optional echo for the scope) so callers can dispatch without parsing prose. Distinct from , which is narrowly scoped to the calling buyer agent’s commercial relationship with the seller (passthrough-only vs agent-billable) rather than to the seller’s capability or per-account state. Sellers MUST emit only when agent identity has been established via signed-request derivation or a credential-to-agent mapping in the seller’s onboarding record; in all other cases (unauthenticated callers and bearer credentials not mapped to a specific agent record) sellers MUST return and MUST omit — emitting the per-agent code or the -scope hint without established identity is a cross-tenant onboarding oracle (same uniform-response shape required by the family). Recovery: correctable (check for and resubmit with a value the seller supports, or omit to accept the seller’s default).
BILLING_OUT_OF_BAND — terminal
Suggested action: do not retry — billing for this account runs through a non-AdCP channel. Pre-filter via capabilities.creative.bills_through_adcp before sending report_usage; flag the account in the buyer’s routing table and fall back to the ad server’s native billing export for cost reconciliationA creative-agent billing-loop operation ( is the canonical case) received a well-formed record that the agent will not bill on because this account bills via a non-AdCP channel — flat license, SaaS contract, bundled enterprise agreement, or any other out-of-band arrangement. The agent returns with the offending record(s) listed in carrying this code; the request itself is valid and silent acceptance would break buyer-side reconciliation. Distinct from (the seller declines a specific value on a media-buy account where AdCP billing is otherwise in scope) and (per-buyer-agent commercial gate on an otherwise-billable surface) by signaling that the entire billing surface is offline for this account, not that a specific value or caller is rejected. Buyers SHOULD pre-filter by reading from before issuing ; agents that have not yet declared the capability remain in the probe-to-discover mode. The error is returned per-record (in the response array with pointing at or a specific record subpath), not at the envelope level. The code itself is the discriminator; no shape is defined for this code (mirroring ‘s discriminator-by-code pattern). Recovery: terminal — auto-retry will not change the outcome; the buyer SHOULD flag the account in its routing table so reconciliation falls back to the ad server’s native billing export (or whatever offline channel the agent uses) rather than expecting AdCP-side cost truth.
BRAND_REQUIRED — correctable
Suggested action: include brand (domain plus optional brand_id) on the requestA billable operation was attempted without a brand reference. Every billable operation requires either a seller-assigned or a natural key including . Recovery: correctable (include — plus optional — on the request).
BUDGET_CAP_REACHED — correctable
Suggested action: raise max_spend, or reduce max_creatives/max_variants, to produce the remaining itemsbuild_creative stopped producing early because the next leaf would exceed the request’s max_spend ceiling. Normally a SUCCESSFUL partial build (BuildCreativeVariantSuccess with budget_status: ‘capped’ and an advisory BUDGET_CAP_REACHED entry — every returned leaf is real and billed); returned as a terminal error only when even the first leaf would exceed the cap (no partial possible). Distinct from BUDGET_EXCEEDED (would exceed a media-buy/package allocation — a rejection) and BUDGET_EXHAUSTED (already spent). Recovery: correctable (raise max_spend, or reduce max_creatives/max_variants).
BUDGET_EXCEEDED — correctable
Suggested action: reduce requested amount or increase budget allocationOperation would exceed the allocated budget for the media buy or package. Distinct from BUDGET_EXHAUSTED (already spent) and BUDGET_TOO_LOW (below minimum). Recovery: correctable (reduce requested amount or increase budget allocation).
BUDGET_EXHAUSTED — terminal
Suggested action: buyer must add funds or increase budget capAccount or campaign budget has been fully spent. Distinct from BUDGET_TOO_LOW (rejected at submission). Recovery: terminal (buyer must add funds or increase budget cap).
BUDGET_TOO_LOW — correctable
Suggested action: increase budget or check capabilities.media_buy.limitsBudget is below the seller’s minimum. Recovery: correctable (increase budget or check capabilities.media_buy.limits).
CAMPAIGN_SUSPENDED — transient
Suggested action: wait for the escalation to resolve; contact the plan operator if the suspension persistsCampaign governance has been suspended pending human review; the governance agent MUST reject and calls on the affected plan until the escalation is resolved. Distinct from (account-wide) — this is scoped to a single plan/campaign. Recovery: transient (wait for the escalation to resolve; contact the plan operator if the suspension persists).
CATALOG_LIMIT_EXCEEDED — correctable
Suggested action: remove unused catalogs, or contact the seller to raise the limitThe account has reached its maximum catalog count. Recovery: correctable (remove unused catalogs, or contact the seller to raise the limit).
COMMITTED_RESOURCE_PURGED — terminal
Suggested action: do not automatically retry with the same or a fresh idempotency_key; reconcile through the resource read task and seller audit or operator records before deciding whether to initiate a new operationThe requested mutation committed, but the affected resource was independently deleted or purged for a reason outside that requested mutation before the seller could durably record the canonical success response. The write stands even though the resource no longer exists, so sellers SHOULD set error.mutation_outcome to applied and MUST NOT set not_applied; this code does not describe the successful outcome of a requested delete operation. Sellers MUST retain the idempotency key record and canonical request hash independently of the resource until at least committed_at + replay_ttl_seconds, and exact replays MUST return this terminal outcome with replayed: true without re-executing the mutation. If the canonical success response was already durably recorded, sellers return that historical response under the normal replay rule instead. Distinct from CONFLICT (a transient concurrent modification before a stable result) and MEDIA_BUY_NOT_FOUND (a request targeting a resource that was already absent). Recovery: terminal (do not automatically retry with the same or a fresh idempotency_key; first reconcile through the resource read task and seller audit or operator records, then initiate a new operation only when reconciliation confirms that is intended).
COMPLIANCE_UNSATISFIED — correctable
Suggested action: choose a format that supports the required disclosure positions and persistence modes, remove the disclosure requirement, or revise the refinement instructionA required disclosure from the brief’s compliance section cannot be satisfied — either the target format’s disclosure_capabilities do not include the required position or persistence mode, or (on a refinement) the request’s message or config instructs removal or contradiction of a required disclosure or the use of a prohibited claim. Recovery: correctable (choose a format that supports the required disclosure positions and persistence modes, remove the disclosure requirement, or revise the refinement instruction).
CONFIGURATION_ERROR — terminal
Suggested action: surface to a human at the seller — the buyer cannot resolve a seller-side deployment misconfiguration and MUST NOT auto-retryThe seller’s deployment is misconfigured in a way that prevents handling the request — the buyer cannot fix it, retrying will not help, and reporting to the seller’s operator is the only remediation. Examples: account declared with but no populated; platform declared with or but no declared; required environment variable unset on the seller process. Distinct from (buyer-fixable; the request itself is malformed), (transient; retry-with-backoff may succeed), (capability mismatch — the seller does not implement the requested specialism), (buyer-side onboarding incomplete; this code is seller-side deployment incomplete), and (governance-agent-scoped; transient). Wire placement. The deployment cannot produce a success artifact, so sellers MUST flip transport-level failure markers (HTTP 5xx, MCP , A2A ) and populate both layers per the two-layer model in . The code itself is the discriminator; no shape is defined for this code (mirroring the minimal-disclosure precedent of / ). Sellers SHOULD populate with operator-actionable detail (which metadata key is missing, which env var is unset) and MUST NOT include credentials, connection strings, or stack traces — the message is wire-visible to the buyer. Recovery: terminal — the buyer MUST surface to the seller’s operator and MUST NOT auto-retry (retries cannot resolve a misconfigured deployment until the operator intervenes).
CONFLICT — transient
Suggested action: re-read the resource and retry with current stateConcurrent modification detected. The resource was modified by another request between read and write. This code does not cover a resource that was committed and then independently deleted or purged before the seller could durably record the canonical success response; use COMMITTED_RESOURCE_PURGED for that terminal outcome. Recovery: transient (re-read the resource and retry with current state).
CONFLICTING_SELECTORS — correctable
Suggested action: emit one canonical format selector route, or make every required legacy 3.x compatibility projection select the same product format contract under the canonical v2-narrows-v1 comparisonA 3.x package request carries multiple resolvable format selector routes that select different canonical product format declaration sets. Sellers MUST first resolve every present route independently (, direct plus , and deprecated ) without applying precedence. An unresolved option reference or an unprojectable legacy ID is rejected with , not this code. Once all routes resolve, sellers derive the product entries selected by each route using directional product satisfaction and require those sets to match. Legacy parameter compatibility uses the asymmetric v2-narrows-v1 relation defined by canonical formats, not raw object equality. For fixed-size image selectors, both width and height participate in compatibility. Sellers MUST reject different format shapes, selected option sets, or incompatible dimensions rather than silently choosing the canonical route. SHOULD point at the conflicting package, and SHOULD identify the supplied selector routes and their normalized canonical summaries. Recovery: correctable (emit one canonical selector route, or make a required legacy 3.x compatibility projection select the same product format contract).
CREATIVE_DEADLINE_EXCEEDED — correctable
Suggested action: check creative_deadline via get_media_buys before submitting changes, or negotiate a deadline extension with the sellerCreative change submitted after the package’s creative_deadline. Distinct from CREATIVE_REJECTED (content-policy, brand-safety, or accessibility-review failure). Recovery: correctable (check creative_deadline via get_media_buys before submitting changes, or negotiate a deadline extension with the seller).
CREATIVE_INACCESSIBLE — correctable
Suggested action: verify the asset URLs in creative_manifest are reachable without agent-side credentials, then re-submitA creative governance agent (get_creative_features) could not retrieve the submitted creative_manifest assets for evaluation — an asset URL was unreachable, returned an error, or required credentials the agent does not hold. Distinct from CREATIVE_NOT_FOUND (a creative_id absent from the agent’s library, not an asset-fetch failure) and CREATIVE_REJECTED (assets retrieved but failed creative review). Recovery: correctable (verify the asset URLs are reachable without agent-side credentials, then re-submit).
CREATIVE_LOCALE_NOT_ACCEPTED — correctable
Suggested action: supply or assign a creative variant matching every in-scope format option’s accepted_language_ranges, narrow placement scope, choose a compatible format option, or change an ineligible serve_defaultA creative bound to a locale-constrained product format has no materialized variant matching locale_policy.accepted_language_ranges, lacks protocol-declared locale topology, or uses serve_default with a seller-ineligible default variant. Seller ranges use RFC 4647 Basic Filtering and are applied independently for every placement where the assignment may serve, before buyer Lookup, locale_fallbacks, or default selection. Distinct from CREATIVE_REJECTED because this is a mechanically discoverable assignment-eligibility mismatch, not subjective content review. error.field SHOULD point to the offending creative or assignment; error.details SHOULD include format_option_id when present, accepted_language_ranges, available_variant_locales, and placement identity when applicable. Recovery: correctable (supply or assign a matching materialized locale variant, narrow placement scope, choose a compatible format option, or change an ineligible serve_default).
CREATIVE_MERGE_REJECTED — correctable
Suggested action: confirm the pairing via list_creatives, or use a replace assignment operation to traffic creative_id as a new serving objectOne or more sync_creatives merge assignment operations failed seller verification. The seller evaluates every merge in the request, MUST leave every assignment unchanged (assignment operations are atomic), SHOULD set error.field to the first rejected assignment_operations entry, and SHOULD return details conforming to error-details/creative-merge-rejected.json listing each rejected merge with a reason: content_mismatch (the seller judges the copy is a different creative), format_mismatch (the buyer’s creative cannot take over the copy’s serving object), not_on_package (merged_creative_id is not a seller-assigned creative assigned to the package in this account, reported uniformly for unknown IDs), or not_supported (the seller cannot merge this pairing on this package). A seller that does not declare creative.supports_assignment_merge returns UNSUPPORTED_FEATURE instead. Recovery: correctable (drop or fix the rejected merges and resubmit; use replace to traffic creative_id as a new serving object).
CREATIVE_MISSING_CLICK_URL — correctable
Suggested action: add the required destination URL and resubmit the creativeA submitted creative that requires a destination URL does not provide one. Sellers SHOULD identify the missing buyer-visible field in error.field and MUST NOT expose downstream ad-server names or internal object identifiers in the buyer-facing message. Recovery: correctable (add the required destination URL and resubmit the creative).
CREATIVE_NOT_FOUND — correctable
Suggested action: verify creative_id via list_creatives, or sync_creatives to register itReferenced creative does not exist in the agent’s creative library. Recovery: correctable (verify creative_id via list_creatives, or sync_creatives to register it). Sellers MUST return this code uniformly for any creative_id not owned by the calling account — never distinguish ‘exists in another tenant’ from ‘does not exist’, which would enable cross-tenant enumeration.
CREATIVE_REJECTED — correctable
Suggested action: revise the creative according to the applicable advertising policy or validated accessibility criteriaCreative failed content-policy, brand-safety, or accessibility review. For deadline violations, see CREATIVE_DEADLINE_EXCEEDED. Accessibility failures SHOULD use structured details conforming to error-details/accessibility-violation.json. Recovery: correctable (revise the creative according to the applicable policy or validated accessibility criteria).
CREATIVE_REPRESENTATION_UNRESOLVED — correctable
Suggested action: inspect every error.details.representation_rejections entry, then choose a compatible format option or supply a compatible representationNo representation in a CreativeRepresentationSet is compatible with the selected target capability or product format option. The resolver MUST retain the complete representation set and MUST include one entry per candidate, conforming to ; silent seller guessing is forbidden. Recovery: correctable (choose a compatible product/format option, add a compatible representation under a new revision, or fix the rejected asset contract).
CREATIVE_REVISION_CONTENT_MISMATCH — correctable
Suggested action: resend the exact content previously bound to this revision_id, or mint a new revision_id for changed contentA sync_creatives item reused a revision_id for different canonical revision content under the same creative_id. Revision identity is scoped to the parent creative and immutable after first acceptance. Sellers MUST evaluate the buyer input before transcoding or normalization, MUST leave the prior creative state unchanged, and SHOULD return details conforming to error-details/creative-revision-content-mismatch.json. Distinct from IDEMPOTENCY_CONFLICT: idempotency_key protects one request replay window, while revision identity protects creative content across requests and retention. Recovery: correctable (resend the exact content previously bound to this revision_id, or mint a new revision_id for the changed content).
CREATIVE_SIZE_MISMATCH — correctable
Suggested action: resize or replace the creative with a size accepted by every selected package that may serve itThe submitted creative dimensions do not match any size accepted by the selected packages. Sellers SHOULD identify the offending creative in error.field and MAY include the submitted and accepted dimensions in buyer-safe error.details. Recovery: correctable (resize or replace the creative with a size accepted by every selected package that may serve it).
CREATIVE_VALIDATION_FAILED_GENERIC — correctable
Suggested action: correct the buyer-visible validation problem and resubmit the creativeThe creative failed buyer-correctable validation, but the producer cannot classify the failure with a more specific standard code. Producers SHOULD prefer a specific creative code whenever one applies and MUST keep buyer-facing messages free of vendor identifiers, internal object names, internal IDs, and stack traces. Recovery: correctable (correct the buyer-visible validation problem and resubmit the creative).
CREATIVE_VALUE_NOT_ALLOWED — correctable
Suggested action: pick a value from error.details.allowed_values (or re-fetch the format) and resubmitA submitted text-asset value is not in the format’s declared list. Distinct from (generic creative-review failure) by being a closed-set constraint violation that the buyer can resolve mechanically without policy interpretation — the seller has published the complete list of acceptable values on the format, and any value outside that list is rejected by definition. The seller MUST set to the offending asset’s path within the manifest (e.g., or the field name declared by the format) and SHOULD include the format’s array in so the buyer agent can re-prompt its LLM with constrained sampling. Recovery: correctable (select a value from and resubmit).
CREDENTIAL_IN_ARGS — terminal
Suggested action: do NOT auto-retry — auto-retry re-logs the credential on each attempt. Move authentication material or caller-supplied trust material out of request args (top-level, , , any nested location) onto the relevant transport authentication/trust channel or account provisioning path (Authorization: Bearer, RFC 9421 signature/JWKS, mTLS, MCP/A2A authentication framing); rotate any leaked credential, then resubmitThe seller detected authentication material or caller-supplied trust material placed in request args (top-level, in , in , or any other nested location in the task payload) instead of arriving on the relevant transport authentication or trust channel. This includes buyer-principal credentials that should arrive on the inbound transport ( per RFC 6750 §2 for HTTP, RFC 9421 signature headers for signed requests, MCP/A2A authentication framing per RFC 9728 §3), and evaluator-call credentials or JWK/JWKS/JWKS-URI trust material smuggled into evaluator-related payload fields instead of being established through the creative agent’s outbound transport authentication to the evaluator. Distinct from (no credentials presented or presented credentials rejected on the transport channel) and (authenticated caller not authorized for the action). Distinct from the receiver-side credentials carried in , which configure the seller’s webhook callback authentication and are not buyer-principal or evaluator-call credentials — those are an explicit carve-out and MUST NOT trigger this code. Sellers SHOULD reject credential-in-args under AdCP 3.1; the requirement upgrades to MUST 90 days after the 3.1 publication date. Recovery: terminal — the agent MUST NOT auto-retry. Auto-retry against this code re-logs the credential on each attempt across the seller’s request logs, observability stack, and any LLM-context surfaces in the buyer-side recovery loop, exactly the prompt-injection exfiltration surface that motivated the rule. Wire placement. Sellers MUST flip transport-level failure markers (HTTP 4xx, MCP , A2A ) and populate both layers per the two-layer model in . The code itself is the discriminator; no shape is defined, and MUST NOT echo the offending credential value or any prefix of it (e.g., ). MUST be generic and MUST NOT contain credential material. Sellers MUST drop the smuggled credential from logs, audit rows, and observability spans before persisting the rejection — the rejection itself is otherwise an exfiltration surface.
CURSOR_EXPIRED — correctable
Suggested action: obtain a latest checkpoint, rebuild authoritative account snapshots, then drain changes after the checkpointThe list_account_changes cursor (experimental, account.change_feed) is no longer within the seller’s retained account change window. The seller MUST NOT silently restart from the retention boundary. Recovery: correctable (obtain a new starting_position: latest checkpoint, rebuild every authoritative account snapshot, then drain changes after that checkpoint). error.details SHOULD include available_since and MAY include a replacement starting-position hint, without disclosing inaccessible history.
EVALUATOR_AGENT_NOT_ACCEPTED — correctable
Suggested action: replace the evaluator agent_url (evaluator.feature_agent.agent_url or the evaluator agent-form agent_url) with one from the seller’s published accepted_verifiers, or drop the evaluator agent pointer to fall back to seller-default rankingBuyer attached an evaluator agent pointer on — or the agent-form — that does not match (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments) any entry in the seller’s . The producing agent does not call buyer-asserted endpoints outside its allowlist; this mirrors for the gate/rank evaluator path — the buyer represents which on-list agent it used, the seller is the agent-of-record and calls only allowlisted agents. MUST point at the offending path; SHOULD include a reference to the product whose the buyer should consult. Recovery: correctable (replace the agent_url with one from the seller’s published , or drop the evaluator agent pointer to fall back to seller-default ranking).
FEED_FETCH_FAILED — correctable
Suggested action: check URL accessibility, authentication, and that content matches the declared feed_formatPlatform could not fetch the catalog feed URL during sync_catalogs. Recovery: correctable (check URL accessibility, authentication, and that the content matches the declared feed_format).
FIELD_NOT_PERMITTED — correctable
Suggested action: drop the disallowed field(s) and retryA request field is not in the caller’s allowlist for this task. Sellers declaring on the account’s object MUST reject any request that sets a non-allowlisted field with this code. Distinct from (schema/business-rule violation) - the field is valid, just not writable by this caller. MUST identify the exact offending field path (e.g., ); when multiple fields are disallowed, sellers SHOULD return one error per field, or MAY enumerate them in . Recovery: correctable and agent-autonomous - agent may drop the disallowed field(s) and retry.
FORMAT_DECLARATION_DIVERGENT — correctable
Suggested action: advisory — seller-side fix needed: producer is emitting disagreeing format_ids and format_options for the same product. Buyer SDK SHOULD prefer format_options and surface the divergent product to operators; do not auto-retryNon-fatal advisory raised when a product carries BOTH (v1) AND (v2) and the two disagree (different canonical, different dimensions, different orientation) after projection. The producer’s contract is that both shapes MUST refer to the same underlying declaration; divergence is a producer bug.Either side MAY emit this code: a SELLER may self-detect on emit (own producer bug; rare), or more commonly a consumer-SDK detects on consumption. SDKs MUST prefer (the richer surface) when both are present and MUST surface the divergent product so it’s observable rather than silently picked-one-and-dropped-other. Hard-failing the entire response is discouraged — it punishes downstream buyers for the producer bug.Surface placement (normative). Same single-surface mandate as : SDKs that detect this on consumption MUST augment the response’s array with an entry carrying , , , and the field+details described below. Logger-only is insufficient; lint-output channels are NOT acceptable as the surface (the multi-hop agent network needs warnings to propagate across SDK boundaries via the wire response). MUST point at the offending product; SHOULD carry so buyer SDKs can flag the producer for follow-up.Multi-hop deduplication. Each hop that detects the same divergence SHOULD deduplicate by rather than re-emit; the existing entry’s identifies which earlier processor saw it first.Recovery: correctable but seller-side — buyer can’t fix divergent declarations, only flag them.
FORMAT_DECLARATION_V1_AMBIGUOUS — correctable
Suggested action: advisory — seller-side fix needed: the v2 declaration’s canonical has only family-level structural registry entries (no invertible literal). Seller MUST author v1_format_ref on the v2 declaration to disambiguate; SDKs MUST NOT synthesize. Do not auto-retryNon-fatal advisory raised when an SDK detects that a product’s v2 declaration cannot be unambiguously projected back to a single v1 named format because the v1-canonical-mapping registry has only family-level structural entries for this canonical (no invertible literal). The family is known (e.g., ‘this is a video_vast’); the specific v1 named format isn’t pickable mechanically. Distinct from (registry-coverage gap, correctable by adding a registry entry) — ambiguity is structural: the family is defined but a specific format can’t be picked without seller assertion.Surface placement: same single-mandate as and — SDKs MUST augment the response’s array with an entry carrying , , , pointing at the offending declaration, and SHOULD carry so adopters can see why the inversion was ambiguous.SDKs MUST NOT synthesize a v1_format_ref in this case (or any other case). v1↔v2 explicit pairing is seller-asserted only — SDKs encountering family-only registry matches MUST treat the v2 declaration as v1-unreachable and surface this code rather than invent a plausible v1 format_id. The seller’s path: author on the v2 declaration to disambiguate (the authoritative pairing per resolution step 1), or accept that v1-only buyers won’t see this product. Recovery: correctable but seller-side — buyer can’t disambiguate without the seller’s assertion.
Suggested action: advisory — emitted alongside the partial v1 emission, NOT in place of it: the v2 declaration carries with N entries but only M v1_format_ref entries (M < N), so v1 buyers see partial size coverage on the product. Seller-side fix: add v1_format_ref entries for the missing sizes. SDK MAY (non-normative) fan out automatically by catalog lookup. Non-fatal — do not auto-retryNon-fatal advisory raised when a v2 declaration carries with N entries but only M v1_format_ref entries (M < N). The seller has asserted some v1 named formats but not enough to cover all declared sizes — v1-only buyers see partial coverage on the product. Emitted alongside the partial v1 emission (NOT in place of it): the product still appears on the v1 wire under the M sizes the seller covered; this code tells v1-aware downstream agents that N-M sizes were dropped from the projection.Surface placement: SDKs that detect on emission OR consumption MUST augment the response’s with (or if the seller self-detects on emit), , , pointing at the offending declaration, and SHOULD carry so buyer agents see which sizes were lost.SDKs MAY (non-normative) fan out automatically by catalog lookup — for each entry in lacking a corresponding , the SDK consults the AAO catalog for the per-size v1 named format (e.g., for look up ) and emits it under . This is opt-in (requires catalog access); when SDKs fan out, they SHOULD still emit this code as a transparency advisory so downstream consumers know the v1 emit was synthesized rather than seller-asserted.Recovery: correctable — non-fatal advisory, do not auto-retry. Seller fix: add entries for the missing sizes.
FORMAT_NOT_SUPPORTED — correctable
Suggested action: refresh get_adcp_capabilities creative.supported_formats[] and retry with a capability_id whose operations contains the intended build, preview, or validate operationA requested creative operation route is not supported by this creative agent. On the canonical 3.2 path, returned when build_creative.target_capability_id(s), preview_creative.target_capability_id, or validate_input targets[] kind capability does not match an advertised creative.supported_formats[].capability_id carrying the requested operation. Also returned when preview renderer inference has zero or multiple compatible matches. Sellers SHOULD attribute the error to the selector field and MAY include supported capability IDs in error.details.supported_capability_ids when safe. Deprecated target_format_id(s) and preview format_id retain legacy named-format error attribution during the 3.x compatibility window. Recovery: correctable (read get_adcp_capabilities creative.supported_formats[] and retry with a capability_id whose operations contains the intended operation).
FORMAT_OPTION_UNRESOLVED — correctable
Suggested action: advisory — publisher-side fix needed: a placement’s references a that does not exist in this file’s top-level . Buyer SDK MUST fail closed for that placement (drop the format from the placement’s accepted set) and surface this code. Publisher fix: either declare the missing format option in or remove the reference from the placement. Do not auto-retryNon-fatal advisory raised when a placement in (or any consumer of ) carries referencing a that does NOT exist in the file’s top-level . The reference is broken — the publisher’s catalog claims the placement accepts a format option that isn’t declared.Resolution scope is same-file only. Cross-file lookup is not supported by design (closes off format_option_id squatting across publisher boundaries — a malicious file cannot reference another publisher’s format_option_id and claim its narrowing). Buyer SDKs MUST fail closed for the placement (drop the format from the placement’s accepted format set) and MUST surface this code rather than silently dropping or guessing what the publisher meant.Surface placement: same single-mandate as the other FORMAT_* codes — SDKs that detect on consumption MUST augment the response’s with , , , pointing at the offending placement (e.g., ), and SHOULD carry so the publisher can fix.Recovery: correctable but publisher-side — buyer can’t fix; publisher either declares the missing format option in or removes the reference from the placement.
FORMAT_PROJECTION_FAILED — correctable
Suggested action: advisory — seller-side fix needed: ask the seller to add an explicit field on the legacy format declaration, or contribute a registry entry (format_id_glob or structural match) to v1-canonical-mapping.json. Do not auto-retry; the product is still valid on the legacy named-format pathNon-fatal advisory raised when a legacy named format on a product cannot be projected to a canonical-formats via the resolution order in (explicit field → format_id_glob → structural match → fail-closed). The product is still valid on the legacy named-format path; only the 3.1+ projection failed. Primarily a consumer-SDK concern — the seller didn’t fail; the consumer-side SDK couldn’t project on their behalf. MUST point at the offending product (e.g., ); SHOULD carry so buyer SDKs can route remediation (suggest the seller add an explicit field, or file a registry PR).Surface placement (normative). SDKs that detect this on consumption MUST augment the response’s array with an entry carrying , , , and the field+details described above. This is the single mandated surface — logger-only is insufficient and a separate lint-output channel is NOT acceptable (AdCP is a multi-hop agent network; warnings need to propagate across hops or each hop has to re-detect locally). Sellers MAY emit this code on their own response when they self-detect a non-projectable format on emit; producer-emitted entries omit (or set ). The response stays 200/success regardless of who emits; this is non-fatal.Multi-hop deduplication. Each hop that detects the same condition SHOULD deduplicate by rather than re-emit. The existing entry’s identifies which earlier processor saw it first; downstream SDKs SHOULD NOT add a second entry for the same pair unless they have materially different (e.g., a different reason from a different registry version).Recovery: correctable (seller-side action — add explicit field on the legacy format file, contribute a v1-canonical-mapping registry entry, or author a 3.1+ with linking back). See canonical-formats.mdx ‘Dual emission and v2↔v1 projection’ for the full rules.
FORMAT_SHAPE_PROMOTED — correctable
Suggested action: advisory — migrate the legacy custom format_shape to error.details.promoted_to before error.details.transition_end; dual emission is allowed during the transition window. Do not auto-retryNon-fatal deprecation advisory raised when a 3.2-aware SDK encounters with a that has been promoted to a first-class canonical. SDKs MUST preserve the declaration during its transition window and SHOULD augment the containing response’s with , , this code, and . Producers that self-detect their own legacy declaration MAY emit the same advisory with . Recovery is seller-side: dual-emit during the published transition window, migrate consumers, then replace the custom declaration with the promoted canonical.
GOVERNANCE_AGENT_NOT_ACCEPTED — correctable
Suggested action: select a governance agent matching , then retry with a fresh idempotency keyThe governance agent proposed in does not satisfy the seller’s authoritative per-account acceptance criteria. The failed binding MUST NOT be persisted or contacted, and credentials supplied for it MUST NOT be echoed in responses or logs. SHOULD conform to . Distinct from , which means a verification criterion or registry could not be resolved and is retryable. Recovery: correctable (select an agent satisfying the returned criteria or resolve the account-specific requirement with the seller).
GOVERNANCE_DENIED — correctable
Suggested action: restructure the buy, escalate to human spending authority, or contact the governance agent for detailsA registered governance agent denied the transaction. Sellers MUST place the denial in the operation’s structured rejection arm when one exists (e.g., → , or an delivery → ); otherwise in + . Buyers MUST dispatch on the response’s discriminated first and fall back to / only when no rejection arm exists for that operation. The buyer may restructure the buy (e.g., reduce budget, split into smaller transactions), escalate to human spending authority, or contact the governance agent for details. Recovery: correctable.Wire placement (full guidance). Governance denial is a structured business outcome, not a system error — the governance call SUCCEEDED and the agent returned a denial verdict. Two cases:
Operation or webhook payload defines a structured rejection arm. The arm IS the canonical denial shape. The seller populates (human-readable, propagating governance findings) and (optional) and does NOT additionally emit in or . The rejection arms enforce this at the schema layer: e.g., and both declare , so dual-emission is already a schema violation. The code does not appear on the wire when the rejection arm is used. Transport-level success markers MUST NOT be flipped (HTTP 200, MCP , A2A ) — the operation completed successfully and produced a structured response.
Operation response has no rejection arm (e.g., returns Success / Error / Submitted arms only). The seller populates in the payload AND on the envelope per the two-layer model in . Transport-level failure markers DO flip in this case (HTTP 4xx, MCP , A2A ) — the task could not produce a success artifact.
The rule generalizes to any current or future operation or webhook payload whose response defines a discriminated rejection arm. In either placement, sellers SHOULD propagate governance findings verbatim — buyers’ recovery decisions depend on what specifically was rejected. is reserved for verdicts received from a reachable governance agent; if the governance call itself failed (timeout, network, config error), use instead.
GOVERNANCE_UNAVAILABLE — transient
Suggested action: retry with backoff; if the agent remains unreachable, the buyer MUST contact the plan’s governance operatorA registered governance agent is unreachable. Sellers MUST place this code in + (never a structured rejection arm) and flip transport-level failure markers (HTTP 5xx, MCP , A2A ). Distinct from (agent reachable and explicitly denied — see that code’s wire-placement guidance). Recovery: transient (retry with backoff; if the agent remains unreachable, the buyer MUST contact the plan’s governance operator — the seller MUST NOT proceed with the media buy without a valid decision).Wire placement (full guidance). Governance unavailability is a system error — the governance call FAILED (timeout, network, config error) and the seller could not get a verdict at all. Always populate both layers per the two-layer model in . Do NOT use a structured rejection arm for unavailability even when the task offers one — the buyer’s recovery semantics differ (retry-with-backoff for unavailability vs. restructure-or-escalate for denial), and conflating them masks the system-error signal.
IDEMPOTENCY_CONFLICT — correctable
Suggested action: use a fresh UUID v4 for the new request, or resend the exact original payload to get the cached responseAn earlier request with the same idempotency_key was processed with a different canonical payload within the seller’s replay window. Distinct from CONFLICT (concurrent write) — this indicates the client reused a key across semantically different requests. Recovery: correctable (use a fresh UUID v4 for the new request, or resend the exact original payload to get the cached response).
IDEMPOTENCY_EXPIRED — correctable
Suggested action: perform a natural-key check to determine whether the original request succeeded; if no evidence of success, generate a fresh idempotency_key for a new attemptThe idempotency_key was seen previously but its cached response has been evicted because it is past the seller’s declared replay_ttl_seconds. Distinct from IDEMPOTENCY_CONFLICT (different payload within window) — this indicates the retry arrived too late for at-most-once guarantees. Recovery: correctable (perform a natural-key reconciliation — e.g., call get_media_buys for the relevant account/status scope and match returned media_buys[].context.internal_campaign_id — to determine whether the original request succeeded, then either accept that result or generate a fresh idempotency_key for a new attempt). If the buyer has any evidence the prior call succeeded (partial response received before crash, entry in the buyer’s own DB, a webhook fired), the buyer MUST do the natural-key reconciliation BEFORE minting a new key — minting a new key in that situation is exactly how double-creation happens.
IDEMPOTENCY_IN_FLIGHT — transient
Suggested action: wait top-level error.retry_after seconds and retry with the SAME idempotency_key — MUST NOT mint a fresh key (turns a safe retry into a double-execution race)A prior request with the same is either actively executing or has an unresolved outcome under fail-closed reconciliation, and has not yet produced a cached response or committed-outcome tombstone. Sellers MAY return this code instead of blocking the second caller while active execution or reconciliation finishes — useful when the first call invokes a slow or ambiguously responding downstream system (SSP, ad server, payment provider). Distinct from IDEMPOTENCY_CONFLICT (different canonical payload — a client bug) and from CONFLICT (concurrent modification of a different resource) — IDEMPOTENCY_IN_FLIGHT tells the buyer that its retry is correct but the prior attempt’s outcome is not yet available. Sellers SHOULD populate top-level with an integer-second wait hint based on expected execution or reconciliation progress. Buyers MUST treat this as transient and MUST NOT mint a fresh — minting a new key turns a safe retry into a double-execution race. Recovery: transient (wait seconds and retry with the same ; the next attempt will replay the resolved outcome, continue reconciliation, or return IDEMPOTENCY_IN_FLIGHT again).
INVALID_FEED_FORMAT — correctable
Suggested action: verify the feed content matches the declared formatCatalog feed content does not match the declared feed_format. Recovery: correctable (verify the feed content matches the declared format, e.g. XML for google_merchant_center).
INVALID_PRICING_OPTION — correctable
Suggested action: verify pricing_option_id against the product’s pricing_options from get_products or the vendor’s discovery response, then resubmit with a valid IDA referenced in the request does not exist on the target account or product. Returned per-record in responses and at the request level for when the submitted pricing option cannot be resolved. SHOULD point at the offending record path (e.g., or ). Distinct from (the product itself is unknown) by being narrowly about a pricing option within a known product or account. Recovery: correctable (verify against the product’s from or the vendor’s discovery response, then resubmit with a valid ID).
INVALID_REQUEST — correctable
Suggested action: check request parameters and fixRequest is malformed, missing required fields, or violates schema constraints. Recovery: correctable (check request parameters and fix).
INVALID_STATE — correctable
Suggested action: check current status via get_media_buys and adjust requestOperation is not permitted for the resource’s current status (e.g., updating a completed or canceled media buy, or modifying a canceled package). Recovery: correctable (check current status via get_media_buys and adjust request).
INVALID_USAGE_DATA — correctable
Suggested action: check required fields for the vendor type (vendor_cost, currency, account at minimum), fix invalid values, and resubmitA usage record in has missing or invalid fields — required fields absent, values out of range, or type mismatches. Returned per-record in the response array. SHOULD point at the offending field path (e.g., , ). Distinct from (top-level request malformed) by being scoped to individual usage records within an otherwise well-formed request. Recovery: correctable (check required fields for the vendor type — at minimum , , and — fix the offending values, and resubmit).
IO_REQUIRED — correctable
Suggested action: review the proposal’s insertion_order, accept terms, and include io_acceptance on accept_proposal; use create_media_buy only for 3.x compatibilityThe committed proposal requires a signed insertion order but no io_acceptance was provided. Recovery: correctable (review the proposal’s insertion_order, accept terms, and include io_acceptance on accept_proposal; 3.x compatibility callers use create_media_buy).
ITEM_VALIDATION_FAILED — correctable
Suggested action: check item_issues for per-item rejection reasons and fix the offending itemsOne or more catalog items failed schema validation during sync_catalogs. Recovery: correctable (check item_issues for per-item rejection reasons and fix the offending items).
MACRO_RESOLUTION_FAILED — correctable
Suggested action: inspect error.details.macro_resolution_results and route to a resolver that supports the declared dialect, semantic, owner, and encoding depthOne or more declared creative macro tokens cannot be resolved or safely preserved under the selected product and seller capability intersection. Sellers MUST include per-token , conforming to ; unknown or ambiguous tokens remain byte-preserved and MUST NOT receive guessed values. Recovery: correctable (route to a compatible execution path, correct the verified declaration, or assign the proper downstream resolver).
MEDIA_BUY_NOT_FOUND — correctable
Suggested action: verify media_buy_id; for legacy correlation use get_media_buys plus context, such as context.internal_campaign_idReferenced media buy does not exist or is not accessible to the requesting agent. Recovery: correctable (verify media_buy_id; when recovering across legacy sellers or missing echoed IDs, reconcile via get_media_buys and the opaque request/response context correlation handle, such as context.internal_campaign_id, rather than deprecated top-level buyer_ref).
MULTI_FINALIZE_UNSUPPORTED — correctable
Suggested action: sequence single-proposal finalize calls — one finalize entry per get_products refine[] call or per refine_proposals refinements[] callReturned by sellers that cannot guarantee atomic commit across multiple proposals in a single finalize batch. Two call sites where this applies: (1) a call with multiple entries in targeting different values; (2) a call with multiple entries in targeting different values. The buyer’s intent — atomic multi-proposal finalize — is structurally well-formed and per spec atomic on both surfaces, but this seller’s downstream stack cannot satisfy the atomicity guarantee (e.g., the proposals route to two different ad servers with no 2PC). More specific than so buyers can distinguish ‘this seller doesn’t support multi-finalize’ from ‘the request itself is malformed’. Recovery: correctable (sequence the finalize calls one--per-call on whichever task surface the buyer is using; there is no capability flag for multi-finalize support, so a successful first-attempt is the only positive discovery signal). See refinement guide § Finalize is exclusive.
NOT_CANCELLABLE — correctable
Suggested action: check the seller’s cancellation policy or contact the sellerThe media buy or package cannot be canceled in its current state. The seller may have contractual or operational constraints that prevent cancellation. Recovery: correctable (check the seller’s cancellation policy or contact the seller).
PACKAGE_NOT_FOUND — correctable
Suggested action: verify package_id; for legacy package correlation use get_media_buys plus package context, such as context.buyer_refReferenced package does not exist within the specified media buy. Recovery: correctable (verify package_id within the media buy; when recovering across legacy sellers or missing echoed product_id, reconcile via get_media_buys and the package-level context correlation handle, such as context.buyer_ref, rather than deprecated top-level buyer_ref).
PAYMENT_TERMS_NOT_SUPPORTED — correctable
Suggested action: omit payment_terms to accept the seller’s default, retry with a different supported value, or negotiate offlineThe seller does not accept the requested value for this account. Payment terms are never silently remapped — sellers either accept or reject. Distinct from (the enum) by being narrowly about the enum on the same account. Recovery: correctable (omit to accept the seller’s default, retry with a different value the seller supports, or negotiate offline).
PERMISSION_DENIED — correctable
Suggested action: call check_governance to mint a valid token, or contact the seller to resolve the underlying permission; when error.details.scope is ‘agent’ (reason ‘sandbox_only’ or ‘grant_absent’) the rejection is terminal-pending-onboarding — surface to a human rather than auto-retrying. For suspended/blocked agent relationships, sellers emit AGENT_SUSPENDED / AGENT_BLOCKED instead (those codes carry recovery: terminal directly).The authenticated caller is not authorized for the requested action, or a required signed credential (e.g., a token on a spend-commit) is missing, fails verification, or was issued for a different plan, seller, or phase. Seller content or advertising policy denials use ; media-buy change-right and current-availability denials use . Distinct from (no credentials presented), (credentials presented but rejected), (governance agent denied), (agent’s relationship temporarily paused), and (agent’s relationship permanently denied). When the gate that fired is specifically a non-status per-agent gate — a provisioning constraint (e.g., the agent is provisioned for sandbox traffic only and the request was against a non-sandbox account) or a missing demand-side grant — SHOULD conform to ( plus , or when no demand-side grant authorizes the agent to act for the account’s brand) so callers can dispatch without parsing prose. Sellers MUST emit only when buyer-agent identity has been established via signed-request derivation or a credential-to-agent mapping in the seller’s onboarding record; in all other cases (including bearer credentials not mapped to a specific agent record) sellers MUST return and MUST omit — emitting the per-agent scope without established identity is a cross-tenant onboarding oracle, and the omit MUST be enforced across every observable channel (response shape, HTTP/A2A/MCP status, headers, side effects, observability, latency parity) per the channel-coverage rules in error-handling.mdx Per-Agent Authorization Gate, mirroring the uniform-response rule and . The and per-agent states are NOT carried on this code — sellers MUST emit / instead, each of which is its own discriminator. Recovery: correctable (call to mint a valid token, or contact the seller to resolve the underlying permission); when is present the rejection is terminal-pending-onboarding — the agent MUST surface to a human at the buyer rather than auto-retrying, since the agent cannot satisfy the gate itself.
PIXEL_TRACKER_LOSSY_DOWNGRADE — correctable
Suggested action: advisory — emitted alongside the v1 downgrade emission: SDK collapsed a pixel_tracker asset to v1 for a seller that doesn’t support pixel_tracker natively. The URL still fires; what’s lost is in (event variant, method:js execution context, or custom event timing). Buyer decision: accept the loss (most counter pixels survive), or fail the buy and route to a 3.1-capable seller. Non-fatal — do not auto-retryNon-fatal advisory raised when a 3.1 buyer SDK downgrades a asset to the v1 shape for a 3.0.x seller that doesn’t recognize the new asset type. The URL is still emitted on the wire and the seller will fire it as a tracker pixel; what’s lost is the event/method discrimination. The one exception is the playback events (, quartiles, ), which are dropped rather than emitted.Downgrade rules (normative):
+ → no loss; emit as
/ / / → emit with ; advisory (specific viewability variant collapses to a single v1 slot)
/ / / / → drop the tracker (no v1 emission); advisory and covering the whole tracker. with equal to one of those five names (the 3.2 interim form) is dropped the same way, and this rule takes precedence over the and rules; set and . Never emit these as : a playback URL fired at impression time would count every impression as a quartile view
→ emit with ; no meaningful loss
→ emit with (default tracker_pixel fires on impression); advisory , (custom event timing collapses to impression timing)
→ emit unchanged shape (url, url_type:tracker_pixel); advisory (v1 seller will fire as HTTP GET; the URL is hit and any counter-based measurement increments, but the response body won’t execute as JS — measurement that depends on JS execution, e.g., OMID-style verification, viewability observers, cross-domain cookie setters, won’t work. Simple counter pixels still work.)
Surface: SDK that performs the downgrade MUST augment the response’s with , , , pointing at the affected manifest asset path, and SHOULD carry . One advisory per downgraded asset; SDKs SHOULD NOT collapse multiple downgrades into a single advisory entry — per-asset details let the buyer’s measurement-plan owner decide whether each loss is tolerable.Recovery: correctable — non-fatal advisory, do not auto-retry. Buyer-side decision: accept the loss (most simple counter pixels survive; dropped playback trackers do not), or fail the buy and route to a 3.1-capable seller. Seller-side fix: upgrade to 3.1 and accept natively.
PIXEL_TRACKER_UPGRADE_INFERRED — correctable
Suggested action: advisory — emitted when a 3.1 SDK upgrades a v1 url+tracker_pixel asset to pixel_tracker by inferring event and method from asset_id conventions. The inference may not match the buyer’s original intent; check / and re-prompt the seller for explicit values if precise measurement matters. Non-fatal — do not auto-retryNon-fatal advisory raised when a 3.1 buyer SDK upgrades a v1 to a asset by INFERRING the event and method from the v1 asset_id and conventional defaults. The inference is structural — the SDK doesn’t have explicit event/method values, only the v1 asset_id hint and (which implies by default).Inference rules (normative):
→
→ (50% is the most common default; specific viewability variant cannot be recovered from v1 shape)
→
→
Surface: SDK MUST augment the response’s with , pointing at the upgraded asset path, and SHOULD carry . Buyer agents reading the response can re-prompt the seller for explicit values if precise measurement matters.Recovery: correctable — non-fatal advisory, do not auto-retry. Seller-side: upgrade emit path to ship pixel_tracker shape directly when 3.1-capable; until then, conventional asset_id values give the SDK enough signal to upgrade without losing critical semantics.
PLACE_TARGET_UNAVAILABLE — correctable
Suggested action: resolve the pinned value against the current catalog, review any replacement, and submit an intentional package targeting updateA place identifier previously accepted and pinned on a package can no longer be executed. This is a nonfatal resource-state error returned in get_media_buys.errors[] alongside the affected buy. error.field MUST point to the exact media_buys[N].packages[M].targeting_overlay.geo_places[_exclude][A].values[V] response path. error.details MUST include media_buy_id, package_id, system, system_version, country, place_type, and value. The seller MUST preserve and echo the pinned target rather than silently changing geography. Recovery: correctable (look up the value through the declared resolver at the current catalog version and submit an intentional targeting update).
PLAN_NOT_FOUND — correctable
Suggested action: verify plan_id via sync_plans, or register the plan firstReferenced governance plan does not exist or is not accessible to the requesting agent. Recovery: correctable (verify plan_id via sync_plans, or register the plan first). Sellers MUST return this code uniformly for any plan_id not accessible to the calling account — never distinguish ‘exists but unauthorized’ from ‘does not exist’, which would enable cross-tenant enumeration of governance plans.
POLICY_VIOLATION — correctable
Suggested action: review policy requirements in the error detailsRequest violates the seller’s content or advertising policies. Recovery: correctable (review policy requirements in the error details).
PRIVATE_FIELD_IN_PUBLIC_PLACEMENT — correctable
Suggested action: seller-side fix needed: remove private operational fields (, , , , or similar) from public placement objects. Consumers MUST fail closed for the affected placement and alert operators; do not echo private field values in logs or error detailsFatal producer-side error raised when a public placement object ( in or in adagents.json) exposes seller-private operational fields such as , , , or . This is a private-data leak, not an ordinary syntactic mismatch. Consumers that detect it MUST fail closed for that placement and surface this code so monitoring can alarm on the leak specifically instead of burying it under generic schema validation. SHOULD point at the offending placement path and SHOULD carry without echoing private field values. Recovery: correctable but seller-side — remove private operational fields from the public placement surface and keep delivery mappings in seller-internal systems.
PRODUCT_EXPIRED — correctable
Suggested action: re-discover with get_products to find current inventoryThe seller still recognizes one or more configured product IDs as issued to the authenticated account and referenced discovery/refinement lineage, and they have passed their expires_at timestamps. Sellers are not required to retain expiry tombstones indefinitely; an ID that is no longer resolvable, or is inaccessible to this caller because it belongs to another account or lineage, uses PRODUCT_NOT_FOUND. This distinction MUST NOT become a cross-tenant existence oracle. Recovery: correctable (re-discover through list_products, request_proposals, or the get_products compatibility facade to find current inventory).
PRODUCT_NOT_FOUND — correctable
Suggested action: remove invalid IDs and retry, or re-discover with get_productsOne or more referenced product IDs are unknown or are not resolvable within the authenticated account and configured-offer lineage. A caller-authorized configured ID that is still recognized as expired uses PRODUCT_EXPIRED; once no expiry tombstone remains, or whenever the ID belongs to another account or lineage, PRODUCT_NOT_FOUND applies. Sellers MUST NOT reveal cross-tenant product existence through error choice. Recovery: correctable (remove invalid IDs and retry, or re-discover with get_products).
PRODUCT_UNAVAILABLE — correctable
Suggested action: choose a different productThe requested product is sold out or no longer available. On accept_proposal for an experimental ranked hold behind first position (media_buy.hold_ranking), it means a hold ahead still stands: the committed proposal stays acceptable until expires_at and a later acceptance may succeed. Recovery: correctable (choose a different product).
PROPOSAL_EXPIRED — correctable
Suggested action: call request_proposals and finalize a fresh proposal, or re-discover and finalize through legacy get_productsA referenced proposal ID has passed its expires_at timestamp. For a committed proposal, the inventory hold has lapsed (or, under terms_only hold semantics, the acceptance window has closed). Recovery: correctable (call request_proposals and finalize a fresh proposal, or re-discover and finalize through the legacy get_products facade).
PROPOSAL_NOT_COMMITTED — correctable
Suggested action: finalize the draft through refine_proposals, or through the legacy get_products refine actionThe referenced proposal has proposal_status ‘draft’ and cannot be accepted into a media buy. Recovery: correctable (finalize it through refine_proposals, or through the legacy get_products refine action).
PROPOSAL_NOT_FOUND — correctable
Suggested action: request and finalize a fresh proposal, then retryThe referenced proposal_id is not recognized by the seller — it belongs to a different tenant, was never issued, or was evicted from the seller’s session cache before consumption. Distinct from (a known proposal whose window has passed) and (a known proposal still in ). Recovery: correctable (request a fresh proposal, finalize it, then retry accept_proposal; 3.x compatibility callers retry create_media_buy).
PROVENANCE_CLAIM_CONTRADICTED — correctable
Suggested action: revise the provenance claim to match the verifier’s observation or replace the creative; auto-retry without correction will not passSeller invoked a governance agent from via and the verifier’s result contradicts the buyer’s provenance claim - e.g., buyer claims but the AI-detection feature returns above the seller’s confidence threshold. Distinct from the family (structural absence) by being an active refutation. SHOULD be limited to the audit-safe allowlist ; sellers MUST NOT forward arbitrary verifier extension fields, , or any verifier response shape that may carry cross-tenant or PII data. When the seller calls a different on-list agent than the buyer nominated (the seller is the verifier-of-record), is the agent the seller actually called and SHOULD carry the buyer’s nominated so the buyer can reconcile. Recovery: correctable - buyer revises the provenance claim to match reality (or replaces the creative); auto-retry without correction will not pass.
Suggested action: set provenance.digital_source_type to a value from the digital-source-type enum and resubmitSeller’s is true and the submitted creative’s resolved provenance (after inheritance) has no value, or has it set to null. Distinct from (no provenance object at all) - provenance is present, just missing this specific field. Recovery: correctable (set to a value from the enum and resubmit). MUST point at the resolved provenance path that was inspected (e.g., ).
PROVENANCE_DISCLOSURE_MISSING — correctable
Suggested action: set provenance.disclosure.required and, when true, populate disclosure.jurisdictionsSeller’s is true and the submitted creative’s resolved provenance has no boolean, or is true with no entries. Recovery: correctable (set and, when true, populate ). MUST point at (e.g., ).
PROVENANCE_EMBEDDED_MISSING — correctable
Suggested action: attach at least one embedded_provenance entry from a supported provider and resubmitSeller’s is true and the submitted creative’s resolved provenance has no array, or has it as an empty array. Used in pipelines where sidecar is stripped by intermediaries and the seller requires content-stream-resilient provenance. Recovery: correctable (attach at least one entry from a supported provider and resubmit, optionally with a pointer matching one of the seller’s ). MUST point at on the resolved manifest.
PROVENANCE_REQUIRED — correctable
Suggested action: attach a provenance object - at minimum digital_source_type - and resubmitSeller’s is true and the submitted creative has no object on the manifest, on the creative-asset, or on any individual asset. Distinct from (generic creative-review failure) by being narrowly about provenance presence. Recovery: correctable (attach a provenance object - at minimum - and resubmit). MUST point at the path where provenance was expected (e.g., ).
Suggested action: assess the creative, set provenance.synthetic_depiction to true or false, and resubmitSeller’s is true and the submitted creative’s resolved provenance (after inheritance) has no boolean. Both and satisfy the requirement; absence means unassessed. Distinct from (no provenance object at all) and from (an independent verifier actively refuted a declared value). Recovery: correctable (assess the creative, set to true or false, and resubmit). MUST point at the resolved path. The declaration does not establish consent, legality, or verification.
PROVENANCE_VERIFIER_NOT_ACCEPTED — correctable
Suggested action: replace verify_agent.agent_url with one from the seller’s published accepted_verifiers, drop verify_agent if the embedding is self-verifiable, or re-embed with a verifier the seller acceptsBuyer attached a on or that does not match (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments) any entry in the seller’s . The seller does not call buyer-asserted endpoints outside its allowlist; this is the cross-check that closes the buyer-controlled-URL trust gap. MUST point at the offending path; SHOULD include a reference to the product whose the buyer should consult (the buyer already has this from ). Recovery: correctable (replace with one from the seller’s published , drop the entirely if the embedding is self-verifiable, or re-embed evidence using a verifier the seller accepts).
RATE_LIMITED — transient
Suggested action: wait top-level error.retry_after seconds when present, then retryRequest rate exceeded. Sellers SHOULD populate top-level with the integer number of seconds to wait. Recovery: transient (wait seconds when present, then retry).
READ_ONLY_SCOPE — correctable
Suggested action: use a non-mutating alternative, or surface to the operator to request a scope that permits mutationThe caller’s scope is read-only; the invoked task would mutate state and was rejected. Distinct from (task not in scope at all) — the task is in some scopes this seller supports, just not this caller’s. Recovery: correctable but not agent-autonomous — use a non-mutating alternative, or surface to the operator to request a scope that permits mutation.
REFERENCE_DEFINITION_CHANGED — correctable
Suggested action: refine the proposal so the seller re-resolves the pinned definitions and issues fresh pins, review the changed definition, then finalize and accept the new proposalA third-party-published definition pinned in a proposal’s commercial_terms.definition_pins[] (a publisher-catalog format option, publisher-catalog placement, adagents.json collection, or data-provider signal) no longer resolves to the pinned content_digest. Returned by accept_proposal, which re-verifies every pin before mutating any state, so no MediaBuy is created or amended. terms_digest can still verify because it covers the pin, not the definition the pin names. Error details SHOULD conform to error-details/reference-definition-changed.json: error.field names the failing pin (for example commercial_terms.definition_pins[2]) and details.current_content_digest carries the digest the definition resolves to now; one error is returned per drifted pin. Distinct from REFERENCE_NOT_FOUND (an identifier that does not exist or is inaccessible) and PROPOSAL_EXPIRED (the hold lapsed). The same drift found while finalizing is reported as an unable outcome with reason_code definition_changed and drifted_pins[] rather than as an error. A definition withdrawn from a successfully fetched document is drift and omits current_content_digest; a document that cannot be fetched or parsed is not drift and returns SERVICE_UNAVAILABLE instead. Because nothing was mutated, sellers SHOULD set error.mutation_outcome to not_applied. Recovery: correctable (re-run request_proposals or refine_proposals so the seller re-resolves the definitions and issues fresh pins, review the changed terms, and finalize again).
REFERENCE_NOT_FOUND — correctable
Suggested action: verify the referenced identifier exists and is accessible to the callerGeneric fallback for a referenced identifier, grant, session, or other resource that does not exist or is not accessible by the caller. Use when no resource-specific not-found code applies (e.g., property lists, content standards, rights grants, SI offerings, proposals, catalogs, event sources, collection lists, brands, individual properties). Typed parameters that lack a dedicated standard code MUST also use REFERENCE_NOT_FOUND rather than minting a custom *_NOT_FOUND code. See ‘Uniform response for inaccessible references’ in error-handling.mdx for the full MUST list. Recovery: correctable. Summary of the uniform-response MUST: sellers MUST return the same response for ‘exists but the caller lacks access’ as for ‘does not exist’ across every observable channel — error.code/message/field/details (message MUST be generic; error.field MUST be identical across both cases on typed parameters); HTTP status, A2A task.status.state, and MCP isError; response headers (ETag, Cache-Control, per-type rate-limit buckets, CDN tags); side effects (webhook/audit writes, background-job enqueues, per-type quota counters, DB-shard routing); and observability (logs, APM spans, third-party error telemetry like Sentry/Datadog). Sellers MUST perform the same resolution-and-authorization work on both paths (resolve-then-authorize; on true-miss still run an authorization decision of equivalent shape against an empty principal set so authorizer latency is not a side channel). Cache population MUST NOT be gated on authorization. Polymorphism is evaluated against the tool-schema’s declared parameter shape before any lookup, and a tool’s declared shape MUST be identical across all callers.
REQUOTE_REQUIRED — correctable
Suggested action: use error.details.decline_reason when present to inform recovery, then refine accepted_proposal_id and apply the amendment through accept_proposal, or keep control_media_buy inside the accepted envelope; some policies require a free-text ask or human negotiation, and 3.1 compatibility callers must adjust or rediscoverA control_media_buy request, or the 3.x update_media_buy facade, would exceed the accepted commercial envelope. The seller is declining the requested shape at the current terms. Distinct from TERMS_REJECTED (measurement) and POLICY_VIOLATION (content). Error details SHOULD conform to error-details/requote-required.json: populate envelope_field with the field path(s) that breached the envelope, change_term_id when an accepted change term governed the request, and decline_reason when a structured seller-policy reason is available and safe to disclose. All producer-authored explanatory text, including message, suggestion, and extension detail values, MUST remain buyer-safe and MUST NOT contain vendor identifiers, internal object names, internal IDs, stack traces, or other producer-private implementation details. AdCP 3.2 callers refine the MediaBuy’s accepted_proposal_id to obtain a typed amendment; legacy 3.1 callers adjust the update, rediscover terms, or create a separate buy.
RIGHTS_CHANNEL_VIOLATION — correctable
Suggested action: advisory — inspect error.details.rights_id and the requested channel against rights[].channels / excluded_channels; target a capability on a permitted channel, confirm the rights entry applies to this output, or have the holder grant the channel (a human or holder action)Advisory. A creative’s rights[] channels / excluded_channels restriction (core/rights-constraint.json) does not permit the media channel of the requested output, so building it would produce a derivative the rights grant does not allow to run there. Creative agents SHOULD check rights[].channels against the channel each requested target capability serves (for example its applies_to_channels, where declared) before generating, and SHOULD surface this code rather than silently building; the restriction is advisory in 3.3, so a creative agent MAY proceed and attach this code as a non-terminal entry in errors[] on an otherwise-successful build, or MAY decline the affected output with a terminal error. error.field SHOULD point at the offending rights entry (e.g. creative_manifest.rights[0].excluded_channels, or creative_manifests[N].rights[i].channels for a multi-capability build) and error.details SHOULD include rights_id, the requested channel, and capability_id when the build named one. Distinct from CREATIVE_REJECTED (content-policy or brand-safety review) and from the governance plan channel check, which is a hard check by the governance agent. Recovery: correctable (target a capability whose channel the grant permits, confirm the rights entry applies to this output, or have the holder grant the channel; the last is a human or holder action, not an autonomous retry). Advisory in 3.3 and may tighten while the surface is experimental.
SCOPE_INSUFFICIENT — correctable
Suggested action: the agent cannot broaden its own scope - surface to the operator rather than auto-retryThe authenticated caller is not authorized for the invoked task — the task is not in the caller’s for this account (discoverable via the object on sync_accounts / list_accounts responses). Distinct from (generic authz failure, often credential-shaped) by being narrowly about task-level scope. Sellers SHOULD populate pointing at where the caller can re-read its scope (strawman: ). Recovery: correctable in the sense that the request can be re-sent after the scope is broadened, but the agent cannot broaden its own scope — this requires operator intervention, and agents SHOULD surface rather than auto-retry.
SERVICE_UNAVAILABLE — transient
Suggested action: retry with exponential backoffSeller service is temporarily unavailable. Retry with exponential backoff. Recovery: transient.
SESSION_NOT_FOUND — correctable
Suggested action: initiate a new session via si_initiate_sessionSI session ID is invalid, expired, or does not exist. Recovery: correctable (initiate a new session via si_initiate_session).
SESSION_TERMINATED — correctable
Suggested action: initiate a new session via si_initiate_sessionSI session has already been terminated and cannot accept further messages. Recovery: correctable (initiate a new session via si_initiate_session).
SIGNAL_NOT_FOUND — correctable
Suggested action: verify signal_id via get_signals, or confirm the signal is available from this agentReferenced signal does not exist in the agent’s catalog. Recovery: correctable (verify signal_ref via get_signals, or confirm the signal is available from this agent). Sellers MUST return this code uniformly for any signal_ref not accessible to the calling account — never distinguish ‘exists but unauthorized’ from ‘does not exist’, which would enable cross-tenant enumeration.
SIGNAL_TARGETING_INCOMPATIBLE — correctable
Suggested action: assign the creative to a package whose signal targeting matches the creative’s signal_condition, or rebuild the creative for the package’s condition; match on shared signal_ref identity (compare signal_agent_segment_id exactly when both carry it, else categorical signal_ref + value)A creative carrying a signal_condition (from build_creative signal_conditions fan-out, #5240) was assigned to a package whose signal targeting is incompatible — e.g. a sun creative routed to a rain-targeted package. The trafficking-compatibility invariant: a creative built FOR one signal condition MUST NOT serve into a package targeting an incompatible condition. Enforced reject-at-trafficking on the sales side (create_media_buy / sync_creatives), NOT at build_creative (per #5280, signal pointers are advisory at the build layer; enforcement lives at the trafficking boundary). Compatibility is matched on shared signal_ref identity: when both sides carry signal_agent_segment_id, compare the opaque handle exactly; when both carry only categorical {signal_id,value}, compare signal_ref + value-set semantics; equal categorical labels from DIFFERENT providers are NOT compatible absent an explicit equivalence mechanism; when one side has a segment handle and the other only a categorical value, the seller MAY accept only if it can resolve both to the same provider-issued segment, else reject/warn. For value_type:numeric the comparison is range-overlap (WG-open: range-overlap vs exact-match — see RFC #5240 open decisions). error.field SHOULD point at the offending assignment path (e.g. packages[N].creative_assignments[M] or creatives[N]); error.details SHOULD carry the creative’s signal_condition and the package’s incompatible signal targeting so the buyer can re-route. Distinct from SIGNAL_NOT_FOUND (signal unknown/inaccessible) by being a compatibility mismatch between a known creative condition and a known package condition. Recovery: correctable (assign the creative to a package whose signal targeting matches its signal_condition, or rebuild for the package’s condition).
SIGNED_RESPONSE_ENVELOPE_EXPIRED — transient
Suggested action: re-invoke the designated task (verify_brand_claim or verify_brand_claims) to obtain a freshly signed response with a current exp windowThe timestamp is at or past the current time after applying the verifier’s clock-skew tolerance. The signed envelope was valid when issued but the verification window has closed. Raised by verifiers consuming a designated-task signed response ( / ) during step 7 of the response-signing verifier checklist. Online verifiers MUST reject expired envelopes; audit verifiers MAY verify after as historical evidence that the brand-agent signed the payload during the stated / window, but MUST NOT treat the result as current truth. Distinct from (cache-staleness advisory on a populated success payload) by being a cryptographic freshness failure on a signed response envelope. Recovery: transient (re-invoke the designated task to obtain a freshly signed response with a current window).
Suggested action: re-invoke the designated task with the intended request parameters — the signed response’s request_hash does not match the verifier’s recomputed hash of the actual request; if the mismatch persists across retries, investigate JCS request-binding canonicalization between caller and responderThe does not match the verifier’s recomputed SHA-256 hash of the canonical request-binding object for the actual request sent. Raised during step 8 of the response-signing verifier checklist. This indicates either a replay of a signed response from a different request, a JCS request-binding canonicalization divergence between signer and verifier, or payload tampering. Verifiers MUST reject the envelope when the recomputed hash does not byte-match the signed . SHOULD carry (the verifier’s recomputed value) when safe to disclose — the hash binds the response to the exact request that produced it, and divergence is the signal that the binding has been broken. Recovery: correctable (re-invoke the designated task with the intended request parameters; if the mismatch persists across retries, investigate JCS request-binding canonicalization between the caller and the responding agent).
SIGNED_RESPONSE_TENANT_MISMATCH — correctable
Suggested action: verify the request targeted the correct brand domain and agent_url, then re-invoke; if the mismatch persists, the responding agent’s server-side tenant resolution may be misconfiguredThe does not match the verifier’s resolved or expected brand tenant for this verification call. Raised during step 9 of the response-signing verifier checklist. The responding brand agent derives from server-side tenant resolution, not from caller-supplied request fields (per the response-signing profile in security.mdx), so a mismatch indicates cross-tenant replay, a multi-brand agent routing error, or a mismatch between the verifier’s tenant resolution and the responder’s. Distinct from (request-binding divergence) by being narrowly about the tenant identity — is a field inside the signed payload that the responder derives independently, not an echo of any caller-supplied value. Recovery: correctable (verify that the request targeted the correct brand domain and agent; re-invoke with the correct brand reference if the request was mis-routed; if the mismatch persists, the responding agent’s server-side tenant resolution may be misconfigured).
SOURCE_ACCESS_FAILED — correctable
Suggested action: error.field source.locator/source.segment_ref: fix the reference; error.field source: grant the seller’s declared consumer identity and retry; no error.field: vendor outage, retry with backoffSeller could not read an external audience source on sync_audiences (experimental, media_buy.audience_activation). Per-audience: surfaces as action: failed with this code in the audience’s errors array. The seller cannot reliably distinguish a revoked grant from an expired one from a transient vendor outage — all three observables are a failed read — so error.field distinguishes what the buyer can act on: ‘source.locator’ or ‘source.segment_ref’ means the reference does not resolve (changed request needed); ‘source’ means access denied (establish or re-grant access to the seller’s declared consumer identity, then retry); absence of error.field indicates a vendor-side failure (retry with backoff, no buyer action). On an already-ready audience a failed re-read MUST NOT change audience status — membership stays frozen at the last successful read and source.access_status reports ‘unavailable’. Recovery: correctable (fix the reference or grant per error.field; vendor outages without error.field are transient and retry with backoff).
STALE_RESPONSE — transient
Suggested action: advisory — emitted alongside a populated payload that was served from cache past the seller’s freshness target because an upstream or sub-agent was unreachable. The response is usable; treat as non-fatal. Inspect to decide whether to immediately retry for fresh data or accept the cached value; the seller’s own service is healthy, so retry is safe (it does not amplify the upstream failure)Non-fatal advisory raised when the seller’s live fetch to an upstream or sub-agent failed (timeout, connection error, downstream 5xx) and the response payload was satisfied from a cached prior result that is past the seller’s freshness target for this surface. Emitted alongside a populated success payload — the caller’s request still completes from a usable cache hit; this code tells downstream consumers that the data is older than the seller would normally serve.Distinct from (seller’s own service is down, no payload — transient, retry-with-backoff) by signalling graceful degradation: the seller’s own service is fine, but one of its dependencies is currently unreachable and the seller chose to honor the request from cache rather than return empty. Sellers MUST emit ONLY when the response payload is non-empty AND derived from a cache entry whose exceeds the surface’s freshness target. When no cached entry exists (or the cache hit is within freshness target), sellers MUST NOT emit this code — return the empty-or-fresh response with whatever upstream-failure code applies (e.g., ).Wire placement (normative). Transport-level success markers stay flipped to success (HTTP 200, MCP , A2A ) — the task ran successfully and produced a response, even if from cache. The advisory rides in on the payload and MUST NOT be promoted to on the envelope (envelope-level errors are reserved for the empty-payload failure case per the two-layer model in ). SHOULD point at the affected payload path (e.g., for , for ). SHOULD conform to — (required, always ), (required), and optionally , (the dependency that failed), and (the underlying failure code/message).Multiple stale upstreams. When N sub-agents are stale (e.g., a registry aggregating from multiple creative agents), the seller SHOULD emit one entry per affected upstream rather than aggregating — the per-upstream shape mirrors the existing precedent set by (one advisory per downgraded asset) and lets buyer agents reason about which sub-population of the payload is stale. Each entry’s SHOULD narrow to the affected slice (e.g., for formats sourced from the stale upstream).Recovery: transient — buyers MUST treat as non-fatal (the response is usable), MAY immediately retry later for fresh data, and SHOULD surface staleness to operators or end users when relevant. is the informational knob for the buyer’s own “is this stale enough to bother retrying” policy.
TERMS_REJECTED — correctable
Suggested action: adjust the proposed terms and retry, or omit measurement_terms to accept the product’s defaultsBuyer-proposed measurement_terms were rejected by the seller. The error details SHOULD identify which specific term was rejected and the seller’s acceptable range or supported vendors. Recovery: correctable (adjust the proposed terms and retry, or omit measurement_terms to accept the product’s defaults).
UNPRICEABLE_OUTPUT — correctable
Suggested action: target an output format the transformer prices, or have the seller add a pricing option covering itA creative transformer build targets an output capability that no pricing option covers — no transformer.pricing_options entry has a matching applies_to_output_capability_ids and none is unscoped. The build is rejected rather than billed at a guessed rate. Recovery: correctable.
UNSUPPORTED_FEATURE — correctable
Suggested action: check get_adcp_capabilities (or the product’s overlay_support for a rejected targeting dimension), remove unsupported fields, and use details.replacement_dimension when presentA requested feature or field is not supported by this seller. When rejecting a request that uses a typed dimension omitted from an explicit declaration, the error details SHOULD follow — names the offending dimension and echoes the seller’s declaration so the buyer can remove or translate the field without another capability round trip. When rejecting a targeting dimension that is unsupported for the product or seller, or has been removed, the error details SHOULD follow (, optional , , ) and SHOULD point at the targeting path. Recovery: correctable (check get_adcp_capabilities (or the product’s overlay_support for a rejected targeting dimension), remove unsupported fields, and use details.replacement_dimension when present).
UNSUPPORTED_GRANULARITY — correctable
Suggested action: pick a granularity from the product’s reporting_capabilities.windowed_pull_granularities (via get_adcp_capabilities) and resubmit, or omit time_granularity to fall back to cumulative date-range pullsThe requested on is not in the product’s declared . Distinct from (generic capability mismatch) by being narrowly about reporting-window granularity — the buyer asked for hourly pull-recovery on a product that only honors daily pulls, for example. Sellers MAY echo the declared set in when the caller is authorized to read the product’s reporting capabilities — the same set is already available via , so the echo is a convenience, not load-bearing. Sellers MUST NOT echo a granularity set the caller could not otherwise read (per-product capability views vary by buyer entitlement). The SHOULD point at . Buyers that need higher-frequency recovery than the seller’s pull set supports MUST rely on the webhook channel as primary at that frequency — the seller’s may legitimately exceed (e.g., a stream-tap webhook on Kafka with warehouse pulls only at daily). Recovery: correctable (re-issue at a granularity in the declared set, or omit to fall back to cumulative date-range pulls).
UNSUPPORTED_PROVISIONING — correctable
Suggested action: re-issue with the entry shape the seller supports — for settings-update sellers with account-id namespaces, or for provisioning sellers; check seller documentation or capability declaration for which modes are implementedThe seller does not support the mode the entry requested. Returned per-entry in the response when (a) an entry keyed by the natural-key trio ( + + ) is sent to a seller that does not provision accounts via AdCP — typical for account-id namespaces where accounts are pre-provisioned out of band or discovered via ; or (b) an entry keyed by (AccountRef) is sent to a seller that has not implemented the settings-update mode. Distinct from (generic capability mismatch) by being narrowly about which of the two modes the seller implements. The two modes are mutually exclusive per-entry — the seller MUST NOT silently downgrade or upgrade between them. Sellers MAY declare which modes they implement via (forward-looking — capability declaration shape is open). Recovery: correctable (re-issue with the entry shape the seller supports; for account-id namespaces that expose settings updates, that means entries; for sellers that only provision via natural key that means the flat shape). The SHOULD point at the entry index where the unsupported shape was found.
VALIDATION_ERROR — correctable
Suggested action: review error details and fix field valuesRequest contains invalid field values or violates business rules beyond schema validation. Recovery: correctable (review error details and fix field values).
VAST_PARSE_FAILED — correctable
Suggested action: inspect error.details.reason (not_xml, no_vast_root, no_ad, no_media_file), fix the VAST document, and resubmitA submitted asset failed document-level validation: the inline (or the document fetched from ) is not well-formed XML, has no root element, contains no element, or an linear creative carries no . Returned by sellers that declare of or ; sellers at the default level do not inspect the VAST document and MUST NOT return this code. Distinct from (manifest-level format validation): the manifest was structurally valid, the VAST document inside it was not. Sellers SHOULD set to the offending asset path and SHOULD populate with one of , , , . Unresolved ad-server macros in URLs (, , ) are opaque tokens, not parse failures. Recovery: correctable (fix the VAST document and resubmit).
VAST_VERSION_MISMATCH — correctable
Suggested action: inspect error.details.mismatch_reason and the corresponding acceptance-set or observed-document fields; select a compatible source representation or correct the offending VAST documentA submitted asset is version-incompatible when its exact is absent from the intersection of the selected product format option’s and the seller’s , or when an inspected document violates its applicable VAST version rule. Modern MUST conform to : acceptance failures carry , , , and , plus only when the selected option is addressable; inspected-document failures carry , , , and . Only the submitted document is compared for equality with the asset declaration; wrapper and terminal documents are checked against the acceptance intersection. The deprecated field remains accepted for older 3.x peers. Distinct from , which concerns AdCP protocol negotiation. Recovery: correctable (select a source VAST representation in the compatibility intersection or correct the offending document; never relabel the asset).
VAST_WRAPPER_DEPTH_EXCEEDED — correctable
Suggested action: inspect error.details.reason (depth, loop, timeout); flatten the wrapper chain, reduce redirects below the format’s max_wrapper_depth, or fix the failing hopResolving a asset’s wrapper chain failed: the chain exceeded the format’s declared , revisited a already seen in the chain (a loop), or a hop did not resolve within the seller’s per-hop timeout. Returned by sellers that declare . Sellers SHOULD set to the offending asset path and SHOULD populate with one of , , , plus with the depth reached. Recovery: correctable (flatten the chain, reduce redirects below the format’s , or fix the failing hop).
VERSION_UNSUPPORTED — correctable
Suggested action: re-pin to a release in supported_versions and retry, or call get_adcp_capabilities without a version pin to discover supported_versionsThe declared adcp_version (release-precision) or adcp_major_version (deprecated) is not supported by this seller. The error details SHOULD follow — (release-precision strings) is authoritative for retry; is deprecated. Recovery: correctable (re-pin to a release in supported_versions and retry; or call get_adcp_capabilities without a version pin to discover supported_versions).
Top-level agent capability claims. An agent claims a protocol by listing it in supported_protocols and must pass the protocol’s baseline storyboard plus every universal storyboard.supported_protocols uses snake_case; compliance paths and specialism IDs use kebab-case. See Naming conventions below for the full mapping.
Creative asset management, format discovery, rendering
signals
protocols/signals/
Audience signal discovery and activation
governance
protocols/governance/
Property governance, brand standards, compliance
brand
protocols/brand/
Brand identity, rights discovery, rights acquisition — small protocol today, growing with rights licensing work; see brand-rights specialism.
sponsored_intelligence
protocols/sponsored-intelligence/
AI-mediated commerce and conversational sponsored experiences
measurement
Preview / no stable baseline
Experimental 3.1 metric-catalog discovery. Agents implementing it must list measurement.core in experimental_features.
Support for the compliance test controller is declared via the capabilities.compliance_testing block on get_adcp_capabilities, not via supported_protocols. Compliance testing is an RPC surface for the test harness, not a functional protocol.
An agent can claim multiple protocols — a full-stack media-buy platform might list media_buy, creative, and signals. The runner executes all matching baselines.
Specific capability claims. Each specialism lives under exactly one protocol. An agent claiming a specialism must pass the specialism’s storyboard in addition to the parent protocol’s baseline — e.g. claiming sales-guaranteed requires media_buy in supported_protocols.Specialisms carry a status:
stable — fully specified storyboard. Compliance runner executes every phase; AAO Verified means the agent demonstrably passed.
preview — ID and scope are reserved; the storyboard is a placeholder while the underlying protocol surface stabilizes. Agents may claim these; the runner emits a result of { status: "preview", passed: null, reason: "storyboard not yet defined" } instead of a verified pass/fail. AAO badges render preview specialisms with a distinct indicator.
deprecated — retained for backward compatibility but scheduled for removal in a future major. Runner emits { status: "deprecated", passed: <boolean>, reason: "..." } — still executes the storyboard if one exists, but warns the claim should be migrated.
Status is declared per-specialism in the YAML frontmatter and surfaced in /compliance/{version}/index.json.Specialisms are grouped below by parent protocol.
What changed in 3.0.sponsored_intelligence was promoted from a specialism to a full protocol (declare it in supported_protocols, not specialisms). audience-sync moved from governance to media-buy to match its tool family. broadcast-platform was renamed to sales-broadcast-tv and social-platform to sales-social. property-governance and collection-governance split into sibling property-lists and collection-lists specialisms.
Deprecated in 3.1. Drop this claim and replace with sales-guaranteed + media_buy.supports_proposals: true. See #3823.
sales-catalog-driven
stable
Catalog-driven commerce with conversion tracking
sales-broadcast-tv
stable
Broadcast linear TV with guaranteed inventory and FCC cancellation rules
sales-dooh
stable
Digital out-of-home, non-guaranteed venue and screen inventory
sales-social
stable
Social media advertising platform with self-service flows
governance-aware-seller
stable
Seller composes with the buyer’s campaign-governance agent after baseline registration — calls check_governance and propagates approvals, conditions, and denials unchanged. Optional claim for the full governance-check loop.
Buyer agent that discovers seller inventory, interprets product capabilities, and assembles a candidate shortlist from a brief
buyer-activation
preview
Buyer agent that creates media buys with correct idempotency keys, handles transient failures with retry, and coordinates creative assignment
buyer-negotiation
preview
Buyer agent that requests proposals, refines terms, handles TERMS_REJECTED, and accepts or declines offers
buyer-monitoring
preview
Buyer agent that monitors delivery via webhooks and polling, detects pacing variance, and flags under-delivery
buyer-recovery
preview
Buyer agent that handles seller offline, auth expiry, idempotency collisions, and rate limiting with graceful degradation
orchestrator-multi-agent
preview
Orchestrator agent that coordinates across multiple sellers, handles partial failures, and reconciles cross-agent budget and state
sales-retail-media
preview
Retail media network seller — onsite sponsored search, sponsored display, and offsite extensions tied to SKU-level catalog feeds, keyword targeting, and deterministic purchase attribution
sales-streaming-tv
preview
Connected TV and streaming seller — SSAI-delivered video inventory, audience-based buying, household-level frequency capping, and VAST creative delivery across CTV apps
sales-exchange
preview
Programmatic exchange or SSP — multi-publisher auction inventory with floor prices, bid guidance, audience targeting, and auction-level delivery transparency
audience-sync moved from the governance protocol to media-buy to match its tool family. If your agent claims audience-sync but only declares governance in supported_protocols, add media_buy to supported_protocols — the runner now expects the media-buy baseline to run alongside the audience-sync storyboard.
Property list governance — curated inclusion and exclusion lists for targeting and delivery compliance
collection-lists
stable
Collection list governance — curated inclusion and exclusion lists of content programs (shows, series, podcasts) for program-level brand safety
governance-delivery-monitor
stable
Campaign delivery monitoring with drift detection
governance-spend-authority
stable
Conditional spend approval and human-in-the-loop governance
Experimental in 3.1. Measurement metric-catalog discovery is available through the experimental measurement capability block and measurement.core experimental feature. A stable measurement-verification specialism and baseline storyboard are deferred until the measurement task surface is frozen.
The sales-* specialisms are not mutually exclusive — a hybrid platform with both a guaranteed direct desk and an auction floor should claim both sales-guaranteed and sales-non-guaranteed. Follow the steps below to resolve your claim.
sales-proposal-mode is deprecated in 3.1. Do not claim it for new agents. Existing agents that declare it must drop it entirely and replace it with sales-guaranteed + media_buy.supports_proposals: true in get_adcp_capabilities. See #3823.
1
Is your inventory channel-specific?
Four specialisms apply to specific delivery channels and have their own storyboards. If you only sell one of these channel types, claim only the matching specialism. If you also sell general display or video inventory outside these channels, continue to Step 2.
If you operate…
Claim
Broadcast linear TV with FCC cancellation rules
sales-broadcast-tv
Catalog-driven dynamic ads (product listings, restaurant menus, hotel listings, local commerce)
sales-catalog-driven
Non-guaranteed digital out-of-home venue and screen inventory
sales-dooh
Guaranteed-only digital out-of-home inventory
sales-guaranteed
Social platform with platform-managed creative
sales-social
sales-dooh is the non-guaranteed DOOH profile. Guaranteed-only DOOH sellers still route dooh briefs through their portfolio declaration, but claim sales-guaranteed until a dedicated guaranteed DOOH profile exists.
2
What purchase model do you support?
If you sell…
Claim
Guaranteed media (IO approval, fixed pricing)
sales-guaranteed → see Step 3
Auction / PMP non-guaranteed
sales-non-guaranteed
Both guaranteed and non-guaranteed
sales-guaranteed + sales-non-guaranteed
3
Set media_buy.supports_proposals (sales-guaranteed only)
media_buy.supports_proposals is a boolean in the media_buy capabilities block of your get_adcp_capabilities response. It gates whether the proposal_finalize compliance scenario runs. It is a conformance declaration, not the buyer’s per-proposal routing signal: buyers decide whether a returned proposal can be bought from proposal_status.
If you…
Set
Accept RFPs, generate proposals, and finalize draft proposals to committed status before create
media_buy.supports_proposals: true
Sell direct-buy guaranteed only (auction PG, retail SKU, quoted-rate — no RFP flow)
media_buy.supports_proposals: false (or omit — default is false)
Property list governance — curated inclusion and exclusion lists for targeting and delivery compliance
collection-lists
stable
Collection list governance — curated inclusion and exclusion lists of content programs (shows, series, podcasts) for program-level brand safety
governance-delivery-monitor
stable
Campaign delivery monitoring with drift detection
governance-spend-authority
stable
Conditional spend approval and human-in-the-loop governance
Experimental in 3.1. Measurement metric-catalog discovery is available through the experimental measurement capability block and measurement.core experimental feature. A stable measurement-verification specialism and baseline storyboard are deferred until the measurement task surface is frozen.
Agent claim for SDKs that dispatch on specialism ID. The graded storyboard is the sponsored-intelligence protocol baseline; this specialism reserves the wire ID and promotes to stable when the SI tools graduate from x-status: experimental.
In addition to per-step validations, specialisms declare cross-step and cross-resource invariants the runner observes across the full storyboard run. These catch state inconsistencies that no single response shape would surface.
Invariant
Scope
Specialisms
status.monotonic
Single-resource — rejects status transitions observed across steps that aren’t on the spec lifecycle graph.
All specialisms with a stateful resource lifecycle.
impairment.coherence
Cross-resource — verifies that media_buy.impairments[] stays in sync with referenced resources. Forward: every entry references a currently-offline resource. Inverse: any offline resource referenced by a non-terminal buy appears in impairments[]. Health-iff: on a non-terminal buy, health == "impaired" iff impairments[] is non-empty (strict iff — stale drift fails). Out of scope: all three rules relax on terminal-status buys (sellers MAY leave impairments[] and health in whatever state held at the terminal transition); materiality is schema-enforced via package_ids: minItems: 1.
audience-sync, creative-ad-server, creative-template, creative-generative, sales-catalog-driven. Driven by the media_buy_seller/dependency_impairment scenario (creative-track via force_creative_status); audience-track and catalog-track follow once the compliance test controller adds force_audience_status / force_catalog_item_status. Grades not_applicable on storyboards that don’t observe both a resource transition and a media-buy snapshot read.
Invariants are declared in the specialism YAML’s invariants: array and documented inline with the rule they enforce. See media-buy lifecycle § Compliance for the full impairment.coherence contract.
Runs every storyboard in /compliance/{version}/universal/
For each protocol in supported_protocols, runs the baseline at /compliance/{version}/protocols/{protocol}/ (snake_case → kebab-case)
Runs each claimed specialism’s storyboard at /compliance/{version}/specialisms/{id}/
For preview specialisms, emits a warning instead of a pass/fail verdict — AAO Verified badges render preview specialisms with a distinct indicator
Implement the tools AND claim the specialism. An agent that wires all of a specialism’s required tools but omits the kebab-case ID from capabilities.specialisms[] will be graded “No applicable tracks found” by the runner — tracks_passed = 0, tracks_failed = 0, tracks_skipped = 1. This is a silent pass at the step level and a silent fail at the track level. The fix is to add the specialism ID (e.g., "creative-generative") to your get_adcp_capabilities response.
If any stable storyboard fails, your agent is not compliant for that claim. See Validate Your Agent for how to run the suite locally. For a detailed walkthrough of how the runner resolves specialism manifests into graded scenarios — including how capability flags like media_buy.supports_proposals gate individual scenarios — see How grading works.
Compliance YAML frontmatter, runner output, test reports
Prose / hyphenated
Titles and narrative
”Streaming TV”, “non-guaranteed”
Catalog pages, narrative copy
The kebab↔snake swap between wire specialism IDs and storyboard categories is mechanical identity — hyphens become underscores, nothing more. Variant scenarios within a specialism use {category}/{variant} path form.
The case split is deliberate: supported_protocols is a pre-existing 3.0 field already shipped to production agents, while specialism IDs are new and URL-first (each is a directory name under /compliance/.../specialisms/{id}/). The runner handles the mapping transparently.
sales-broadcast-tv declares channels: ['linear_tv'] — “Broadcast TV” is the prose name; linear_tv is the wire value.
/compliance/{version}/index.json surfaces each specialism’s required_tools so agents can discover the tool families without reading the full storyboard YAML.
Wire enum values are always snake_case (non_guaranteed, pmax_platform, ctv). Prose renders the same concept with hyphens or spaces (“non-guaranteed auction inventory”, “Connected TV”). When populating a payload, always use the wire form — hyphenated or spaced spellings are editorial only and will fail schema validation.
The signal_type enum in signal responses has three values:
marketplace — the signal agent is reselling segments published by a third-party data provider (Experian, Peer39, etc.). Buyers can verify authorization via the provider’s /.well-known/adagents.json.
owned — the signal agent exposes its own first-party segments derived from directly owned data (retailer purchase data, publisher behavioral data, telco location data).
custom — the signal source builds the segment on demand from models, composites, or buyer-supplied inputs. Use this when no adagents.json authorization chain applies — the segment is source-native, not attributable to a standing upstream provider.
Enumerated protocols + specialisms + universal storyboards + per-specialism status
/schemas/{version}/enums/specialism.json
Specialism enum used by get_adcp_capabilities.specialisms
/schemas/{version}/enums/adcp-protocol.json
Task-classification enum referenced by tasks-list-request and webhook payloads. Same axis as supported_protocols (kebab-case here, snake_case on the wire).
The build pipeline verifies the specialism filesystem ↔ enum parity and that every specialism’s parent protocol exists in the compliance tree. Drift fails the build.
The catalog on this page is maintained by hand to give human context. The authoritative enumeration is always /compliance/{version}/index.json.
Building an agent that wraps an upstream platform? Storyboards in this catalog grade the AdCP wire contract; they cannot detect adapters that return shape-valid responses without integrating with the upstream. See Validate adapter agents with mock upstream fixtures for the complementary pre-staging gate.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"AdCP - Ad Context Protocol","description":"AdCP (Ad Context Protocol) is the open standard for agentic advertising. It defines how AI agents buy media, generate creatives, activate audiences, and enforce governance across platforms. Current stable documentation index: https://docs.adcontextprotocol.org/llms-current.md.","colors":{"primary":"#047857","light":"#34D399","dark":"#065F46"},"logo":{"light":"https://mintcdn.com/agenticadvertisingorg/cnoy0Xiq2i_jSWzz/logo/sage.svg?fit=max\u0026auto=format\u0026n=cnoy0Xiq2i_jSWzz\u0026q=85\u0026s=f393829d8ccdabe856cf9c8362e66b96","dark":"https://mintcdn.com/agenticadvertisingorg/cnoy0Xiq2i_jSWzz/logo/sage.svg?fit=max\u0026auto=format\u0026n=cnoy0Xiq2i_jSWzz\u0026q=85\u0026s=f393829d8ccdabe856cf9c8362e66b96","href":"https://agenticadvertising.org"},"favicon":"https://mintcdn.com/agenticadvertisingorg/cnoy0Xiq2i_jSWzz/logo/sage.svg?fit=max\u0026auto=format\u0026n=cnoy0Xiq2i_jSWzz\u0026q=85\u0026s=f393829d8ccdabe856cf9c8362e66b96","api":{},"navbar":{"links":[{"href":"https://adcontextprotocol.org","label":"AdCP Home"},{"href":"https://agenticadvertising.org/members","label":"Members"},{"href":"https://agenticadvertising.org/perspectives","label":"Perspectives"},{"href":"https://agenticadvertising.org","label":"Join"}],"primary":{"type":"github","href":"https://github.com/adcontextprotocol/adcp"}},"footer":{"links":[{"header":"Legal","items":[{"label":"Privacy Policy","href":"https://agenticadvertising.org/api/agreement?type=privacy_policy"},{"label":"Terms of Use","href":"https://agenticadvertising.org/api/agreement?type=terms_of_service"}]},{"header":"Transparency","items":[{"label":"AI Disclosure","href":"/docs/ai-disclosure"},{"label":"Governance Charter","href":"https://github.com/adcontextprotocol/adcp/blob/main/CHARTER.md"},{"label":"Working Group","href":"/docs/community/working-group"}]}]},"seo":{},"banner":{"content":"AdCP 3.3 beta is open: scheduled, human-gated, and offline media in the same buy as programmatic — [see what's new →](/3.3)","dismissible":true},"metadata":{"timestamp":false},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"agenticadvertisingorg","hasAudioNarration":false,"actualSubdomain":"agenticadvertisingorg","customDomains":["docs.adcontextprotocol.org"],"gitSource":{"type":"github","owner":"adcontextprotocol","repo":"adcp","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adc13b6c8fac8fb63b0e787","collectionId":"1ec7d179-1da6-4f95-9d5a-a423a89aeacd","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc13b6c8fac8fb63b0e787"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{},"buildId":"6adc13b6c8fac8fb63b0e787","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"Protocol","count":716},{"language":"default","tag":"Reference","count":639},{"language":"default","tag":"Registry API","count":405},{"language":"default","tag":"Building with AdCP","count":392},{"language":"default","tag":"Media Buy","count":199},{"language":"default","tag":"Creative","count":182},{"language":"default","tag":"Governance","count":169},{"language":"default","tag":"Concepts","count":136},{"language":"default","tag":"Build by layer","count":125},{"language":"default","tag":"Certification","count":116}]},"assistantConfig":{"enableAskAiButton":true,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"apps/web/src/styles/app.css","content":"@import \"tailwindcss\";@import \"tw-animate-css\";@source \"../\";@source \"../../.ladle\";:root{--radius:0.25rem;--background:var(--color-white);--foreground:var(--color-neutral-950);--card:var(--color-white);--card-foreground:var(--color-neutral-950);--popover:var(--color-white);--popover-foreground:var(--color-neutral-950);--primary:var(--color-blue-600);--primary-foreground:var(--color-white);--secondary:oklch(from var(--color-slate-900) l c h / 6%);--secondary-foreground:var(--color-neutral-900);--muted:var(--color-slate-100);--muted-foreground:var(--color-slate-500);--body-foreground:var(--color-neutral-600);--accent:var(--color-slate-100);--accent-foreground:var(--color-slate-900);--destructive:var(--color-red-600);--destructive-foreground:var(--color-red-700);--destructive-on-color:var(--color-white);--success:var(--color-emerald-600);--success-foreground:var(--color-emerald-700);--warning:var(--color-yellow-400);--warning-foreground:var(--color-yellow-700);--info:var(--color-blue-600);--info-foreground:var(--color-blue-700);--border:var(--color-neutral-200);--input:var(--color-neutral-200);--ring:var(--color-neutral-400);--chart-1:var(--color-orange-500);--chart-2:var(--color-cyan-500);--chart-3:var(--color-blue-700);--chart-4:var(--color-yellow-400);--chart-5:var(--color-amber-500)}@media (prefers-color-scheme:dark){:root{--background:var(--color-slate-950);--foreground:var(--color-slate-50);--card:var(--color-slate-900);--card-foreground:var(--color-slate-50);--popover:var(--color-slate-900);--popover-foreground:var(--color-slate-50);--primary:var(--color-blue-600);--primary-foreground:var(--color-white);--secondary:oklch(1 0 0 / 12%);--secondary-foreground:var(--color-slate-50);--muted:var(--color-slate-800);--muted-foreground:var(--color-slate-400);--body-foreground:var(--color-slate-300);--accent:var(--color-slate-800);--accent-foreground:var(--color-slate-50);--destructive:var(--color-red-400);--destructive-foreground:var(--color-red-400);--destructive-on-color:var(--color-white);--success:var(--color-emerald-400);--success-foreground:var(--color-emerald-300);--warning:var(--color-yellow-400);--warning-foreground:var(--color-yellow-300);--info:var(--color-blue-400);--info-foreground:var(--color-blue-300);--border:oklch(1 0 0 / 10%);--input:oklch(1 0 0 / 15%);--ring:var(--color-slate-500)}}:root[data-theme=dark],:root[data-theme=light]{--primary:var(--color-blue-600);--primary-foreground:var(--color-white);--destructive-on-color:var(--color-white);--warning:var(--color-yellow-400)}:root[data-theme=light]{--background:var(--color-white);--foreground:var(--color-neutral-950);--card:var(--color-white);--card-foreground:var(--color-neutral-950);--popover:var(--color-white);--popover-foreground:var(--color-neutral-950);--secondary:oklch(from var(--color-slate-900) l c h / 6%);--secondary-foreground:var(--color-neutral-900);--muted:var(--color-slate-100);--muted-foreground:var(--color-slate-500);--body-foreground:var(--color-neutral-600);--accent:var(--color-slate-100);--accent-foreground:var(--color-slate-900);--destructive:var(--color-red-600);--destructive-foreground:var(--color-red-700);--success:var(--color-emerald-600);--success-foreground:var(--color-emerald-700);--warning-foreground:var(--color-yellow-700);--info:var(--color-blue-600);--info-foreground:var(--color-blue-700);--border:var(--color-neutral-200);--input:var(--color-neutral-200);--ring:var(--color-neutral-400)}:root[data-theme=dark]{--background:var(--color-slate-950);--foreground:var(--color-slate-50);--card:var(--color-slate-900);--card-foreground:var(--color-slate-50);--popover:var(--color-slate-900);--popover-foreground:var(--color-slate-50);--secondary:oklch(1 0 0 / 12%);--secondary-foreground:var(--color-slate-50);--muted:var(--color-slate-800);--muted-foreground:var(--color-slate-400);--body-foreground:var(--color-slate-300);--accent:var(--color-slate-800);--accent-foreground:var(--color-slate-50);--destructive:var(--color-red-400);--destructive-foreground:var(--color-red-400);--success:var(--color-emerald-400);--success-foreground:var(--color-emerald-300);--warning-foreground:var(--color-yellow-300);--info:var(--color-blue-400);--info-foreground:var(--color-blue-300);--border:oklch(1 0 0 / 10%);--input:oklch(1 0 0 / 15%);--ring:var(--color-slate-500)}@theme{--font-sans:'Inter Variable', 'Inter', -apple-system, BlinkMacSystemFont,\n 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;--font-mono:'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas,\n monospace;--color-blue-50:oklch(0.970 0.012 258);--color-blue-100:oklch(0.928 0.028 260);--color-blue-200:oklch(0.878 0.055 262);--color-blue-300:oklch(0.802 0.100 264);--color-blue-400:oklch(0.700 0.175 266);--color-blue-500:oklch(0.620 0.215 267);--color-blue-600:oklch(0.5358 0.2447 266.97);--color-blue-700:oklch(0.465 0.225 268);--color-blue-800:oklch(0.395 0.190 268);--color-blue-900:oklch(0.330 0.145 268);--color-blue-950:oklch(0.270 0.120 268);--color-blue-1000:oklch(0.2102 0.0975 268.06);--color-slate-1000:oklch(0.069 0.038 265);--color-gray-1000:oklch(0.070 0.026 261);--color-neutral-1000:oklch(0.080 0 0);--color-cyan-1000:oklch(0.242 0.045 230);--color-green-1000:oklch(0.206 0.052 153);--color-emerald-1000:oklch(0.205 0.030 173);--color-red-1000:oklch(0.198 0.074 26);--color-orange-1000:oklch(0.206 0.063 36);--color-amber-1000:oklch(0.219 0.048 46);--color-yellow-1000:oklch(0.226 0.053 54)}@theme inline{--color-background:var(--background);--color-foreground:var(--foreground);--color-card:var(--card);--color-card-foreground:var(--card-foreground);--color-popover:var(--popover);--color-popover-foreground:var(--popover-foreground);--color-primary:var(--primary);--color-primary-foreground:var(--primary-foreground);--color-secondary:var(--secondary);--color-secondary-foreground:var(--secondary-foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-body-foreground:var(--body-foreground);--color-accent:var(--accent);--color-accent-foreground:var(--accent-foreground);--color-destructive:var(--destructive);--color-destructive-foreground:var(--destructive-foreground);--color-destructive-on-color:var(--destructive-on-color);--color-success:var(--success);--color-success-foreground:var(--success-foreground);--color-warning:var(--warning);--color-warning-foreground:var(--warning-foreground);--color-info:var(--info);--color-info-foreground:var(--info-foreground);--color-border:var(--border);--color-input:var(--input);--color-ring:var(--ring);--color-chart-1:var(--chart-1);--color-chart-2:var(--chart-2);--color-chart-3:var(--chart-3);--color-chart-4:var(--chart-4);--color-chart-5:var(--chart-5);--radius-sm:max(0px, calc(var(--radius) - 4px));--radius-md:var(--radius);--radius-lg:calc(var(--radius) + 4px);--radius-xl:calc(var(--radius) + 8px)}@layer base{*,::after,::backdrop,::before,::file-selector-button{border-color:var(--color-border, currentColor)}body{background:var(--color-background);color:var(--color-foreground);font-family:var(--font-sans)}[data-sonner-toast][data-styled=true] [data-description]{color:var(--body-foreground)}}"}],"page":{"pagePath":"dist/docs/3.2.6/building/verification/compliance-catalog","slug":"/dist/docs/3.2.6/building/verification/compliance-catalog","pageMetadata":{"title":"Compliance Catalog","sidebarTitle":"Compliance Catalog","description":"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.","og:title":"AdCP — Compliance Catalog","href":"/dist/docs/3.2.6/building/verification/compliance-catalog"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,CodeBlock,Heading,Note,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Every AdCP agent declares its `,_jsx(_components.code,{children:`supported_protocols`}),` and `,_jsx(_components.code,{children:`specialisms`}),` in `,_jsx(_components.a,{href:`/dist/docs/3.2.6/protocol/get_adcp_capabilities`,children:_jsx(_components.code,{children:`get_adcp_capabilities`})}),`. Each declaration maps to a compliance bundle at `,_jsx(_components.code,{children:`/compliance/{version}/`}),` that the storyboard runner executes to verify the claim.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`supported_protocols`}),` is not exhaustive.`]}),` The `,_jsx(_components.code,{children:`accounts`}),` surface (`,_jsx(_components.a,{href:`/dist/docs/3.2.6/accounts/tasks/sync_accounts`,children:_jsx(_components.code,{children:`sync_accounts`})}),`, `,_jsx(_components.a,{href:`/dist/docs/3.2.6/accounts/tasks/list_accounts`,children:_jsx(_components.code,{children:`list_accounts`})}),`, `,_jsx(_components.a,{href:`/dist/docs/3.2.6/accounts/tasks/sync_governance`,children:_jsx(_components.code,{children:`sync_governance`})}),`) is a foundation implicit in every `,_jsx(_components.code,{children:`media_buy`}),`, `,_jsx(_components.code,{children:`creative`}),`, and `,_jsx(_components.code,{children:`signals`}),` agent and is intentionally not a `,_jsx(_components.code,{children:`supported_protocols`}),` value. See `,_jsx(_components.a,{href:`/dist/docs/3.2.6/accounts/tasks/sync_accounts`,children:`Accounts tasks`}),` for the full account surface.`]})}),`\n`,_jsxs(_components.p,{children:[`This page is the human-readable index of that taxonomy. The machine-readable equivalent is `,_jsx(_components.code,{children:`/compliance/{version}/index.json`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`universal-storyboards`,children:`Universal storyboards`}),`\n`,_jsxs(_components.p,{children:[`Every agent runs every graded storyboard in `,_jsx(_components.code,{children:`/compliance/{version}/universal/`}),` regardless of which protocols or specialisms it claims. A few are `,_jsx(_components.em,{children:`capability-gated`}),` — they only run when the agent advertises the relevant capability — but the storyboard is still universal in scope: any agent claiming the capability is graded by it. Failing a universal storyboard fails overall compliance. Non-executable schemas and support fixtures shipped in the universal bundle are not runner scenarios and do not appear in this table.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Graded storyboard`}),_jsx(_components.th,{children:`Purpose`}),_jsx(_components.th,{children:`Source`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`account-identity-reconciliation`})}),_jsx(_components.td,{children:`Validates revision-guarded operator identity rekeying, collision safety, and former-key redirects for sellers that advertise identity updates.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/account-identity-reconciliation.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`agent-notification-configs`})}),_jsx(_components.td,{children:`Validates the 3.2 agent-level capabilities.changed registration surface: advertised revision fencing, NO_AUTH rejection, and dry-run clear semantics.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/agent-notification-configs.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`billing-gate-dispatch`})}),_jsx(_components.td,{children:`Validates that account.supported_billing is declared and honored by sync_accounts, including out-of-set BILLING_NOT_SUPPORTED rejection, recovery-value consistency, and the distinct per-buyer-agent BILLING_NOT_PERMITTED_FOR_AGENT gate.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/billing-gate-dispatch.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`canonical-format-validate-input`})}),_jsx(_components.td,{children:`Validates 3.1 canonical-format dry-run semantics: structural pass/fail across canonical slots and unvalidatable_nondeterministic for seeded products.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/canonical-format-validate-input.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`capability-discovery`})}),_jsx(_components.td,{children:`Buyer calls get_adcp_capabilities to discover what an agent supports before making any buying or creative decisions.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/capability-discovery.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`collection-lists-pagination-integrity`})}),_jsx(_components.td,{children:`Validates the cursor↔has_more invariant by walking a paginated list_collection_lists response from a continuation page to a terminal page.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/collection-lists-pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`comply-controller-mode-gate`})}),_jsx(_components.td,{children:`Verifies that a seller exposing comply_test_controller refuses calls from live-mode (non-sandbox) accounts with FORBIDDEN.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/comply-controller-mode-gate.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`content-standards-pagination-integrity`})}),_jsx(_components.td,{children:`Validates the cursor↔has_more invariant by walking a paginated list_content_standards response from a continuation page to a terminal page.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/content-standards-pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ctv-experience-validate-input`})}),_jsx(_components.td,{children:`Validates AdCP 3.2 ctv_ad_experience matrix pairings, duration/interactivity constraint profiles, the menu focus/video pairing, and non-blocking activation-copy warnings via validate_input against seeded CTV products.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/ctv-experience-validate-input.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deterministic-testing`})}),_jsx(_components.td,{children:`Uses comply_test_controller to force state transitions and simulate delivery/budget, verifying state machines and reporting.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/deterministic-testing.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`error-compliance`})}),_jsx(_components.td,{children:`Validates that agents return properly structured AdCP errors with correct codes, recovery hints, and transport bindings.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/error-compliance.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`error-compliance-signals`})}),_jsx(_components.td,{children:`Validates that signals agents return properly structured AdCP errors with correct codes, recovery hints, and transport bindings.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/error-compliance-signals.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get-media-buys-pagination-integrity`})}),_jsx(_components.td,{children:`Validates that get_media_buys responses carry a well-formed pagination envelope honoring the cursor↔has_more invariant.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/get-media-buys-pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get-products-pagination-integrity`})}),_jsx(_components.td,{children:`Validates get_products wholesale-mode pagination by walking a seeded product feed from continuation to terminal, while documenting that brief/refine pagination caps returned products in curated results.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/get-products-pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get-signals-pagination-integrity`})}),_jsx(_components.td,{children:`Validates the cursor↔has_more invariant on a paginated get_signals response by walking from a continuation page to the next page under a broad query.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/get-signals-pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`idempotency`})}),_jsx(_components.td,{children:`Validates that mutating requests enforce idempotency_key — replays return cached responses even after resource purge, key reuse with a different payload returns IDEMPOTENCY_CONFLICT, fresh keys create new resources, and concurrent retries with the same key produce exactly one resource (first-insert-wins under rule 9).`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/idempotency.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`notification-config-event-scope`})}),_jsx(_components.td,{children:`Validates that sync_accounts.accounts[].notification_configs[] rejects media-buy-anchored notification types.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/notification-config-event-scope.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`notification-config-lifecycle`})}),_jsx(_components.td,{children:`Validates account-level notification_configs[] lifecycle behavior on sync_accounts: paused registration, durable echo, subscriber-keyed replacement, and clear.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/notification-config-lifecycle.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`notification-config-rejections`})}),_jsx(_components.td,{children:`Validates account-level notification_configs[] semantic rejection for duplicate subscriber keys.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/notification-config-rejections.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`oauth-setup`})}),_jsx(_components.td,{children:`Capability-gated evaluation of an agent’s RFC 9728 protected-resource metadata and the complete RFC 8414 authorization-server graph it advertises.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/oauth-setup.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pagination-integrity`})}),_jsx(_components.td,{children:`Validates the cursor↔has_more invariant by walking a paginated list_creatives response from a continuation page to a terminal page.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pagination-integrity-creative-formats`})}),_jsx(_components.td,{children:`When an agent still exposes deprecated list_creative_formats compatibility, validates its cursor↔has_more invariant by seeding two formats and walking pages with max_results=1.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/pagination-integrity-creative-formats.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pagination-integrity-list-accounts`})}),_jsx(_components.td,{children:`Validates list_accounts pagination by seeding sandbox accounts, requesting a small first page, and following its cursor once.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/pagination-integrity-list-accounts.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`premium-display-canonical-validation`})}),_jsx(_components.td,{children:`Validates AdCP 3.2 seller_rendered_stateful_display supply-mode contracts (components, rendered_canvases, layered_source), single-state reveal shape, policy floors, and coordinated_placements sequence/serving_policy, alongside transition/canvas coverage and shared-slot resolution.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/premium-display-canonical-validation.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`principal`})}),_jsx(_components.td,{children:`Validates the experimental stable-principal-scoped configuration surface: capability discovery, pre-configuration identity readback, NO_AUTH rejection, dry-run setup, applied lifecycle with readback, idempotent replay, and section clearing.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/principal.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`property-list-reference-resolution`})}),_jsx(_components.td,{children:`An independent receiver resolves an issued list over the task transport using only its read-only bearer token and follows pagination.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/property-list-reference-resolution.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`property-lists-pagination-integrity`})}),_jsx(_components.td,{children:`Validates the cursor↔has_more invariant by walking a paginated list_property_lists response from a continuation page to a terminal page.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/property-lists-pagination-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`read-tool-idempotency`})}),_jsx(_components.td,{children:`Validates that read-only AdCP tasks and the 3.x get_products compatibility facade tolerate an optional idempotency_key without claiming read-response replay.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/read-tool-idempotency.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reliable-reporting-managed-delivery`})}),_jsx(_components.td,{children:`Validates the Managed Delivery tier’s explicit capability, atomic managed offering, resource retention, and authorization-revocation contract.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/reliable-reporting-managed-delivery.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reliable-reporting-reconciled-billing`})}),_jsx(_components.td,{children:`Validates the Reconciled Billing tier’s canonical evidence and authenticated receipt path for official revisions and later adjustments.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/reliable-reporting-reconciled-billing.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reporting-consumer-status`})}),_jsx(_components.td,{children:`Validates opt-in buyer-to-seller reporting status, missing-obligation identity, caller-scoped mismatch, content-mismatch contract facts, counted silence, escalation, and immutable supersession.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/reporting-consumer-status.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reporting-core`})}),_jsx(_components.td,{children:`Validates reporting.core obligation-before-report behavior, clock-derived health, and explicit zero-row reporting.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/reporting-core.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reporting-core-declaration`})}),_jsx(_components.td,{children:`Validates the proper-name Reliable Reporting 1.0 declaration and its required Core tier without requiring optional tiers or a sandbox controller.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/reporting-core-declaration.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`schema-validation`})}),_jsx(_components.td,{children:`Validates that agent responses conform to AdCP schemas and that temporal constraints are enforced.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/schema-validation.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`schema-validation-signals`})}),_jsx(_components.td,{children:`Validates that signals agent responses conform to AdCP schemas with all required fields present and correctly typed.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/schema-validation-signals.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`security`})}),_jsx(_components.td,{children:`Every AdCP agent MUST require authentication on protected operations. At least one of static credentials or OAuth MUST be implemented and correctly advertised.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/security.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`signed-requests`})}),_jsxs(_components.td,{children:[`Agent verifies RFC 9421 HTTP Signatures on incoming AdCP requests per the 3.1-compatible transport-layer profile. Universal capability-gated storyboard — runs for any agent advertising `,_jsx(`code`,{children:`request_signing.supported: true`}),` regardless of `,_jsx(`code`,{children:`supported_protocols`}),`. Graded against the legacy wire suite covering every 3.1 checklist step and canonicalization-edge rule; a verifier advertising `,_jsx(`code`,{children:`covers_content_digest: \"required\"`}),` (every 3.2+ verifier) is graded against the `,_jsx(`code`,{children:`profile-3.2/`}),` mirror, which carries a counterpart of every legacy vector (positive `,_jsx(`code`,{children:`001`}),` and `,_jsx(`code`,{children:`002`}),` collapse into `,_jsx(`code`,{children:`positive/001-post-with-content-digest`}),`) except `,_jsx(`code`,{children:`negative/018`}),` (`,_jsx(`code`,{children:`forbidden`}),` is illegal in 3.2).`]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/signed-requests.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`stale-response-advisory`})}),_jsx(_components.td,{children:`Validates that STALE_RESPONSE rides in errors[] on a populated success response with transport success preserved, and that STALE_RESPONSE is absent on healthy upstream responses.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/stale-response-advisory.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`trusted-match-publisher-authentication`})}),_jsx(_components.td,{children:`Verifies that a TMP router deployment rejects schema-valid Context Match and Identity Match requests with absent or invalid publisher authentication using HTTP 401 and a WWW-Authenticate challenge.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/trusted-match-publisher-authentication.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`v3-envelope-integrity`})}),_jsx(_components.td,{children:`v3 protocol envelopes MUST NOT carry task_status or response_status — v2 legacy field names that have no semantics in v3.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/v3-envelope-integrity.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`version-negotiation`})}),_jsx(_components.td,{children:`Sellers advertise supported releases on capabilities and echo the served release on every response.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/version-negotiation.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook-emission`})}),_jsx(_components.td,{children:`Any agent that emits webhooks MUST echo the caller-supplied operation_id in every payload, carry a stable idempotency_key across retries, avoid duplicate webhook side effects on request replay, and — when the buyer has not opted into the deprecated HMAC fallback — MUST sign deliveries under the RFC 9421 webhook profile. Sellers MUST NOT emit task webhooks for inline terminal responses; any future sync-completion notification mode would be explicit and capability-advertised. Graded by a runner hosting a webhook receiver during storyboard execution.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/webhook-emission.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`webhook-receiver-envelope`})}),_jsx(_components.td,{children:`Buyer webhook receivers MUST accept full MCP webhook envelopes, reject bare delivery-result payloads, preserve raw-body signature verification, and dedupe retries by a stable idempotency_key.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/webhook-receiver-envelope.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-bulk-webhooks`})}),_jsx(_components.td,{children:`Validates account-level notification_configs[] registration for agents that advertise wholesale_feed.bulk_change webhook events.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-bulk-webhooks.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-product-webhooks`})}),_jsx(_components.td,{children:`Validates account-level notification_configs[] registration for agents that advertise product wholesale feed webhook events.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-product-webhooks.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-products`})}),_jsx(_components.td,{children:`Validates get_products wholesale feed versioning: bootstrap responses carry wholesale_feed_version/cache_scope and matching if_wholesale_feed_version probes return unchanged without product rows.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-products.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-products-scope-isolation`})}),_jsx(_components.td,{children:`Validates that get_products conditional-fetch is keyed by cache_scope: a wholesale_feed_version minted under one cache_scope must not short-circuit (unchanged: true) a request the seller resolves to a different cache_scope.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-products-scope-isolation.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-signal-webhooks`})}),_jsx(_components.td,{children:`Validates account-level notification_configs[] registration for agents that advertise signal wholesale feed webhook events.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-signal-webhooks.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-signals`})}),_jsx(_components.td,{children:`Validates get_signals wholesale feed versioning: bootstrap responses carry wholesale_feed_version/cache_scope and matching if_wholesale_feed_version probes return unchanged without signal rows.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-signals.yaml`,children:`YAML`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wholesale-feed-signals-scope-isolation`})}),_jsx(_components.td,{children:`Validates that get_signals conditional-fetch is keyed by cache_scope: a wholesale_feed_version minted under one cache_scope must not short-circuit (unchanged: true) a request the agent resolves to a different cache_scope.`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://adcontextprotocol.org/compliance/latest/universal/wholesale-feed-signals-scope-isolation.yaml`,children:`YAML`})})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Capability-gated rows (`,_jsx(_components.code,{children:`deterministic-testing`}),`, `,_jsx(_components.code,{children:`oauth-setup`}),`, `,_jsx(_components.code,{children:`signed-requests`}),`) are skipped when the corresponding capability is absent or advertises `,_jsx(_components.code,{children:`supported: false`}),`; they cannot be claimed and partially implemented. Declaring `,_jsx(_components.code,{children:`supported: true`}),` and failing the storyboard is non-conformant — omit the capability or declare `,_jsx(_components.code,{children:`false`}),` rather than ship a partial implementation. The `,_jsx(_components.code,{children:`billing-gate-dispatch`}),` and `,_jsx(_components.code,{children:`comply-controller-mode-gate`}),` rows are precondition-gated rather than ordinary capability-gated rows: each phase grades `,_jsx(_components.code,{children:`not_applicable`}),` when its precondition is not met. Sellers wanting full coverage of the per-agent billing gate SHOULD ship a test kit with `,_jsx(_components.code,{children:`commercial_relationship: passthrough_only`}),` declared so the per-agent phases run.`]}),`\n`,_jsx(Heading,{level:`2`,id:`standard-error-codes`,children:`Standard error codes`}),`\n`,_jsxs(_components.p,{children:[`The compliance suite verifies that standard errors use the recovery classifications and remediation guidance defined by the canonical `,_jsx(_components.a,{href:`https://github.com/adcontextprotocol/adcp/blob/main/static/schemas/source/enums/error-code.json`,children:_jsx(_components.code,{children:`error-code.json`})}),` source taxonomy. The vocabulary remains open: agents must also handle unknown codes using the response’s `,_jsx(_components.code,{children:`recovery`}),` value.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Recovery`}),_jsx(_components.th,{children:`Suggested action`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_AMBIGUOUS`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`pass explicit account_id or a more specific natural key`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_IDENTITY_CONFLICT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`choose a different operator or operator_unit identity, or retain the account’s current identity; do not retry the same desired identity unchanged`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_MOVED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`replace the stale reference with error.details.current_account, refresh through list_accounts, and retry with a fresh idempotency key`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_NOT_FOUND`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`for a natural key, provision through sync_accounts or omit account for public discovery; for an account_id, verify via list_accounts or contact seller`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_PAYMENT_REQUIRED`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`buyer must resolve billing`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`pass account, or reference an existing resource whose owning account the service can resolve`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_SETUP_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check details.setup for URL or instructions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACCOUNT_SUSPENDED`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`contact seller to resolve suspension`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ACTION_NOT_ALLOWED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`branch on error.details.reason: for wrong_status, wait for or transition to a status listed under the action’s allowed_statuses; for mode_mismatch, this is a flow switch (not a retry against update_media_buy) — follow the mode named in available_actions[\u003caction>].mode; for condition_unresolved, wait until the seller advertises the action after resolving its opaque condition; for not_supported_on_product or not_supported_on_buy, do not retry — the action is unavailable on this buy and buyer must select a different product or renegotiate, using error.details.decline_reason when present to inform that renegotiation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AGENT_BLOCKED`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`surface to a human at the buyer — the relationship is permanently denied and is reinstated only through offline operator action with the seller, not via any seller-callable AdCP task`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AGENT_SUSPENDED`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`surface to a human at the buyer — the agent cannot unilaterally lift a suspension; re-onboarding with the seller offline may resolve`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AMBIGUOUS_BIDDING_POLICY`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`remove either the canonical bidding block or all legacy bidding fields from the effective package`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AUDIENCE_TOO_SMALL`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`broaden targeting or upload more audience members`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AUTHORIZATION_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`complete or restore the required downstream platform connection, identity, creator, or post authorization; use error.details.missing_connections, authorization_url, authorization_instructions, or reference_authorization when present`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AUTH_INVALID`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`do NOT auto-retry — credentials were rejected; rotate keys, refresh OAuth tokens once if applicable, otherwise escalate to a human`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AUTH_MISSING`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`provide credentials via the auth header and retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`AUTH_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`provide credentials when missing; do NOT auto-retry rejected credentials — escalate for rotation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BIDDING_PLACEMENT_CONFLICT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`align media-buy and package bidding scopes with the provider’s supported placement, or choose a compatible budget mode/product combination`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BILLING_NOT_PERMITTED_FOR_AGENT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`retry with error.details.suggested_billing (typically ‘operator’) when present; when absent, surface to a human at the buyer — the agent cannot unilaterally extend its commercial relationship and MUST NOT auto-retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BILLING_NOT_SUPPORTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check get_adcp_capabilities for supported_billing and resubmit with a supported value, or omit billing to accept the seller’s default`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BILLING_OUT_OF_BAND`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`do not retry — billing for this account runs through a non-AdCP channel. Pre-filter via capabilities.creative.bills_through_adcp before sending report_usage; flag the account in the buyer’s routing table and fall back to the ad server’s native billing export for cost reconciliation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BRAND_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`include brand (domain plus optional brand_id) on the request`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BUDGET_CAP_REACHED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`raise max_spend, or reduce max_creatives/max_variants, to produce the remaining items`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BUDGET_EXCEEDED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`reduce requested amount or increase budget allocation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BUDGET_EXHAUSTED`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`buyer must add funds or increase budget cap`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BUDGET_TOO_LOW`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`increase budget or check capabilities.media_buy.limits`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CAMPAIGN_SUSPENDED`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`wait for the escalation to resolve; contact the plan operator if the suspension persists`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CATALOG_LIMIT_EXCEEDED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`remove unused catalogs, or contact the seller to raise the limit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`COMMITTED_RESOURCE_PURGED`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`do not automatically retry with the same or a fresh idempotency_key; reconcile through the resource read task and seller audit or operator records before deciding whether to initiate a new operation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`COMPLIANCE_UNSATISFIED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`choose a format that supports the required disclosure positions and persistence modes, remove the disclosure requirement, or revise the refinement instruction`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CONFIGURATION_ERROR`})}),_jsx(_components.td,{children:`terminal`}),_jsx(_components.td,{children:`surface to a human at the seller — the buyer cannot resolve a seller-side deployment misconfiguration and MUST NOT auto-retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CONFLICT`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`re-read the resource and retry with current state`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CONFLICTING_SELECTORS`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`emit one canonical format selector route, or make every required legacy 3.x compatibility projection select the same product format contract under the canonical v2-narrows-v1 comparison`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_DEADLINE_EXCEEDED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check creative_deadline via get_media_buys before submitting changes, or negotiate a deadline extension with the seller`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_INACCESSIBLE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify the asset URLs in creative_manifest are reachable without agent-side credentials, then re-submit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_LOCALE_NOT_ACCEPTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`supply or assign a creative variant matching every in-scope format option’s accepted_language_ranges, narrow placement scope, choose a compatible format option, or change an ineligible serve_default`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_MERGE_REJECTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`confirm the pairing via list_creatives, or use a replace assignment operation to traffic creative_id as a new serving object`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_MISSING_CLICK_URL`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`add the required destination URL and resubmit the creative`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify creative_id via list_creatives, or sync_creatives to register it`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_REJECTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`revise the creative according to the applicable advertising policy or validated accessibility criteria`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_REPRESENTATION_UNRESOLVED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`inspect every error.details.representation_rejections entry, then choose a compatible format option or supply a compatible representation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_REVISION_CONTENT_MISMATCH`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`resend the exact content previously bound to this revision_id, or mint a new revision_id for changed content`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_SIZE_MISMATCH`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`resize or replace the creative with a size accepted by every selected package that may serve it`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_VALIDATION_FAILED_GENERIC`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`correct the buyer-visible validation problem and resubmit the creative`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREATIVE_VALUE_NOT_ALLOWED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`pick a value from error.details.allowed_values (or re-fetch the format) and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CREDENTIAL_IN_ARGS`})}),_jsx(_components.td,{children:`terminal`}),_jsxs(_components.td,{children:[`do NOT auto-retry — auto-retry re-logs the credential on each attempt. Move authentication material or caller-supplied trust material out of request args (top-level, `,_jsx(`code`,{children:`context`}),`, `,_jsx(`code`,{children:`ext`}),`, any nested location) onto the relevant transport authentication/trust channel or account provisioning path (Authorization: Bearer, RFC 9421 signature/JWKS, mTLS, MCP/A2A authentication framing); rotate any leaked credential, then resubmit`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CURSOR_EXPIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`obtain a latest checkpoint, rebuild authoritative account snapshots, then drain changes after the checkpoint`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`EVALUATOR_AGENT_NOT_ACCEPTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`replace the evaluator agent_url (evaluator.feature_agent.agent_url or the evaluator agent-form agent_url) with one from the seller’s published accepted_verifiers, or drop the evaluator agent pointer to fall back to seller-default ranking`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FEED_FETCH_FAILED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check URL accessibility, authentication, and that content matches the declared feed_format`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FIELD_NOT_PERMITTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`drop the disallowed field(s) and retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_DECLARATION_DIVERGENT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`advisory — seller-side fix needed: producer is emitting disagreeing format_ids and format_options for the same product. Buyer SDK SHOULD prefer format_options and surface the divergent product to operators; do not auto-retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_DECLARATION_V1_AMBIGUOUS`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`advisory — seller-side fix needed: the v2 declaration’s canonical has only family-level structural registry entries (no invertible literal). Seller MUST author v1_format_ref on the v2 declaration to disambiguate; SDKs MUST NOT synthesize. Do not auto-retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`advisory — emitted alongside the partial v1 emission, NOT in place of it: the v2 declaration carries `,_jsx(`code`,{children:`params.sizes[]`}),` with N entries but only M v1_format_ref entries (M \u003c N), so v1 buyers see partial size coverage on the product. Seller-side fix: add v1_format_ref entries for the missing sizes. SDK MAY (non-normative) fan out automatically by catalog lookup. Non-fatal — do not auto-retry`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_NOT_SUPPORTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`refresh get_adcp_capabilities creative.supported_formats[] and retry with a capability_id whose operations contains the intended build, preview, or validate operation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_OPTION_UNRESOLVED`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`advisory — publisher-side fix needed: a placement’s `,_jsx(`code`,{children:`format_options[].format_option_id`}),` references a `,_jsx(`code`,{children:`format_option_id`}),` that does not exist in this file’s top-level `,_jsx(`code`,{children:`formats[]`}),`. Buyer SDK MUST fail closed for that placement (drop the format from the placement’s accepted set) and surface this code. Publisher fix: either declare the missing format option in `,_jsx(`code`,{children:`formats[]`}),` or remove the reference from the placement. Do not auto-retry`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_PROJECTION_FAILED`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`advisory — seller-side fix needed: ask the seller to add an explicit `,_jsx(`code`,{children:`canonical`}),` field on the legacy format declaration, or contribute a registry entry (format_id_glob or structural match) to v1-canonical-mapping.json. Do not auto-retry; the product is still valid on the legacy named-format path`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FORMAT_SHAPE_PROMOTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`advisory — migrate the legacy custom format_shape to error.details.promoted_to before error.details.transition_end; dual emission is allowed during the transition window. Do not auto-retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GOVERNANCE_AGENT_NOT_ACCEPTED`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`select a governance agent matching `,_jsx(`code`,{children:`error.details.accepted_governance_agents`}),`, then retry `,_jsx(`code`,{children:`sync_governance`}),` with a fresh idempotency key`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GOVERNANCE_DENIED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`restructure the buy, escalate to human spending authority, or contact the governance agent for details`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GOVERNANCE_UNAVAILABLE`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`retry with backoff; if the agent remains unreachable, the buyer MUST contact the plan’s governance operator`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`IDEMPOTENCY_CONFLICT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`use a fresh UUID v4 for the new request, or resend the exact original payload to get the cached response`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`IDEMPOTENCY_EXPIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`perform a natural-key check to determine whether the original request succeeded; if no evidence of success, generate a fresh idempotency_key for a new attempt`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`IDEMPOTENCY_IN_FLIGHT`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`wait top-level error.retry_after seconds and retry with the SAME idempotency_key — MUST NOT mint a fresh key (turns a safe retry into a double-execution race)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`INVALID_FEED_FORMAT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify the feed content matches the declared format`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`INVALID_PRICING_OPTION`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify pricing_option_id against the product’s pricing_options from get_products or the vendor’s discovery response, then resubmit with a valid ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`INVALID_REQUEST`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check request parameters and fix`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`INVALID_STATE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check current status via get_media_buys and adjust request`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`INVALID_USAGE_DATA`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check required fields for the vendor type (vendor_cost, currency, account at minimum), fix invalid values, and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`IO_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`review the proposal’s insertion_order, accept terms, and include io_acceptance on accept_proposal; use create_media_buy only for 3.x compatibility`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ITEM_VALIDATION_FAILED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check item_issues for per-item rejection reasons and fix the offending items`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MACRO_RESOLUTION_FAILED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`inspect error.details.macro_resolution_results and route to a resolver that supports the declared dialect, semantic, owner, and encoding depth`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MEDIA_BUY_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify media_buy_id; for legacy correlation use get_media_buys plus context, such as context.internal_campaign_id`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MULTI_FINALIZE_UNSUPPORTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`sequence single-proposal finalize calls — one finalize entry per get_products refine[] call or per refine_proposals refinements[] call`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`NOT_CANCELLABLE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check the seller’s cancellation policy or contact the seller`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PACKAGE_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify package_id; for legacy package correlation use get_media_buys plus package context, such as context.buyer_ref`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PAYMENT_TERMS_NOT_SUPPORTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`omit payment_terms to accept the seller’s default, retry with a different supported value, or negotiate offline`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PERMISSION_DENIED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`call check_governance to mint a valid token, or contact the seller to resolve the underlying permission; when error.details.scope is ‘agent’ (reason ‘sandbox_only’ or ‘grant_absent’) the rejection is terminal-pending-onboarding — surface to a human rather than auto-retrying. For suspended/blocked agent relationships, sellers emit AGENT_SUSPENDED / AGENT_BLOCKED instead (those codes carry recovery: terminal directly).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PIXEL_TRACKER_LOSSY_DOWNGRADE`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`advisory — emitted alongside the v1 downgrade emission: SDK collapsed a pixel_tracker asset to v1 `,_jsx(`code`,{children:`{asset_type: url, url_type: tracker_pixel}`}),` for a seller that doesn’t support pixel_tracker natively. The URL still fires; what’s lost is in `,_jsx(`code`,{children:`error.details.lost_fields`}),` (event variant, method:js execution context, or custom event timing). Buyer decision: accept the loss (most counter pixels survive), or fail the buy and route to a 3.1-capable seller. Non-fatal — do not auto-retry`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PIXEL_TRACKER_UPGRADE_INFERRED`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`advisory — emitted when a 3.1 SDK upgrades a v1 url+tracker_pixel asset to pixel_tracker by inferring event and method from asset_id conventions. The inference may not match the buyer’s original intent; check `,_jsx(`code`,{children:`error.details.inferred_event`}),` / `,_jsx(`code`,{children:`inferred_method`}),` and re-prompt the seller for explicit values if precise measurement matters. Non-fatal — do not auto-retry`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PLACE_TARGET_UNAVAILABLE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`resolve the pinned value against the current catalog, review any replacement, and submit an intentional package targeting update`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PLAN_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify plan_id via sync_plans, or register the plan first`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POLICY_VIOLATION`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`review policy requirements in the error details`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PRIVATE_FIELD_IN_PUBLIC_PLACEMENT`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`seller-side fix needed: remove private operational fields (`,_jsx(`code`,{children:`visibility`}),`, `,_jsx(`code`,{children:`source`}),`, `,_jsx(`code`,{children:`origin`}),`, `,_jsx(`code`,{children:`delivery_mappings`}),`, or similar) from public placement objects. Consumers MUST fail closed for the affected placement and alert operators; do not echo private field values in logs or error details`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PRODUCT_EXPIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`re-discover with get_products to find current inventory`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PRODUCT_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`remove invalid IDs and retry, or re-discover with get_products`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PRODUCT_UNAVAILABLE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`choose a different product`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROPOSAL_EXPIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`call request_proposals and finalize a fresh proposal, or re-discover and finalize through legacy get_products`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROPOSAL_NOT_COMMITTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`finalize the draft through refine_proposals, or through the legacy get_products refine action`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROPOSAL_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`request and finalize a fresh proposal, then retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_CLAIM_CONTRADICTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`revise the provenance claim to match the verifier’s observation or replace the creative; auto-retry without correction will not pass`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`set provenance.digital_source_type to a value from the digital-source-type enum and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_DISCLOSURE_MISSING`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`set provenance.disclosure.required and, when true, populate disclosure.jurisdictions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_EMBEDDED_MISSING`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`attach at least one embedded_provenance entry from a supported provider and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`attach a provenance object - at minimum digital_source_type - and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_SYNTHETIC_DEPICTION_MISSING`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`assess the creative, set provenance.synthetic_depiction to true or false, and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PROVENANCE_VERIFIER_NOT_ACCEPTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`replace verify_agent.agent_url with one from the seller’s published accepted_verifiers, drop verify_agent if the embedding is self-verifiable, or re-embed with a verifier the seller accepts`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITED`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`wait top-level error.retry_after seconds when present, then retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`READ_ONLY_SCOPE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`use a non-mutating alternative, or surface to the operator to request a scope that permits mutation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`REFERENCE_DEFINITION_CHANGED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`refine the proposal so the seller re-resolves the pinned definitions and issues fresh pins, review the changed definition, then finalize and accept the new proposal`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`REFERENCE_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify the referenced identifier exists and is accessible to the caller`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`REQUOTE_REQUIRED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`use error.details.decline_reason when present to inform recovery, then refine accepted_proposal_id and apply the amendment through accept_proposal, or keep control_media_buy inside the accepted envelope; some policies require a free-text ask or human negotiation, and 3.1 compatibility callers must adjust or rediscover`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`RIGHTS_CHANNEL_VIOLATION`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`advisory — inspect error.details.rights_id and the requested channel against rights[].channels / excluded_channels; target a capability on a permitted channel, confirm the rights entry applies to this output, or have the holder grant the channel (a human or holder action)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SCOPE_INSUFFICIENT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`the agent cannot broaden its own scope - surface to the operator rather than auto-retry`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SERVICE_UNAVAILABLE`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`retry with exponential backoff`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SESSION_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`initiate a new session via si_initiate_session`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SESSION_TERMINATED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`initiate a new session via si_initiate_session`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SIGNAL_NOT_FOUND`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify signal_id via get_signals, or confirm the signal is available from this agent`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SIGNAL_TARGETING_INCOMPATIBLE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`assign the creative to a package whose signal targeting matches the creative’s signal_condition, or rebuild the creative for the package’s condition; match on shared signal_ref identity (compare signal_agent_segment_id exactly when both carry it, else categorical signal_ref + value)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SIGNED_RESPONSE_ENVELOPE_EXPIRED`})}),_jsx(_components.td,{children:`transient`}),_jsx(_components.td,{children:`re-invoke the designated task (verify_brand_claim or verify_brand_claims) to obtain a freshly signed response with a current exp window`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SIGNED_RESPONSE_REQUEST_HASH_MISMATCH`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`re-invoke the designated task with the intended request parameters — the signed response’s request_hash does not match the verifier’s recomputed hash of the actual request; if the mismatch persists across retries, investigate JCS request-binding canonicalization between caller and responder`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SIGNED_RESPONSE_TENANT_MISMATCH`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`verify the request targeted the correct brand domain and agent_url, then re-invoke; if the mismatch persists, the responding agent’s server-side tenant resolution may be misconfigured`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`SOURCE_ACCESS_FAILED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`error.field source.locator/source.segment_ref: fix the reference; error.field source: grant the seller’s declared consumer identity and retry; no error.field: vendor outage, retry with backoff`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`STALE_RESPONSE`})}),_jsx(_components.td,{children:`transient`}),_jsxs(_components.td,{children:[`advisory — emitted alongside a populated payload that was served from cache past the seller’s freshness target because an upstream or sub-agent was unreachable. The response is usable; treat as non-fatal. Inspect `,_jsx(`code`,{children:`error.details.cache_age_seconds`}),` to decide whether to immediately retry for fresh data or accept the cached value; the seller’s own service is healthy, so retry is safe (it does not amplify the upstream failure)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`TERMS_REJECTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`adjust the proposed terms and retry, or omit measurement_terms to accept the product’s defaults`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNPRICEABLE_OUTPUT`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`target an output format the transformer prices, or have the seller add a pricing option covering it`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNSUPPORTED_FEATURE`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`check get_adcp_capabilities (or the product’s overlay_support for a rejected targeting dimension), remove unsupported fields, and use details.replacement_dimension when present`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNSUPPORTED_GRANULARITY`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`pick a granularity from the product’s reporting_capabilities.windowed_pull_granularities (via get_adcp_capabilities) and resubmit, or omit time_granularity to fall back to cumulative date-range pulls`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNSUPPORTED_PROVISIONING`})}),_jsx(_components.td,{children:`correctable`}),_jsxs(_components.td,{children:[`re-issue with the entry shape the seller supports — `,_jsx(`code`,{children:`account: {account_id: ...}`}),` for settings-update sellers with account-id namespaces, or `,_jsx(`code`,{children:`brand+operator+billing`}),` for provisioning sellers; check seller documentation or capability declaration for which modes are implemented`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VALIDATION_ERROR`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`review error details and fix field values`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VAST_PARSE_FAILED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`inspect error.details.reason (not_xml, no_vast_root, no_ad, no_media_file), fix the VAST document, and resubmit`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VAST_VERSION_MISMATCH`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`inspect error.details.mismatch_reason and the corresponding acceptance-set or observed-document fields; select a compatible source representation or correct the offending VAST document`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VAST_WRAPPER_DEPTH_EXCEEDED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`inspect error.details.reason (depth, loop, timeout); flatten the wrapper chain, reduce redirects below the format’s max_wrapper_depth, or fix the failing hop`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VERSION_UNSUPPORTED`})}),_jsx(_components.td,{children:`correctable`}),_jsx(_components.td,{children:`re-pin to a release in supported_versions and retry, or call get_adcp_capabilities without a version pin to discover supported_versions`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`full-descriptions`,children:`Full descriptions`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(`a`,{id:`error-code-account-ambiguous`}),_jsxs(Accordion,{title:`ACCOUNT_AMBIGUOUS — correctable`,id:`account-ambiguous-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` pass explicit account_id or a more specific natural key`]}),_jsx(_components.p,{children:`Natural key resolves to multiple accounts. Recovery: correctable (pass explicit account_id or a more specific natural key).`})]}),_jsx(`a`,{id:`error-code-account-identity-conflict`}),_jsxs(Accordion,{title:`ACCOUNT_IDENTITY_CONFLICT — correctable`,id:`account-identity-conflict-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` choose a different operator or operator_unit identity, or retain the account’s current identity; do not retry the same desired identity unchanged`]}),_jsx(_components.p,{children:`The complete operator_identity requested through sync_accounts would rekey the account onto a natural key already owned by another account. The seller MUST reject the change atomically, MUST NOT merge the accounts, and MUST preserve both accounts and every account-scoped resource unchanged. Distinct from CONFLICT, which reports a transient stale revision or concurrent write. Recovery: correctable (choose a different operator or operator_unit identity, or retain the account’s current identity; do not retry the same desired identity unchanged).`})]}),_jsx(`a`,{id:`error-code-account-moved`}),_jsxs(Accordion,{title:`ACCOUNT_MOVED — correctable`,id:`account-moved-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` replace the stale reference with error.details.current_account, refresh through list_accounts, and retry with a fresh idempotency key`]}),_jsx(_components.p,{children:`An authorized caller used a former natural key that was tombstoned after the same account was rekeyed through sync_accounts. The seller MUST return the current canonical reference in error.details.current_account, conforming to error-details/account-moved.json, and MUST NOT provision or resolve a second account from the former key. Sellers retain the tombstone while the account or any account-scoped historical resources are retained. To avoid a cross-tenant existence oracle, sellers return ACCOUNT_MOVED only when the caller is authorized to resolve the current account; otherwise they return ACCOUNT_NOT_FOUND. Recovery: correctable (replace the stale account reference with details.current_account, refresh through list_accounts, and retry with a fresh idempotency key).`})]}),_jsx(`a`,{id:`error-code-account-not-found`}),_jsxs(Accordion,{title:`ACCOUNT_NOT_FOUND — terminal`,id:`account-not-found-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` for a natural key, provision through sync_accounts or omit account for public discovery; for an account_id, verify via list_accounts or contact seller`]}),_jsx(_components.p,{children:`The account reference could not be resolved: an account_id that does not exist, a buyer-declared natural key the seller has not provisioned, or an account outside the caller’s authorized set. Sellers return it on tasks where account is optional too, rather than ignoring the reference, unless a lazy-provisioning seller answers a discovery task for the account it would create. Recovery: terminal (for a natural key, provision through sync_accounts or omit account for public discovery; for an account_id, verify via list_accounts or contact seller).`})]}),_jsx(`a`,{id:`error-code-account-payment-required`}),_jsxs(Accordion,{title:`ACCOUNT_PAYMENT_REQUIRED — terminal`,id:`account-payment-required-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` buyer must resolve billing`]}),_jsx(_components.p,{children:`Account has an outstanding balance requiring payment before new buys. Recovery: terminal (buyer must resolve billing).`})]}),_jsx(`a`,{id:`error-code-account-required`}),_jsxs(Accordion,{title:`ACCOUNT_REQUIRED — correctable`,id:`account-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` pass account, or reference an existing resource whose owning account the service can resolve`]}),_jsx(_components.p,{children:`The service must resolve the commercial account before it can determine governance applicability, but the request and referenced resource do not identify one. Recovery: correctable (pass account, or use a resource bound to an account).`})]}),_jsx(`a`,{id:`error-code-account-setup-required`}),_jsxs(Accordion,{title:`ACCOUNT_SETUP_REQUIRED — correctable`,id:`account-setup-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check details.setup for URL or instructions`]}),_jsx(_components.p,{children:`Natural key resolved but the account needs setup before use. Recovery: correctable (check details.setup for URL or instructions).`})]}),_jsx(`a`,{id:`error-code-account-suspended`}),_jsxs(Accordion,{title:`ACCOUNT_SUSPENDED — terminal`,id:`account-suspended-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` contact seller to resolve suspension`]}),_jsx(_components.p,{children:`Account has been suspended. Recovery: terminal (contact seller to resolve suspension).`})]}),_jsx(`a`,{id:`error-code-action-not-allowed`}),_jsxs(Accordion,{title:`ACTION_NOT_ALLOWED — correctable`,id:`action-not-allowed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` branch on error.details.reason: for wrong_status, wait for or transition to a status listed under the action’s allowed_statuses; for mode_mismatch, this is a flow switch (not a retry against update_media_buy) — follow the mode named in available_actions[\u003caction>].mode; for condition_unresolved, wait until the seller advertises the action after resolving its opaque condition; for not_supported_on_product or not_supported_on_buy, do not retry — the action is unavailable on this buy and buyer must select a different product or renegotiate, using error.details.decline_reason when present to inform that renegotiation`]}),_jsxs(_components.p,{children:[`The requested mutation maps to an action that is not currently available on this media buy. Sellers MUST populate `,_jsx(`code`,{children:`error.details`}),` with `,_jsx(`code`,{children:`attempted_action`}),` (the structured available-action identifier the request maps to), `,_jsx(`code`,{children:`reason`}),` (an `,_jsx(`code`,{children:`action-not-allowed-reason`}),` value: `,_jsx(`code`,{children:`wrong_status`}),`, `,_jsx(`code`,{children:`not_supported_on_product`}),`, `,_jsx(`code`,{children:`not_supported_on_buy`}),`, `,_jsx(`code`,{children:`mode_mismatch`}),`, or `,_jsx(`code`,{children:`condition_unresolved`}),`), and `,_jsx(`code`,{children:`currently_available_actions`}),` (echo of the buy’s resolved `,_jsx(`code`,{children:`available_actions[]`}),` so the buyer SDK can offer recovery without a separate get_media_buys round-trip). For `,_jsx(`code`,{children:`not_supported_on_buy`}),`, sellers SHOULD also populate `,_jsx(`code`,{children:`decline_reason`}),` from `,_jsx(`code`,{children:`seller-policy-decline-reason`}),` when they have a structured reason and disclosure does not expose private thresholds or enforcement controls. `,_jsx(`code`,{children:`decline_reason`}),` SHOULD be omitted for structural reasons. All producer-authored explanatory text, including message, suggestion, and extension detail values, MUST remain buyer-safe and MUST NOT contain vendor identifiers, internal object names, internal IDs, stack traces, or other producer-private implementation details. Recovery: correctable when `,_jsx(`code`,{children:`reason`}),` is `,_jsx(`code`,{children:`wrong_status`}),` (wait for or transition to an allowed status), `,_jsx(`code`,{children:`mode_mismatch`}),` (re-issue through the appropriate flow), or `,_jsx(`code`,{children:`condition_unresolved`}),` (wait until the seller can resolve the condition and advertises the action). Terminal-for-this-buy when `,_jsx(`code`,{children:`reason`}),` is `,_jsx(`code`,{children:`not_supported_on_product`}),` or `,_jsx(`code`,{children:`not_supported_on_buy`}),` — buyers select a different product or renegotiate buy terms.`]})]}),_jsx(`a`,{id:`error-code-agent-blocked`}),_jsxs(Accordion,{title:`AGENT_BLOCKED — terminal`,id:`agent-blocked-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` surface to a human at the buyer — the relationship is permanently denied and is reinstated only through offline operator action with the seller, not via any seller-callable AdCP task`]}),_jsxs(_components.p,{children:[`The calling buyer agent’s commercial relationship with the seller is permanently denied — the agent is blocked. Sibling to `,_jsx(`code`,{children:`AGENT_SUSPENDED`}),` on the agent-relationship axis but with no recovery path (a suspension may lift via re-onboarding; a block does not). The code itself is the discriminator — same posture as `,_jsx(`code`,{children:`AGENT_SUSPENDED`}),`: no `,_jsx(`code`,{children:`error.details`}),` payload, no per-agent commercial state, cross-tenant onboarding oracle clamp + channel-coverage requirements normative in error-handling.mdx Per-Agent Authorization Gate. Recovery: terminal (no autonomous recovery — the agent MUST surface to a human at the buyer; relationships are reinstated only through offline operator action with the seller, not via any seller-callable AdCP task).`]})]}),_jsx(`a`,{id:`error-code-agent-suspended`}),_jsxs(Accordion,{title:`AGENT_SUSPENDED — terminal`,id:`agent-suspended-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` surface to a human at the buyer — the agent cannot unilaterally lift a suspension; re-onboarding with the seller offline may resolve`]}),_jsxs(_components.p,{children:[`The calling buyer agent’s commercial relationship with the seller is temporarily paused — the agent is onboarded but currently suspended. Sibling to `,_jsx(`code`,{children:`ACCOUNT_SUSPENDED`}),` (account-wide) and `,_jsx(`code`,{children:`CAMPAIGN_SUSPENDED`}),` (per-plan) but scoped to the agent-relationship axis (orthogonal to any specific account on that agent). The code itself is the discriminator — it does NOT carry an `,_jsx(`code`,{children:`error.details`}),` payload (mirroring `,_jsx(`code`,{children:`BILLING_NOT_PERMITTED_FOR_AGENT`}),`‘s discriminator-by-code pattern), and MUST NOT carry per-agent commercial state (rate cards, payment terms, credit limit, billing entity, contact channels) since full disclosure of per-agent state in a single probe is a per-agent oracle. Cross-tenant onboarding oracle clamp + channel-coverage requirements (response shape, HTTP/A2A/MCP status, headers, side effects, observability, latency parity, retry-counter side channel) are normative in error-handling.mdx Per-Agent Authorization Gate; this description does not restate them to avoid drift. Recovery: terminal (re-onboarding may resolve the suspension; the agent MUST surface to a human at the buyer rather than auto-retrying — the agent cannot unilaterally lift a suspension, and re-attempts only reinforce the gate).`]})]}),_jsx(`a`,{id:`error-code-ambiguous-bidding-policy`}),_jsxs(Accordion,{title:`AMBIGUOUS_BIDDING_POLICY — correctable`,id:`ambiguous-bidding-policy-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` remove either the canonical bidding block or all legacy bidding fields from the effective package`]}),_jsx(_components.p,{children:`The same effective package combines the canonical bidding block with legacy bid_price or monetary optimization-goal target fields, so two bidding interpretations are present. Sellers MUST reject rather than choosing a winner. Recovery: correctable (emit only the 3.2 bidding block or only one legacy representation).`})]}),_jsx(`a`,{id:`error-code-audience-too-small`}),_jsxs(Accordion,{title:`AUDIENCE_TOO_SMALL — correctable`,id:`audience-too-small-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` broaden targeting or upload more audience members`]}),_jsx(_components.p,{children:`Audience segment is below the minimum required size for targeting. Recovery: correctable (broaden targeting or upload more audience members).`})]}),_jsx(`a`,{id:`error-code-authorization-required`}),_jsxs(Accordion,{title:`AUTHORIZATION_REQUIRED — correctable`,id:`authorization-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` complete or restore the required downstream platform connection, identity, creator, or post authorization; use error.details.missing_connections, authorization_url, authorization_instructions, or reference_authorization when present`]}),_jsxs(_components.p,{children:[`The caller is authenticated, but the referenced object requires an additional downstream platform connection, identity, creator, or post authorization before the seller can complete the requested action. Typical use: `,_jsx(`code`,{children:`sync_creatives`}),` with a `,_jsx(`code`,{children:`published_post`}),` reference where the seller can resolve the post but the owning identity has not authorized paid serving, or authorization has expired/revoked and can be restored. Distinct from `,_jsx(`code`,{children:`AUTH_MISSING`}),` / `,_jsx(`code`,{children:`AUTH_INVALID`}),` (caller credentials) and from `,_jsx(`code`,{children:`PERMISSION_DENIED`}),` (seller policy denies the caller). Sellers SHOULD include recovery details conforming to `,_jsx(`code`,{children:`error-details/authorization-required.json`}),`, especially `,_jsx(`code`,{children:`error.details.missing_connections[]`}),` when the caller needs to complete one of several platform connections. Legacy recovery hints such as `,_jsx(`code`,{children:`authorization_url`}),`, `,_jsx(`code`,{children:`authorization_instructions`}),`, or `,_jsx(`code`,{children:`reference_authorization`}),` remain valid when safe to disclose. Recovery: correctable (complete or restore the required authorization, then retry).`]})]}),_jsx(`a`,{id:`error-code-auth-invalid`}),_jsxs(Accordion,{title:`AUTH_INVALID — terminal`,id:`auth-invalid-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` do NOT auto-retry — credentials were rejected; rotate keys, refresh OAuth tokens once if applicable, otherwise escalate to a human`]}),_jsxs(_components.p,{children:[`Credentials were presented but rejected — revoked, malformed signature, or a key no longer in the seller’s keystore. Sellers MUST return this code when an `,_jsx(`code`,{children:`Authorization`}),` header was present but verification failed. Recovery: terminal. Exception: agents with a valid OAuth 2.1 refresh grant MAY treat this as correctable when the rejection reason is token expiry — silently refresh and retry once; if the refresh fails or the seller explicitly signals revocation, escalate to human.`]})]}),_jsx(`a`,{id:`error-code-auth-missing`}),_jsxs(Accordion,{title:`AUTH_MISSING — correctable`,id:`auth-missing-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` provide credentials via the auth header and retry`]}),_jsxs(_components.p,{children:[`No credentials were presented. Sellers MUST return this code when no `,_jsx(`code`,{children:`Authorization`}),` header was included in the request. Recovery: correctable (provide credentials via the auth header and retry).`]})]}),_jsx(`a`,{id:`error-code-auth-required`}),_jsxs(Accordion,{title:`AUTH_REQUIRED — correctable`,id:`auth-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` provide credentials when missing; do NOT auto-retry rejected credentials — escalate for rotation`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Deprecated`}),` — use `,_jsx(`code`,{children:`AUTH_MISSING`}),` (no credentials presented) or `,_jsx(`code`,{children:`AUTH_INVALID`}),` (credentials presented and rejected). Retained as a backward-compatible alias during the 3.x deprecation window. Recovery: correctable.`]})]}),_jsx(`a`,{id:`error-code-bidding-placement-conflict`}),_jsxs(Accordion,{title:`BIDDING_PLACEMENT_CONFLICT — correctable`,id:`bidding-placement-conflict-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` align media-buy and package bidding scopes with the provider’s supported placement, or choose a compatible budget mode/product combination`]}),_jsx(_components.p,{children:`The authored media-buy/package bidding scopes cannot be represented by the provider’s native campaign, package, or shared-strategy placement rules. Sellers MUST detect this before any provider mutation and SHOULD identify the conflicting scopes and provider constraint in error.details. Recovery: correctable (remove or align package overrides, move the policy to the supported scope, or choose a compatible budget mode/product combination).`})]}),_jsx(`a`,{id:`error-code-billing-not-permitted-for-agent`}),_jsxs(Accordion,{title:`BILLING_NOT_PERMITTED_FOR_AGENT — correctable`,id:`billing-not-permitted-for-agent-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` retry with error.details.suggested_billing (typically ‘operator’) when present; when absent, surface to a human at the buyer — the agent cannot unilaterally extend its commercial relationship and MUST NOT auto-retry`]}),_jsxs(_components.p,{children:[`The seller’s `,_jsx(`code`,{children:`supported_billing`}),` capability accepts the requested model, but the calling buyer agent’s commercial relationship with the seller does not — e.g., the agent is onboarded as passthrough-only (no payments relationship — only the operator can be invoiced) and `,_jsx(`code`,{children:`billing: 'agent'`}),` or `,_jsx(`code`,{children:`billing: 'advertiser'`}),` is rejected even though the seller supports both at the capability level. Distinct from `,_jsx(`code`,{children:`BILLING_NOT_SUPPORTED`}),` (seller-wide capability) by being narrowly per-buyer-agent: the gate is the seller’s onboarding record for this caller, not the seller’s global wire capability. Sellers MUST emit this code only after agent identity has been established via signed-request derivation or a credential-to-agent mapping in the seller’s onboarding record; callers without established identity MUST receive `,_jsx(`code`,{children:`BILLING_NOT_SUPPORTED`}),` instead, to prevent the distinct code from acting as an onboarding oracle. The recovery shape is deliberately minimal — `,_jsx(`code`,{children:`error.details`}),` MUST conform to `,_jsx(`code`,{children:`error-details/billing-not-permitted-for-agent.json`}),` (`,_jsx(`code`,{children:`rejected_billing`}),` plus an optional single `,_jsx(`code`,{children:`suggested_billing`}),` retry value, typically `,_jsx(`code`,{children:`operator`}),`) and MUST NOT carry the agent’s full permitted-billing subset, rate cards, payment terms, credit limit, billing entity, or any other per-agent commercial state. Recovery: correctable (retry with `,_jsx(`code`,{children:`error.details.suggested_billing`}),` when present; when absent, surface to a human at the buyer — the agent cannot unilaterally extend its commercial relationship and MUST NOT auto-retry, since payments-relationship onboarding with the seller is offline).`]})]}),_jsx(`a`,{id:`error-code-billing-not-supported`}),_jsxs(Accordion,{title:`BILLING_NOT_SUPPORTED — correctable`,id:`billing-not-supported-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check get_adcp_capabilities for supported_billing and resubmit with a supported value, or omit billing to accept the seller’s default`]}),_jsxs(_components.p,{children:[`The seller declines the requested `,_jsx(`code`,{children:`billing`}),` value either at the seller-wide capability level (`,_jsx(`code`,{children:`supported_billing`}),` does not include the value) or at the per-account-relationship level (e.g., the seller accepts `,_jsx(`code`,{children:`operator`}),` billing in general but has no direct billing relationship with the operator on this specific account). The default reject code for billing-value mismatches; `,_jsx(`code`,{children:`error.details`}),` SHOULD conform to `,_jsx(`code`,{children:`error-details/billing-not-supported.json`}),` (`,_jsx(`code`,{children:`scope`}),` ∈ `,_jsx(`code`,{children:`{\"capability\", \"account\"}`}),` plus optional `,_jsx(`code`,{children:`supported_billing`}),` echo for the `,_jsx(`code`,{children:`\"capability\"`}),` scope) so callers can dispatch without parsing prose. Distinct from `,_jsx(`code`,{children:`BILLING_NOT_PERMITTED_FOR_AGENT`}),`, which is narrowly scoped to the calling buyer agent’s commercial relationship with the seller (passthrough-only vs agent-billable) rather than to the seller’s capability or per-account state. Sellers MUST emit `,_jsx(`code`,{children:`BILLING_NOT_PERMITTED_FOR_AGENT`}),` only when agent identity has been established via signed-request derivation or a credential-to-agent mapping in the seller’s onboarding record; in all other cases (unauthenticated callers and bearer credentials not mapped to a specific agent record) sellers MUST return `,_jsx(`code`,{children:`BILLING_NOT_SUPPORTED`}),` and MUST omit `,_jsx(`code`,{children:`error.details.scope`}),` — emitting the per-agent code or the `,_jsx(`code`,{children:`\"account\"`}),`-scope hint without established identity is a cross-tenant onboarding oracle (same uniform-response shape required by the `,_jsx(`code`,{children:`*_NOT_FOUND`}),` family). Recovery: correctable (check `,_jsx(`code`,{children:`get_adcp_capabilities`}),` for `,_jsx(`code`,{children:`supported_billing`}),` and resubmit with a value the seller supports, or omit `,_jsx(`code`,{children:`billing`}),` to accept the seller’s default).`]})]}),_jsx(`a`,{id:`error-code-billing-out-of-band`}),_jsxs(Accordion,{title:`BILLING_OUT_OF_BAND — terminal`,id:`billing-out-of-band-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` do not retry — billing for this account runs through a non-AdCP channel. Pre-filter via capabilities.creative.bills_through_adcp before sending report_usage; flag the account in the buyer’s routing table and fall back to the ad server’s native billing export for cost reconciliation`]}),_jsxs(_components.p,{children:[`A creative-agent billing-loop operation (`,_jsx(`code`,{children:`report_usage`}),` is the canonical case) received a well-formed record that the agent will not bill on because this account bills via a non-AdCP channel — flat license, SaaS contract, bundled enterprise agreement, or any other out-of-band arrangement. The agent returns `,_jsx(`code`,{children:`accepted: 0`}),` with the offending record(s) listed in `,_jsx(`code`,{children:`errors[]`}),` carrying this code; the request itself is valid and silent acceptance would break buyer-side reconciliation. Distinct from `,_jsx(`code`,{children:`BILLING_NOT_SUPPORTED`}),` (the seller declines a specific `,_jsx(`code`,{children:`billing`}),` value on a media-buy account where AdCP billing is otherwise in scope) and `,_jsx(`code`,{children:`BILLING_NOT_PERMITTED_FOR_AGENT`}),` (per-buyer-agent commercial gate on an otherwise-billable surface) by signaling that the entire billing surface is offline for this account, not that a specific value or caller is rejected. Buyers SHOULD pre-filter by reading `,_jsx(`code`,{children:`capabilities.creative.bills_through_adcp`}),` from `,_jsx(`code`,{children:`get_adcp_capabilities`}),` before issuing `,_jsx(`code`,{children:`report_usage`}),`; agents that have not yet declared the capability remain in the probe-to-discover mode. The error is returned per-record (in the `,_jsx(`code`,{children:`report_usage`}),` response `,_jsx(`code`,{children:`errors[]`}),` array with `,_jsx(`code`,{children:`field`}),` pointing at `,_jsx(`code`,{children:`usage[N]`}),` or a specific record subpath), not at the envelope level. The code itself is the discriminator; no `,_jsx(`code`,{children:`error.details`}),` shape is defined for this code (mirroring `,_jsx(`code`,{children:`CONFIGURATION_ERROR`}),`‘s discriminator-by-code pattern). Recovery: terminal — auto-retry will not change the outcome; the buyer SHOULD flag the account in its routing table so reconciliation falls back to the ad server’s native billing export (or whatever offline channel the agent uses) rather than expecting AdCP-side cost truth.`]})]}),_jsx(`a`,{id:`error-code-brand-required`}),_jsxs(Accordion,{title:`BRAND_REQUIRED — correctable`,id:`brand-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` include brand (domain plus optional brand_id) on the request`]}),_jsxs(_components.p,{children:[`A billable operation was attempted without a brand reference. Every billable operation requires either a seller-assigned `,_jsx(`code`,{children:`account_id`}),` or a natural key including `,_jsx(`code`,{children:`brand`}),`. Recovery: correctable (include `,_jsx(`code`,{children:`brand`}),` — `,_jsx(`code`,{children:`domain`}),` plus optional `,_jsx(`code`,{children:`brand_id`}),` — on the request).`]})]}),_jsx(`a`,{id:`error-code-budget-cap-reached`}),_jsxs(Accordion,{title:`BUDGET_CAP_REACHED — correctable`,id:`budget-cap-reached-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` raise max_spend, or reduce max_creatives/max_variants, to produce the remaining items`]}),_jsx(_components.p,{children:`build_creative stopped producing early because the next leaf would exceed the request’s max_spend ceiling. Normally a SUCCESSFUL partial build (BuildCreativeVariantSuccess with budget_status: ‘capped’ and an advisory BUDGET_CAP_REACHED entry — every returned leaf is real and billed); returned as a terminal error only when even the first leaf would exceed the cap (no partial possible). Distinct from BUDGET_EXCEEDED (would exceed a media-buy/package allocation — a rejection) and BUDGET_EXHAUSTED (already spent). Recovery: correctable (raise max_spend, or reduce max_creatives/max_variants).`})]}),_jsx(`a`,{id:`error-code-budget-exceeded`}),_jsxs(Accordion,{title:`BUDGET_EXCEEDED — correctable`,id:`budget-exceeded-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` reduce requested amount or increase budget allocation`]}),_jsx(_components.p,{children:`Operation would exceed the allocated budget for the media buy or package. Distinct from BUDGET_EXHAUSTED (already spent) and BUDGET_TOO_LOW (below minimum). Recovery: correctable (reduce requested amount or increase budget allocation).`})]}),_jsx(`a`,{id:`error-code-budget-exhausted`}),_jsxs(Accordion,{title:`BUDGET_EXHAUSTED — terminal`,id:`budget-exhausted-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` buyer must add funds or increase budget cap`]}),_jsx(_components.p,{children:`Account or campaign budget has been fully spent. Distinct from BUDGET_TOO_LOW (rejected at submission). Recovery: terminal (buyer must add funds or increase budget cap).`})]}),_jsx(`a`,{id:`error-code-budget-too-low`}),_jsxs(Accordion,{title:`BUDGET_TOO_LOW — correctable`,id:`budget-too-low-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` increase budget or check capabilities.media_buy.limits`]}),_jsx(_components.p,{children:`Budget is below the seller’s minimum. Recovery: correctable (increase budget or check capabilities.media_buy.limits).`})]}),_jsx(`a`,{id:`error-code-campaign-suspended`}),_jsxs(Accordion,{title:`CAMPAIGN_SUSPENDED — transient`,id:`campaign-suspended-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` wait for the escalation to resolve; contact the plan operator if the suspension persists`]}),_jsxs(_components.p,{children:[`Campaign governance has been suspended pending human review; the governance agent MUST reject `,_jsx(`code`,{children:`check_governance`}),` and `,_jsx(`code`,{children:`report_plan_outcome`}),` calls on the affected plan until the escalation is resolved. Distinct from `,_jsx(`code`,{children:`ACCOUNT_SUSPENDED`}),` (account-wide) — this is scoped to a single plan/campaign. Recovery: transient (wait for the escalation to resolve; contact the plan operator if the suspension persists).`]})]}),_jsx(`a`,{id:`error-code-catalog-limit-exceeded`}),_jsxs(Accordion,{title:`CATALOG_LIMIT_EXCEEDED — correctable`,id:`catalog-limit-exceeded-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` remove unused catalogs, or contact the seller to raise the limit`]}),_jsx(_components.p,{children:`The account has reached its maximum catalog count. Recovery: correctable (remove unused catalogs, or contact the seller to raise the limit).`})]}),_jsx(`a`,{id:`error-code-committed-resource-purged`}),_jsxs(Accordion,{title:`COMMITTED_RESOURCE_PURGED — terminal`,id:`committed-resource-purged-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` do not automatically retry with the same or a fresh idempotency_key; reconcile through the resource read task and seller audit or operator records before deciding whether to initiate a new operation`]}),_jsx(_components.p,{children:`The requested mutation committed, but the affected resource was independently deleted or purged for a reason outside that requested mutation before the seller could durably record the canonical success response. The write stands even though the resource no longer exists, so sellers SHOULD set error.mutation_outcome to applied and MUST NOT set not_applied; this code does not describe the successful outcome of a requested delete operation. Sellers MUST retain the idempotency key record and canonical request hash independently of the resource until at least committed_at + replay_ttl_seconds, and exact replays MUST return this terminal outcome with replayed: true without re-executing the mutation. If the canonical success response was already durably recorded, sellers return that historical response under the normal replay rule instead. Distinct from CONFLICT (a transient concurrent modification before a stable result) and MEDIA_BUY_NOT_FOUND (a request targeting a resource that was already absent). Recovery: terminal (do not automatically retry with the same or a fresh idempotency_key; first reconcile through the resource read task and seller audit or operator records, then initiate a new operation only when reconciliation confirms that is intended).`})]}),_jsx(`a`,{id:`error-code-compliance-unsatisfied`}),_jsxs(Accordion,{title:`COMPLIANCE_UNSATISFIED — correctable`,id:`compliance-unsatisfied-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` choose a format that supports the required disclosure positions and persistence modes, remove the disclosure requirement, or revise the refinement instruction`]}),_jsx(_components.p,{children:`A required disclosure from the brief’s compliance section cannot be satisfied — either the target format’s disclosure_capabilities do not include the required position or persistence mode, or (on a refinement) the request’s message or config instructs removal or contradiction of a required disclosure or the use of a prohibited claim. Recovery: correctable (choose a format that supports the required disclosure positions and persistence modes, remove the disclosure requirement, or revise the refinement instruction).`})]}),_jsx(`a`,{id:`error-code-configuration-error`}),_jsxs(Accordion,{title:`CONFIGURATION_ERROR — terminal`,id:`configuration-error-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` surface to a human at the seller — the buyer cannot resolve a seller-side deployment misconfiguration and MUST NOT auto-retry`]}),_jsxs(_components.p,{children:[`The seller’s deployment is misconfigured in a way that prevents handling the request — the buyer cannot fix it, retrying will not help, and reporting to the seller’s operator is the only remediation. Examples: account declared with `,_jsx(`code`,{children:`mode: 'mock'`}),` but no `,_jsx(`code`,{children:`mock_upstream_url`}),` populated; platform declared with `,_jsx(`code`,{children:`mode: 'live'`}),` or `,_jsx(`code`,{children:`mode: 'sandbox'`}),` but no `,_jsx(`code`,{children:`upstream_url`}),` declared; required environment variable unset on the seller process. Distinct from `,_jsx(`code`,{children:`INVALID_REQUEST`}),` (buyer-fixable; the request itself is malformed), `,_jsx(`code`,{children:`SERVICE_UNAVAILABLE`}),` (transient; retry-with-backoff may succeed), `,_jsx(`code`,{children:`UNSUPPORTED_FEATURE`}),` (capability mismatch — the seller does not implement the requested specialism), `,_jsx(`code`,{children:`ACCOUNT_SETUP_REQUIRED`}),` (buyer-side onboarding incomplete; this code is seller-side deployment incomplete), and `,_jsx(`code`,{children:`GOVERNANCE_UNAVAILABLE`}),` (governance-agent-scoped; transient). Wire placement. The deployment cannot produce a success artifact, so sellers MUST flip transport-level failure markers (HTTP 5xx, MCP `,_jsx(`code`,{children:`isError: true`}),`, A2A `,_jsx(`code`,{children:`failed`}),`) and populate both layers per the two-layer model in `,_jsx(`code`,{children:`error-handling.mdx#envelope-vs-payload-errors-the-two-layer-model`}),`. The code itself is the discriminator; no `,_jsx(`code`,{children:`error.details`}),` shape is defined for this code (mirroring the minimal-disclosure precedent of `,_jsx(`code`,{children:`AGENT_SUSPENDED`}),` / `,_jsx(`code`,{children:`AGENT_BLOCKED`}),`). Sellers SHOULD populate `,_jsx(`code`,{children:`error.message`}),` with operator-actionable detail (which metadata key is missing, which env var is unset) and MUST NOT include credentials, connection strings, or stack traces — the message is wire-visible to the buyer. Recovery: terminal — the buyer MUST surface to the seller’s operator and MUST NOT auto-retry (retries cannot resolve a misconfigured deployment until the operator intervenes).`]})]}),_jsx(`a`,{id:`error-code-conflict`}),_jsxs(Accordion,{title:`CONFLICT — transient`,id:`conflict-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` re-read the resource and retry with current state`]}),_jsx(_components.p,{children:`Concurrent modification detected. The resource was modified by another request between read and write. This code does not cover a resource that was committed and then independently deleted or purged before the seller could durably record the canonical success response; use COMMITTED_RESOURCE_PURGED for that terminal outcome. Recovery: transient (re-read the resource and retry with current state).`})]}),_jsx(`a`,{id:`error-code-conflicting-selectors`}),_jsxs(Accordion,{title:`CONFLICTING_SELECTORS — correctable`,id:`conflicting-selectors-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` emit one canonical format selector route, or make every required legacy 3.x compatibility projection select the same product format contract under the canonical v2-narrows-v1 comparison`]}),_jsxs(_components.p,{children:[`A 3.x package request carries multiple resolvable format selector routes that select different canonical product format declaration sets. Sellers MUST first resolve every present route independently (`,_jsx(`code`,{children:`format_option_refs`}),`, direct `,_jsx(`code`,{children:`format_kind`}),` plus `,_jsx(`code`,{children:`params`}),`, and deprecated `,_jsx(`code`,{children:`format_ids`}),`) without applying precedence. An unresolved option reference or an unprojectable legacy ID is rejected with `,_jsx(`code`,{children:`UNSUPPORTED_FEATURE`}),`, not this code. Once all routes resolve, sellers derive the product `,_jsx(`code`,{children:`format_options[]`}),` entries selected by each route using directional product satisfaction and require those sets to match. Legacy parameter compatibility uses the asymmetric v2-narrows-v1 relation defined by canonical formats, not raw object equality. For fixed-size image selectors, both width and height participate in compatibility. Sellers MUST reject different format shapes, selected option sets, or incompatible dimensions rather than silently choosing the canonical route. `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the conflicting package, and `,_jsx(`code`,{children:`error.details`}),` SHOULD identify the supplied selector routes and their normalized canonical summaries. Recovery: correctable (emit one canonical selector route, or make a required legacy 3.x compatibility projection select the same product format contract).`]})]}),_jsx(`a`,{id:`error-code-creative-deadline-exceeded`}),_jsxs(Accordion,{title:`CREATIVE_DEADLINE_EXCEEDED — correctable`,id:`creative-deadline-exceeded-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check creative_deadline via get_media_buys before submitting changes, or negotiate a deadline extension with the seller`]}),_jsx(_components.p,{children:`Creative change submitted after the package’s creative_deadline. Distinct from CREATIVE_REJECTED (content-policy, brand-safety, or accessibility-review failure). Recovery: correctable (check creative_deadline via get_media_buys before submitting changes, or negotiate a deadline extension with the seller).`})]}),_jsx(`a`,{id:`error-code-creative-inaccessible`}),_jsxs(Accordion,{title:`CREATIVE_INACCESSIBLE — correctable`,id:`creative-inaccessible-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify the asset URLs in creative_manifest are reachable without agent-side credentials, then re-submit`]}),_jsx(_components.p,{children:`A creative governance agent (get_creative_features) could not retrieve the submitted creative_manifest assets for evaluation — an asset URL was unreachable, returned an error, or required credentials the agent does not hold. Distinct from CREATIVE_NOT_FOUND (a creative_id absent from the agent’s library, not an asset-fetch failure) and CREATIVE_REJECTED (assets retrieved but failed creative review). Recovery: correctable (verify the asset URLs are reachable without agent-side credentials, then re-submit).`})]}),_jsx(`a`,{id:`error-code-creative-locale-not-accepted`}),_jsxs(Accordion,{title:`CREATIVE_LOCALE_NOT_ACCEPTED — correctable`,id:`creative-locale-not-accepted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` supply or assign a creative variant matching every in-scope format option’s accepted_language_ranges, narrow placement scope, choose a compatible format option, or change an ineligible serve_default`]}),_jsx(_components.p,{children:`A creative bound to a locale-constrained product format has no materialized variant matching locale_policy.accepted_language_ranges, lacks protocol-declared locale topology, or uses serve_default with a seller-ineligible default variant. Seller ranges use RFC 4647 Basic Filtering and are applied independently for every placement where the assignment may serve, before buyer Lookup, locale_fallbacks, or default selection. Distinct from CREATIVE_REJECTED because this is a mechanically discoverable assignment-eligibility mismatch, not subjective content review. error.field SHOULD point to the offending creative or assignment; error.details SHOULD include format_option_id when present, accepted_language_ranges, available_variant_locales, and placement identity when applicable. Recovery: correctable (supply or assign a matching materialized locale variant, narrow placement scope, choose a compatible format option, or change an ineligible serve_default).`})]}),_jsx(`a`,{id:`error-code-creative-merge-rejected`}),_jsxs(Accordion,{title:`CREATIVE_MERGE_REJECTED — correctable`,id:`creative-merge-rejected-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` confirm the pairing via list_creatives, or use a replace assignment operation to traffic creative_id as a new serving object`]}),_jsx(_components.p,{children:`One or more sync_creatives merge assignment operations failed seller verification. The seller evaluates every merge in the request, MUST leave every assignment unchanged (assignment operations are atomic), SHOULD set error.field to the first rejected assignment_operations entry, and SHOULD return details conforming to error-details/creative-merge-rejected.json listing each rejected merge with a reason: content_mismatch (the seller judges the copy is a different creative), format_mismatch (the buyer’s creative cannot take over the copy’s serving object), not_on_package (merged_creative_id is not a seller-assigned creative assigned to the package in this account, reported uniformly for unknown IDs), or not_supported (the seller cannot merge this pairing on this package). A seller that does not declare creative.supports_assignment_merge returns UNSUPPORTED_FEATURE instead. Recovery: correctable (drop or fix the rejected merges and resubmit; use replace to traffic creative_id as a new serving object).`})]}),_jsx(`a`,{id:`error-code-creative-missing-click-url`}),_jsxs(Accordion,{title:`CREATIVE_MISSING_CLICK_URL — correctable`,id:`creative-missing-click-url-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` add the required destination URL and resubmit the creative`]}),_jsx(_components.p,{children:`A submitted creative that requires a destination URL does not provide one. Sellers SHOULD identify the missing buyer-visible field in error.field and MUST NOT expose downstream ad-server names or internal object identifiers in the buyer-facing message. Recovery: correctable (add the required destination URL and resubmit the creative).`})]}),_jsx(`a`,{id:`error-code-creative-not-found`}),_jsxs(Accordion,{title:`CREATIVE_NOT_FOUND — correctable`,id:`creative-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify creative_id via list_creatives, or sync_creatives to register it`]}),_jsx(_components.p,{children:`Referenced creative does not exist in the agent’s creative library. Recovery: correctable (verify creative_id via list_creatives, or sync_creatives to register it). Sellers MUST return this code uniformly for any creative_id not owned by the calling account — never distinguish ‘exists in another tenant’ from ‘does not exist’, which would enable cross-tenant enumeration.`})]}),_jsx(`a`,{id:`error-code-creative-rejected`}),_jsxs(Accordion,{title:`CREATIVE_REJECTED — correctable`,id:`creative-rejected-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` revise the creative according to the applicable advertising policy or validated accessibility criteria`]}),_jsx(_components.p,{children:`Creative failed content-policy, brand-safety, or accessibility review. For deadline violations, see CREATIVE_DEADLINE_EXCEEDED. Accessibility failures SHOULD use structured details conforming to error-details/accessibility-violation.json. Recovery: correctable (revise the creative according to the applicable policy or validated accessibility criteria).`})]}),_jsx(`a`,{id:`error-code-creative-representation-unresolved`}),_jsxs(Accordion,{title:`CREATIVE_REPRESENTATION_UNRESOLVED — correctable`,id:`creative-representation-unresolved-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` inspect every error.details.representation_rejections entry, then choose a compatible format option or supply a compatible representation`]}),_jsxs(_components.p,{children:[`No representation in a CreativeRepresentationSet is compatible with the selected target capability or product format option. The resolver MUST retain the complete representation set and MUST include one `,_jsx(`code`,{children:`error.details.representation_rejections[]`}),` entry per candidate, conforming to `,_jsx(`code`,{children:`error-details/creative-representation-unresolved.json`}),`; silent seller guessing is forbidden. Recovery: correctable (choose a compatible product/format option, add a compatible representation under a new revision, or fix the rejected asset contract).`]})]}),_jsx(`a`,{id:`error-code-creative-revision-content-mismatch`}),_jsxs(Accordion,{title:`CREATIVE_REVISION_CONTENT_MISMATCH — correctable`,id:`creative-revision-content-mismatch-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` resend the exact content previously bound to this revision_id, or mint a new revision_id for changed content`]}),_jsx(_components.p,{children:`A sync_creatives item reused a revision_id for different canonical revision content under the same creative_id. Revision identity is scoped to the parent creative and immutable after first acceptance. Sellers MUST evaluate the buyer input before transcoding or normalization, MUST leave the prior creative state unchanged, and SHOULD return details conforming to error-details/creative-revision-content-mismatch.json. Distinct from IDEMPOTENCY_CONFLICT: idempotency_key protects one request replay window, while revision identity protects creative content across requests and retention. Recovery: correctable (resend the exact content previously bound to this revision_id, or mint a new revision_id for the changed content).`})]}),_jsx(`a`,{id:`error-code-creative-size-mismatch`}),_jsxs(Accordion,{title:`CREATIVE_SIZE_MISMATCH — correctable`,id:`creative-size-mismatch-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` resize or replace the creative with a size accepted by every selected package that may serve it`]}),_jsx(_components.p,{children:`The submitted creative dimensions do not match any size accepted by the selected packages. Sellers SHOULD identify the offending creative in error.field and MAY include the submitted and accepted dimensions in buyer-safe error.details. Recovery: correctable (resize or replace the creative with a size accepted by every selected package that may serve it).`})]}),_jsx(`a`,{id:`error-code-creative-validation-failed-generic`}),_jsxs(Accordion,{title:`CREATIVE_VALIDATION_FAILED_GENERIC — correctable`,id:`creative-validation-failed-generic-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` correct the buyer-visible validation problem and resubmit the creative`]}),_jsx(_components.p,{children:`The creative failed buyer-correctable validation, but the producer cannot classify the failure with a more specific standard code. Producers SHOULD prefer a specific creative code whenever one applies and MUST keep buyer-facing messages free of vendor identifiers, internal object names, internal IDs, and stack traces. Recovery: correctable (correct the buyer-visible validation problem and resubmit the creative).`})]}),_jsx(`a`,{id:`error-code-creative-value-not-allowed`}),_jsxs(Accordion,{title:`CREATIVE_VALUE_NOT_ALLOWED — correctable`,id:`creative-value-not-allowed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` pick a value from error.details.allowed_values (or re-fetch the format) and resubmit`]}),_jsxs(_components.p,{children:[`A submitted text-asset value is not in the format’s declared `,_jsx(`code`,{children:`allowed_values`}),` list. Distinct from `,_jsx(`code`,{children:`CREATIVE_REJECTED`}),` (generic creative-review failure) by being a closed-set constraint violation that the buyer can resolve mechanically without policy interpretation — the seller has published the complete list of acceptable values on the format, and any value outside that list is rejected by definition. The seller MUST set `,_jsx(`code`,{children:`error.field`}),` to the offending asset’s path within the manifest (e.g., `,_jsx(`code`,{children:`creatives[0].creative_manifest.assets[0].value`}),` or the field name declared by the format) and SHOULD include the format’s `,_jsx(`code`,{children:`allowed_values`}),` array in `,_jsx(`code`,{children:`error.details.allowed_values`}),` so the buyer agent can re-prompt its LLM with constrained sampling. Recovery: correctable (select a value from `,_jsx(`code`,{children:`allowed_values`}),` and resubmit).`]})]}),_jsx(`a`,{id:`error-code-credential-in-args`}),_jsxs(Accordion,{title:`CREDENTIAL_IN_ARGS — terminal`,id:`credential-in-args-terminal`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` do NOT auto-retry — auto-retry re-logs the credential on each attempt. Move authentication material or caller-supplied trust material out of request args (top-level, `,_jsx(`code`,{children:`context`}),`, `,_jsx(`code`,{children:`ext`}),`, any nested location) onto the relevant transport authentication/trust channel or account provisioning path (Authorization: Bearer, RFC 9421 signature/JWKS, mTLS, MCP/A2A authentication framing); rotate any leaked credential, then resubmit`]}),_jsxs(_components.p,{children:[`The seller detected authentication material or caller-supplied trust material placed in request args (top-level, in `,_jsx(`code`,{children:`context`}),`, in `,_jsx(`code`,{children:`ext`}),`, or any other nested location in the task payload) instead of arriving on the relevant transport authentication or trust channel. This includes buyer-principal credentials that should arrive on the inbound transport (`,_jsx(`code`,{children:`Authorization: Bearer`}),` per RFC 6750 §2 for HTTP, RFC 9421 signature headers for signed requests, MCP/A2A authentication framing per RFC 9728 §3), and evaluator-call credentials or JWK/JWKS/JWKS-URI trust material smuggled into evaluator-related payload fields instead of being established through the creative agent’s outbound transport authentication to the evaluator. Distinct from `,_jsx(`code`,{children:`AUTH_REQUIRED`}),` (no credentials presented or presented credentials rejected on the transport channel) and `,_jsx(`code`,{children:`PERMISSION_DENIED`}),` (authenticated caller not authorized for the action). Distinct from the receiver-side credentials carried in `,_jsx(`code`,{children:`push_notification_config.authentication.credentials`}),`, which configure the seller’s webhook callback authentication and are not buyer-principal or evaluator-call credentials — those are an explicit carve-out and MUST NOT trigger this code. Sellers SHOULD reject credential-in-args under AdCP 3.1; the requirement upgrades to MUST 90 days after the 3.1 publication date. Recovery: terminal — the agent MUST NOT auto-retry. Auto-retry against this code re-logs the credential on each attempt across the seller’s request logs, observability stack, and any LLM-context surfaces in the buyer-side recovery loop, exactly the prompt-injection exfiltration surface that motivated the rule. Wire placement. Sellers MUST flip transport-level failure markers (HTTP 4xx, MCP `,_jsx(`code`,{children:`isError: true`}),`, A2A `,_jsx(`code`,{children:`failed`}),`) and populate both layers per the two-layer model in `,_jsx(`code`,{children:`error-handling.mdx#envelope-vs-payload-errors-the-two-layer-model`}),`. The code itself is the discriminator; no `,_jsx(`code`,{children:`error.details`}),` shape is defined, and `,_jsx(`code`,{children:`error.field`}),` MUST NOT echo the offending credential value or any prefix of it (e.g., `,_jsx(`code`,{children:`\"Bearer ey...\"`}),`). `,_jsx(`code`,{children:`error.message`}),` MUST be generic and MUST NOT contain credential material. Sellers MUST drop the smuggled credential from logs, audit rows, and observability spans before persisting the rejection — the rejection itself is otherwise an exfiltration surface.`]})]}),_jsx(`a`,{id:`error-code-cursor-expired`}),_jsxs(Accordion,{title:`CURSOR_EXPIRED — correctable`,id:`cursor-expired-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` obtain a latest checkpoint, rebuild authoritative account snapshots, then drain changes after the checkpoint`]}),_jsx(_components.p,{children:`The list_account_changes cursor (experimental, account.change_feed) is no longer within the seller’s retained account change window. The seller MUST NOT silently restart from the retention boundary. Recovery: correctable (obtain a new starting_position: latest checkpoint, rebuild every authoritative account snapshot, then drain changes after that checkpoint). error.details SHOULD include available_since and MAY include a replacement starting-position hint, without disclosing inaccessible history.`})]}),_jsx(`a`,{id:`error-code-evaluator-agent-not-accepted`}),_jsxs(Accordion,{title:`EVALUATOR_AGENT_NOT_ACCEPTED — correctable`,id:`evaluator-agent-not-accepted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` replace the evaluator agent_url (evaluator.feature_agent.agent_url or the evaluator agent-form agent_url) with one from the seller’s published accepted_verifiers, or drop the evaluator agent pointer to fall back to seller-default ranking`]}),_jsxs(_components.p,{children:[`Buyer attached an evaluator agent pointer on `,_jsx(`code`,{children:`build_creative`}),` — `,_jsx(`code`,{children:`evaluator.feature_agent.agent_url`}),` or the `,_jsx(`code`,{children:`evaluator`}),` agent-form `,_jsx(`code`,{children:`agent_url`}),` — that does not match (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments) any entry in the seller’s `,_jsx(`code`,{children:`creative_policy.accepted_verifiers[].agent_url`}),`. The producing agent does not call buyer-asserted endpoints outside its allowlist; this mirrors `,_jsx(`code`,{children:`PROVENANCE_VERIFIER_NOT_ACCEPTED`}),` for the gate/rank evaluator path — the buyer represents which on-list agent it used, the seller is the agent-of-record and calls only allowlisted agents. `,_jsx(`code`,{children:`error.field`}),` MUST point at the offending `,_jsx(`code`,{children:`agent_url`}),` path; `,_jsx(`code`,{children:`error.details`}),` SHOULD include a reference to the product whose `,_jsx(`code`,{children:`creative_policy.accepted_verifiers`}),` the buyer should consult. Recovery: correctable (replace the agent_url with one from the seller’s published `,_jsx(`code`,{children:`accepted_verifiers`}),`, or drop the evaluator agent pointer to fall back to seller-default ranking).`]})]}),_jsx(`a`,{id:`error-code-feed-fetch-failed`}),_jsxs(Accordion,{title:`FEED_FETCH_FAILED — correctable`,id:`feed-fetch-failed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check URL accessibility, authentication, and that content matches the declared feed_format`]}),_jsx(_components.p,{children:`Platform could not fetch the catalog feed URL during sync_catalogs. Recovery: correctable (check URL accessibility, authentication, and that the content matches the declared feed_format).`})]}),_jsx(`a`,{id:`error-code-field-not-permitted`}),_jsxs(Accordion,{title:`FIELD_NOT_PERMITTED — correctable`,id:`field-not-permitted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` drop the disallowed field(s) and retry`]}),_jsxs(_components.p,{children:[`A request field is not in the caller’s `,_jsx(`code`,{children:`field_scopes`}),` allowlist for this task. Sellers declaring `,_jsx(`code`,{children:`field_scopes`}),` on the account’s `,_jsx(`code`,{children:`authorization`}),` object MUST reject any request that sets a non-allowlisted field with this code. Distinct from `,_jsx(`code`,{children:`VALIDATION_ERROR`}),` (schema/business-rule violation) - the field is valid, just not writable by this caller. `,_jsx(`code`,{children:`error.field`}),` MUST identify the exact offending field path (e.g., `,_jsx(`code`,{children:`packages[0].budget`}),`); when multiple fields are disallowed, sellers SHOULD return one error per field, or MAY enumerate them in `,_jsx(`code`,{children:`error.details.fields`}),`. Recovery: correctable and agent-autonomous - agent may drop the disallowed field(s) and retry.`]})]}),_jsx(`a`,{id:`error-code-format-declaration-divergent`}),_jsxs(Accordion,{title:`FORMAT_DECLARATION_DIVERGENT — correctable`,id:`format-declaration-divergent-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — seller-side fix needed: producer is emitting disagreeing format_ids and format_options for the same product. Buyer SDK SHOULD prefer format_options and surface the divergent product to operators; do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when a product carries BOTH `,_jsx(`code`,{children:`format_ids`}),` (v1) AND `,_jsx(`code`,{children:`format_options`}),` (v2) and the two disagree (different canonical, different dimensions, different orientation) after projection. The producer’s contract is that both shapes MUST refer to the same underlying declaration; divergence is a producer bug.`]}),_jsxs(_components.p,{children:[`Either side MAY emit this code: a SELLER may self-detect on emit (own producer bug; rare), or more commonly a consumer-SDK detects on consumption. SDKs MUST prefer `,_jsx(`code`,{children:`format_options`}),` (the richer surface) when both are present and MUST surface the divergent product so it’s observable rather than silently picked-one-and-dropped-other. Hard-failing the entire `,_jsx(`code`,{children:`get_products`}),` response is discouraged — it punishes downstream buyers for the producer bug.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Surface placement (normative).`}),` Same single-surface mandate as `,_jsx(`code`,{children:`FORMAT_PROJECTION_FAILED`}),`: SDKs that detect this on consumption MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` array with an entry carrying `,_jsx(`code`,{children:`source: \"sdk\"`}),`, `,_jsx(`code`,{children:`sdk_id: \"\u003cpackage>@\u003cversion>\"`}),`, `,_jsx(`code`,{children:`code: \"FORMAT_DECLARATION_DIVERGENT\"`}),`, and the field+details described below. Logger-only is insufficient; lint-output channels are NOT acceptable as the surface (the multi-hop agent network needs warnings to propagate across SDK boundaries via the wire response).`]}),_jsxs(_components.p,{children:[_jsx(`code`,{children:`error.field`}),` MUST point at the offending product; `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ product_id, format_ids, format_options_summary, divergence_reason }`}),` so buyer SDKs can flag the producer for follow-up.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multi-hop deduplication.`}),` Each hop that detects the same divergence SHOULD deduplicate by `,_jsx(`code`,{children:`(code, field)`}),` rather than re-emit; the existing entry’s `,_jsx(`code`,{children:`sdk_id`}),` identifies which earlier processor saw it first.`]}),_jsx(_components.p,{children:`Recovery: correctable but seller-side — buyer can’t fix divergent declarations, only flag them.`})]}),_jsx(`a`,{id:`error-code-format-declaration-v1-ambiguous`}),_jsxs(Accordion,{title:`FORMAT_DECLARATION_V1_AMBIGUOUS — correctable`,id:`format-declaration-v1-ambiguous-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — seller-side fix needed: the v2 declaration’s canonical has only family-level structural registry entries (no invertible literal). Seller MUST author v1_format_ref on the v2 declaration to disambiguate; SDKs MUST NOT synthesize. Do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when an SDK detects that a product’s v2 declaration cannot be unambiguously projected back to a single v1 named format because the v1-canonical-mapping registry has only family-level structural entries for this canonical (no invertible `,_jsx(`code`,{children:`format_id_glob`}),` literal). The family is known (e.g., ‘this is a video_vast’); the specific v1 named format isn’t pickable mechanically. Distinct from `,_jsx(`code`,{children:`FORMAT_PROJECTION_FAILED`}),` (registry-coverage gap, correctable by adding a registry entry) — ambiguity is structural: the family is defined but a specific format can’t be picked without seller assertion.`]}),_jsxs(_components.p,{children:[`Surface placement: same single-mandate as `,_jsx(`code`,{children:`FORMAT_PROJECTION_FAILED`}),` and `,_jsx(`code`,{children:`FORMAT_DECLARATION_DIVERGENT`}),` — SDKs MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` array with an entry carrying `,_jsx(`code`,{children:`source: \"sdk\"`}),`, `,_jsx(`code`,{children:`sdk_id`}),`, `,_jsx(`code`,{children:`code: \"FORMAT_DECLARATION_V1_AMBIGUOUS\"`}),`, `,_jsx(`code`,{children:`field`}),` pointing at the offending declaration, and `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ format_kind, registry_matches: [\u003clist of structural entries that matched at family level>], product_id }`}),` so adopters can see why the inversion was ambiguous.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`SDKs MUST NOT synthesize a v1_format_ref`}),` in this case (or any other case). v1↔v2 explicit pairing is seller-asserted only — SDKs encountering family-only registry matches MUST treat the v2 declaration as v1-unreachable and surface this code rather than invent a plausible v1 format_id. The seller’s path: author `,_jsx(`code`,{children:`v1_format_ref`}),` on the v2 declaration to disambiguate (the authoritative pairing per `,_jsx(`code`,{children:`v1-canonical-mapping.json`}),` resolution step 1), or accept that v1-only buyers won’t see this product. Recovery: correctable but seller-side — buyer can’t disambiguate without the seller’s assertion.`]})]}),_jsx(`a`,{id:`error-code-format-declaration-v1-lossy-multi-size`}),_jsxs(Accordion,{title:`FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE — correctable`,id:`format-declaration-v1-lossy-multi-size-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — emitted alongside the partial v1 emission, NOT in place of it: the v2 declaration carries `,_jsx(`code`,{children:`params.sizes[]`}),` with N entries but only M v1_format_ref entries (M \u003c N), so v1 buyers see partial size coverage on the product. Seller-side fix: add v1_format_ref entries for the missing sizes. SDK MAY (non-normative) fan out automatically by catalog lookup. Non-fatal — do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when a v2 declaration carries `,_jsx(`code`,{children:`params.sizes[]`}),` with N entries but only M v1_format_ref entries (M \u003c N). The seller has asserted some v1 named formats but not enough to cover all declared sizes — v1-only buyers see partial coverage on the product. Emitted `,_jsx(_components.strong,{children:`alongside`}),` the partial v1 emission (NOT in place of it): the product still appears on the v1 wire under the M sizes the seller covered; this code tells v1-aware downstream agents that N-M sizes were dropped from the projection.`]}),_jsxs(_components.p,{children:[`Surface placement: SDKs that detect on emission OR consumption MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` with `,_jsx(`code`,{children:`source: \"sdk\"`}),` (or `,_jsx(`code`,{children:`\"producer\"`}),` if the seller self-detects on emit), `,_jsx(`code`,{children:`sdk_id`}),`, `,_jsx(`code`,{children:`code: \"FORMAT_DECLARATION_V1_LOSSY_MULTI_SIZE\"`}),`, `,_jsx(`code`,{children:`field`}),` pointing at the offending declaration, and `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ product_id, declared_sizes: [{w,h}, …], covered_sizes: [{w,h}, …], dropped_sizes: [{w,h}, …] }`}),` so buyer agents see which sizes were lost.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`SDKs MAY (non-normative) fan out automatically`}),` by catalog lookup — for each entry in `,_jsx(`code`,{children:`sizes[]`}),` lacking a corresponding `,_jsx(`code`,{children:`v1_format_ref`}),`, the SDK consults the AAO catalog for the per-size v1 named format (e.g., for `,_jsx(`code`,{children:`{width: 728, height: 90}`}),` look up `,_jsx(`code`,{children:`display_728x90_image`}),`) and emits it under `,_jsx(`code`,{children:`format_ids[]`}),`. This is opt-in (requires catalog access); when SDKs fan out, they SHOULD still emit this code as a transparency advisory so downstream consumers know the v1 emit was synthesized rather than seller-asserted.`]}),_jsxs(_components.p,{children:[`Recovery: correctable — non-fatal advisory, do not auto-retry. Seller fix: add `,_jsx(`code`,{children:`v1_format_ref[]`}),` entries for the missing sizes.`]})]}),_jsx(`a`,{id:`error-code-format-not-supported`}),_jsxs(Accordion,{title:`FORMAT_NOT_SUPPORTED — correctable`,id:`format-not-supported-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` refresh get_adcp_capabilities creative.supported_formats[] and retry with a capability_id whose operations contains the intended build, preview, or validate operation`]}),_jsx(_components.p,{children:`A requested creative operation route is not supported by this creative agent. On the canonical 3.2 path, returned when build_creative.target_capability_id(s), preview_creative.target_capability_id, or validate_input targets[] kind capability does not match an advertised creative.supported_formats[].capability_id carrying the requested operation. Also returned when preview renderer inference has zero or multiple compatible matches. Sellers SHOULD attribute the error to the selector field and MAY include supported capability IDs in error.details.supported_capability_ids when safe. Deprecated target_format_id(s) and preview format_id retain legacy named-format error attribution during the 3.x compatibility window. Recovery: correctable (read get_adcp_capabilities creative.supported_formats[] and retry with a capability_id whose operations contains the intended operation).`})]}),_jsx(`a`,{id:`error-code-format-option-unresolved`}),_jsxs(Accordion,{title:`FORMAT_OPTION_UNRESOLVED — correctable`,id:`format-option-unresolved-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — publisher-side fix needed: a placement’s `,_jsx(`code`,{children:`format_options[].format_option_id`}),` references a `,_jsx(`code`,{children:`format_option_id`}),` that does not exist in this file’s top-level `,_jsx(`code`,{children:`formats[]`}),`. Buyer SDK MUST fail closed for that placement (drop the format from the placement’s accepted set) and surface this code. Publisher fix: either declare the missing format option in `,_jsx(`code`,{children:`formats[]`}),` or remove the reference from the placement. Do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when a placement in `,_jsx(`code`,{children:`adagents.json`}),` (or any consumer of `,_jsx(`code`,{children:`placement-definition.json`}),`) carries `,_jsx(`code`,{children:`format_options[].format_option_id`}),` referencing a `,_jsx(`code`,{children:`format_option_id`}),` that does NOT exist in the file’s top-level `,_jsx(`code`,{children:`formats[]`}),`. The reference is broken — the publisher’s catalog claims the placement accepts a format option that isn’t declared.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Resolution scope is same-file only.`}),` Cross-file `,_jsx(`code`,{children:`format_option_id`}),` lookup is not supported by design (closes off format_option_id squatting across publisher boundaries — a malicious file cannot reference another publisher’s format_option_id and claim its narrowing). Buyer SDKs MUST fail closed for the placement (drop the format from the placement’s accepted format set) and MUST surface this code rather than silently dropping or guessing what the publisher meant.`]}),_jsxs(_components.p,{children:[`Surface placement: same single-mandate as the other FORMAT_* codes — SDKs that detect on consumption MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` with `,_jsx(`code`,{children:`source: \"sdk\"`}),`, `,_jsx(`code`,{children:`sdk_id`}),`, `,_jsx(`code`,{children:`code: \"FORMAT_OPTION_UNRESOLVED\"`}),`, `,_jsx(`code`,{children:`field`}),` pointing at the offending placement (e.g., `,_jsx(`code`,{children:`placements[2].format_options[1].format_option_id`}),`), and `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ placement_id, format_option_id, declared_format_options: [\u003clist of format_option_ids actually in formats[]>] }`}),` so the publisher can fix.`]}),_jsxs(_components.p,{children:[`Recovery: correctable but publisher-side — buyer can’t fix; publisher either declares the missing format option in `,_jsx(`code`,{children:`formats[]`}),` or removes the reference from the placement.`]})]}),_jsx(`a`,{id:`error-code-format-projection-failed`}),_jsxs(Accordion,{title:`FORMAT_PROJECTION_FAILED — correctable`,id:`format-projection-failed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — seller-side fix needed: ask the seller to add an explicit `,_jsx(`code`,{children:`canonical`}),` field on the legacy format declaration, or contribute a registry entry (format_id_glob or structural match) to v1-canonical-mapping.json. Do not auto-retry; the product is still valid on the legacy named-format path`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when a legacy named format on a product cannot be projected to a canonical-formats `,_jsx(`code`,{children:`ProductFormatDeclaration`}),` via the resolution order in `,_jsx(`code`,{children:`v1-canonical-mapping.json`}),` (explicit `,_jsx(`code`,{children:`canonical`}),` field → format_id_glob → structural match → fail-closed). The product is still valid on the legacy named-format path; only the 3.1+ `,_jsx(`code`,{children:`format_options`}),` projection failed. Primarily a `,_jsx(_components.strong,{children:`consumer-SDK concern`}),` — the seller didn’t fail; the consumer-side SDK couldn’t project on their behalf. `,_jsx(`code`,{children:`error.field`}),` MUST point at the offending product (e.g., `,_jsx(`code`,{children:`products[3].format_ids[0]`}),`); `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ format_id, product_id, resolution_failure: \"no_explicit_canonical\" | \"no_registry_match\" | \"no_structural_match\" }`}),` so buyer SDKs can route remediation (suggest the seller add an explicit `,_jsx(`code`,{children:`canonical`}),` field, or file a registry PR).`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Surface placement (normative).`}),` SDKs that detect this on consumption MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` array with an entry carrying `,_jsx(`code`,{children:`source: \"sdk\"`}),`, `,_jsx(`code`,{children:`sdk_id: \"\u003cpackage>@\u003cversion>\"`}),`, `,_jsx(`code`,{children:`code: \"FORMAT_PROJECTION_FAILED\"`}),`, and the field+details described above. This is the single mandated surface — logger-only is insufficient and a separate lint-output channel is NOT acceptable (AdCP is a multi-hop agent network; warnings need to propagate across hops or each hop has to re-detect locally). Sellers MAY emit this code on their own response when they self-detect a non-projectable format on emit; producer-emitted entries omit `,_jsx(`code`,{children:`source`}),` (or set `,_jsx(`code`,{children:`source: \"producer\"`}),`). The response stays 200/success regardless of who emits; this is non-fatal.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multi-hop deduplication.`}),` Each hop that detects the same condition SHOULD deduplicate by `,_jsx(`code`,{children:`(code, field)`}),` rather than re-emit. The existing entry’s `,_jsx(`code`,{children:`sdk_id`}),` identifies which earlier processor saw it first; downstream SDKs SHOULD NOT add a second entry for the same `,_jsx(`code`,{children:`(code, field)`}),` pair unless they have materially different `,_jsx(`code`,{children:`error.details`}),` (e.g., a different `,_jsx(`code`,{children:`resolution_failure`}),` reason from a different registry version).`]}),_jsxs(_components.p,{children:[`Recovery: correctable (seller-side action — add explicit `,_jsx(`code`,{children:`canonical`}),` field on the legacy format file, contribute a v1-canonical-mapping registry entry, or author a 3.1+ `,_jsx(`code`,{children:`ProductFormatDeclaration`}),` with `,_jsx(`code`,{children:`v1_format_ref`}),` linking back). See canonical-formats.mdx ‘Dual emission and v2↔v1 projection’ for the full rules.`]})]}),_jsx(`a`,{id:`error-code-format-shape-promoted`}),_jsxs(Accordion,{title:`FORMAT_SHAPE_PROMOTED — correctable`,id:`format-shape-promoted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — migrate the legacy custom format_shape to error.details.promoted_to before error.details.transition_end; dual emission is allowed during the transition window. Do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal deprecation advisory raised when a 3.2-aware SDK encounters `,_jsx(`code`,{children:`format_kind: custom`}),` with a `,_jsx(`code`,{children:`format_shape`}),` that has been promoted to a first-class canonical. SDKs MUST preserve the declaration during its transition window and SHOULD augment the containing response’s `,_jsx(`code`,{children:`errors[]`}),` with `,_jsx(`code`,{children:`source: sdk`}),`, `,_jsx(`code`,{children:`sdk_id`}),`, this code, and `,_jsx(`code`,{children:`details: { format_shape, promoted_to, promotion_release, transition_end }`}),`. Producers that self-detect their own legacy declaration MAY emit the same advisory with `,_jsx(`code`,{children:`source: producer`}),`. Recovery is seller-side: dual-emit during the published transition window, migrate consumers, then replace the custom declaration with the promoted canonical.`]})]}),_jsx(`a`,{id:`error-code-governance-agent-not-accepted`}),_jsxs(Accordion,{title:`GOVERNANCE_AGENT_NOT_ACCEPTED — correctable`,id:`governance-agent-not-accepted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` select a governance agent matching `,_jsx(`code`,{children:`error.details.accepted_governance_agents`}),`, then retry `,_jsx(`code`,{children:`sync_governance`}),` with a fresh idempotency key`]}),_jsxs(_components.p,{children:[`The governance agent proposed in `,_jsx(`code`,{children:`sync_governance`}),` does not satisfy the seller’s authoritative per-account acceptance criteria. The failed binding MUST NOT be persisted or contacted, and credentials supplied for it MUST NOT be echoed in responses or logs. `,_jsx(`code`,{children:`error.details`}),` SHOULD conform to `,_jsx(`code`,{children:`error-details/governance-agent-not-accepted.json`}),`. Distinct from `,_jsx(`code`,{children:`GOVERNANCE_UNAVAILABLE`}),`, which means a verification criterion or registry could not be resolved and is retryable. Recovery: correctable (select an agent satisfying the returned criteria or resolve the account-specific requirement with the seller).`]})]}),_jsx(`a`,{id:`error-code-governance-denied`}),_jsxs(Accordion,{title:`GOVERNANCE_DENIED — correctable`,id:`governance-denied-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` restructure the buy, escalate to human spending authority, or contact the governance agent for details`]}),_jsxs(_components.p,{children:[`A registered governance agent denied the transaction. Sellers MUST place the denial in the operation’s structured rejection arm when one exists (e.g., `,_jsx(`code`,{children:`acquire_rights`}),` → `,_jsx(`code`,{children:`AcquireRightsRejected`}),`, or an `,_jsx(`code`,{children:`approval_webhook`}),` delivery → `,_jsx(`code`,{children:`CreativeRejected`}),`); otherwise in `,_jsx(`code`,{children:`errors[]`}),` + `,_jsx(`code`,{children:`adcp_error`}),`. Buyers MUST dispatch on the response’s discriminated `,_jsx(`code`,{children:`status`}),` first and fall back to `,_jsx(`code`,{children:`errors[].code`}),` / `,_jsx(`code`,{children:`adcp_error.code`}),` only when no rejection arm exists for that operation. The buyer may restructure the buy (e.g., reduce budget, split into smaller transactions), escalate to human spending authority, or contact the governance agent for details. Recovery: correctable.`]}),_jsx(_components.p,{children:`Wire placement (full guidance). Governance denial is a structured business outcome, not a system error — the governance call SUCCEEDED and the agent returned a denial verdict. Two cases:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Operation or webhook payload defines a structured rejection arm. The arm IS the canonical denial shape. The seller populates `,_jsx(`code`,{children:`reason`}),` (human-readable, propagating governance findings) and `,_jsx(`code`,{children:`suggestions`}),` (optional) and does NOT additionally emit `,_jsx(`code`,{children:`GOVERNANCE_DENIED`}),` in `,_jsx(`code`,{children:`errors[]`}),` or `,_jsx(`code`,{children:`adcp_error`}),`. The rejection arms enforce this at the schema layer: e.g., `,_jsx(`code`,{children:`AcquireRightsRejected`}),` and `,_jsx(`code`,{children:`CreativeRejected`}),` both declare `,_jsx(`code`,{children:`not: { required: [errors] }`}),`, so dual-emission is already a schema violation. The code does not appear on the wire when the rejection arm is used. Transport-level success markers MUST NOT be flipped (HTTP 200, MCP `,_jsx(`code`,{children:`isError: false`}),`, A2A `,_jsx(`code`,{children:`succeeded`}),`) — the operation completed successfully and produced a structured response.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Operation response has no rejection arm (e.g., `,_jsx(`code`,{children:`create_media_buy`}),` returns Success / Error / Submitted arms only). The seller populates `,_jsx(`code`,{children:`errors[].code: GOVERNANCE_DENIED`}),` in the payload AND `,_jsx(`code`,{children:`adcp_error.code: GOVERNANCE_DENIED`}),` on the envelope per the two-layer model in `,_jsx(`code`,{children:`error-handling.mdx#envelope-vs-payload-errors-the-two-layer-model`}),`. Transport-level failure markers DO flip in this case (HTTP 4xx, MCP `,_jsx(`code`,{children:`isError: true`}),`, A2A `,_jsx(`code`,{children:`failed`}),`) — the task could not produce a success artifact.`]}),`\n`]}),`\n`]}),_jsxs(_components.p,{children:[`The rule generalizes to any current or future operation or webhook payload whose response defines a discriminated rejection arm. In either placement, sellers SHOULD propagate governance findings verbatim — buyers’ recovery decisions depend on what specifically was rejected. `,_jsx(`code`,{children:`GOVERNANCE_DENIED`}),` is reserved for verdicts received from a reachable governance agent; if the governance call itself failed (timeout, network, config error), use `,_jsx(`code`,{children:`GOVERNANCE_UNAVAILABLE`}),` instead.`]})]}),_jsx(`a`,{id:`error-code-governance-unavailable`}),_jsxs(Accordion,{title:`GOVERNANCE_UNAVAILABLE — transient`,id:`governance-unavailable-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` retry with backoff; if the agent remains unreachable, the buyer MUST contact the plan’s governance operator`]}),_jsxs(_components.p,{children:[`A registered governance agent is unreachable. Sellers MUST place this code in `,_jsx(`code`,{children:`errors[]`}),` + `,_jsx(`code`,{children:`adcp_error`}),` (never a structured rejection arm) and flip transport-level failure markers (HTTP 5xx, MCP `,_jsx(`code`,{children:`isError: true`}),`, A2A `,_jsx(`code`,{children:`failed`}),`). Distinct from `,_jsx(`code`,{children:`GOVERNANCE_DENIED`}),` (agent reachable and explicitly denied — see that code’s wire-placement guidance). Recovery: transient (retry with backoff; if the agent remains unreachable, the buyer MUST contact the plan’s governance operator — the seller MUST NOT proceed with the media buy without a valid decision).`]}),_jsxs(_components.p,{children:[`Wire placement (full guidance). Governance unavailability is a system error — the governance call FAILED (timeout, network, config error) and the seller could not get a verdict at all. Always populate both layers per the two-layer model in `,_jsx(`code`,{children:`error-handling.mdx#envelope-vs-payload-errors-the-two-layer-model`}),`. Do NOT use a structured rejection arm for unavailability even when the task offers one — the buyer’s recovery semantics differ (retry-with-backoff for unavailability vs. restructure-or-escalate for denial), and conflating them masks the system-error signal.`]})]}),_jsx(`a`,{id:`error-code-idempotency-conflict`}),_jsxs(Accordion,{title:`IDEMPOTENCY_CONFLICT — correctable`,id:`idempotency-conflict-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` use a fresh UUID v4 for the new request, or resend the exact original payload to get the cached response`]}),_jsx(_components.p,{children:`An earlier request with the same idempotency_key was processed with a different canonical payload within the seller’s replay window. Distinct from CONFLICT (concurrent write) — this indicates the client reused a key across semantically different requests. Recovery: correctable (use a fresh UUID v4 for the new request, or resend the exact original payload to get the cached response).`})]}),_jsx(`a`,{id:`error-code-idempotency-expired`}),_jsxs(Accordion,{title:`IDEMPOTENCY_EXPIRED — correctable`,id:`idempotency-expired-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` perform a natural-key check to determine whether the original request succeeded; if no evidence of success, generate a fresh idempotency_key for a new attempt`]}),_jsx(_components.p,{children:`The idempotency_key was seen previously but its cached response has been evicted because it is past the seller’s declared replay_ttl_seconds. Distinct from IDEMPOTENCY_CONFLICT (different payload within window) — this indicates the retry arrived too late for at-most-once guarantees. Recovery: correctable (perform a natural-key reconciliation — e.g., call get_media_buys for the relevant account/status scope and match returned media_buys[].context.internal_campaign_id — to determine whether the original request succeeded, then either accept that result or generate a fresh idempotency_key for a new attempt). If the buyer has any evidence the prior call succeeded (partial response received before crash, entry in the buyer’s own DB, a webhook fired), the buyer MUST do the natural-key reconciliation BEFORE minting a new key — minting a new key in that situation is exactly how double-creation happens.`})]}),_jsx(`a`,{id:`error-code-idempotency-in-flight`}),_jsxs(Accordion,{title:`IDEMPOTENCY_IN_FLIGHT — transient`,id:`idempotency-in-flight-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` wait top-level error.retry_after seconds and retry with the SAME idempotency_key — MUST NOT mint a fresh key (turns a safe retry into a double-execution race)`]}),_jsxs(_components.p,{children:[`A prior request with the same `,_jsx(`code`,{children:`idempotency_key`}),` is either actively executing or has an unresolved outcome under fail-closed reconciliation, and has not yet produced a cached response or committed-outcome tombstone. Sellers MAY return this code instead of blocking the second caller while active execution or reconciliation finishes — useful when the first call invokes a slow or ambiguously responding downstream system (SSP, ad server, payment provider). Distinct from IDEMPOTENCY_CONFLICT (different canonical payload — a client bug) and from CONFLICT (concurrent modification of a different resource) — IDEMPOTENCY_IN_FLIGHT tells the buyer that its retry is correct but the prior attempt’s outcome is not yet available. Sellers SHOULD populate top-level `,_jsx(`code`,{children:`error.retry_after`}),` with an integer-second wait hint based on expected execution or reconciliation progress. Buyers MUST treat this as transient and MUST NOT mint a fresh `,_jsx(`code`,{children:`idempotency_key`}),` — minting a new key turns a safe retry into a double-execution race. Recovery: transient (wait `,_jsx(`code`,{children:`error.retry_after`}),` seconds and retry with the same `,_jsx(`code`,{children:`idempotency_key`}),`; the next attempt will replay the resolved outcome, continue reconciliation, or return IDEMPOTENCY_IN_FLIGHT again).`]})]}),_jsx(`a`,{id:`error-code-invalid-feed-format`}),_jsxs(Accordion,{title:`INVALID_FEED_FORMAT — correctable`,id:`invalid-feed-format-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify the feed content matches the declared format`]}),_jsx(_components.p,{children:`Catalog feed content does not match the declared feed_format. Recovery: correctable (verify the feed content matches the declared format, e.g. XML for google_merchant_center).`})]}),_jsx(`a`,{id:`error-code-invalid-pricing-option`}),_jsxs(Accordion,{title:`INVALID_PRICING_OPTION — correctable`,id:`invalid-pricing-option-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify pricing_option_id against the product’s pricing_options from get_products or the vendor’s discovery response, then resubmit with a valid ID`]}),_jsxs(_components.p,{children:[`A `,_jsx(`code`,{children:`pricing_option_id`}),` referenced in the request does not exist on the target account or product. Returned per-record in `,_jsx(`code`,{children:`report_usage`}),` responses and at the request level for `,_jsx(`code`,{children:`create_media_buy`}),` when the submitted pricing option cannot be resolved. `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the offending record path (e.g., `,_jsx(`code`,{children:`usage[1].pricing_option_id`}),` or `,_jsx(`code`,{children:`packages[0].pricing_option_id`}),`). Distinct from `,_jsx(`code`,{children:`PRODUCT_NOT_FOUND`}),` (the product itself is unknown) by being narrowly about a pricing option within a known product or account. Recovery: correctable (verify `,_jsx(`code`,{children:`pricing_option_id`}),` against the product’s `,_jsx(`code`,{children:`pricing_options`}),` from `,_jsx(`code`,{children:`get_products`}),` or the vendor’s discovery response, then resubmit with a valid ID).`]})]}),_jsx(`a`,{id:`error-code-invalid-request`}),_jsxs(Accordion,{title:`INVALID_REQUEST — correctable`,id:`invalid-request-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check request parameters and fix`]}),_jsx(_components.p,{children:`Request is malformed, missing required fields, or violates schema constraints. Recovery: correctable (check request parameters and fix).`})]}),_jsx(`a`,{id:`error-code-invalid-state`}),_jsxs(Accordion,{title:`INVALID_STATE — correctable`,id:`invalid-state-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check current status via get_media_buys and adjust request`]}),_jsx(_components.p,{children:`Operation is not permitted for the resource’s current status (e.g., updating a completed or canceled media buy, or modifying a canceled package). Recovery: correctable (check current status via get_media_buys and adjust request).`})]}),_jsx(`a`,{id:`error-code-invalid-usage-data`}),_jsxs(Accordion,{title:`INVALID_USAGE_DATA — correctable`,id:`invalid-usage-data-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check required fields for the vendor type (vendor_cost, currency, account at minimum), fix invalid values, and resubmit`]}),_jsxs(_components.p,{children:[`A usage record in `,_jsx(`code`,{children:`report_usage`}),` has missing or invalid fields — required fields absent, values out of range, or type mismatches. Returned per-record in the `,_jsx(`code`,{children:`report_usage`}),` response `,_jsx(`code`,{children:`errors[]`}),` array. `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the offending field path (e.g., `,_jsx(`code`,{children:`usage[0].vendor_cost`}),`, `,_jsx(`code`,{children:`usage[0].currency`}),`). Distinct from `,_jsx(`code`,{children:`INVALID_REQUEST`}),` (top-level request malformed) by being scoped to individual usage records within an otherwise well-formed request. Recovery: correctable (check required fields for the vendor type — at minimum `,_jsx(`code`,{children:`vendor_cost`}),`, `,_jsx(`code`,{children:`currency`}),`, and `,_jsx(`code`,{children:`account`}),` — fix the offending values, and resubmit).`]})]}),_jsx(`a`,{id:`error-code-io-required`}),_jsxs(Accordion,{title:`IO_REQUIRED — correctable`,id:`io-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` review the proposal’s insertion_order, accept terms, and include io_acceptance on accept_proposal; use create_media_buy only for 3.x compatibility`]}),_jsx(_components.p,{children:`The committed proposal requires a signed insertion order but no io_acceptance was provided. Recovery: correctable (review the proposal’s insertion_order, accept terms, and include io_acceptance on accept_proposal; 3.x compatibility callers use create_media_buy).`})]}),_jsx(`a`,{id:`error-code-item-validation-failed`}),_jsxs(Accordion,{title:`ITEM_VALIDATION_FAILED — correctable`,id:`item-validation-failed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check item_issues for per-item rejection reasons and fix the offending items`]}),_jsx(_components.p,{children:`One or more catalog items failed schema validation during sync_catalogs. Recovery: correctable (check item_issues for per-item rejection reasons and fix the offending items).`})]}),_jsx(`a`,{id:`error-code-macro-resolution-failed`}),_jsxs(Accordion,{title:`MACRO_RESOLUTION_FAILED — correctable`,id:`macro-resolution-failed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` inspect error.details.macro_resolution_results and route to a resolver that supports the declared dialect, semantic, owner, and encoding depth`]}),_jsxs(_components.p,{children:[`One or more declared creative macro tokens cannot be resolved or safely preserved under the selected product and seller capability intersection. Sellers MUST include per-token `,_jsx(`code`,{children:`error.details.macro_resolution_results`}),`, conforming to `,_jsx(`code`,{children:`error-details/macro-resolution-failed.json`}),`; unknown or ambiguous tokens remain byte-preserved and MUST NOT receive guessed values. Recovery: correctable (route to a compatible execution path, correct the verified declaration, or assign the proper downstream resolver).`]})]}),_jsx(`a`,{id:`error-code-media-buy-not-found`}),_jsxs(Accordion,{title:`MEDIA_BUY_NOT_FOUND — correctable`,id:`media-buy-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify media_buy_id; for legacy correlation use get_media_buys plus context, such as context.internal_campaign_id`]}),_jsx(_components.p,{children:`Referenced media buy does not exist or is not accessible to the requesting agent. Recovery: correctable (verify media_buy_id; when recovering across legacy sellers or missing echoed IDs, reconcile via get_media_buys and the opaque request/response context correlation handle, such as context.internal_campaign_id, rather than deprecated top-level buyer_ref).`})]}),_jsx(`a`,{id:`error-code-multi-finalize-unsupported`}),_jsxs(Accordion,{title:`MULTI_FINALIZE_UNSUPPORTED — correctable`,id:`multi-finalize-unsupported-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` sequence single-proposal finalize calls — one finalize entry per get_products refine[] call or per refine_proposals refinements[] call`]}),_jsxs(_components.p,{children:[`Returned by sellers that cannot guarantee atomic commit across multiple proposals in a single finalize batch. Two call sites where this applies: (1) a `,_jsx(`code`,{children:`get_products`}),` call with multiple `,_jsx(`code`,{children:`action: 'finalize'`}),` entries in `,_jsx(`code`,{children:`refine[]`}),` targeting different `,_jsx(`code`,{children:`proposal_id`}),` values; (2) a `,_jsx(`code`,{children:`refine_proposals`}),` call with multiple `,_jsx(`code`,{children:`action: 'finalize'`}),` entries in `,_jsx(`code`,{children:`refinements[]`}),` targeting different `,_jsx(`code`,{children:`proposal_id`}),` values. The buyer’s intent — atomic multi-proposal finalize — is structurally well-formed and per spec atomic on both surfaces, but this seller’s downstream stack cannot satisfy the atomicity guarantee (e.g., the proposals route to two different ad servers with no 2PC). More specific than `,_jsx(`code`,{children:`INVALID_REQUEST`}),` so buyers can distinguish ‘this seller doesn’t support multi-finalize’ from ‘the request itself is malformed’. Recovery: correctable (sequence the finalize calls one-`,_jsx(`code`,{children:`proposal_id`}),`-per-call on whichever task surface the buyer is using; there is no capability flag for multi-finalize support, so a successful first-attempt is the only positive discovery signal). See `,_jsx(_components.a,{href:`/docs/media-buy/product-discovery/refinement#finalize-is-exclusive-within-refine`,children:`refinement guide § Finalize is exclusive`}),`.`]})]}),_jsx(`a`,{id:`error-code-not-cancellable`}),_jsxs(Accordion,{title:`NOT_CANCELLABLE — correctable`,id:`not-cancellable-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check the seller’s cancellation policy or contact the seller`]}),_jsx(_components.p,{children:`The media buy or package cannot be canceled in its current state. The seller may have contractual or operational constraints that prevent cancellation. Recovery: correctable (check the seller’s cancellation policy or contact the seller).`})]}),_jsx(`a`,{id:`error-code-package-not-found`}),_jsxs(Accordion,{title:`PACKAGE_NOT_FOUND — correctable`,id:`package-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify package_id; for legacy package correlation use get_media_buys plus package context, such as context.buyer_ref`]}),_jsx(_components.p,{children:`Referenced package does not exist within the specified media buy. Recovery: correctable (verify package_id within the media buy; when recovering across legacy sellers or missing echoed product_id, reconcile via get_media_buys and the package-level context correlation handle, such as context.buyer_ref, rather than deprecated top-level buyer_ref).`})]}),_jsx(`a`,{id:`error-code-payment-terms-not-supported`}),_jsxs(Accordion,{title:`PAYMENT_TERMS_NOT_SUPPORTED — correctable`,id:`payment-terms-not-supported-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` omit payment_terms to accept the seller’s default, retry with a different supported value, or negotiate offline`]}),_jsxs(_components.p,{children:[`The seller does not accept the requested `,_jsx(`code`,{children:`payment_terms`}),` value for this account. Payment terms are never silently remapped — sellers either accept or reject. Distinct from `,_jsx(`code`,{children:`BILLING_NOT_SUPPORTED`}),` (the `,_jsx(`code`,{children:`billing`}),` enum) by being narrowly about the `,_jsx(`code`,{children:`payment_terms`}),` enum on the same account. Recovery: correctable (omit `,_jsx(`code`,{children:`payment_terms`}),` to accept the seller’s default, retry with a different value the seller supports, or negotiate offline).`]})]}),_jsx(`a`,{id:`error-code-permission-denied`}),_jsxs(Accordion,{title:`PERMISSION_DENIED — correctable`,id:`permission-denied-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` call check_governance to mint a valid token, or contact the seller to resolve the underlying permission; when error.details.scope is ‘agent’ (reason ‘sandbox_only’ or ‘grant_absent’) the rejection is terminal-pending-onboarding — surface to a human rather than auto-retrying. For suspended/blocked agent relationships, sellers emit AGENT_SUSPENDED / AGENT_BLOCKED instead (those codes carry recovery: terminal directly).`]}),_jsxs(_components.p,{children:[`The authenticated caller is not authorized for the requested action, or a required signed credential (e.g., a `,_jsx(`code`,{children:`governance_context`}),` token on a spend-commit) is missing, fails verification, or was issued for a different plan, seller, or phase. Seller content or advertising policy denials use `,_jsx(`code`,{children:`POLICY_VIOLATION`}),`; media-buy change-right and current-availability denials use `,_jsx(`code`,{children:`ACTION_NOT_ALLOWED`}),`. Distinct from `,_jsx(`code`,{children:`AUTH_MISSING`}),` (no credentials presented), `,_jsx(`code`,{children:`AUTH_INVALID`}),` (credentials presented but rejected), `,_jsx(`code`,{children:`GOVERNANCE_DENIED`}),` (governance agent denied), `,_jsx(`code`,{children:`AGENT_SUSPENDED`}),` (agent’s relationship temporarily paused), and `,_jsx(`code`,{children:`AGENT_BLOCKED`}),` (agent’s relationship permanently denied). When the gate that fired is specifically a non-status per-agent gate — a provisioning constraint (e.g., the agent is provisioned for sandbox traffic only and the request was against a non-sandbox account) or a missing demand-side grant — `,_jsx(`code`,{children:`error.details`}),` SHOULD conform to `,_jsx(`code`,{children:`error-details/agent-permission-denied.json`}),` (`,_jsx(`code`,{children:`scope: \"agent\"`}),` plus `,_jsx(`code`,{children:`reason: \"sandbox_only\"`}),`, or `,_jsx(`code`,{children:`reason: \"grant_absent\"`}),` when no demand-side grant authorizes the agent to act for the account’s brand) so callers can dispatch without parsing prose. Sellers MUST emit `,_jsx(`code`,{children:`scope: \"agent\"`}),` only when buyer-agent identity has been established via signed-request derivation or a credential-to-agent mapping in the seller’s onboarding record; in all other cases (including bearer credentials not mapped to a specific agent record) sellers MUST return `,_jsx(`code`,{children:`PERMISSION_DENIED`}),` and MUST omit `,_jsx(`code`,{children:`error.details.scope`}),` — emitting the per-agent scope without established identity is a cross-tenant onboarding oracle, and the omit MUST be enforced across every observable channel (response shape, HTTP/A2A/MCP status, headers, side effects, observability, latency parity) per the channel-coverage rules in error-handling.mdx Per-Agent Authorization Gate, mirroring the `,_jsx(`code`,{children:`*_NOT_FOUND`}),` uniform-response rule and `,_jsx(`code`,{children:`BILLING_NOT_PERMITTED_FOR_AGENT`}),`. The `,_jsx(`code`,{children:`suspended`}),` and `,_jsx(`code`,{children:`blocked`}),` per-agent states are NOT carried on this code — sellers MUST emit `,_jsx(`code`,{children:`AGENT_SUSPENDED`}),` / `,_jsx(`code`,{children:`AGENT_BLOCKED`}),` instead, each of which is its own discriminator. Recovery: correctable (call `,_jsx(`code`,{children:`check_governance`}),` to mint a valid token, or contact the seller to resolve the underlying permission); when `,_jsx(`code`,{children:`details.reason`}),` is present the rejection is terminal-pending-onboarding — the agent MUST surface to a human at the buyer rather than auto-retrying, since the agent cannot satisfy the gate itself.`]})]}),_jsx(`a`,{id:`error-code-pixel-tracker-lossy-downgrade`}),_jsxs(Accordion,{title:`PIXEL_TRACKER_LOSSY_DOWNGRADE — correctable`,id:`pixel-tracker-lossy-downgrade-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — emitted alongside the v1 downgrade emission: SDK collapsed a pixel_tracker asset to v1 `,_jsx(`code`,{children:`{asset_type: url, url_type: tracker_pixel}`}),` for a seller that doesn’t support pixel_tracker natively. The URL still fires; what’s lost is in `,_jsx(`code`,{children:`error.details.lost_fields`}),` (event variant, method:js execution context, or custom event timing). Buyer decision: accept the loss (most counter pixels survive), or fail the buy and route to a 3.1-capable seller. Non-fatal — do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when a 3.1 buyer SDK downgrades a `,_jsx(`code`,{children:`pixel_tracker`}),` asset to the v1 `,_jsx(`code`,{children:`{asset_type: url, url_type: tracker_pixel}`}),` shape for a 3.0.x seller that doesn’t recognize the new asset type. The URL is still emitted on the wire and the seller will fire it as a tracker pixel; what’s lost is the event/method discrimination. The one exception is the playback events (`,_jsx(`code`,{children:`start`}),`, quartiles, `,_jsx(`code`,{children:`complete`}),`), which are dropped rather than emitted.`]}),_jsx(_components.p,{children:`Downgrade rules (normative):`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`event: impression`}),` + `,_jsx(`code`,{children:`method: img`}),` → no loss; emit as `,_jsx(`code`,{children:`{asset_type: url, url_type: tracker_pixel, url, asset_id: impression_tracker}`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`event: viewable_mrc_50`}),` / `,_jsx(`code`,{children:`viewable_mrc_100`}),` / `,_jsx(`code`,{children:`viewable_video_50`}),` / `,_jsx(`code`,{children:`audible_video_complete`}),` → emit with `,_jsx(`code`,{children:`asset_id: viewability_tracker`}),`; advisory `,_jsx(`code`,{children:`lost_event: \u003cvariant>`}),` (specific viewability variant collapses to a single v1 slot)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`event: start`}),` / `,_jsx(`code`,{children:`first_quartile`}),` / `,_jsx(`code`,{children:`midpoint`}),` / `,_jsx(`code`,{children:`third_quartile`}),` / `,_jsx(`code`,{children:`complete`}),` → `,_jsx(_components.strong,{children:`drop`}),` the tracker (no v1 emission); advisory `,_jsx(`code`,{children:`lost_event: \u003cvariant>`}),` and `,_jsx(`code`,{children:`lost_fields`}),` covering the whole tracker. `,_jsx(`code`,{children:`event: custom`}),` with `,_jsx(`code`,{children:`custom_event_name`}),` equal to one of those five names (the 3.2 interim form) is dropped the same way, and this rule takes precedence over the `,_jsx(`code`,{children:`custom`}),` and `,_jsx(`code`,{children:`method: js`}),` rules; set `,_jsx(`code`,{children:`downgrade_target: \"dropped\"`}),` and `,_jsx(`code`,{children:`lost_fields: [\"event\", \"url\"]`}),`. Never emit these as `,_jsx(`code`,{children:`impression_tracker`}),`: a playback URL fired at impression time would count every impression as a quartile view`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`event: click`}),` → emit with `,_jsx(`code`,{children:`asset_id: click_tracker`}),`; no meaningful loss`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`event: custom, custom_event_name: X`}),` → emit with `,_jsx(`code`,{children:`asset_id: impression_tracker`}),` (default tracker_pixel fires on impression); advisory `,_jsx(`code`,{children:`lost_event: \"custom\"`}),`, `,_jsx(`code`,{children:`lost_custom_event_name: X`}),` (custom event timing collapses to impression timing)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`method: js`}),` → emit unchanged shape (url, url_type:tracker_pixel); advisory `,_jsx(`code`,{children:`lost_method: \"js\"`}),` (v1 seller will fire as HTTP GET; the URL is hit and any counter-based measurement increments, but the response body won’t execute as JS — measurement that depends on JS execution, e.g., OMID-style verification, viewability observers, cross-domain cookie setters, won’t work. Simple counter pixels still work.)`]}),`\n`]}),_jsxs(_components.p,{children:[`Surface: SDK that performs the downgrade MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` with `,_jsx(`code`,{children:`source: \"sdk\"`}),`, `,_jsx(`code`,{children:`sdk_id`}),`, `,_jsx(`code`,{children:`code: \"PIXEL_TRACKER_LOSSY_DOWNGRADE\"`}),`, `,_jsx(`code`,{children:`field`}),` pointing at the affected manifest asset path, and `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ asset_id, original_event, original_method, original_custom_event_name (if present), downgrade_target: \"url+tracker_pixel\", lost_fields: [\u003clist>] }`}),`. One advisory per downgraded asset; SDKs SHOULD NOT collapse multiple downgrades into a single advisory entry — per-asset details let the buyer’s measurement-plan owner decide whether each loss is tolerable.`]}),_jsxs(_components.p,{children:[`Recovery: correctable — non-fatal advisory, do not auto-retry. Buyer-side decision: accept the loss (most simple counter pixels survive; dropped playback trackers do not), or fail the buy and route to a 3.1-capable seller. Seller-side fix: upgrade to 3.1 and accept `,_jsx(`code`,{children:`pixel_tracker`}),` natively.`]})]}),_jsx(`a`,{id:`error-code-pixel-tracker-upgrade-inferred`}),_jsxs(Accordion,{title:`PIXEL_TRACKER_UPGRADE_INFERRED — correctable`,id:`pixel-tracker-upgrade-inferred-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — emitted when a 3.1 SDK upgrades a v1 url+tracker_pixel asset to pixel_tracker by inferring event and method from asset_id conventions. The inference may not match the buyer’s original intent; check `,_jsx(`code`,{children:`error.details.inferred_event`}),` / `,_jsx(`code`,{children:`inferred_method`}),` and re-prompt the seller for explicit values if precise measurement matters. Non-fatal — do not auto-retry`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when a 3.1 buyer SDK upgrades a v1 `,_jsx(`code`,{children:`{asset_type: url, url_type: tracker_pixel}`}),` to a `,_jsx(`code`,{children:`pixel_tracker`}),` asset by INFERRING the event and method from the v1 asset_id and conventional defaults. The inference is structural — the SDK doesn’t have explicit event/method values, only the v1 asset_id hint and `,_jsx(`code`,{children:`url_type: tracker_pixel`}),` (which implies `,_jsx(`code`,{children:`method: img`}),` by default).`]}),_jsx(_components.p,{children:`Inference rules (normative):`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`asset_id: impression_tracker`}),` → `,_jsx(`code`,{children:`event: impression, method: img`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`asset_id: viewability_tracker`}),` → `,_jsx(`code`,{children:`event: viewable_mrc_50, method: img`}),` (50% is the most common default; specific viewability variant cannot be recovered from v1 shape)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`asset_id: click_tracker`}),` → `,_jsx(`code`,{children:`event: click, method: img`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(`code`,{children:`asset_id: \u003cother>`}),` → `,_jsx(`code`,{children:`event: custom, custom_event_name: \u003coriginal asset_id>, method: img`})]}),`\n`]}),_jsxs(_components.p,{children:[`Surface: SDK MUST augment the response’s `,_jsx(`code`,{children:`errors[]`}),` with `,_jsx(`code`,{children:`code: \"PIXEL_TRACKER_UPGRADE_INFERRED\"`}),`, `,_jsx(`code`,{children:`field`}),` pointing at the upgraded asset path, and `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ asset_id, inferred_event, inferred_method, inference_basis: \"asset_id_convention\" | \"default\" }`}),`. Buyer agents reading the response can re-prompt the seller for explicit values if precise measurement matters.`]}),_jsx(_components.p,{children:`Recovery: correctable — non-fatal advisory, do not auto-retry. Seller-side: upgrade emit path to ship pixel_tracker shape directly when 3.1-capable; until then, conventional asset_id values give the SDK enough signal to upgrade without losing critical semantics.`})]}),_jsx(`a`,{id:`error-code-place-target-unavailable`}),_jsxs(Accordion,{title:`PLACE_TARGET_UNAVAILABLE — correctable`,id:`place-target-unavailable-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` resolve the pinned value against the current catalog, review any replacement, and submit an intentional package targeting update`]}),_jsx(_components.p,{children:`A place identifier previously accepted and pinned on a package can no longer be executed. This is a nonfatal resource-state error returned in get_media_buys.errors[] alongside the affected buy. error.field MUST point to the exact media_buys[N].packages[M].targeting_overlay.geo_places[_exclude][A].values[V] response path. error.details MUST include media_buy_id, package_id, system, system_version, country, place_type, and value. The seller MUST preserve and echo the pinned target rather than silently changing geography. Recovery: correctable (look up the value through the declared resolver at the current catalog version and submit an intentional targeting update).`})]}),_jsx(`a`,{id:`error-code-plan-not-found`}),_jsxs(Accordion,{title:`PLAN_NOT_FOUND — correctable`,id:`plan-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify plan_id via sync_plans, or register the plan first`]}),_jsx(_components.p,{children:`Referenced governance plan does not exist or is not accessible to the requesting agent. Recovery: correctable (verify plan_id via sync_plans, or register the plan first). Sellers MUST return this code uniformly for any plan_id not accessible to the calling account — never distinguish ‘exists but unauthorized’ from ‘does not exist’, which would enable cross-tenant enumeration of governance plans.`})]}),_jsx(`a`,{id:`error-code-policy-violation`}),_jsxs(Accordion,{title:`POLICY_VIOLATION — correctable`,id:`policy-violation-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` review policy requirements in the error details`]}),_jsx(_components.p,{children:`Request violates the seller’s content or advertising policies. Recovery: correctable (review policy requirements in the error details).`})]}),_jsx(`a`,{id:`error-code-private-field-in-public-placement`}),_jsxs(Accordion,{title:`PRIVATE_FIELD_IN_PUBLIC_PLACEMENT — correctable`,id:`private-field-in-public-placement-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` seller-side fix needed: remove private operational fields (`,_jsx(`code`,{children:`visibility`}),`, `,_jsx(`code`,{children:`source`}),`, `,_jsx(`code`,{children:`origin`}),`, `,_jsx(`code`,{children:`delivery_mappings`}),`, or similar) from public placement objects. Consumers MUST fail closed for the affected placement and alert operators; do not echo private field values in logs or error details`]}),_jsxs(_components.p,{children:[`Fatal producer-side error raised when a public placement object (`,_jsx(`code`,{children:`Product.placements[]`}),` in `,_jsx(`code`,{children:`get_products`}),` or `,_jsx(`code`,{children:`placements[]`}),` in adagents.json) exposes seller-private operational fields such as `,_jsx(`code`,{children:`visibility`}),`, `,_jsx(`code`,{children:`source`}),`, `,_jsx(`code`,{children:`origin`}),`, or `,_jsx(`code`,{children:`delivery_mappings`}),`. This is a private-data leak, not an ordinary syntactic mismatch. Consumers that detect it MUST fail closed for that placement and surface this code so monitoring can alarm on the leak specifically instead of burying it under generic schema validation. `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the offending placement path and `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`{ placement_id, leaked_fields: [\u003cfield names>] }`}),` without echoing private field values. Recovery: correctable but seller-side — remove private operational fields from the public placement surface and keep delivery mappings in seller-internal systems.`]})]}),_jsx(`a`,{id:`error-code-product-expired`}),_jsxs(Accordion,{title:`PRODUCT_EXPIRED — correctable`,id:`product-expired-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` re-discover with get_products to find current inventory`]}),_jsx(_components.p,{children:`The seller still recognizes one or more configured product IDs as issued to the authenticated account and referenced discovery/refinement lineage, and they have passed their expires_at timestamps. Sellers are not required to retain expiry tombstones indefinitely; an ID that is no longer resolvable, or is inaccessible to this caller because it belongs to another account or lineage, uses PRODUCT_NOT_FOUND. This distinction MUST NOT become a cross-tenant existence oracle. Recovery: correctable (re-discover through list_products, request_proposals, or the get_products compatibility facade to find current inventory).`})]}),_jsx(`a`,{id:`error-code-product-not-found`}),_jsxs(Accordion,{title:`PRODUCT_NOT_FOUND — correctable`,id:`product-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` remove invalid IDs and retry, or re-discover with get_products`]}),_jsx(_components.p,{children:`One or more referenced product IDs are unknown or are not resolvable within the authenticated account and configured-offer lineage. A caller-authorized configured ID that is still recognized as expired uses PRODUCT_EXPIRED; once no expiry tombstone remains, or whenever the ID belongs to another account or lineage, PRODUCT_NOT_FOUND applies. Sellers MUST NOT reveal cross-tenant product existence through error choice. Recovery: correctable (remove invalid IDs and retry, or re-discover with get_products).`})]}),_jsx(`a`,{id:`error-code-product-unavailable`}),_jsxs(Accordion,{title:`PRODUCT_UNAVAILABLE — correctable`,id:`product-unavailable-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` choose a different product`]}),_jsx(_components.p,{children:`The requested product is sold out or no longer available. On accept_proposal for an experimental ranked hold behind first position (media_buy.hold_ranking), it means a hold ahead still stands: the committed proposal stays acceptable until expires_at and a later acceptance may succeed. Recovery: correctable (choose a different product).`})]}),_jsx(`a`,{id:`error-code-proposal-expired`}),_jsxs(Accordion,{title:`PROPOSAL_EXPIRED — correctable`,id:`proposal-expired-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` call request_proposals and finalize a fresh proposal, or re-discover and finalize through legacy get_products`]}),_jsx(_components.p,{children:`A referenced proposal ID has passed its expires_at timestamp. For a committed proposal, the inventory hold has lapsed (or, under terms_only hold semantics, the acceptance window has closed). Recovery: correctable (call request_proposals and finalize a fresh proposal, or re-discover and finalize through the legacy get_products facade).`})]}),_jsx(`a`,{id:`error-code-proposal-not-committed`}),_jsxs(Accordion,{title:`PROPOSAL_NOT_COMMITTED — correctable`,id:`proposal-not-committed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` finalize the draft through refine_proposals, or through the legacy get_products refine action`]}),_jsx(_components.p,{children:`The referenced proposal has proposal_status ‘draft’ and cannot be accepted into a media buy. Recovery: correctable (finalize it through refine_proposals, or through the legacy get_products refine action).`})]}),_jsx(`a`,{id:`error-code-proposal-not-found`}),_jsxs(Accordion,{title:`PROPOSAL_NOT_FOUND — correctable`,id:`proposal-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` request and finalize a fresh proposal, then retry`]}),_jsxs(_components.p,{children:[`The referenced proposal_id is not recognized by the seller — it belongs to a different tenant, was never issued, or was evicted from the seller’s session cache before consumption. Distinct from `,_jsx(`code`,{children:`PROPOSAL_EXPIRED`}),` (a known proposal whose `,_jsx(`code`,{children:`expires_at`}),` window has passed) and `,_jsx(`code`,{children:`PROPOSAL_NOT_COMMITTED`}),` (a known proposal still in `,_jsx(`code`,{children:`draft`}),`). Recovery: correctable (request a fresh proposal, finalize it, then retry accept_proposal; 3.x compatibility callers retry create_media_buy).`]})]}),_jsx(`a`,{id:`error-code-provenance-claim-contradicted`}),_jsxs(Accordion,{title:`PROVENANCE_CLAIM_CONTRADICTED — correctable`,id:`provenance-claim-contradicted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` revise the provenance claim to match the verifier’s observation or replace the creative; auto-retry without correction will not pass`]}),_jsxs(_components.p,{children:[`Seller invoked a governance agent from `,_jsx(`code`,{children:`creative_policy.accepted_verifiers`}),` via `,_jsx(`code`,{children:`get_creative_features`}),` and the verifier’s result contradicts the buyer’s provenance claim - e.g., buyer claims `,_jsx(`code`,{children:`digital_source_type: digital_capture`}),` but the AI-detection feature returns `,_jsx(`code`,{children:`ai_generated: true`}),` above the seller’s confidence threshold. Distinct from the `,_jsx(`code`,{children:`PROVENANCE_*_MISSING`}),` family (structural absence) by being an active refutation. `,_jsx(`code`,{children:`error.details`}),` SHOULD be limited to the audit-safe allowlist `,_jsx(`code`,{children:`{ agent_url, feature_id, claimed_value, observed_value, confidence }`}),`; sellers MUST NOT forward arbitrary verifier extension fields, `,_jsx(`code`,{children:`detail_url`}),`, or any verifier response shape that may carry cross-tenant or PII data. When the seller calls a different on-list agent than the buyer nominated (the seller is the verifier-of-record), `,_jsx(`code`,{children:`error.details.agent_url`}),` is the agent the seller actually called and `,_jsx(`code`,{children:`error.details.substituted_for`}),` SHOULD carry the buyer’s nominated `,_jsx(`code`,{children:`agent_url`}),` so the buyer can reconcile. Recovery: correctable - buyer revises the provenance claim to match reality (or replaces the creative); auto-retry without correction will not pass.`]})]}),_jsx(`a`,{id:`error-code-provenance-digital-source-type-missing`}),_jsxs(Accordion,{title:`PROVENANCE_DIGITAL_SOURCE_TYPE_MISSING — correctable`,id:`provenance-digital-source-type-missing-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` set provenance.digital_source_type to a value from the digital-source-type enum and resubmit`]}),_jsxs(_components.p,{children:[`Seller’s `,_jsx(`code`,{children:`creative_policy.provenance_requirements.require_digital_source_type`}),` is true and the submitted creative’s resolved provenance (after inheritance) has no `,_jsx(`code`,{children:`digital_source_type`}),` value, or has it set to null. Distinct from `,_jsx(`code`,{children:`PROVENANCE_REQUIRED`}),` (no provenance object at all) - provenance is present, just missing this specific field. Recovery: correctable (set `,_jsx(`code`,{children:`provenance.digital_source_type`}),` to a value from the `,_jsx(`code`,{children:`digital-source-type`}),` enum and resubmit). `,_jsx(`code`,{children:`error.field`}),` MUST point at the resolved provenance path that was inspected (e.g., `,_jsx(`code`,{children:`creatives[0].creative_manifest.provenance.digital_source_type`}),`).`]})]}),_jsx(`a`,{id:`error-code-provenance-disclosure-missing`}),_jsxs(Accordion,{title:`PROVENANCE_DISCLOSURE_MISSING — correctable`,id:`provenance-disclosure-missing-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` set provenance.disclosure.required and, when true, populate disclosure.jurisdictions`]}),_jsxs(_components.p,{children:[`Seller’s `,_jsx(`code`,{children:`creative_policy.provenance_requirements.require_disclosure_metadata`}),` is true and the submitted creative’s resolved provenance has no `,_jsx(`code`,{children:`disclosure.required`}),` boolean, or `,_jsx(`code`,{children:`disclosure.required`}),` is true with no `,_jsx(`code`,{children:`disclosure.jurisdictions`}),` entries. Recovery: correctable (set `,_jsx(`code`,{children:`provenance.disclosure.required`}),` and, when true, populate `,_jsx(`code`,{children:`disclosure.jurisdictions`}),`). `,_jsx(`code`,{children:`error.field`}),` MUST point at `,_jsx(`code`,{children:`provenance.disclosure`}),` (e.g., `,_jsx(`code`,{children:`creatives[0].creative_manifest.provenance.disclosure`}),`).`]})]}),_jsx(`a`,{id:`error-code-provenance-embedded-missing`}),_jsxs(Accordion,{title:`PROVENANCE_EMBEDDED_MISSING — correctable`,id:`provenance-embedded-missing-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` attach at least one embedded_provenance entry from a supported provider and resubmit`]}),_jsxs(_components.p,{children:[`Seller’s `,_jsx(`code`,{children:`creative_policy.provenance_requirements.require_embedded_provenance`}),` is true and the submitted creative’s resolved provenance has no `,_jsx(`code`,{children:`embedded_provenance`}),` array, or has it as an empty array. Used in pipelines where sidecar `,_jsx(`code`,{children:`c2pa.manifest_url`}),` is stripped by intermediaries and the seller requires content-stream-resilient provenance. Recovery: correctable (attach at least one `,_jsx(`code`,{children:`embedded_provenance`}),` entry from a supported provider and resubmit, optionally with a `,_jsx(`code`,{children:`verify_agent`}),` pointer matching one of the seller’s `,_jsx(`code`,{children:`creative_policy.accepted_verifiers`}),`). `,_jsx(`code`,{children:`error.field`}),` MUST point at `,_jsx(`code`,{children:`provenance.embedded_provenance`}),` on the resolved manifest.`]})]}),_jsx(`a`,{id:`error-code-provenance-required`}),_jsxs(Accordion,{title:`PROVENANCE_REQUIRED — correctable`,id:`provenance-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` attach a provenance object - at minimum digital_source_type - and resubmit`]}),_jsxs(_components.p,{children:[`Seller’s `,_jsx(`code`,{children:`creative_policy.provenance_required`}),` is true and the submitted creative has no `,_jsx(`code`,{children:`provenance`}),` object on the manifest, on the creative-asset, or on any individual asset. Distinct from `,_jsx(`code`,{children:`CREATIVE_REJECTED`}),` (generic creative-review failure) by being narrowly about provenance presence. Recovery: correctable (attach a provenance object - at minimum `,_jsx(`code`,{children:`digital_source_type`}),` - and resubmit). `,_jsx(`code`,{children:`error.field`}),` MUST point at the path where provenance was expected (e.g., `,_jsx(`code`,{children:`creatives[0].creative_manifest`}),`).`]})]}),_jsx(`a`,{id:`error-code-provenance-synthetic-depiction-missing`}),_jsxs(Accordion,{title:`PROVENANCE_SYNTHETIC_DEPICTION_MISSING — correctable`,id:`provenance-synthetic-depiction-missing-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` assess the creative, set provenance.synthetic_depiction to true or false, and resubmit`]}),_jsxs(_components.p,{children:[`Seller’s `,_jsx(`code`,{children:`creative_policy.provenance_requirements.require_synthetic_depiction`}),` is true and the submitted creative’s resolved provenance (after inheritance) has no `,_jsx(`code`,{children:`synthetic_depiction`}),` boolean. Both `,_jsx(`code`,{children:`true`}),` and `,_jsx(`code`,{children:`false`}),` satisfy the requirement; absence means unassessed. Distinct from `,_jsx(`code`,{children:`PROVENANCE_REQUIRED`}),` (no provenance object at all) and from `,_jsx(`code`,{children:`PROVENANCE_CLAIM_CONTRADICTED`}),` (an independent verifier actively refuted a declared value). Recovery: correctable (assess the creative, set `,_jsx(`code`,{children:`provenance.synthetic_depiction`}),` to true or false, and resubmit). `,_jsx(`code`,{children:`error.field`}),` MUST point at the resolved `,_jsx(`code`,{children:`provenance.synthetic_depiction`}),` path. The declaration does not establish consent, legality, or verification.`]})]}),_jsx(`a`,{id:`error-code-provenance-verifier-not-accepted`}),_jsxs(Accordion,{title:`PROVENANCE_VERIFIER_NOT_ACCEPTED — correctable`,id:`provenance-verifier-not-accepted-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` replace verify_agent.agent_url with one from the seller’s published accepted_verifiers, drop verify_agent if the embedding is self-verifiable, or re-embed with a verifier the seller accepts`]}),_jsxs(_components.p,{children:[`Buyer attached a `,_jsx(`code`,{children:`verify_agent.agent_url`}),` on `,_jsx(`code`,{children:`embedded_provenance[]`}),` or `,_jsx(`code`,{children:`watermarks[]`}),` that does not match (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments) any entry in the seller’s `,_jsx(`code`,{children:`creative_policy.accepted_verifiers[].agent_url`}),`. The seller does not call buyer-asserted endpoints outside its allowlist; this is the cross-check that closes the buyer-controlled-URL trust gap. `,_jsx(`code`,{children:`error.field`}),` MUST point at the offending `,_jsx(`code`,{children:`verify_agent.agent_url`}),` path; `,_jsx(`code`,{children:`error.details`}),` SHOULD include a reference to the product whose `,_jsx(`code`,{children:`creative_policy.accepted_verifiers`}),` the buyer should consult (the buyer already has this from `,_jsx(`code`,{children:`get_products`}),`). Recovery: correctable (replace `,_jsx(`code`,{children:`verify_agent.agent_url`}),` with one from the seller’s published `,_jsx(`code`,{children:`accepted_verifiers`}),`, drop the `,_jsx(`code`,{children:`verify_agent`}),` entirely if the embedding is self-verifiable, or re-embed evidence using a verifier the seller accepts).`]})]}),_jsx(`a`,{id:`error-code-rate-limited`}),_jsxs(Accordion,{title:`RATE_LIMITED — transient`,id:`rate-limited-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` wait top-level error.retry_after seconds when present, then retry`]}),_jsxs(_components.p,{children:[`Request rate exceeded. Sellers SHOULD populate top-level `,_jsx(`code`,{children:`error.retry_after`}),` with the integer number of seconds to wait. Recovery: transient (wait `,_jsx(`code`,{children:`error.retry_after`}),` seconds when present, then retry).`]})]}),_jsx(`a`,{id:`error-code-read-only-scope`}),_jsxs(Accordion,{title:`READ_ONLY_SCOPE — correctable`,id:`read-only-scope-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` use a non-mutating alternative, or surface to the operator to request a scope that permits mutation`]}),_jsxs(_components.p,{children:[`The caller’s scope is read-only; the invoked task would mutate state and was rejected. Distinct from `,_jsx(`code`,{children:`SCOPE_INSUFFICIENT`}),` (task not in scope at all) — the task is in some scopes this seller supports, just not this caller’s. Recovery: correctable but not agent-autonomous — use a non-mutating alternative, or surface to the operator to request a scope that permits mutation.`]})]}),_jsx(`a`,{id:`error-code-reference-definition-changed`}),_jsxs(Accordion,{title:`REFERENCE_DEFINITION_CHANGED — correctable`,id:`reference-definition-changed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` refine the proposal so the seller re-resolves the pinned definitions and issues fresh pins, review the changed definition, then finalize and accept the new proposal`]}),_jsx(_components.p,{children:`A third-party-published definition pinned in a proposal’s commercial_terms.definition_pins[] (a publisher-catalog format option, publisher-catalog placement, adagents.json collection, or data-provider signal) no longer resolves to the pinned content_digest. Returned by accept_proposal, which re-verifies every pin before mutating any state, so no MediaBuy is created or amended. terms_digest can still verify because it covers the pin, not the definition the pin names. Error details SHOULD conform to error-details/reference-definition-changed.json: error.field names the failing pin (for example commercial_terms.definition_pins[2]) and details.current_content_digest carries the digest the definition resolves to now; one error is returned per drifted pin. Distinct from REFERENCE_NOT_FOUND (an identifier that does not exist or is inaccessible) and PROPOSAL_EXPIRED (the hold lapsed). The same drift found while finalizing is reported as an unable outcome with reason_code definition_changed and drifted_pins[] rather than as an error. A definition withdrawn from a successfully fetched document is drift and omits current_content_digest; a document that cannot be fetched or parsed is not drift and returns SERVICE_UNAVAILABLE instead. Because nothing was mutated, sellers SHOULD set error.mutation_outcome to not_applied. Recovery: correctable (re-run request_proposals or refine_proposals so the seller re-resolves the definitions and issues fresh pins, review the changed terms, and finalize again).`})]}),_jsx(`a`,{id:`error-code-reference-not-found`}),_jsxs(Accordion,{title:`REFERENCE_NOT_FOUND — correctable`,id:`reference-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify the referenced identifier exists and is accessible to the caller`]}),_jsx(_components.p,{children:`Generic fallback for a referenced identifier, grant, session, or other resource that does not exist or is not accessible by the caller. Use when no resource-specific not-found code applies (e.g., property lists, content standards, rights grants, SI offerings, proposals, catalogs, event sources, collection lists, brands, individual properties). Typed parameters that lack a dedicated standard code MUST also use REFERENCE_NOT_FOUND rather than minting a custom *_NOT_FOUND code. See ‘Uniform response for inaccessible references’ in error-handling.mdx for the full MUST list. Recovery: correctable. Summary of the uniform-response MUST: sellers MUST return the same response for ‘exists but the caller lacks access’ as for ‘does not exist’ across every observable channel — error.code/message/field/details (message MUST be generic; error.field MUST be identical across both cases on typed parameters); HTTP status, A2A task.status.state, and MCP isError; response headers (ETag, Cache-Control, per-type rate-limit buckets, CDN tags); side effects (webhook/audit writes, background-job enqueues, per-type quota counters, DB-shard routing); and observability (logs, APM spans, third-party error telemetry like Sentry/Datadog). Sellers MUST perform the same resolution-and-authorization work on both paths (resolve-then-authorize; on true-miss still run an authorization decision of equivalent shape against an empty principal set so authorizer latency is not a side channel). Cache population MUST NOT be gated on authorization. Polymorphism is evaluated against the tool-schema’s declared parameter shape before any lookup, and a tool’s declared shape MUST be identical across all callers.`})]}),_jsx(`a`,{id:`error-code-requote-required`}),_jsxs(Accordion,{title:`REQUOTE_REQUIRED — correctable`,id:`requote-required-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` use error.details.decline_reason when present to inform recovery, then refine accepted_proposal_id and apply the amendment through accept_proposal, or keep control_media_buy inside the accepted envelope; some policies require a free-text ask or human negotiation, and 3.1 compatibility callers must adjust or rediscover`]}),_jsx(_components.p,{children:`A control_media_buy request, or the 3.x update_media_buy facade, would exceed the accepted commercial envelope. The seller is declining the requested shape at the current terms. Distinct from TERMS_REJECTED (measurement) and POLICY_VIOLATION (content). Error details SHOULD conform to error-details/requote-required.json: populate envelope_field with the field path(s) that breached the envelope, change_term_id when an accepted change term governed the request, and decline_reason when a structured seller-policy reason is available and safe to disclose. All producer-authored explanatory text, including message, suggestion, and extension detail values, MUST remain buyer-safe and MUST NOT contain vendor identifiers, internal object names, internal IDs, stack traces, or other producer-private implementation details. AdCP 3.2 callers refine the MediaBuy’s accepted_proposal_id to obtain a typed amendment; legacy 3.1 callers adjust the update, rediscover terms, or create a separate buy.`})]}),_jsx(`a`,{id:`error-code-rights-channel-violation`}),_jsxs(Accordion,{title:`RIGHTS_CHANNEL_VIOLATION — correctable`,id:`rights-channel-violation-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — inspect error.details.rights_id and the requested channel against rights[].channels / excluded_channels; target a capability on a permitted channel, confirm the rights entry applies to this output, or have the holder grant the channel (a human or holder action)`]}),_jsx(_components.p,{children:`Advisory. A creative’s rights[] channels / excluded_channels restriction (core/rights-constraint.json) does not permit the media channel of the requested output, so building it would produce a derivative the rights grant does not allow to run there. Creative agents SHOULD check rights[].channels against the channel each requested target capability serves (for example its applies_to_channels, where declared) before generating, and SHOULD surface this code rather than silently building; the restriction is advisory in 3.3, so a creative agent MAY proceed and attach this code as a non-terminal entry in errors[] on an otherwise-successful build, or MAY decline the affected output with a terminal error. error.field SHOULD point at the offending rights entry (e.g. creative_manifest.rights[0].excluded_channels, or creative_manifests[N].rights[i].channels for a multi-capability build) and error.details SHOULD include rights_id, the requested channel, and capability_id when the build named one. Distinct from CREATIVE_REJECTED (content-policy or brand-safety review) and from the governance plan channel check, which is a hard check by the governance agent. Recovery: correctable (target a capability whose channel the grant permits, confirm the rights entry applies to this output, or have the holder grant the channel; the last is a human or holder action, not an autonomous retry). Advisory in 3.3 and may tighten while the surface is experimental.`})]}),_jsx(`a`,{id:`error-code-scope-insufficient`}),_jsxs(Accordion,{title:`SCOPE_INSUFFICIENT — correctable`,id:`scope-insufficient-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` the agent cannot broaden its own scope - surface to the operator rather than auto-retry`]}),_jsxs(_components.p,{children:[`The authenticated caller is not authorized for the invoked task — the task is not in the caller’s `,_jsx(`code`,{children:`allowed_tasks`}),` for this account (discoverable via the `,_jsx(`code`,{children:`authorization`}),` object on sync_accounts / list_accounts responses). Distinct from `,_jsx(`code`,{children:`PERMISSION_DENIED`}),` (generic authz failure, often credential-shaped) by being narrowly about task-level scope. Sellers SHOULD populate `,_jsx(`code`,{children:`error.details.introspection_hint`}),` pointing at where the caller can re-read its scope (strawman: `,_jsx(`code`,{children:`{ task: 'list_accounts', account: {...} }`}),`). Recovery: correctable in the sense that the request can be re-sent after the scope is broadened, but the agent cannot broaden its own scope — this requires operator intervention, and agents SHOULD surface rather than auto-retry.`]})]}),_jsx(`a`,{id:`error-code-service-unavailable`}),_jsxs(Accordion,{title:`SERVICE_UNAVAILABLE — transient`,id:`service-unavailable-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` retry with exponential backoff`]}),_jsx(_components.p,{children:`Seller service is temporarily unavailable. Retry with exponential backoff. Recovery: transient.`})]}),_jsx(`a`,{id:`error-code-session-not-found`}),_jsxs(Accordion,{title:`SESSION_NOT_FOUND — correctable`,id:`session-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` initiate a new session via si_initiate_session`]}),_jsx(_components.p,{children:`SI session ID is invalid, expired, or does not exist. Recovery: correctable (initiate a new session via si_initiate_session).`})]}),_jsx(`a`,{id:`error-code-session-terminated`}),_jsxs(Accordion,{title:`SESSION_TERMINATED — correctable`,id:`session-terminated-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` initiate a new session via si_initiate_session`]}),_jsx(_components.p,{children:`SI session has already been terminated and cannot accept further messages. Recovery: correctable (initiate a new session via si_initiate_session).`})]}),_jsx(`a`,{id:`error-code-signal-not-found`}),_jsxs(Accordion,{title:`SIGNAL_NOT_FOUND — correctable`,id:`signal-not-found-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify signal_id via get_signals, or confirm the signal is available from this agent`]}),_jsx(_components.p,{children:`Referenced signal does not exist in the agent’s catalog. Recovery: correctable (verify signal_ref via get_signals, or confirm the signal is available from this agent). Sellers MUST return this code uniformly for any signal_ref not accessible to the calling account — never distinguish ‘exists but unauthorized’ from ‘does not exist’, which would enable cross-tenant enumeration.`})]}),_jsx(`a`,{id:`error-code-signal-targeting-incompatible`}),_jsxs(Accordion,{title:`SIGNAL_TARGETING_INCOMPATIBLE — correctable`,id:`signal-targeting-incompatible-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` assign the creative to a package whose signal targeting matches the creative’s signal_condition, or rebuild the creative for the package’s condition; match on shared signal_ref identity (compare signal_agent_segment_id exactly when both carry it, else categorical signal_ref + value)`]}),_jsx(_components.p,{children:`A creative carrying a signal_condition (from build_creative signal_conditions fan-out, #5240) was assigned to a package whose signal targeting is incompatible — e.g. a sun creative routed to a rain-targeted package. The trafficking-compatibility invariant: a creative built FOR one signal condition MUST NOT serve into a package targeting an incompatible condition. Enforced reject-at-trafficking on the sales side (create_media_buy / sync_creatives), NOT at build_creative (per #5280, signal pointers are advisory at the build layer; enforcement lives at the trafficking boundary). Compatibility is matched on shared signal_ref identity: when both sides carry signal_agent_segment_id, compare the opaque handle exactly; when both carry only categorical {signal_id,value}, compare signal_ref + value-set semantics; equal categorical labels from DIFFERENT providers are NOT compatible absent an explicit equivalence mechanism; when one side has a segment handle and the other only a categorical value, the seller MAY accept only if it can resolve both to the same provider-issued segment, else reject/warn. For value_type:numeric the comparison is range-overlap (WG-open: range-overlap vs exact-match — see RFC #5240 open decisions). error.field SHOULD point at the offending assignment path (e.g. packages[N].creative_assignments[M] or creatives[N]); error.details SHOULD carry the creative’s signal_condition and the package’s incompatible signal targeting so the buyer can re-route. Distinct from SIGNAL_NOT_FOUND (signal unknown/inaccessible) by being a compatibility mismatch between a known creative condition and a known package condition. Recovery: correctable (assign the creative to a package whose signal targeting matches its signal_condition, or rebuild for the package’s condition).`})]}),_jsx(`a`,{id:`error-code-signed-response-envelope-expired`}),_jsxs(Accordion,{title:`SIGNED_RESPONSE_ENVELOPE_EXPIRED — transient`,id:`signed-response-envelope-expired-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` re-invoke the designated task (verify_brand_claim or verify_brand_claims) to obtain a freshly signed response with a current exp window`]}),_jsxs(_components.p,{children:[`The `,_jsx(`code`,{children:`signed_response.payload.exp`}),` timestamp is at or past the current time after applying the verifier’s clock-skew tolerance. The signed envelope was valid when issued but the verification window has closed. Raised by verifiers consuming a designated-task signed response (`,_jsx(`code`,{children:`verify_brand_claim`}),` / `,_jsx(`code`,{children:`verify_brand_claims`}),`) during step 7 of the `,_jsx(_components.a,{href:`/docs/building/by-layer/L1/security#verifier-checklist-responses`,children:`response-signing verifier checklist`}),`. Online verifiers MUST reject expired envelopes; audit verifiers MAY verify after `,_jsx(`code`,{children:`exp`}),` as historical evidence that the brand-agent signed the payload during the stated `,_jsx(`code`,{children:`iat`}),`/`,_jsx(`code`,{children:`exp`}),` window, but MUST NOT treat the result as current truth. Distinct from `,_jsx(`code`,{children:`STALE_RESPONSE`}),` (cache-staleness advisory on a populated success payload) by being a cryptographic freshness failure on a signed response envelope. Recovery: transient (re-invoke the designated task to obtain a freshly signed response with a current `,_jsx(`code`,{children:`exp`}),` window).`]})]}),_jsx(`a`,{id:`error-code-signed-response-request-hash-mismatch`}),_jsxs(Accordion,{title:`SIGNED_RESPONSE_REQUEST_HASH_MISMATCH — correctable`,id:`signed-response-request-hash-mismatch-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` re-invoke the designated task with the intended request parameters — the signed response’s request_hash does not match the verifier’s recomputed hash of the actual request; if the mismatch persists across retries, investigate JCS request-binding canonicalization between caller and responder`]}),_jsxs(_components.p,{children:[`The `,_jsx(`code`,{children:`signed_response.payload.request_hash`}),` does not match the verifier’s recomputed SHA-256 hash of the canonical request-binding object `,_jsx(`code`,{children:`{ task, brand_domain, agent_url, caller_identity, request }`}),` for the actual request sent. Raised during step 8 of the `,_jsx(_components.a,{href:`/docs/building/by-layer/L1/security#verifier-checklist-responses`,children:`response-signing verifier checklist`}),`. This indicates either a replay of a signed response from a different request, a JCS request-binding canonicalization divergence between signer and verifier, or payload tampering. Verifiers MUST reject the envelope when the recomputed hash does not byte-match the signed `,_jsx(`code`,{children:`request_hash`}),`. `,_jsx(`code`,{children:`error.details`}),` SHOULD carry `,_jsx(`code`,{children:`expected_request_hash`}),` (the verifier’s recomputed value) when safe to disclose — the hash binds the response to the exact request that produced it, and divergence is the signal that the binding has been broken. Recovery: correctable (re-invoke the designated task with the intended request parameters; if the mismatch persists across retries, investigate JCS request-binding canonicalization between the caller and the responding agent).`]})]}),_jsx(`a`,{id:`error-code-signed-response-tenant-mismatch`}),_jsxs(Accordion,{title:`SIGNED_RESPONSE_TENANT_MISMATCH — correctable`,id:`signed-response-tenant-mismatch-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` verify the request targeted the correct brand domain and agent_url, then re-invoke; if the mismatch persists, the responding agent’s server-side tenant resolution may be misconfigured`]}),_jsxs(_components.p,{children:[`The `,_jsx(`code`,{children:`signed_response.payload.brand_domain`}),` does not match the verifier’s resolved or expected brand tenant for this verification call. Raised during step 9 of the `,_jsx(_components.a,{href:`/docs/building/by-layer/L1/security#verifier-checklist-responses`,children:`response-signing verifier checklist`}),`. The responding brand agent derives `,_jsx(`code`,{children:`brand_domain`}),` from server-side tenant resolution, not from caller-supplied request fields (per the response-signing profile in security.mdx), so a mismatch indicates cross-tenant replay, a multi-brand agent routing error, or a mismatch between the verifier’s tenant resolution and the responder’s. Distinct from `,_jsx(`code`,{children:`SIGNED_RESPONSE_REQUEST_HASH_MISMATCH`}),` (request-binding divergence) by being narrowly about the tenant identity — `,_jsx(`code`,{children:`brand_domain`}),` is a field inside the signed payload that the responder derives independently, not an echo of any caller-supplied value. Recovery: correctable (verify that the request targeted the correct brand domain and agent; re-invoke with the correct brand reference if the request was mis-routed; if the mismatch persists, the responding agent’s server-side tenant resolution may be misconfigured).`]})]}),_jsx(`a`,{id:`error-code-source-access-failed`}),_jsxs(Accordion,{title:`SOURCE_ACCESS_FAILED — correctable`,id:`source-access-failed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` error.field source.locator/source.segment_ref: fix the reference; error.field source: grant the seller’s declared consumer identity and retry; no error.field: vendor outage, retry with backoff`]}),_jsx(_components.p,{children:`Seller could not read an external audience source on sync_audiences (experimental, media_buy.audience_activation). Per-audience: surfaces as action: failed with this code in the audience’s errors array. The seller cannot reliably distinguish a revoked grant from an expired one from a transient vendor outage — all three observables are a failed read — so error.field distinguishes what the buyer can act on: ‘source.locator’ or ‘source.segment_ref’ means the reference does not resolve (changed request needed); ‘source’ means access denied (establish or re-grant access to the seller’s declared consumer identity, then retry); absence of error.field indicates a vendor-side failure (retry with backoff, no buyer action). On an already-ready audience a failed re-read MUST NOT change audience status — membership stays frozen at the last successful read and source.access_status reports ‘unavailable’. Recovery: correctable (fix the reference or grant per error.field; vendor outages without error.field are transient and retry with backoff).`})]}),_jsx(`a`,{id:`error-code-stale-response`}),_jsxs(Accordion,{title:`STALE_RESPONSE — transient`,id:`stale-response-transient`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` advisory — emitted alongside a populated payload that was served from cache past the seller’s freshness target because an upstream or sub-agent was unreachable. The response is usable; treat as non-fatal. Inspect `,_jsx(`code`,{children:`error.details.cache_age_seconds`}),` to decide whether to immediately retry for fresh data or accept the cached value; the seller’s own service is healthy, so retry is safe (it does not amplify the upstream failure)`]}),_jsxs(_components.p,{children:[`Non-fatal advisory raised when the seller’s live fetch to an upstream or sub-agent failed (timeout, connection error, downstream 5xx) and the response payload was satisfied from a cached prior result that is past the seller’s freshness target for this surface. Emitted `,_jsx(_components.strong,{children:`alongside`}),` a populated success payload — the caller’s request still completes from a usable cache hit; this code tells downstream consumers that the data is older than the seller would normally serve.`]}),_jsxs(_components.p,{children:[`Distinct from `,_jsx(`code`,{children:`SERVICE_UNAVAILABLE`}),` (seller’s own service is down, no payload — transient, retry-with-backoff) by signalling `,_jsx(_components.strong,{children:`graceful degradation`}),`: the seller’s own service is fine, but one of its dependencies is currently unreachable and the seller chose to honor the request from cache rather than return empty. Sellers MUST emit `,_jsx(`code`,{children:`STALE_RESPONSE`}),` ONLY when the response payload is non-empty AND derived from a cache entry whose `,_jsx(`code`,{children:`cache_age_seconds`}),` exceeds the surface’s freshness target. When no cached entry exists (or the cache hit is within freshness target), sellers MUST NOT emit this code — return the empty-or-fresh response with whatever upstream-failure code applies (e.g., `,_jsx(`code`,{children:`SERVICE_UNAVAILABLE`}),`).`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Wire placement (normative).`}),` Transport-level success markers stay flipped to success (HTTP 200, MCP `,_jsx(`code`,{children:`isError: false`}),`, A2A `,_jsx(`code`,{children:`succeeded`}),`) — the task ran successfully and produced a response, even if from cache. The advisory rides in `,_jsx(`code`,{children:`errors[]`}),` on the payload and MUST NOT be promoted to `,_jsx(`code`,{children:`adcp_error`}),` on the envelope (envelope-level errors are reserved for the empty-payload failure case per the two-layer model in `,_jsx(`code`,{children:`error-handling.mdx#envelope-vs-payload-errors-the-two-layer-model`}),`). `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the affected payload path (e.g., `,_jsx(`code`,{children:`formats`}),` for `,_jsx(`code`,{children:`list_creative_formats`}),`, `,_jsx(`code`,{children:`products`}),` for `,_jsx(`code`,{children:`get_products`}),`). `,_jsx(`code`,{children:`error.details`}),` SHOULD conform to `,_jsx(`code`,{children:`error-details/stale-response.json`}),` — `,_jsx(`code`,{children:`served_from_cache`}),` (required, always `,_jsx(`code`,{children:`true`}),`), `,_jsx(`code`,{children:`cache_age_seconds`}),` (required), and optionally `,_jsx(`code`,{children:`freshness_target_seconds`}),`, `,_jsx(`code`,{children:`upstream`}),` (the dependency that failed), and `,_jsx(`code`,{children:`original_error`}),` (the underlying failure code/message).`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multiple stale upstreams.`}),` When N sub-agents are stale (e.g., a `,_jsx(`code`,{children:`list_creative_formats`}),` registry aggregating from multiple creative agents), the seller SHOULD emit `,_jsxs(_components.strong,{children:[`one `,_jsx(`code`,{children:`STALE_RESPONSE`}),` entry per affected upstream`]}),` rather than aggregating — the per-upstream shape mirrors the existing precedent set by `,_jsx(`code`,{children:`PIXEL_TRACKER_LOSSY_DOWNGRADE`}),` (one advisory per downgraded asset) and lets buyer agents reason about which sub-population of the payload is stale. Each entry’s `,_jsx(`code`,{children:`error.field`}),` SHOULD narrow to the affected slice (e.g., `,_jsx(`code`,{children:`formats`}),` for formats sourced from the stale upstream).`]}),_jsxs(_components.p,{children:[`Recovery: transient — buyers MUST treat as non-fatal (the response is usable), MAY immediately retry later for fresh data, and SHOULD surface staleness to operators or end users when relevant. `,_jsx(`code`,{children:`cache_age_seconds`}),` is the informational knob for the buyer’s own “is this stale enough to bother retrying” policy.`]})]}),_jsx(`a`,{id:`error-code-terms-rejected`}),_jsxs(Accordion,{title:`TERMS_REJECTED — correctable`,id:`terms-rejected-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` adjust the proposed terms and retry, or omit measurement_terms to accept the product’s defaults`]}),_jsx(_components.p,{children:`Buyer-proposed measurement_terms were rejected by the seller. The error details SHOULD identify which specific term was rejected and the seller’s acceptable range or supported vendors. Recovery: correctable (adjust the proposed terms and retry, or omit measurement_terms to accept the product’s defaults).`})]}),_jsx(`a`,{id:`error-code-unpriceable-output`}),_jsxs(Accordion,{title:`UNPRICEABLE_OUTPUT — correctable`,id:`unpriceable-output-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` target an output format the transformer prices, or have the seller add a pricing option covering it`]}),_jsx(_components.p,{children:`A creative transformer build targets an output capability that no pricing option covers — no transformer.pricing_options entry has a matching applies_to_output_capability_ids and none is unscoped. The build is rejected rather than billed at a guessed rate. Recovery: correctable.`})]}),_jsx(`a`,{id:`error-code-unsupported-feature`}),_jsxs(Accordion,{title:`UNSUPPORTED_FEATURE — correctable`,id:`unsupported-feature-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` check get_adcp_capabilities (or the product’s overlay_support for a rejected targeting dimension), remove unsupported fields, and use details.replacement_dimension when present`]}),_jsxs(_components.p,{children:[`A requested feature or field is not supported by this seller. When rejecting a `,_jsx(`code`,{children:`refine_proposals`}),` request that uses a typed dimension omitted from an explicit `,_jsx(`code`,{children:`proposal_refinement.supported_dimensions`}),` declaration, the error details SHOULD follow `,_jsx(`code`,{children:`error-details/unsupported-refinement-dimension.json`}),` — `,_jsx(`code`,{children:`unsupported_dimension`}),` names the offending dimension and `,_jsx(`code`,{children:`supported_dimensions`}),` echoes the seller’s declaration so the buyer can remove or translate the field without another capability round trip. When rejecting a targeting dimension that is unsupported for the product or seller, or has been removed, the error details SHOULD follow `,_jsx(`code`,{children:`error-details/unsupported-targeting-dimension.json`}),` (`,_jsx(`code`,{children:`unsupported_dimension`}),`, optional `,_jsx(`code`,{children:`supported_dimensions`}),`, `,_jsx(`code`,{children:`deprecated`}),`, `,_jsx(`code`,{children:`replacement_dimension`}),`) and `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the targeting path. Recovery: correctable (check get_adcp_capabilities (or the product’s overlay_support for a rejected targeting dimension), remove unsupported fields, and use details.replacement_dimension when present).`]})]}),_jsx(`a`,{id:`error-code-unsupported-granularity`}),_jsxs(Accordion,{title:`UNSUPPORTED_GRANULARITY — correctable`,id:`unsupported-granularity-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` pick a granularity from the product’s reporting_capabilities.windowed_pull_granularities (via get_adcp_capabilities) and resubmit, or omit time_granularity to fall back to cumulative date-range pulls`]}),_jsxs(_components.p,{children:[`The requested `,_jsx(`code`,{children:`time_granularity`}),` on `,_jsx(`code`,{children:`get_media_buy_delivery`}),` is not in the product’s declared `,_jsx(`code`,{children:`reporting_capabilities.windowed_pull_granularities`}),`. Distinct from `,_jsx(`code`,{children:`UNSUPPORTED_FEATURE`}),` (generic capability mismatch) by being narrowly about reporting-window granularity — the buyer asked for hourly pull-recovery on a product that only honors daily pulls, for example. Sellers MAY echo the declared set in `,_jsx(`code`,{children:`error.details.supported_granularities`}),` when the caller is authorized to read the product’s reporting capabilities — the same set is already available via `,_jsx(`code`,{children:`get_adcp_capabilities`}),`, so the echo is a convenience, not load-bearing. Sellers MUST NOT echo a granularity set the caller could not otherwise read (per-product capability views vary by buyer entitlement). The `,_jsx(`code`,{children:`error.field`}),` SHOULD point at `,_jsx(`code`,{children:`time_granularity`}),`. Buyers that need higher-frequency recovery than the seller’s pull set supports MUST rely on the webhook channel as primary at that frequency — the seller’s `,_jsx(`code`,{children:`available_reporting_frequencies`}),` may legitimately exceed `,_jsx(`code`,{children:`windowed_pull_granularities`}),` (e.g., a stream-tap webhook on Kafka with warehouse pulls only at daily). Recovery: correctable (re-issue at a granularity in the declared set, or omit `,_jsx(`code`,{children:`time_granularity`}),` to fall back to cumulative date-range pulls).`]})]}),_jsx(`a`,{id:`error-code-unsupported-provisioning`}),_jsxs(Accordion,{title:`UNSUPPORTED_PROVISIONING — correctable`,id:`unsupported-provisioning-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` re-issue with the entry shape the seller supports — `,_jsx(`code`,{children:`account: {account_id: ...}`}),` for settings-update sellers with account-id namespaces, or `,_jsx(`code`,{children:`brand+operator+billing`}),` for provisioning sellers; check seller documentation or capability declaration for which modes are implemented`]}),_jsxs(_components.p,{children:[`The seller does not support the `,_jsx(`code`,{children:`sync_accounts`}),` mode the entry requested. Returned per-entry in the `,_jsx(`code`,{children:`sync_accounts`}),` response when (a) an entry keyed by the natural-key trio (`,_jsx(`code`,{children:`brand`}),` + `,_jsx(`code`,{children:`operator`}),` + `,_jsx(`code`,{children:`billing`}),`) is sent to a seller that does not provision accounts via AdCP — typical for account-id namespaces where accounts are pre-provisioned out of band or discovered via `,_jsx(`code`,{children:`list_accounts`}),`; or (b) an entry keyed by `,_jsx(`code`,{children:`account`}),` (AccountRef) is sent to a seller that has not implemented the settings-update mode. Distinct from `,_jsx(`code`,{children:`UNSUPPORTED_FEATURE`}),` (generic capability mismatch) by being narrowly about which of the two `,_jsx(`code`,{children:`sync_accounts`}),` modes the seller implements. The two modes are mutually exclusive per-entry — the seller MUST NOT silently downgrade or upgrade between them. Sellers MAY declare which modes they implement via `,_jsx(`code`,{children:`get_adcp_capabilities`}),` (forward-looking — capability declaration shape is open). Recovery: correctable (re-issue with the entry shape the seller supports; for account-id namespaces that expose settings updates, that means `,_jsx(`code`,{children:`account: {account_id: ...}`}),` entries; for sellers that only provision via natural key that means the flat `,_jsx(`code`,{children:`brand+operator+billing`}),` shape). The `,_jsx(`code`,{children:`error.field`}),` SHOULD point at the entry index where the unsupported shape was found.`]})]}),_jsx(`a`,{id:`error-code-validation-error`}),_jsxs(Accordion,{title:`VALIDATION_ERROR — correctable`,id:`validation-error-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` review error details and fix field values`]}),_jsx(_components.p,{children:`Request contains invalid field values or violates business rules beyond schema validation. Recovery: correctable (review error details and fix field values).`})]}),_jsx(`a`,{id:`error-code-vast-parse-failed`}),_jsxs(Accordion,{title:`VAST_PARSE_FAILED — correctable`,id:`vast-parse-failed-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` inspect error.details.reason (not_xml, no_vast_root, no_ad, no_media_file), fix the VAST document, and resubmit`]}),_jsxs(_components.p,{children:[`A submitted `,_jsx(`code`,{children:`vast`}),` asset failed document-level validation: the inline `,_jsx(`code`,{children:`content`}),` (or the document fetched from `,_jsx(`code`,{children:`url`}),`) is not well-formed XML, has no `,_jsx(`code`,{children:`\u003cVAST>`}),` root element, contains no `,_jsx(`code`,{children:`\u003cAd>`}),` element, or an `,_jsx(`code`,{children:`\u003cInLine>`}),` linear creative carries no `,_jsx(`code`,{children:`\u003cMediaFile>`}),`. Returned by sellers that declare `,_jsx(`code`,{children:`creative_specs.vast_validation`}),` of `,_jsx(`code`,{children:`document`}),` or `,_jsx(`code`,{children:`wrapper`}),`; sellers at the default `,_jsx(`code`,{children:`structural`}),` level do not inspect the VAST document and MUST NOT return this code. Distinct from `,_jsx(`code`,{children:`VALIDATION_ERROR`}),` (manifest-level format validation): the manifest was structurally valid, the VAST document inside it was not. Sellers SHOULD set `,_jsx(`code`,{children:`error.field`}),` to the offending asset path and SHOULD populate `,_jsx(`code`,{children:`error.details.reason`}),` with one of `,_jsx(`code`,{children:`not_xml`}),`, `,_jsx(`code`,{children:`no_vast_root`}),`, `,_jsx(`code`,{children:`no_ad`}),`, `,_jsx(`code`,{children:`no_media_file`}),`. Unresolved ad-server macros in URLs (`,_jsx(`code`,{children:`[MACRO]`}),`, `,_jsx(`code`,{children:\"${MACRO}\"}),`, `,_jsx(`code`,{children:`{UNIVERSAL_MACRO}`}),`) are opaque tokens, not parse failures. Recovery: correctable (fix the VAST document and resubmit).`]})]}),_jsx(`a`,{id:`error-code-vast-version-mismatch`}),_jsxs(Accordion,{title:`VAST_VERSION_MISMATCH — correctable`,id:`vast-version-mismatch-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` inspect error.details.mismatch_reason and the corresponding acceptance-set or observed-document fields; select a compatible source representation or correct the offending VAST document`]}),_jsxs(_components.p,{children:[`A submitted `,_jsx(`code`,{children:`vast`}),` asset is version-incompatible when its exact `,_jsx(`code`,{children:`vast_version`}),` is absent from the intersection of the selected product format option’s `,_jsx(`code`,{children:`params.vast_versions`}),` and the seller’s `,_jsx(`code`,{children:`execution.creative_specs.vast_versions`}),`, or when an inspected document violates its applicable VAST version rule. Modern `,_jsx(`code`,{children:`error.details`}),` MUST conform to `,_jsx(`code`,{children:`error-details/vast-version-mismatch.json`}),`: acceptance failures carry `,_jsx(`code`,{children:`mismatch_reason: asset_outside_acceptance`}),`, `,_jsx(`code`,{children:`asset_vast_version`}),`, `,_jsx(`code`,{children:`product_vast_versions`}),`, and `,_jsx(`code`,{children:`seller_vast_versions`}),`, plus `,_jsx(`code`,{children:`format_option_ref`}),` only when the selected option is addressable; inspected-document failures carry `,_jsx(`code`,{children:`mismatch_reason: document_version_mismatch`}),`, `,_jsx(`code`,{children:`asset_vast_version`}),`, `,_jsx(`code`,{children:`observed_document_vast_version`}),`, and `,_jsx(`code`,{children:`document_role`}),`. Only the submitted document is compared for equality with the asset declaration; wrapper and terminal documents are checked against the acceptance intersection. The deprecated `,_jsx(`code`,{children:`supported_versions`}),` field remains accepted for older 3.x peers. Distinct from `,_jsx(`code`,{children:`VERSION_UNSUPPORTED`}),`, which concerns AdCP protocol negotiation. Recovery: correctable (select a source VAST representation in the compatibility intersection or correct the offending document; never relabel the asset).`]})]}),_jsx(`a`,{id:`error-code-vast-wrapper-depth-exceeded`}),_jsxs(Accordion,{title:`VAST_WRAPPER_DEPTH_EXCEEDED — correctable`,id:`vast-wrapper-depth-exceeded-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` inspect error.details.reason (depth, loop, timeout); flatten the wrapper chain, reduce redirects below the format’s max_wrapper_depth, or fix the failing hop`]}),_jsxs(_components.p,{children:[`Resolving a `,_jsx(`code`,{children:`vast`}),` asset’s wrapper chain failed: the chain exceeded the format’s declared `,_jsx(`code`,{children:`max_wrapper_depth`}),`, revisited a `,_jsx(`code`,{children:`VASTAdTagURI`}),` already seen in the chain (a loop), or a hop did not resolve within the seller’s per-hop timeout. Returned by sellers that declare `,_jsx(`code`,{children:`creative_specs.vast_validation: \"wrapper\"`}),`. Sellers SHOULD set `,_jsx(`code`,{children:`error.field`}),` to the offending asset path and SHOULD populate `,_jsx(`code`,{children:`error.details.reason`}),` with one of `,_jsx(`code`,{children:`depth`}),`, `,_jsx(`code`,{children:`loop`}),`, `,_jsx(`code`,{children:`timeout`}),`, plus `,_jsx(`code`,{children:`error.details.depth`}),` with the depth reached. Recovery: correctable (flatten the chain, reduce redirects below the format’s `,_jsx(`code`,{children:`max_wrapper_depth`}),`, or fix the failing hop).`]})]}),_jsx(`a`,{id:`error-code-version-unsupported`}),_jsxs(Accordion,{title:`VERSION_UNSUPPORTED — correctable`,id:`version-unsupported-correctable`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Suggested action:`}),` re-pin to a release in supported_versions and retry, or call get_adcp_capabilities without a version pin to discover supported_versions`]}),_jsxs(_components.p,{children:[`The declared adcp_version (release-precision) or adcp_major_version (deprecated) is not supported by this seller. The error details SHOULD follow `,_jsx(`code`,{children:`error-details/version-unsupported.json`}),` — `,_jsx(`code`,{children:`supported_versions`}),` (release-precision strings) is authoritative for retry; `,_jsx(`code`,{children:`supported_majors`}),` is deprecated. Recovery: correctable (re-pin to a release in supported_versions and retry; or call get_adcp_capabilities without a version pin to discover supported_versions).`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`protocols`,children:`Protocols`}),`\n`,_jsxs(_components.p,{children:[`Top-level agent capability claims. An agent claims a protocol by listing it in `,_jsx(_components.code,{children:`supported_protocols`}),` and must pass the protocol’s baseline storyboard plus every `,_jsx(_components.a,{href:`/dist/docs/3.2.6/building/verification/validate-your-agent#storyboard-taxonomy`,children:`universal`}),` storyboard.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`supported_protocols`}),` uses snake_case; compliance paths and specialism IDs use kebab-case. See `,_jsx(_components.a,{href:`#naming-conventions`,children:`Naming conventions`}),` below for the full mapping.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsxs(_components.th,{children:[_jsx(_components.code,{children:`supported_protocols`}),` value`]}),_jsx(_components.th,{children:`Compliance path`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`media_buy`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`protocols/media-buy/`})}),_jsx(_components.td,{children:`Campaign creation, package management, delivery optimization, conversion tracking`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`protocols/creative/`})}),_jsx(_components.td,{children:`Creative asset management, format discovery, rendering`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`signals`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`protocols/signals/`})}),_jsx(_components.td,{children:`Audience signal discovery and activation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`protocols/governance/`})}),_jsx(_components.td,{children:`Property governance, brand standards, compliance`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`brand`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`protocols/brand/`})}),_jsxs(_components.td,{children:[`Brand identity, rights discovery, rights acquisition `,_jsxs(_components.em,{children:[`— small protocol today, growing with rights licensing work; see `,_jsx(_components.code,{children:`brand-rights`}),` specialism.`]})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sponsored_intelligence`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`protocols/sponsored-intelligence/`})}),_jsx(_components.td,{children:`AI-mediated commerce and conversational sponsored experiences`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`measurement`})}),_jsx(_components.td,{children:`Preview / no stable baseline`}),_jsxs(_components.td,{children:[`Experimental 3.1 metric-catalog discovery. Agents implementing it must list `,_jsx(_components.code,{children:`measurement.core`}),` in `,_jsx(_components.code,{children:`experimental_features`}),`.`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Support for the `,_jsx(_components.a,{href:`/dist/docs/3.2.6/building/by-layer/L3/comply-test-controller`,children:`compliance test controller`}),` is declared via the `,_jsx(_components.code,{children:`capabilities.compliance_testing`}),` block on `,_jsx(_components.a,{href:`/dist/docs/3.2.6/protocol/get_adcp_capabilities`,children:_jsx(_components.code,{children:`get_adcp_capabilities`})}),`, not via `,_jsx(_components.code,{children:`supported_protocols`}),`. Compliance testing is an RPC surface for the test harness, not a functional protocol.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`An agent can claim multiple protocols — a full-stack media-buy platform might list `,_jsx(_components.code,{children:`media_buy`}),`, `,_jsx(_components.code,{children:`creative`}),`, and `,_jsx(_components.code,{children:`signals`}),`. The runner executes all matching baselines.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`specialisms`,children:`Specialisms`}),`\n`,_jsxs(_components.p,{children:[`Specific capability claims. Each specialism lives under exactly one protocol. An agent claiming a specialism must pass the specialism’s storyboard in addition to the parent protocol’s baseline — e.g. claiming `,_jsx(_components.code,{children:`sales-guaranteed`}),` requires `,_jsx(_components.code,{children:`media_buy`}),` in `,_jsx(_components.code,{children:`supported_protocols`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Specialisms carry a `,_jsx(_components.code,{children:`status`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`stable`})}),` — fully specified storyboard. Compliance runner executes every phase; `,_jsx(_components.code,{children:`AAO Verified`}),` means the agent demonstrably passed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`preview`})}),` — ID and scope are reserved; the storyboard is a placeholder while the underlying protocol surface stabilizes. Agents may claim these; the runner emits a result of `,_jsx(_components.code,{children:`{ status: \"preview\", passed: null, reason: \"storyboard not yet defined\" }`}),` instead of a verified pass/fail. AAO badges render preview specialisms with a distinct indicator.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`deprecated`})}),` — retained for backward compatibility but scheduled for removal in a future major. Runner emits `,_jsx(_components.code,{children:`{ status: \"deprecated\", passed: \u003cboolean>, reason: \"...\" }`}),` — still executes the storyboard if one exists, but warns the claim should be migrated.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Status is declared per-specialism in the YAML frontmatter and surfaced in `,_jsx(_components.code,{children:`/compliance/{version}/index.json`}),`.`]}),`\n`,_jsx(_components.p,{children:`Specialisms are grouped below by parent protocol.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`What changed in 3.0.`}),` `,_jsx(_components.code,{children:`sponsored_intelligence`}),` was promoted from a specialism to a full protocol (declare it in `,_jsx(_components.code,{children:`supported_protocols`}),`, not `,_jsx(_components.code,{children:`specialisms`}),`). `,_jsx(_components.code,{children:`audience-sync`}),` moved from `,_jsx(_components.code,{children:`governance`}),` to `,_jsx(_components.code,{children:`media-buy`}),` to match its tool family. `,_jsx(_components.code,{children:`broadcast-platform`}),` was renamed to `,_jsx(_components.code,{children:`sales-broadcast-tv`}),` and `,_jsx(_components.code,{children:`social-platform`}),` to `,_jsx(_components.code,{children:`sales-social`}),`. `,_jsx(_components.code,{children:`property-governance`}),` and `,_jsx(_components.code,{children:`collection-governance`}),` split into sibling `,_jsx(_components.code,{children:`property-lists`}),` and `,_jsx(_components.code,{children:`collection-lists`}),` specialisms.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`media-buy`,children:`media-buy`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-guaranteed`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Guaranteed media buys with human IO approval`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-non-guaranteed`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Non-guaranteed auction-based media buys`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-proposal-mode`})}),_jsx(_components.td,{children:`deprecated`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Deprecated in 3.1.`}),` Drop this claim and replace with `,_jsx(_components.code,{children:`sales-guaranteed`}),` + `,_jsx(_components.code,{children:`media_buy.supports_proposals: true`}),`. See `,_jsx(_components.a,{href:`https://github.com/adcontextprotocol/adcp/issues/3823`,children:`#3823`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-catalog-driven`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Catalog-driven commerce with conversion tracking`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-broadcast-tv`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Broadcast linear TV with guaranteed inventory and FCC cancellation rules`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-dooh`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Digital out-of-home, non-guaranteed venue and screen inventory`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-social`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Social media advertising platform with self-service flows`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance-aware-seller`})}),_jsx(_components.td,{children:`stable`}),_jsxs(_components.td,{children:[`Seller composes with the buyer’s campaign-governance agent after baseline registration — calls `,_jsx(_components.a,{href:`/dist/docs/3.2.6/governance/campaign/tasks/check_governance`,children:_jsx(_components.code,{children:`check_governance`})}),` and propagates approvals, conditions, and denials unchanged. Optional claim for the full governance-check loop.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`audience-sync`})}),_jsx(_components.td,{children:`stable`}),_jsxs(_components.td,{children:[`Syncs buyer-provided audience segments into a platform for activation (uses `,_jsx(_components.a,{href:`/dist/docs/3.2.6/media-buy/task-reference/sync_audiences`,children:_jsx(_components.code,{children:`sync_audiences`})}),`, `,_jsx(_components.a,{href:`/dist/docs/3.2.6/accounts/tasks/list_accounts`,children:_jsx(_components.code,{children:`list_accounts`})}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`buyer-discovery`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Buyer agent that discovers seller inventory, interprets product capabilities, and assembles a candidate shortlist from a brief`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`buyer-activation`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Buyer agent that creates media buys with correct idempotency keys, handles transient failures with retry, and coordinates creative assignment`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`buyer-negotiation`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Buyer agent that requests proposals, refines terms, handles TERMS_REJECTED, and accepts or declines offers`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`buyer-monitoring`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Buyer agent that monitors delivery via webhooks and polling, detects pacing variance, and flags under-delivery`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`buyer-recovery`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Buyer agent that handles seller offline, auth expiry, idempotency collisions, and rate limiting with graceful degradation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orchestrator-multi-agent`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Orchestrator agent that coordinates across multiple sellers, handles partial failures, and reconciles cross-agent budget and state`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-retail-media`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Retail media network seller — onsite sponsored search, sponsored display, and offsite extensions tied to SKU-level catalog feeds, keyword targeting, and deterministic purchase attribution`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-streaming-tv`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Connected TV and streaming seller — SSAI-delivered video inventory, audience-based buying, household-level frequency capping, and VAST creative delivery across CTV apps`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-exchange`})}),_jsx(_components.td,{children:`preview`}),_jsx(_components.td,{children:`Programmatic exchange or SSP — multi-publisher auction inventory with floor prices, bid guidance, audience targeting, and auction-level delivery transparency`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`audience-sync`}),` moved from the `,_jsx(_components.code,{children:`governance`}),` protocol to `,_jsx(_components.code,{children:`media-buy`}),` to match its tool family. If your agent claims `,_jsx(_components.code,{children:`audience-sync`}),` but only declares `,_jsx(_components.code,{children:`governance`}),` in `,_jsx(_components.code,{children:`supported_protocols`}),`, add `,_jsx(_components.code,{children:`media_buy`}),` to `,_jsx(_components.code,{children:`supported_protocols`}),` — the runner now expects the media-buy baseline to run alongside the audience-sync storyboard.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`creative`,children:`creative`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-ad-server`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Creative ad server with tag-based delivery`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-generative`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Generative creative agent producing assets on demand`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-template`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Creative template and transformation agent`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`signals`,children:`signals`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`signal-owned`})}),_jsx(_components.td,{children:`stable`}),_jsxs(_components.td,{children:[`Owned signal agent exposing first-party segments through `,_jsx(_components.a,{href:`/dist/docs/3.2.6/signals/tasks/get_signals`,children:_jsx(_components.code,{children:`get_signals`})}),`; activation is not required for this claim`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`signal-marketplace`})}),_jsx(_components.td,{children:`stable`}),_jsxs(_components.td,{children:[`Marketplace signal agent reselling third-party data; requires `,_jsx(_components.code,{children:`get_signals`}),` and `,_jsx(_components.a,{href:`/dist/docs/3.2.6/signals/tasks/activate_signal`,children:_jsx(_components.code,{children:`activate_signal`})})]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`governance`,children:`governance`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`content-standards`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Content standards enforcement (brand safety, policy compliance)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`property-lists`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Property list governance — curated inclusion and exclusion lists for targeting and delivery compliance`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`collection-lists`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Collection list governance — curated inclusion and exclusion lists of content programs (shows, series, podcasts) for program-level brand safety`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance-delivery-monitor`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Campaign delivery monitoring with drift detection`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance-spend-authority`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Conditional spend approval and human-in-the-loop governance`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Experimental in 3.1.`}),` Measurement metric-catalog discovery is available through the experimental `,_jsx(_components.code,{children:`measurement`}),` capability block and `,_jsx(_components.code,{children:`measurement.core`}),` experimental feature. A stable `,_jsx(_components.code,{children:`measurement-verification`}),` specialism and baseline storyboard are deferred until the measurement task surface is frozen.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`brand`,children:`brand`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`brand-rights`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Brand identity and rights licensing (talent, music, stock media)`})]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`choosing-a-sales-specialism`,children:`Choosing a sales specialism`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`sales-*`}),` specialisms are not mutually exclusive — a hybrid platform with both a guaranteed direct desk and an auction floor should claim both `,_jsx(_components.code,{children:`sales-guaranteed`}),` and `,_jsx(_components.code,{children:`sales-non-guaranteed`}),`. Follow the steps below to resolve your claim.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`sales-proposal-mode`}),` is deprecated in 3.1.`]}),` Do not claim it for new agents. Existing agents that declare it must drop it entirely and replace it with `,_jsx(_components.code,{children:`sales-guaranteed`}),` + `,_jsx(_components.code,{children:`media_buy.supports_proposals: true`}),` in `,_jsx(_components.a,{href:`/dist/docs/3.2.6/protocol/get_adcp_capabilities`,children:_jsx(_components.code,{children:`get_adcp_capabilities`})}),`. See `,_jsx(_components.a,{href:`https://github.com/adcontextprotocol/adcp/issues/3823`,children:`#3823`}),`.`]})}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Is your inventory channel-specific?`,children:[_jsx(_components.p,{children:`Four specialisms apply to specific delivery channels and have their own storyboards. If you only sell one of these channel types, claim only the matching specialism. If you also sell general display or video inventory outside these channels, continue to Step 2.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`If you operate…`}),_jsx(_components.th,{children:`Claim`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Broadcast linear TV with FCC cancellation rules`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-broadcast-tv`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Catalog-driven dynamic ads (product listings, restaurant menus, hotel listings, local commerce)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-catalog-driven`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Non-guaranteed digital out-of-home venue and screen inventory`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-dooh`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Guaranteed-only digital out-of-home inventory`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-guaranteed`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Social platform with platform-managed creative`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-social`})})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`sales-dooh`}),` is the non-guaranteed DOOH profile. Guaranteed-only DOOH sellers still route `,_jsx(_components.code,{children:`dooh`}),` briefs through their portfolio declaration, but claim `,_jsx(_components.code,{children:`sales-guaranteed`}),` until a dedicated guaranteed DOOH profile exists.`]})]}),_jsx(Step,{title:`What purchase model do you support?`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`If you sell…`}),_jsx(_components.th,{children:`Claim`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Guaranteed media (IO approval, fixed pricing)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sales-guaranteed`}),` → see Step 3`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Auction / PMP non-guaranteed`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-non-guaranteed`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Both guaranteed and non-guaranteed`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sales-guaranteed`}),` + `,_jsx(_components.code,{children:`sales-non-guaranteed`})]})]})]})]})}),_jsxs(Step,{title:`Set media_buy.supports_proposals (sales-guaranteed only)`,children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`media_buy.supports_proposals`}),` is a boolean in the `,_jsx(_components.code,{children:`media_buy`}),` capabilities block of your `,_jsx(_components.code,{children:`get_adcp_capabilities`}),` response. It gates whether the `,_jsx(_components.code,{children:`proposal_finalize`}),` compliance scenario runs. It is a conformance declaration, not the buyer’s per-proposal routing signal: buyers decide whether a returned proposal can be bought from `,_jsx(_components.code,{children:`proposal_status`}),`.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`If you…`}),_jsx(_components.th,{children:`Set`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Accept RFPs, generate proposals, and finalize draft proposals to committed status before create`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`media_buy.supports_proposals: true`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sell direct-buy guaranteed only (auction PG, retail SKU, quoted-rate — no RFP flow)`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`media_buy.supports_proposals: false`}),` (or omit — default is `,_jsx(_components.code,{children:`false`}),`)`]})]})]})]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`jsonc`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`jsonc`,children:_jsxs(_components.code,{language:`jsonc`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Full-service guaranteed seller — proposal lifecycle graded`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"supported_protocols\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"media_buy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"specialisms\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"sales-guaranteed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"media_buy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"supports_proposals\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`jsonc`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`jsonc`,children:_jsxs(_components.code,{language:`jsonc`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Direct-buy guaranteed seller — proposal scenario skipped as capability_unsupported`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"supported_protocols\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"media_buy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"specialisms\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"sales-guaranteed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"media_buy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"supports_proposals\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`creative-2`,children:`creative`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-ad-server`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Creative ad server with tag-based delivery`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-generative`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Generative creative agent producing assets on demand`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-template`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Creative template and transformation agent`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`signals-2`,children:`signals`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`signal-owned`})}),_jsx(_components.td,{children:`stable`}),_jsxs(_components.td,{children:[`Owned signal agent exposing first-party segments through `,_jsx(_components.a,{href:`/dist/docs/3.2.6/signals/tasks/get_signals`,children:_jsx(_components.code,{children:`get_signals`})}),`; activation is not required for this claim`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`signal-marketplace`})}),_jsx(_components.td,{children:`stable`}),_jsxs(_components.td,{children:[`Marketplace signal agent reselling third-party data; requires `,_jsx(_components.code,{children:`get_signals`}),` and `,_jsx(_components.a,{href:`/dist/docs/3.2.6/signals/tasks/activate_signal`,children:_jsx(_components.code,{children:`activate_signal`})})]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`governance-2`,children:`governance`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`content-standards`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Content standards enforcement (brand safety, policy compliance)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`property-lists`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Property list governance — curated inclusion and exclusion lists for targeting and delivery compliance`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`collection-lists`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Collection list governance — curated inclusion and exclusion lists of content programs (shows, series, podcasts) for program-level brand safety`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance-delivery-monitor`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Campaign delivery monitoring with drift detection`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance-spend-authority`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Conditional spend approval and human-in-the-loop governance`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Experimental in 3.1.`}),` Measurement metric-catalog discovery is available through the experimental `,_jsx(_components.code,{children:`measurement`}),` capability block and `,_jsx(_components.code,{children:`measurement.core`}),` experimental feature. A stable `,_jsx(_components.code,{children:`measurement-verification`}),` specialism and baseline storyboard are deferred until the measurement task surface is frozen.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`brand-2`,children:`brand`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`brand-rights`})}),_jsx(_components.td,{children:`stable`}),_jsx(_components.td,{children:`Brand identity and rights licensing (talent, music, stock media)`})]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`sponsored-intelligence`,children:`sponsored-intelligence`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sponsored-intelligence`})}),_jsx(_components.td,{children:`preview`}),_jsxs(_components.td,{children:[`Agent claim for SDKs that dispatch on specialism ID. The graded storyboard is the `,_jsx(_components.code,{children:`sponsored-intelligence`}),` protocol baseline; this specialism reserves the wire ID and promotes to `,_jsx(_components.code,{children:`stable`}),` when the SI tools graduate from `,_jsx(_components.code,{children:`x-status: experimental`}),`.`]})]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`cross-resource-invariants`,children:`Cross-resource invariants`}),`\n`,_jsxs(_components.p,{children:[`In addition to per-step validations, specialisms declare cross-step and cross-resource `,_jsx(_components.strong,{children:`invariants`}),` the runner observes across the full storyboard run. These catch state inconsistencies that no single response shape would surface.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Invariant`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Specialisms`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`status.monotonic`})}),_jsx(_components.td,{children:`Single-resource — rejects status transitions observed across steps that aren’t on the spec lifecycle graph.`}),_jsx(_components.td,{children:`All specialisms with a stateful resource lifecycle.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`impairment.coherence`})}),_jsxs(_components.td,{children:[`Cross-resource — verifies that `,_jsx(_components.code,{children:`media_buy.impairments[]`}),` stays in sync with referenced resources. `,_jsx(_components.strong,{children:`Forward`}),`: every entry references a currently-offline resource. `,_jsx(_components.strong,{children:`Inverse`}),`: any offline resource referenced by a non-terminal buy appears in `,_jsx(_components.code,{children:`impairments[]`}),`. `,_jsx(_components.strong,{children:`Health-iff`}),`: on a non-terminal buy, `,_jsx(_components.code,{children:`health == \"impaired\"`}),` iff `,_jsx(_components.code,{children:`impairments[]`}),` is non-empty (strict iff — stale drift fails). Out of scope: all three rules relax on terminal-status buys (sellers MAY leave `,_jsx(_components.code,{children:`impairments[]`}),` and `,_jsx(_components.code,{children:`health`}),` in whatever state held at the terminal transition); materiality is schema-enforced via `,_jsx(_components.code,{children:`package_ids: minItems: 1`}),`.`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`audience-sync`}),`, `,_jsx(_components.code,{children:`creative-ad-server`}),`, `,_jsx(_components.code,{children:`creative-template`}),`, `,_jsx(_components.code,{children:`creative-generative`}),`, `,_jsx(_components.code,{children:`sales-catalog-driven`}),`. Driven by the `,_jsx(_components.a,{href:`/compliance/latest/protocols/media-buy/scenarios/dependency_impairment.yaml`,children:_jsx(_components.code,{children:`media_buy_seller/dependency_impairment`})}),` scenario (creative-track via `,_jsx(_components.code,{children:`force_creative_status`}),`); audience-track and catalog-track follow once the compliance test controller adds `,_jsx(_components.code,{children:`force_audience_status`}),` / `,_jsx(_components.code,{children:`force_catalog_item_status`}),`. Grades `,_jsx(_components.code,{children:`not_applicable`}),` on storyboards that don’t observe both a resource transition and a media-buy snapshot read.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Invariants are declared in the specialism YAML’s `,_jsx(_components.code,{children:`invariants:`}),` array and documented inline with the rule they enforce. See `,_jsx(_components.a,{href:`/dist/docs/3.2.6/media-buy/media-buys/lifecycle#compliance`,children:`media-buy lifecycle § Compliance`}),` for the full `,_jsx(_components.code,{children:`impairment.coherence`}),` contract.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-claim`,children:`How to claim`}),`\n`,_jsxs(_components.p,{children:[`Declare your protocols and specialisms in `,_jsx(_components.a,{href:`/dist/docs/3.2.6/protocol/get_adcp_capabilities`,children:_jsx(_components.code,{children:`get_adcp_capabilities`})}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"supported_protocols\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"media_buy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"creative\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"specialisms\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"sales-guaranteed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"creative-template\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The storyboard runner:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Runs every storyboard in `,_jsx(_components.code,{children:`/compliance/{version}/universal/`})]}),`\n`,_jsxs(_components.li,{children:[`For each protocol in `,_jsx(_components.code,{children:`supported_protocols`}),`, runs the baseline at `,_jsx(_components.code,{children:`/compliance/{version}/protocols/{protocol}/`}),` (snake_case → kebab-case)`]}),`\n`,_jsxs(_components.li,{children:[`Runs each claimed specialism’s storyboard at `,_jsx(_components.code,{children:`/compliance/{version}/specialisms/{id}/`})]}),`\n`,_jsxs(_components.li,{children:[`For `,_jsx(_components.code,{children:`preview`}),` specialisms, emits a warning instead of a pass/fail verdict — AAO Verified badges render preview specialisms with a distinct indicator`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Implement the tools AND claim the specialism.`}),` An agent that wires all of a specialism’s required tools but omits the kebab-case ID from `,_jsx(_components.code,{children:`capabilities.specialisms[]`}),` will be graded `,_jsx(_components.strong,{children:`“No applicable tracks found”`}),` by the runner — `,_jsx(_components.code,{children:`tracks_passed = 0, tracks_failed = 0, tracks_skipped = 1`}),`. This is a silent pass at the step level and a silent fail at the track level. The fix is to add the specialism ID (e.g., `,_jsx(_components.code,{children:`\"creative-generative\"`}),`) to your `,_jsx(_components.code,{children:`get_adcp_capabilities`}),` response.`]})}),`\n`,_jsxs(_components.p,{children:[`If any `,_jsx(_components.code,{children:`stable`}),` storyboard fails, your agent is not compliant for that claim. See `,_jsx(_components.a,{href:`/dist/docs/3.2.6/building/verification/validate-your-agent`,children:`Validate Your Agent`}),` for how to run the suite locally. For a detailed walkthrough of how the runner resolves specialism manifests into graded scenarios — including how capability flags like `,_jsx(_components.code,{children:`media_buy.supports_proposals`}),` gate individual scenarios — see `,_jsx(_components.a,{href:`/dist/docs/3.2.6/building/verification/how-grading-works`,children:`How grading works`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`naming-conventions`,children:`Naming conventions`}),`\n`,_jsx(_components.p,{children:`Four casings coexist in the taxonomy. Which one applies depends on where the identifier is read:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Casing`}),_jsx(_components.th,{children:`Layer`}),_jsx(_components.th,{children:`Example`}),_jsx(_components.th,{children:`Where it appears`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`snake_case`})}),_jsxs(_components.td,{children:[`Wire enums (`,_jsx(_components.code,{children:`supported_protocols`}),`, `,_jsx(_components.code,{children:`delivery_type`}),`, channel IDs, `,_jsx(_components.code,{children:`signal_type`}),`)`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`media_buy`}),`, `,_jsx(_components.code,{children:`non_guaranteed`}),`, `,_jsx(_components.code,{children:`ctv`}),`, `,_jsx(_components.code,{children:`custom`})]}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/dist/docs/3.2.6/protocol/get_adcp_capabilities`,children:_jsx(_components.code,{children:`get_adcp_capabilities`})}),` response, JSON payloads, generated schemas`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`kebab-case`})}),_jsx(_components.td,{children:`Specialism IDs and compliance URLs`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sales-broadcast-tv`}),`, `,_jsx(_components.code,{children:`property-lists`}),`, `,_jsx(_components.code,{children:`audience-sync`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`get_adcp_capabilities.specialisms`}),`, `,_jsx(_components.code,{children:`/compliance/.../specialisms/{id}/`}),` paths`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`snake_case`})}),_jsxs(_components.td,{children:[`Storyboard `,_jsx(_components.code,{children:`id:`}),` and `,_jsx(_components.code,{children:`category:`}),` fields`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`sales_broadcast_tv`}),`, `,_jsx(_components.code,{children:`audience_sync`})]}),_jsx(_components.td,{children:`Compliance YAML frontmatter, runner output, test reports`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Prose / hyphenated`}),_jsx(_components.td,{children:`Titles and narrative`}),_jsx(_components.td,{children:`”Streaming TV”, “non-guaranteed”`}),_jsx(_components.td,{children:`Catalog pages, narrative copy`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The kebab↔snake swap between wire specialism IDs and storyboard categories is mechanical identity — hyphens become underscores, nothing more. Variant scenarios within a specialism use `,_jsx(_components.code,{children:`{category}/{variant}`}),` path form.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Specialism ID (wire)`}),_jsx(_components.th,{children:`Channel / tool family`}),_jsx(_components.th,{children:`Storyboard category`}),_jsx(_components.th,{children:`Variant scenarios`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-broadcast-tv`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`channels: ['linear_tv']`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/sales-broadcast-tv/index.yaml`,children:_jsx(_components.code,{children:`sales_broadcast_tv`})})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-dooh`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`channels: ['dooh']`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/sales-dooh/index.yaml`,children:_jsx(_components.code,{children:`sales_dooh`})})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sales-social`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`channels: ['social']`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/sales-social/index.yaml`,children:_jsx(_components.code,{children:`sales_social`})})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`audience-sync`})}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/dist/docs/3.2.6/media-buy/task-reference/sync_audiences`,children:_jsx(_components.code,{children:`sync_audiences`})}),` tool`]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/audience-sync/index.yaml`,children:_jsx(_components.code,{children:`audience_sync`})})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`property-lists`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`property_list`}),` tools`]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/property-lists/index.yaml`,children:_jsx(_components.code,{children:`property_lists`})})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`collection-lists`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`collection_list`}),` tools`]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/collection-lists/index.yaml`,children:_jsx(_components.code,{children:`collection_lists`})})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`governance-spend-authority`})}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/dist/docs/3.2.6/governance/campaign/tasks/check_governance`,children:_jsx(_components.code,{children:`check_governance`})}),`, `,_jsx(_components.a,{href:`/dist/docs/3.2.6/governance/campaign/tasks/sync_plans`,children:_jsx(_components.code,{children:`sync_plans`})})]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/governance-spend-authority/index.yaml`,children:_jsx(_components.code,{children:`governance_spend_authority`})})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/governance-spend-authority/denied.yaml`,children:_jsx(_components.code,{children:`governance_spend_authority/denied`})})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creative-generative`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/dist/docs/3.2.6/creative/task-reference/build_creative`,children:_jsx(_components.code,{children:`build_creative`})})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/creative-generative/index.yaml`,children:_jsx(_components.code,{children:`creative_generative`})})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/creative-generative/generative-seller.yaml`,children:_jsx(_components.code,{children:`creative_generative/seller`})})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`brand-rights`})}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/dist/docs/3.2.6/brand-protocol/tasks/get_brand_identity`,children:_jsx(_components.code,{children:`get_brand_identity`})}),`, `,_jsx(_components.a,{href:`/dist/docs/3.2.6/brand-protocol/tasks/acquire_rights`,children:_jsx(_components.code,{children:`acquire_rights`})})]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/brand-rights/index.yaml`,children:_jsx(_components.code,{children:`brand_rights`})})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/compliance/latest/specialisms/brand-rights/scenarios/governance_denied.yaml`,children:_jsx(_components.code,{children:`brand_rights/governance_denied`})})})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The case split is deliberate: `,_jsx(_components.code,{children:`supported_protocols`}),` is a pre-existing 3.0 field already shipped to production agents, while specialism IDs are new and URL-first (each is a directory name under `,_jsx(_components.code,{children:`/compliance/.../specialisms/{id}/`}),`). The runner handles the mapping transparently.`]}),`\n`,_jsx(Heading,{level:`3`,id:`specialism--tool-family-mapping`,children:`Specialism ↔ tool family mapping`}),`\n`,_jsx(_components.p,{children:`The protocol an agent claims does not always match the tool family name a specialism uses:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`audience-sync`}),` lives under the `,_jsx(_components.code,{children:`media-buy`}),` protocol because `,_jsx(_components.code,{children:`sync_audiences`}),` is a media-buy tool.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`property-lists`}),` (specialism ID, kebab-case) maps to the `,_jsx(_components.code,{children:`property_list`}),` tool family (`,_jsx(_components.a,{href:`/dist/docs/3.2.6/governance/property/tasks/property_lists#create_property_list`,children:_jsx(_components.code,{children:`create_property_list`})}),`, `,_jsx(_components.a,{href:`/dist/docs/3.2.6/governance/property/tasks/validate_property_delivery`,children:_jsx(_components.code,{children:`validate_property_delivery`})}),`) and storyboard category `,_jsx(_components.code,{children:`property_lists`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`sales-broadcast-tv`}),` declares `,_jsx(_components.code,{children:`channels: ['linear_tv']`}),` — “Broadcast TV” is the prose name; `,_jsx(_components.code,{children:`linear_tv`}),` is the wire value.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/compliance/{version}/index.json`}),` surfaces each specialism’s `,_jsx(_components.code,{children:`required_tools`}),` so agents can discover the tool families without reading the full storyboard YAML.`]}),`\n`,_jsx(Heading,{level:`3`,id:`wire-enum-vs-prose`,children:`Wire enum vs prose`}),`\n`,_jsxs(_components.p,{children:[`Wire enum values are always `,_jsx(_components.code,{children:`snake_case`}),` (`,_jsx(_components.code,{children:`non_guaranteed`}),`, `,_jsx(_components.code,{children:`pmax_platform`}),`, `,_jsx(_components.code,{children:`ctv`}),`). Prose renders the same concept with hyphens or spaces (“non-guaranteed auction inventory”, “Connected TV”). When populating a payload, always use the wire form — hyphenated or spaced spellings are editorial only and will fail schema validation.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`signal_type-values`,children:[_jsx(_components.code,{children:`signal_type`}),` values`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`signal_type`}),` enum in signal responses has three values:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`marketplace`}),` — the signal agent is reselling segments published by a third-party data provider (Experian, Peer39, etc.). Buyers can verify authorization via the provider’s `,_jsx(_components.code,{children:`/.well-known/adagents.json`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`owned`}),` — the signal agent exposes its own first-party segments derived from directly owned data (retailer purchase data, publisher behavioral data, telco location data).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`custom`}),` — the signal source builds the segment on demand from models, composites, or buyer-supplied inputs. Use this when no `,_jsx(_components.code,{children:`adagents.json`}),` authorization chain applies — the segment is source-native, not attributable to a standing upstream provider.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`source-of-truth`,children:`Source of truth`}),`\n`,_jsx(_components.p,{children:`The machine index is published alongside schemas:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Path`}),_jsx(_components.th,{children:`Contents`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/compliance/{version}/index.json`})}),_jsxs(_components.td,{children:[`Enumerated protocols + specialisms + universal storyboards + per-specialism `,_jsx(_components.code,{children:`status`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/schemas/{version}/enums/specialism.json`})}),_jsxs(_components.td,{children:[`Specialism enum used by `,_jsx(_components.code,{children:`get_adcp_capabilities.specialisms`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/schemas/{version}/enums/adcp-protocol.json`})}),_jsxs(_components.td,{children:[`Task-classification enum referenced by `,_jsx(_components.code,{children:`tasks-list-request`}),` and webhook payloads. Same axis as `,_jsx(_components.code,{children:`supported_protocols`}),` (kebab-case here, snake_case on the wire).`]})]})]})]}),`\n`,_jsx(_components.p,{children:`The build pipeline verifies the specialism filesystem ↔ enum parity and that every specialism’s parent protocol exists in the compliance tree. Drift fails the build.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`The catalog on this page is maintained by hand to give human context. The authoritative enumeration is always `,_jsx(_components.code,{children:`/compliance/{version}/index.json`}),`.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Building an agent that wraps an upstream platform?`}),` Storyboards in this catalog grade the AdCP wire contract; they cannot detect adapters that return shape-valid responses without integrating with the upstream. See `,_jsx(_components.strong,{children:_jsx(_components.a,{href:`/dist/docs/3.2.6/building/verification/validate-with-mock-fixtures`,children:`Validate adapter agents with mock upstream fixtures`})}),` for the complementary pre-staging gate.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Compliance Catalog","sidebarTitle":"Compliance Catalog","description":"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.","og:title":"AdCP — Compliance Catalog","href":"/dist/docs/3.2.6/building/verification/compliance-catalog"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[21637,21761,"` regardless of `,`."],[21890,21950,""],[21998,22037,""],[22110,22369,"` and `,` collapse into `,`) except `,` (`,` is illegal in 3"],[46520,46604,"`, `,`, any nested l"],[49359,49400,""],[50311,50434,"` references a `,` t"],[50480,50516,""],[50701,50737,""],[51083,51119,""],[51984,52113,"`, then retry `,` wi"],[58683,58752,""],[58853,58905,""],[59549,59666,"` / `,` and re-promp"],[60883,61050,"`, `,`, `,`, `,`, or"],[71169,71227,""],[73056,73109,""],[73172,73221,""],[81635,81738,"` with `,` (the stru"],[81797,82306,"` (an `,` value: `,`, `,`, `,`, `,`, or `,`), and `,` (echo of the buy’s resolved `,` so the buyer S"],[82381,82584,"`, sellers SHOULD also populate `,` from `,` when they have "],[82681,82722,""],[83060,83232,"` is `,` (wait for or transition to an allowed status), `,` "],[83278,83325,""],[83433,83584,"` is `,` or `,` — bu"],[84212,84254,""],[84431,84533,"`: no `,` payload, n"],[85462,85591,"` (account-wide) and `,` (per-plan) but "],[85743,85881,"` payload (mirroring `,`‘s discriminator"],[88574,88676,"` with a `,` referen"],[88848,89010,"` / `,` (caller credentials) and from `,"],[89103,89253,"`, especially `,` wh"],[89354,89521,"`, `,`, or `,` remai"],[90183,90223,""],[90922,90962,""],[91498,91616,"` (no credentials presented) or `,` (cre"],[93186,93230,""],[93471,93582,"` or `,` is rejected"],[93661,93709,""],[94097,94145,""],[94269,94588,"` MUST conform to `,` (`,` plus an optional single `,` retry value, typically `,"],[94787,94845,""],[95528,95562,""],[95616,95660,""],[95759,95794,""],[95955,96309,"` SHOULD conform to `,` (`,` ∈ `,` plus optional `,` echo for the `,` scope) so "],[96369,96427,""],[96642,96700,""],[96974,97164,"` and MUST omit `,` — emitting the per-agent code or the `,`"],[97288,97326,""],[97368,97480,"` for `,` and resubm"],[97527,97561,""],[98202,98241,""],[98497,98535,""],[98578,98613,""],[98740,98862,"` (the seller declines a specific `,` va"],[98937,98995,""],[99225,99419,"` from `,` before issuing `,`; agents th"],[99540,99741,"` response `,` array with `,` pointing at `,` or a specific "],[99828,99868,""],[99914,99960,""],[100726,100995,"` or a natural key including `,`. Recovery: correctable (include `,` — `,` plus optional `,` — on th"],[103916,104025,"` and `,` calls on t"],[104092,104136,""],[108180,108463,"` but no `,` populated; platform declared with `,` or `,` but no `,` declared; r"],[108537,108579,""],[108633,108679,""],[108728,108774,""],[108858,108907,""],[108999,109048,""],[109224,109317,"`, A2A `,`) and popu"],[109363,109455,""],[109501,109541,""],[109623,109785,"` / `,`). Sellers SHOULD populate `,` wi"],[111537,111730,"`, direct `,` plus `,`, and deprecated `"],[111843,111889,""],[111961,112004,""],[112469,112507,""],[112556,112596,""],[120213,120401,"` entry per candidate, conforming to `,`"],[123774,123899,"` list. Distinct from `,` (generic creat"],[124194,124232,""],[124293,124366,""],[124444,124560,"` array in `,` so th"],[124668,124709,""],[125135,125219,"`, `,`, any nested l"],[125600,125684,"`, in `,`, or any ot"],[125893,125941,""],[126306,126346,""],[126440,126484,""],[126597,126675,""],[127388,127481,"`, A2A `,`) and popu"],[127527,127619,""],[127665,127783,"` shape is defined, and `,` MUST NOT ech"],[127845,127946,"`). `,` MUST be gene"],[129651,129864,"` — `,` or the `,` agent-form `,` — that"],[130041,130114,""],[130214,130273,""],[130431,130706,"` MUST point at the offending `,` path; `,` SHOULD include a reference to the product whose `,` the "],[130812,130857,""],[131859,131898,""],[131945,132044,"` on the account’s `"],[132144,132187,""],[132280,132318,""],[132374,132419,""],[132530,132577,""],[133269,133367,"` (v1) AND `,` (v2) "],[133796,133837,""],[134017,134056,""],[134275,134326,""],[134396,134650,"` array with an entry carrying `,`, `,`, `,`, and the field+"],[134897,134935,""],[134976,135132,"` SHOULD carry `,` s"],[135348,135388,""],[135434,135467,""],[136490,136531,""],[136669,136720,""],[136979,137391,"` and `,` — SDKs MUST augment the response’s `,` array with an entry carrying `,`, `,`, `,`, `,` poi"],[137433,137626,"` SHOULD carry `,` s"],[138067,138107,""],[138180,138232,""],[138815,138856,""],[139225,139266,""],[139874,140427,"` with `,` (or `,` if the seller self-detects on emit), `,`, `,`, `,` pointing at the offending declaration, and `,` SHOULD carry `,` so buy"],[140626,140740,"` lacking a corresponding `,`, the SDK c"],[140810,140987,"` look up `,`) and emits it under `,`. T"],[141310,141352,""],[143039,143162,"` references a `,` t"],[143208,143244,""],[143429,143465,""],[143613,143868,"` (or any consumer of `,`) carries `,` referencing a `,` tha"],[143911,143947,""],[144190,144233,""],[144802,145355,"` with `,`, `,`, `,`, `,` pointing at the offending placement (e.g., `,`), and `,` SHOULD carry `,` "],[145534,145570,""],[145953,145989,""],[146354,146553,"` via the resolution order in `,` (explicit `,` field → form"],[146675,146716,""],[146896,146934,""],[146981,147256,"`); `,` SHOULD carry `,` so buyer SDKs c"],[147315,147351,""],[147557,147807,"` array with an entry carrying `,`, `,`, `,`, and the field+"],[148202,148300,"` (or set `,`). The "],[148536,148576,""],[148622,148655,""],[148767,148807,""],[148854,148979,"` (e.g., a different `,` reason from a d"],[149102,149138,""],[149242,149353,"` with `,` linking b"],[149995,150100,"` with a `,` that ha"],[150255,150501,"` with `,`, `,`, this code, and `,`. Pro"],[150588,150631,""],[151110,151239,"`, then retry `,` wi"],[151337,151379,""],[151588,151792,"` SHOULD conform to `,`. Distinct from `"],[152555,152862,"` → `,`, or an `,` delivery → `,`); otherwise in `,` + `,`. "],[152917,153072,"` first and fall back to `,` / `,` only "],[153772,153805,""],[153863,153901,""],[153947,154083,"` in `,` or `,`. The"],[154141,154326,"` and `,` both declare `,`, so dual-emis"],[154500,154597,"`, A2A `,`) — the op"],[154796,154839,""],[154912,155204,"` in the payload AND `,` on the envelope per the two-layer model in `,`. Transpo"],[155267,155360,"`, A2A `,`) — the ta"],[155728,155772,""],[155920,155969,""],[156459,156551,"` + `,` (never a str"],[156632,156789,"`, A2A `,`). Distinct from `,` (agent re"],[157346,157438,""],[160305,160347,""],[161061,161105,""],[161260,161302,""],[161401,161527,"` seconds and retry with the same `,`; t"],[162599,162643,""],[162745,162784,""],[162827,162870,""],[162928,162966,""],[163019,163212,"` or `,`). Distinct from `,` (the produc"],[163341,163506,"` against the product’s `,` from `,` or "],[164989,165028,""],[165156,165501,"` response `,` array. `,` SHOULD point at the offending field path (e.g., `,`, `,`). Distinct from `"],[165699,165826,"`, `,`, and `,` — fi"],[167697,167851,"`, conforming to `,`"],[169429,169912,"` call with multiple `,` entries in `,` targeting different `,` values; (2) a `,` call with multiple `,` entries in `,` targeting different `,` values. The buye"],[170188,170230,""],[170400,170438,""],[172569,172609,""],[172728,172910,"` (the `,` enum) by being narrowly about the `,` enum on the"],[172955,172995,""],[173915,173960,""],[174124,174167,""],[174232,174661,"`. Distinct from `,` (no credentials presented), `,` (credentials presented but rejected), `,` (governance agent denied), `,` (agent’s relationship temporarily paused), and `,` (ag"],[174941,175249,"` SHOULD conform to `,` (`,` plus `,`, or `,` when no demand"],[175381,175422,""],[175684,175794,"` and MUST omit `,` "],[176144,176370,"` uniform-response rule and `,`. The `,` and `,` per-agent s"],[176427,176529,"` / `,` instead, eac"],[176596,176639,""],[176732,176773,""],[177335,177404,""],[177505,177557,""],[177871,178000,"` asset to the v1 `,"],[178247,178334,"`, quartiles, `,`), "],[178507,179102,"` + `,` → no loss; emit as `]}),`\n`,_jsxs(_components.li,{children:[` / `,` / `,` / `,` → emit with `,`; advisory `,` (s"],[179201,179432,"` / `,` / `,` / `,` / `,` → `,_jsx(_comp"],[179508,179738,"` and `,` covering the whole tracker. `,` with `,` equal to "],[179852,180137,"` and `,` rules; set `,` and `,`. Never emit these as `,`: a"],[180264,180373,"` → emit with `,`; n"],[180431,180568,"` → emit with `,` (d"],[180622,180741,"`, `,` (custom event"],[180821,180858,""],[180925,180969,""],[181396,181915,"` with `,`, `,`, `,`, `,` pointing at the affected manifest asset path, and `,` SHOULD carry `,`. On"],[182424,182464,""],[182970,183087,"` / `,` and re-promp"],[183281,183410,"` to a `,` asset by "],[183602,183710,"` (which implies `,`"],[183830,184143,"(_components.li,{children:` → `}),`\n`,_jsxs(_components.li,{children:[` → `,` (5"],[184250,184575,"(_components.li,{children:` → `}),`\n`,_jsx(_components.li,{children:` → `}),`\n`]"],[184653,185029,"` with `,`, `,` pointing at the upgraded asset path, and `,` SHOULD carry `,`. B"],[188070,188237,"`, `,`, `,`, `,`, or"],[188514,188659,"` in `,` or `,` in a"],[188725,188892,"`, `,`, `,`, or `,`."],[189147,189185,""],[189238,189373,"` SHOULD carry `,` w"],[193857,194118,"` (a known proposal whose `,` window has passed) and `,` (a known proposal still in `,`). Recovery: "],[194739,194868,"` via `,` and the ve"],[194948,195011,""],[195052,195097,""],[195160,195207,""],[195270,195310,""],[195360,195455,""],[195522,195559,""],[195749,195799,""],[195847,195979,"` SHOULD carry the buyer’s nominated `,`"],[196604,196698,""],[196786,196832,""],[196880,196926,""],[197046,197247,"` to a value from the `,` enum and resubmit). `,` MUST point"],[197308,197396,""],[197812,197906,""],[197974,198530,"` boolean, or `,` is true with no `,` entries. Recovery: correctable (set `,` and, when true, populate `,`). `,` MUST point at `,` (e.g., `,"],[198940,199034,""],[199102,199148,""],[199220,199264,""],[199402,199448,""],[199516,199555,""],[199596,199792,"`). `,` MUST point at `,` on the resolve"],[200176,200238,""],[200284,200321,""],[200414,200458,""],[200604,200708,"` - and resubmit). `"],[200773,200830,""],[201275,201369,""],[201457,201606,"` boolean. Both `,` and `,` satisfy the "],[201661,201707,""],[201750,201806,""],[201919,202151,"` to true or false, and resubmit). `,` MUST point at the resolved `,` path. The "],[202752,202908,"` on `,` or `,` that"],[203085,203158,""],[203308,203596,"` MUST point at the offending `,` path; `,` SHOULD include a reference to the product whose `,` the "],[203652,203924,"`). Recovery: correctable (replace `,` with one from the seller’s published `,`, drop the `,` entire"],[204409,204453,""],[204527,204571,""],[205085,205130,""],[213499,213539,""],[213582,213622,""],[213692,213736,""],[213855,213914,""],[213980,214048,""],[219205,219259,""],[219503,219614,"` / `,`) during step"],[219853,219883,""],[219968,220048,"`/`,` window, but MU"],[220106,220147,""],[220385,220415,""],[221064,221127,""],[221225,221311,""],[221788,221955,"`. `,` SHOULD carry `,` (the verifier’s "],[222866,222929,""],[223234,223273,""],[223575,223639,""],[223718,223757,""],[226117,226175,""],[226955,227001,""],[227342,227383,""],[227468,227512,""],[227751,227797,""],[227977,228074,"`, A2A `,`) — the ta"],[228163,228198,""],[228245,228282,""],[228400,229252,"`). `,` SHOULD point at the affected payload path (e.g., `,` for `,`, `,` for `,`). `,` SHOULD conform to `,` — `,` (required, always `,`), `,` (required), and optionally `,`, `,` (the dependency that failed), and `,` (t"],[229429,229477,""],[229600,229641,""],[229766,229822,""],[229956,229994,""],[230041,230075,""],[230354,230398,""],[232370,232413,""],[232478,232545,""],[232594,232827,"` — `,` names the offending dimension and `,` echoes the sel"],[233070,233405,"` (`,`, optional `,`, `,`, `,`) and `,` "],[234157,234452,"` on `,` is not in the product’s declared `,`. Distinct from `,` (generic capabi"],[234658,234722,""],[234841,234889,""],[235080,235181,"` SHOULD point at `,"],[235342,235494,"` may legitimately exceed `,` (e.g., a s"],[235638,235681,""],[236048,236101,""],[236164,236213,""],[236396,236436,""],[236492,236532,""],[236594,236715,"` + `,` + `,`) is se"],[236875,236989,"`; or (b) an entry keyed by `,` (Account"],[237081,237127,""],[237202,237242,""],[237439,237487,""],[237690,237743,""],[237824,237931,"` shape). The `,` SH"],[238880,238911,""],[238966,239570,"` (or the document fetched from `,`) is not well-formed XML, has no `,` root element, contains no `,` element, or an `,` linear creative carries no `,`. Returned by sellers that declare `,` of `,` or `,`; sellers at the default `,` level do"],[239648,239691,""],[239824,239862,""],[239914,240319,"` with one of `,`, `,`, `,`, `,`. Unresolved ad-server macros in URLs (`,`, `,`, `,`) are opaque tok"],[240895,240926,""],[240975,241014,""],[241090,241222,"` and the seller’s `"],[241308,241747,"` MUST conform to `,`: acceptance failures carry `,`, `,`, `,`, and `,`, plus `,"],[241831,242062,"`, `,`, `,`, and `,`"],[242242,242287,""],[242349,242395,""],[243076,243107,""],[243182,243285,"`, revisited a `,` a"],[243417,243833,"`. Sellers SHOULD set `,` to the offending asset path and SHOULD populate `,` with one of `,`, `,`, `,`, plus `,` with t"],[243931,243975,""],[244573,244703,"` — `,` (release-pre"],[244749,244792,""]]},"mdxExtracts":{"tableOfContents":[{"title":"Universal storyboards","slug":"universal-storyboards","depth":2,"children":[]},{"title":"Standard error codes","slug":"standard-error-codes","depth":2,"children":[{"title":"Full descriptions","slug":"full-descriptions","depth":3,"children":[]}]},{"title":"Protocols","slug":"protocols","depth":2,"children":[]},{"title":"Specialisms","slug":"specialisms","depth":2,"children":[{"title":"media-buy","slug":"media-buy","depth":3,"children":[]},{"title":"creative","slug":"creative","depth":3,"children":[]},{"title":"signals","slug":"signals","depth":3,"children":[]},{"title":"governance","slug":"governance","depth":3,"children":[]},{"title":"brand","slug":"brand","depth":3,"children":[]}]},{"title":"Choosing a sales specialism","slug":"choosing-a-sales-specialism","depth":2,"children":[{"title":"creative","slug":"creative-2","depth":3,"children":[]},{"title":"signals","slug":"signals-2","depth":3,"children":[]},{"title":"governance","slug":"governance-2","depth":3,"children":[]},{"title":"brand","slug":"brand-2","depth":3,"children":[]},{"title":"sponsored-intelligence","slug":"sponsored-intelligence","depth":3,"children":[]}]},{"title":"Cross-resource invariants","slug":"cross-resource-invariants","depth":2,"children":[]},{"title":"How to claim","slug":"how-to-claim","depth":2,"children":[]},{"title":"Naming conventions","slug":"naming-conventions","depth":2,"children":[{"title":"Specialism ↔ tool family mapping","slug":"specialism--tool-family-mapping","depth":3,"children":[]},{"title":"Wire enum vs prose","slug":"wire-enum-vs-prose","depth":3,"children":[]},{"title":"signal_type values","slug":"signal_type-values","depth":3,"children":[]}]},{"title":"Source of truth","slug":"source-of-truth","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/agenticadvertisingorg/1a1b50531e8add0f/dist/compliance/storyboard-runner-options.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.0.23/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.14/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.0.24/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.0/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.2/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.3/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.17/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.18/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.0.26/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.19/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.15/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.16/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.4/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.0.25/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.1/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.5/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.6/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.7/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.8/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.9/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/docs/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/3d9934cdcf6b6ce6/workers/artifact-cdn/src/index.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.10/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.20/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-beta.11/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.0/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.1/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.21/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.2/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.6/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.24/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.3/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.4/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.0-rc.7/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.1/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.2/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.3/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.1.27/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.0.27/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.0.28/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.3.0-beta.0/slack-invite-recovery.js","/_mintlify/custom/agenticadvertisingorg/bd3bc019124ed96c/dist/docs/3.2.6/slack-invite-recovery.js"],"subdomain":"agenticadvertisingorg","siteName":"AdCP - Ad Context Protocol","title":"AdCP — Compliance Catalog","navMaps":{"firstHrefInVersion":{"3.2":{"href":"/dist/docs/3.2.6/building/verification/compliance-catalog","matchLevel":0},"3.3-beta":{"href":"/dist/docs/3.3.0-beta.0/building/verification/compliance-catalog","matchLevel":1},"3.1":{"href":"/dist/docs/3.1.27/building/verification/compliance-catalog","matchLevel":1},"3.0":{"href":"/dist/docs/3.0.28/building/verification/compliance-catalog","matchLevel":1},"2.5 (archived)":{"href":"/dist/docs/2.5.3/intro","matchLevel":3}},"firstHrefInLanguage":{}},"lastModified":"2026-10-24T03:07:16.917Z","originalFileLocation":"dist/docs/3.2.6/building/verification/compliance-catalog.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.\">\u003cmeta data-mint-head name=\"application-name\" content=\"AdCP - Ad Context Protocol\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"AdCP — Compliance Catalog\">\u003cmeta data-mint-head property=\"og:description\" content=\"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"AdCP - Ad Context Protocol\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://agenticadvertisingorg.mintlify.app/_mintlify/api/og/v2?division=Verification+%26+trust\u0026amp;title=Compliance+Catalog\u0026amp;description=Full+index+of+AdCP+protocols+and+specialisms+an+agent+can+claim+%E2%80%94+what+each+one+means%2C+which+compliance+storyboards+run%2C+and+where+to+find+the+source+YAML.\u0026amp;theme=be64ae0b59577dd8c09f9173\u0026amp;signature=bd6198428e2c0a49fcabaa0e4e1b38f5f0cb049fa1af48f6551a40e057845f6e\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"AdCP — Compliance Catalog\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://agenticadvertisingorg.mintlify.app/_mintlify/api/og/v2?division=Verification+%26+trust\u0026amp;title=Compliance+Catalog\u0026amp;description=Full+index+of+AdCP+protocols+and+specialisms+an+agent+can+claim+%E2%80%94+what+each+one+means%2C+which+compliance+storyboards+run%2C+and+where+to+find+the+source+YAML.\u0026amp;theme=be64ae0b59577dd8c09f9173\u0026amp;signature=bd6198428e2c0a49fcabaa0e4e1b38f5f0cb049fa1af48f6551a40e057845f6e\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/agenticadvertisingorg/JomSeQ4JKmdJww4Y/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"AdCP - Ad Context Protocol\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#047857\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/dist/docs/3.2.6/building/verification/compliance-catalog.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.adcontextprotocol.org/#organization\",\"name\":\"AdCP - Ad Context Protocol\",\"url\":\"https://docs.adcontextprotocol.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/agenticadvertisingorg/cnoy0Xiq2i_jSWzz/logo/sage.svg?fit=max\u0026auto=format\u0026n=cnoy0Xiq2i_jSWzz\u0026q=85\u0026s=f393829d8ccdabe856cf9c8362e66b96\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.adcontextprotocol.org#website\",\"name\":\"AdCP - Ad Context Protocol\",\"url\":\"https://docs.adcontextprotocol.org\",\"publisher\":{\"@id\":\"https://docs.adcontextprotocol.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog#webpage\",\"url\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog\",\"name\":\"Compliance Catalog\",\"description\":\"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.\",\"dateModified\":\"2026-10-24T03:07:16.917Z\",\"isPartOf\":{\"@id\":\"https://docs.adcontextprotocol.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Building with AdCP\",\"item\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verification \u0026 trust\",\"item\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/conformance\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Compliance Catalog\",\"item\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog#article\",\"headline\":\"Compliance Catalog\",\"name\":\"Compliance Catalog\",\"description\":\"Full index of AdCP protocols and specialisms an agent can claim — what each one means, which compliance storyboards run, and where to find the source YAML.\",\"url\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog\",\"mainEntityOfPage\":{\"@id\":\"https://docs.adcontextprotocol.org/dist/docs/3.2.6/building/verification/compliance-catalog#webpage\"},\"dateModified\":\"2026-10-24T03:07:16.917Z\",\"publisher\":{\"@id\":\"https://docs.adcontextprotocol.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.adcontextprotocol.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"AdCP - Ad Context Protocol\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"AdCP - Ad Context Protocol","nav":{"global":null,"versions":[{"version":"3.2","default":true,"tag":"Latest","groups":[{"group":"Getting Started","pages":[{"title":"Introduction to AdCP","sidebarTitle":"Introduction","href":"/dist/docs/3.2.6/intro"},{"title":"Quickstart","href":"/dist/docs/3.2.6/quickstart"}]},{"group":"Building with AdCP","expanded":false,"pages":[{"title":"Building with AdCP","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/building/index"},{"title":"Schemas \u0026 SDKs","sidebarTitle":"Schemas \u0026 SDKs","href":"/dist/docs/3.2.6/building/schemas-and-sdks"},{"group":"Release notes \u0026 migration","expanded":false,"pages":[{"title":"AdCP 3.0","href":"/dist/docs/3.2.6/reference/whats-new-in-v3"},{"title":"What's New in AdCP 3.1","href":"/dist/docs/3.2.6/reference/whats-new-in-3-1"},{"title":"What's new in AdCP 3.2","sidebarTitle":"What's new in 3.2","href":"/dist/docs/3.2.6/reference/whats-new-in-3-2"},{"title":"AdCP 3.2 prerelease history","sidebarTitle":"3.2 prerelease history","href":"/dist/docs/3.2.6/reference/3-2-beta"},{"group":"3.3 preview","pages":[{"title":"What's new in AdCP 3.3","sidebarTitle":"What's new in 3.3","href":"/dist/docs/3.2.6/reference/whats-new-in-3-3"},{"title":"AdCP 3.3 beta program","sidebarTitle":"3.3 beta program","href":"/dist/docs/3.2.6/reference/3-3-beta"},{"title":"Migrating from 3.2 to 3.3","sidebarTitle":"3.2 to 3.3","href":"/dist/docs/3.2.6/reference/migration/3-2-to-3-3"}]},{"title":"v3 readiness checklist","sidebarTitle":"Readiness checklist","href":"/dist/docs/3.2.6/reference/migration/v3-readiness"},{"title":"Migration guides","sidebarTitle":"Migration guides","href":"/dist/docs/3.2.6/reference/migration/index"},{"title":"Migrating from 3.0 to 3.1","sidebarTitle":"3.0 to 3.1","href":"/dist/docs/3.2.6/reference/migration/3-0-to-3-1"},{"title":"Migrating from 3.1 to 3.2","sidebarTitle":"3.1 to 3.2","href":"/dist/docs/3.2.6/reference/migration/3-1-to-3-2"},{"title":"Reliable Reporting consumer-status loop","href":"/dist/docs/3.2.6/reference/migration/reliable-reporting-status-loop"},{"title":"Prerelease upgrade notes","sidebarTitle":"Prerelease upgrades","href":"/dist/docs/3.2.6/reference/migration/prerelease-upgrades"},{"title":"Migrating channels","href":"/dist/docs/3.2.6/reference/migration/channels"},{"title":"Migrating pricing","href":"/dist/docs/3.2.6/reference/migration/pricing"},{"title":"Migrating geo targeting","href":"/dist/docs/3.2.6/reference/migration/geo-targeting"},{"title":"Migrating creatives","href":"/dist/docs/3.2.6/reference/migration/creatives"},{"title":"Migrating to creative transformers (3.1)","href":"/dist/docs/3.2.6/reference/migration/creative-transformers"},{"title":"Migrating catalogs","href":"/dist/docs/3.2.6/reference/migration/catalogs"},{"title":"Migrating optimization goals","href":"/dist/docs/3.2.6/reference/migration/optimization-goals"},{"title":"Migrating brand identity","href":"/dist/docs/3.2.6/reference/migration/brand-identity"},{"title":"Migrating signals","href":"/dist/docs/3.2.6/reference/migration/signals"},{"title":"Migrating audiences","href":"/dist/docs/3.2.6/reference/migration/audiences"},{"title":"Migrating attribution windows","href":"/dist/docs/3.2.6/reference/migration/attribution"},{"title":"Migrating to `media_buy_status` (3.1 → 3.2)","href":"/dist/docs/3.2.6/reference/migration/media-buy-status"},{"title":"Targeting-aware product discovery","href":"/dist/docs/3.2.6/reference/migration/targeting-aware-discovery"},{"title":"Migrating secured asset access (3.2)","href":"/dist/docs/3.2.6/reference/migration/asset-access"},{"title":"Cross-role governance enforcement","href":"/dist/docs/3.2.6/reference/migration/cross-role-governance-enforcement"}]},{"title":"Protocol architecture","sidebarTitle":"Architecture","href":"/dist/docs/3.2.6/protocol/architecture"},{"title":"How AdCP is designed","sidebarTitle":"Design principles","href":"/dist/docs/3.2.6/protocol/design-principles"},{"title":"Language and localization","sidebarTitle":"Language and localization","href":"/dist/docs/3.2.6/protocol/language-and-localization"},{"title":"Capabilities explorer","sidebarTitle":"Capabilities explorer","href":"/dist/docs/3.2.6/protocol/capabilities-explorer"},{"title":"Specification Guidelines","href":"/dist/docs/3.2.6/spec-guidelines"},{"title":"Required tasks by protocol","sidebarTitle":"Required tasks","href":"/dist/docs/3.2.6/protocol/required-tasks"},{"title":"Calling an AdCP agent","sidebarTitle":"Calling an agent","href":"/dist/docs/3.2.6/protocol/calling-an-agent"},{"title":"Format References","href":"/dist/docs/3.2.6/protocol/format-references"},{"title":"Snapshot and log","href":"/dist/docs/3.2.6/protocol/snapshot-and-log"},{"group":"Concepts","expanded":false,"pages":[{"title":"Why AdCP","href":"/dist/docs/3.2.6/building/concepts/index"},{"title":"Protocol Comparison","href":"/dist/docs/3.2.6/building/concepts/protocol-comparison"},{"title":"AdCP and OpenRTB","sidebarTitle":"AdCP vs OpenRTB","href":"/dist/docs/3.2.6/building/concepts/adcp-vs-openrtb"},{"title":"How AI agents communicate ad specs across platforms","sidebarTitle":"How agents communicate","href":"/dist/docs/3.2.6/building/concepts/how-agents-communicate"},{"title":"Security Model","sidebarTitle":"Security Model","href":"/dist/docs/3.2.6/building/concepts/security-model"},{"title":"AI advertising standards landscape","sidebarTitle":"Industry landscape","href":"/dist/docs/3.2.6/building/concepts/industry-landscape"},{"title":"Managing Response Size","sidebarTitle":"Managing Response Size","href":"/dist/docs/3.2.6/building/concepts/managing-response-size"}]},{"group":"Build by layer","pages":[{"group":"L4 — Business logic","pages":[{"title":"L4 — Business logic","sidebarTitle":"L4 — Business logic","href":"/dist/docs/3.2.6/building/by-layer/L4/index"},{"title":"Choose your SDK","sidebarTitle":"Choose your SDK","href":"/dist/docs/3.2.6/building/by-layer/L4/choose-your-sdk"},{"title":"Build an Agent","sidebarTitle":"Build an Agent","href":"/dist/docs/3.2.6/building/by-layer/L4/build-an-agent"},{"title":"Build a caller","sidebarTitle":"Build a caller","href":"/dist/docs/3.2.6/building/by-layer/L4/build-a-caller"},{"title":"Migrate from a hand-rolled agent","sidebarTitle":"Migrate from hand-rolled","href":"/dist/docs/3.2.6/building/by-layer/L4/migrate-from-hand-rolled"}]},{"group":"L3 — Protocol semantics","expanded":false,"pages":[{"title":"L3 — Protocol semantics","sidebarTitle":"L3 — Protocol semantics","href":"/dist/docs/3.2.6/building/by-layer/L3/index"},{"title":"Task Lifecycle","href":"/dist/docs/3.2.6/building/by-layer/L3/task-lifecycle"},{"title":"Async Operations","href":"/dist/docs/3.2.6/building/by-layer/L3/async-operations"},{"title":"Async identity and convergence","href":"/dist/docs/3.2.6/building/by-layer/L3/async-identity-and-convergence"},{"title":"Push Notifications","href":"/dist/docs/3.2.6/building/by-layer/L3/webhooks"},{"title":"Error Handling","href":"/dist/docs/3.2.6/building/by-layer/L3/error-handling"},{"title":"Compliance test controller","href":"/dist/docs/3.2.6/building/by-layer/L3/comply-test-controller"}]},{"group":"L2 — Auth \u0026 registry","expanded":false,"pages":[{"title":"L2 — Auth \u0026 registry","sidebarTitle":"L2 — Auth \u0026 registry","href":"/dist/docs/3.2.6/building/by-layer/L2/index"},{"title":"Authentication","href":"/dist/docs/3.2.6/building/by-layer/L2/authentication"},{"title":"Account state","href":"/dist/docs/3.2.6/building/by-layer/L2/account-state"},{"title":"Accounts and agents","href":"/dist/docs/3.2.6/building/by-layer/L2/accounts-and-agents"},{"title":"Context \u0026 Sessions","href":"/dist/docs/3.2.6/building/by-layer/L2/context-sessions"}]},{"group":"L1 — Identity \u0026 signing","expanded":false,"pages":[{"title":"L1 — Identity \u0026 signing","sidebarTitle":"L1 — Identity \u0026 signing","href":"/dist/docs/3.2.6/building/by-layer/L1/index"},{"title":"Security","href":"/dist/docs/3.2.6/building/by-layer/L1/security"},{"title":"Request Signing Guide","href":"/dist/docs/3.2.6/building/by-layer/L1/request-signing"},{"title":"Webhook Verifier Tuning Guide","sidebarTitle":"Webhook Verifier Tuning","href":"/dist/docs/3.2.6/building/by-layer/L1/webhook-verifier-tuning"}]},{"group":"L0 — Wire \u0026 transport","expanded":false,"pages":[{"title":"L0 — Wire \u0026 transport","sidebarTitle":"L0 — Wire \u0026 transport","href":"/dist/docs/3.2.6/building/by-layer/L0/index"},{"title":"Schemas","sidebarTitle":"Schemas","href":"/dist/docs/3.2.6/building/by-layer/L0/schemas"},{"title":"MCP Guide","href":"/dist/docs/3.2.6/building/by-layer/L0/mcp-guide"},{"title":"A2A Guide","href":"/dist/docs/3.2.6/building/by-layer/L0/a2a-guide"},{"title":"AdCP A2A Profile Extension v3","sidebarTitle":"A2A profile extension","href":"/dist/docs/3.2.6/building/by-layer/L0/a2a-profile-extension"},{"title":"A2A Response Format","href":"/dist/docs/3.2.6/building/by-layer/L0/a2a-response-format"},{"title":"get_adcp_capabilities","href":"/dist/docs/3.2.6/protocol/get_adcp_capabilities"},{"title":"sync_agent_notification_configs","href":"/dist/docs/3.2.6/protocol/sync_agent_notification_configs"},{"title":"sync_principal","href":"/dist/docs/3.2.6/protocol/sync_principal"},{"title":"get_principal","href":"/dist/docs/3.2.6/protocol/get_principal"},{"title":"MCP Response Extraction","href":"/dist/docs/3.2.6/building/by-layer/L0/mcp-response-extraction"},{"title":"A2A Response Extraction","href":"/dist/docs/3.2.6/building/by-layer/L0/a2a-response-extraction"}]}]},{"group":"Cross-cutting","expanded":false,"pages":[{"title":"The AdCP stack","sidebarTitle":"SDK stack reference","href":"/dist/docs/3.2.6/building/cross-cutting/sdk-stack"},{"title":"Version Adaptation","sidebarTitle":"Version Adaptation","href":"/dist/docs/3.2.6/building/cross-cutting/version-adaptation"},{"title":"Known spec ambiguities","href":"/dist/docs/3.2.6/building/cross-cutting/known-ambiguities"}]},{"group":"Verification \u0026 trust","expanded":false,"pages":[{"title":"Conformance Specification","sidebarTitle":"Conformance Specification","description":"What 'AdCP-conformant' means, defined by the storyboards that verify it. Conformance is what the spec requires; verified is what the suite attests.","href":"/dist/docs/3.2.6/building/verification/conformance"},{"title":"Compliance Catalog","sidebarTitle":"Compliance Catalog","href":"/dist/docs/3.2.6/building/verification/compliance-catalog"},{"title":"Storyboards vs. scenarios — which is which","sidebarTitle":"Storyboards vs. Scenarios","description":"Three things in AdCP share the word 'scenarios' and they aren't the same. Here's how to tell them apart.","href":"/dist/docs/3.2.6/building/verification/storyboards-vs-scenarios"},{"title":"How grading works","sidebarTitle":"How grading works","href":"/dist/docs/3.2.6/building/verification/how-grading-works"},{"title":"Validate your agent using storyboards","sidebarTitle":"Validate Your Agent","href":"/dist/docs/3.2.6/building/verification/validate-your-agent"},{"title":"Validate adapter agents with mock upstream fixtures","sidebarTitle":"Mock Upstream Fixtures","href":"/dist/docs/3.2.6/building/verification/validate-with-mock-fixtures"},{"title":"Pair-program with Addie (Socket Mode)","sidebarTitle":"Pair with Addie","href":"/dist/docs/3.2.6/building/verification/addie-socket-mode"},{"title":"Auth Graders","sidebarTitle":"Auth Graders","href":"/dist/docs/3.2.6/building/verification/grading"},{"title":"Get Test-Ready","sidebarTitle":"Get Test-Ready","href":"/dist/docs/3.2.6/building/verification/get-test-ready"},{"title":"AAO Verified","sidebarTitle":"AAO Verified","href":"/dist/docs/3.2.6/building/verification/aao-verified"}]},{"group":"Operating","expanded":false,"pages":[{"title":"Operating an Agent","sidebarTitle":"Operating an Agent","href":"/dist/docs/3.2.6/building/operating/operating-an-agent"},{"title":"Orchestrator Design","href":"/dist/docs/3.2.6/building/operating/orchestrator-design"},{"title":"Transport Error Mapping","href":"/dist/docs/3.2.6/building/operating/transport-errors"},{"title":"Making your inventory available to AI agents","sidebarTitle":"Seller integration","href":"/dist/docs/3.2.6/building/operating/seller-integration"},{"title":"Storyboard troubleshooting","href":"/dist/docs/3.2.6/building/operating/storyboard-troubleshooting"},{"title":"Support recovery runbooks","sidebarTitle":"Support recovery","href":"/dist/docs/3.2.6/building/operating/support-recovery-runbooks"}]},{"group":"Accounts","expanded":false,"pages":[{"title":"Accounts Protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/accounts/overview"},{"title":"Set up your buyer agent with a seller","sidebarTitle":"Buyer agent setup","href":"/dist/docs/3.2.6/accounts/principal-registration-walkthrough"},{"title":"Provision a seller-mediated account","sidebarTitle":"Provision an account","href":"/dist/docs/3.2.6/accounts/provisioning-walkthrough"},{"title":"sync_accounts","href":"/dist/docs/3.2.6/accounts/tasks/sync_accounts"},{"title":"list_accounts","href":"/dist/docs/3.2.6/accounts/tasks/list_accounts"},{"title":"report_usage","href":"/dist/docs/3.2.6/accounts/tasks/report_usage"},{"title":"sync_governance","href":"/dist/docs/3.2.6/accounts/tasks/sync_governance"},{"title":"get_account_financials","href":"/dist/docs/3.2.6/accounts/tasks/get_account_financials"},{"title":"list_account_changes","href":"/dist/docs/3.2.6/accounts/tasks/list_account_changes"}]}]},{"group":"Protocol","expanded":false,"pages":[{"group":"Media Buy","expanded":false,"pages":[{"title":"Media buy protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/media-buy/index"},{"title":"Commerce Media","href":"/dist/docs/3.2.6/media-buy/commerce-media"},{"group":"Concepts","pages":[{"title":"Product discovery and planning","sidebarTitle":"Discovery and planning","href":"/dist/docs/3.2.6/media-buy/product-discovery/index"},{"title":"Brief expectations","href":"/dist/docs/3.2.6/media-buy/product-discovery/brief-expectations"},{"title":"Example campaign discovery requests","href":"/dist/docs/3.2.6/media-buy/product-discovery/example-briefs"},{"title":"Media Products","href":"/dist/docs/3.2.6/media-buy/product-discovery/media-products"},{"title":"Collections and installments","href":"/dist/docs/3.2.6/media-buy/product-discovery/collections-and-installments"},{"title":"Proposal negotiation","href":"/dist/docs/3.2.6/media-buy/product-discovery/proposal-negotiation"},{"title":"MediaBuy lifecycle","href":"/dist/docs/3.2.6/media-buy/media-buys/index"},{"title":"Media Buy Lifecycle Flow","href":"/dist/docs/3.2.6/media-buy/media-buys/lifecycle"},{"title":"Indicators and Warnings","href":"/dist/docs/3.2.6/media-buy/media-buys/indicators"},{"title":"Optimization \u0026 Reporting","href":"/dist/docs/3.2.6/media-buy/media-buys/optimization-reporting"},{"title":"Policy compliance","href":"/dist/docs/3.2.6/media-buy/media-buys/policy-compliance"},{"title":"Creative Lifecycle","href":"/dist/docs/3.2.6/media-buy/creatives/index"},{"title":"Conversion Tracking \u0026 Optimization Goals","href":"/dist/docs/3.2.6/media-buy/conversion-tracking/index"},{"title":"Pricing Models","href":"/dist/docs/3.2.6/media-buy/advanced-topics/pricing-models"},{"title":"Targeting","href":"/dist/docs/3.2.6/media-buy/advanced-topics/targeting"},{"title":"Accountability","sidebarTitle":"Accountability","href":"/dist/docs/3.2.6/media-buy/advanced-topics/accountability"},{"title":"Billing Authority","sidebarTitle":"Billing Authority","href":"/dist/docs/3.2.6/media-buy/advanced-topics/billing-authority"},{"group":"3.x compatibility","expanded":false,"pages":[{"title":"Refinement","href":"/dist/docs/3.2.6/media-buy/product-discovery/refinement"}]}]},{"group":"Building","pages":[{"title":"Capability Discovery","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/media-buy/capability-discovery/index"},{"title":"Implementing Standard Format Support","href":"/dist/docs/3.2.6/media-buy/capability-discovery/implementing-standard-formats"},{"title":"Reliable Reporting: implementing reporting.core","href":"/dist/docs/3.2.6/media-buy/reporting-core-implementation-guide"},{"title":"Agentic eXecution Engine (AXE)","href":"/dist/docs/3.2.6/media-buy/advanced-topics/agentic-execution-engine"},{"title":"Accounts \u0026 Security","href":"/dist/docs/3.2.6/media-buy/advanced-topics/accounts-and-security"},{"title":"Sandbox mode","href":"/dist/docs/3.2.6/media-buy/advanced-topics/sandbox"}]},{"group":"Reference","expanded":false,"pages":[{"title":"Media Buy Specification","sidebarTitle":"Specification","href":"/dist/docs/3.2.6/media-buy/specification"},{"title":"Task Reference","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/media-buy/task-reference/index"},{"title":"list_products","href":"/dist/docs/3.2.6/media-buy/task-reference/list_products"},{"title":"request_proposals","href":"/dist/docs/3.2.6/media-buy/task-reference/request_proposals"},{"title":"refine_proposals","href":"/dist/docs/3.2.6/media-buy/task-reference/refine_proposals"},{"title":"decline_proposals","href":"/dist/docs/3.2.6/media-buy/task-reference/decline_proposals"},{"title":"buy_products","href":"/dist/docs/3.2.6/media-buy/task-reference/buy_products"},{"title":"accept_proposal","href":"/dist/docs/3.2.6/media-buy/task-reference/accept_proposal"},{"title":"control_media_buy","href":"/dist/docs/3.2.6/media-buy/task-reference/control_media_buy"},{"title":"sync_catalogs","href":"/dist/docs/3.2.6/media-buy/task-reference/sync_catalogs"},{"title":"get_media_buys","href":"/dist/docs/3.2.6/media-buy/task-reference/get_media_buys"},{"title":"get_media_buy_delivery","href":"/dist/docs/3.2.6/media-buy/task-reference/get_media_buy_delivery"},{"title":"get_reporting_status","href":"/dist/docs/3.2.6/media-buy/task-reference/get_reporting_status"},{"title":"sync_reporting_status","href":"/dist/docs/3.2.6/media-buy/task-reference/sync_reporting_status"},{"title":"sync_reporting_receipts","href":"/dist/docs/3.2.6/media-buy/task-reference/sync_reporting_receipts"},{"title":"provide_performance_feedback","href":"/dist/docs/3.2.6/media-buy/task-reference/provide_performance_feedback"},{"title":"sync_event_sources","href":"/dist/docs/3.2.6/media-buy/task-reference/sync_event_sources"},{"title":"log_event","href":"/dist/docs/3.2.6/media-buy/task-reference/log_event"},{"title":"sync_audiences","href":"/dist/docs/3.2.6/media-buy/task-reference/sync_audiences"},{"group":"3.x compatibility","expanded":false,"pages":[{"title":"get_products","href":"/dist/docs/3.2.6/media-buy/task-reference/get_products"},{"title":"create_media_buy","href":"/dist/docs/3.2.6/media-buy/task-reference/create_media_buy"},{"title":"update_media_buy","href":"/dist/docs/3.2.6/media-buy/task-reference/update_media_buy"}]}]}]},{"group":"Creative","expanded":false,"pages":[{"title":"Creative protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/creative/index"},{"group":"Concepts","pages":[{"title":"Key concepts","href":"/dist/docs/3.2.6/creative/key-concepts"},{"title":"AI creative for campaign teams","href":"/dist/docs/3.2.6/creative/ai-creative-overview"},{"title":"Generative Creative","href":"/dist/docs/3.2.6/creative/generative-creative"},{"title":"Creative libraries and concepts","href":"/dist/docs/3.2.6/creative/creative-libraries"},{"title":"Catalogs","href":"/dist/docs/3.2.6/creative/catalogs"},{"title":"Catalog item schemas","href":"/dist/docs/3.2.6/creative/catalog-schemas"}]},{"group":"Building Creative Agents","pages":[{"title":"Implementing Creative Agents","href":"/dist/docs/3.2.6/creative/implementing-creative-agents"},{"title":"Creative Capabilities on Sales Agents","href":"/dist/docs/3.2.6/creative/sales-agent-creative-capabilities"},{"title":"Multi-Agent Creative Orchestration","href":"/dist/docs/3.2.6/creative/multi-agent-orchestration"},{"title":"Creative Manifests","href":"/dist/docs/3.2.6/creative/creative-manifests"},{"title":"Private assets","href":"/dist/docs/3.2.6/creative/private-assets"},{"title":"Buyer-attached inputs to build_creative","sidebarTitle":"Buyer-attached inputs","href":"/dist/docs/3.2.6/creative/buyer-attached-inputs"}]},{"group":"Formats and Assets","pages":[{"title":"Canonical Formats","href":"/dist/docs/3.2.6/creative/canonical-formats"},{"title":"Migration to Canonical Formats","href":"/dist/docs/3.2.6/creative/canonical-formats-migration"},{"title":"Creative Formats","href":"/dist/docs/3.2.6/creative/formats"},{"title":"Asset Types","href":"/dist/docs/3.2.6/creative/asset-types"},{"title":"Creative representation sets","href":"/dist/docs/3.2.6/creative/representation-sets"},{"title":"Published Post Reference Creatives","href":"/dist/docs/3.2.6/creative/published-post-reference-creatives"},{"title":"Sponsored Placement adapter contracts","href":"/dist/docs/3.2.6/creative/sponsored-placement-adapter-contracts"},{"title":"Migrating Template Format IDs","href":"/dist/docs/3.2.6/creative/template-format-ids"},{"title":"Universal Macros","href":"/dist/docs/3.2.6/creative/universal-macros"},{"title":"Tracker execution contracts","href":"/dist/docs/3.2.6/creative/tracker-execution-contracts"}]},{"group":"Channel Guides","pages":[{"title":"Video Ads","href":"/dist/docs/3.2.6/creative/channels/video"},{"title":"Connected TV","href":"/dist/docs/3.2.6/creative/channels/ctv"},{"title":"CTV Experience Profiles","href":"/dist/docs/3.2.6/creative/ctv-experiences"},{"title":"Broadcast Creative","href":"/dist/docs/3.2.6/creative/channels/broadcast"},{"title":"Display Ads","href":"/dist/docs/3.2.6/creative/channels/display"},{"title":"Audio Ads","href":"/dist/docs/3.2.6/creative/channels/audio"},{"title":"Radio creative","href":"/dist/docs/3.2.6/creative/channels/radio"},{"title":"Digital Out-of-Home","href":"/dist/docs/3.2.6/creative/channels/dooh"},{"title":"Out-of-Home (Static)","href":"/dist/docs/3.2.6/creative/channels/ooh"},{"title":"Print Creative","href":"/dist/docs/3.2.6/creative/channels/print"},{"title":"Carousel Ads","href":"/dist/docs/3.2.6/creative/channels/carousels"},{"title":"Social and Native Ads","href":"/dist/docs/3.2.6/creative/channels/social-native"}]},{"group":"Compliance","pages":[{"title":"Accessibility","href":"/dist/docs/3.2.6/creative/accessibility"},{"title":"AI provenance and disclosure","sidebarTitle":"Provenance","href":"/dist/docs/3.2.6/creative/provenance"}]},{"group":"Reference","expanded":false,"pages":[{"title":"Creative Specification","sidebarTitle":"Specification","href":"/dist/docs/3.2.6/creative/specification"},{"title":"build_creative","href":"/dist/docs/3.2.6/creative/task-reference/build_creative"},{"title":"preview_creative","href":"/dist/docs/3.2.6/creative/task-reference/preview_creative"},{"title":"preview_creative (Advanced)","href":"/dist/docs/3.2.6/creative/task-reference/preview_creative-advanced"},{"title":"list_creative_formats (deprecated)","href":"/dist/docs/3.2.6/creative/task-reference/list_creative_formats"},{"title":"list_transformers","href":"/dist/docs/3.2.6/creative/task-reference/list_transformers"},{"title":"list_creatives","href":"/dist/docs/3.2.6/creative/task-reference/list_creatives"},{"title":"sync_creatives","href":"/dist/docs/3.2.6/creative/task-reference/sync_creatives"},{"title":"get_creative_delivery","href":"/dist/docs/3.2.6/creative/task-reference/get_creative_delivery"}]}]},{"group":"Governance","expanded":false,"pages":[{"title":"Governance protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/overview"},{"title":"RFC process","href":"/dist/docs/3.2.6/governance/rfc-process"},{"title":"Embedded human judgment","sidebarTitle":"Embedded human judgment","href":"/dist/docs/3.2.6/governance/embedded-human-judgment"},{"title":"Sell-side governance boundaries","sidebarTitle":"Sell-side boundaries","href":"/dist/docs/3.2.6/governance/sell-side-governance"},{"title":"Policy Registry","sidebarTitle":"Policy Registry","href":"/dist/docs/3.2.6/governance/policy-registry"},{"title":"Policy Registry: Sync and versioning","sidebarTitle":"Sync and versioning","href":"/dist/docs/3.2.6/governance/policy-registry-sync"},{"title":"Policy Attribution","sidebarTitle":"Policy Attribution","href":"/dist/docs/3.2.6/governance/policy-attribution"},{"title":"Annex III \u0026 Article 22 obligations","sidebarTitle":"Annex III \u0026 Art 22","href":"/dist/docs/3.2.6/governance/annex-iii-obligations"},{"title":"Working group charter","sidebarTitle":"Working group charter","href":"/dist/docs/3.2.6/governance/working-group-charter"},{"group":"Property Governance","pages":[{"title":"Property Governance","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/property/index"},{"title":"adagents.json Tech Spec","href":"/dist/docs/3.2.6/governance/property/adagents"},{"title":"Managed Network Deployment","href":"/dist/docs/3.2.6/governance/property/managed-networks"},{"title":"Understanding Authorization","href":"/dist/docs/3.2.6/governance/property/authorized-properties"},{"title":"Property Governance Specification","sidebarTitle":"Specification","href":"/dist/docs/3.2.6/governance/property/specification"},{"group":"Tasks","pages":[{"title":"Property Governance Tasks","sidebarTitle":"Task Reference","href":"/dist/docs/3.2.6/governance/property/tasks/index"},{"title":"Property List Management","href":"/dist/docs/3.2.6/governance/property/tasks/property_lists"},{"title":"validate_property_delivery","href":"/dist/docs/3.2.6/governance/property/tasks/validate_property_delivery"}]}]},{"group":"Collection Governance","pages":[{"title":"Collection Governance","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/collection/index"},{"title":"Collection List Management","href":"/dist/docs/3.2.6/governance/collection/tasks/collection_lists"}]},{"group":"Content Standards","pages":[{"title":"Content Standards","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/content-standards/index"},{"title":"Content Artifacts","sidebarTitle":"Artifacts","href":"/dist/docs/3.2.6/governance/content-standards/artifacts"},{"title":"Content Standards Implementation","sidebarTitle":"Implementation Guide","href":"/dist/docs/3.2.6/governance/content-standards/implementation-guide"},{"group":"Tasks","pages":[{"title":"list_content_standards","href":"/dist/docs/3.2.6/governance/content-standards/tasks/list_content_standards"},{"title":"get_content_standards","href":"/dist/docs/3.2.6/governance/content-standards/tasks/get_content_standards"},{"title":"create_content_standards","href":"/dist/docs/3.2.6/governance/content-standards/tasks/create_content_standards"},{"title":"update_content_standards","href":"/dist/docs/3.2.6/governance/content-standards/tasks/update_content_standards"},{"title":"calibrate_content","href":"/dist/docs/3.2.6/governance/content-standards/tasks/calibrate_content"},{"title":"get_media_buy_artifacts","href":"/dist/docs/3.2.6/governance/content-standards/tasks/get_media_buy_artifacts"},{"title":"validate_content_delivery","href":"/dist/docs/3.2.6/governance/content-standards/tasks/validate_content_delivery"}]}]},{"group":"Creative Governance","pages":[{"title":"Creative Governance","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/creative/index"},{"title":"get_creative_features","href":"/dist/docs/3.2.6/governance/creative/get_creative_features"},{"title":"Provenance verification","sidebarTitle":"Provenance verification","href":"/dist/docs/3.2.6/governance/creative/provenance-verification"},{"title":"Policy-backed creative rejections","sidebarTitle":"Policy-backed rejections","href":"/dist/docs/3.2.6/governance/creative/policy-backed-rejections"}]},{"group":"Campaign Governance","pages":[{"title":"Campaign Governance","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/campaign/index"},{"title":"Buyer and Seller Responsibilities","sidebarTitle":"Responsibilities","href":"/dist/docs/3.2.6/governance/campaign/responsibilities"},{"title":"Safety Model","sidebarTitle":"Safety Model","href":"/dist/docs/3.2.6/governance/campaign/safety-model"},{"title":"Specification","sidebarTitle":"Specification","href":"/dist/docs/3.2.6/governance/campaign/specification"},{"title":"Audit trail: internal vs shareable views","sidebarTitle":"Audit trail","href":"/dist/docs/3.2.6/governance/campaign/audit-trail"},{"group":"Tasks","pages":[{"title":"Task reference","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/governance/campaign/tasks/index"},{"title":"sync_plans","href":"/dist/docs/3.2.6/governance/campaign/tasks/sync_plans"},{"title":"report_plan_outcome","href":"/dist/docs/3.2.6/governance/campaign/tasks/report_plan_outcome"},{"title":"report_plan_adjustment","href":"/dist/docs/3.2.6/governance/campaign/tasks/report_plan_adjustment"},{"title":"check_governance","href":"/dist/docs/3.2.6/governance/campaign/tasks/check_governance"},{"title":"get_plan_audit_logs","href":"/dist/docs/3.2.6/governance/campaign/tasks/get_plan_audit_logs"}]}]}]},{"group":"Sponsored Intelligence","expanded":false,"pages":[{"title":"Sponsored Intelligence","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/sponsored-intelligence/overview"},{"title":"Monetizing AI surfaces","sidebarTitle":"Monetizing AI","href":"/dist/docs/3.2.6/sponsored-intelligence/monetizing-ai"},{"group":"Concepts","pages":[{"title":"Product spectrum","sidebarTitle":"Product spectrum","href":"/dist/docs/3.2.6/sponsored-intelligence/product-spectrum"},{"title":"Ad networks","sidebarTitle":"Ad networks","href":"/dist/docs/3.2.6/sponsored-intelligence/networks"},{"title":"End-to-end workflow","sidebarTitle":"Workflow","href":"/dist/docs/3.2.6/sponsored-intelligence/workflow"},{"title":"Measurement","sidebarTitle":"Measurement","href":"/dist/docs/3.2.6/sponsored-intelligence/measurement"}]},{"group":"SI Chat Protocol","pages":[{"title":"SI Chat Protocol","sidebarTitle":"SI Chat Protocol","href":"/dist/docs/3.2.6/sponsored-intelligence/si-chat-protocol"},{"title":"Implementing SI Agents","href":"/dist/docs/3.2.6/sponsored-intelligence/implementing-si-agents"},{"title":"Implementing SI Hosts","href":"/dist/docs/3.2.6/sponsored-intelligence/implementing-si-hosts"}]},{"group":"Reference","expanded":false,"pages":[{"title":"Sponsored Intelligence Specification","sidebarTitle":"Specification","href":"/dist/docs/3.2.6/sponsored-intelligence/specification"},{"title":"Sponsored Intelligence Tasks","sidebarTitle":"Task Reference","href":"/dist/docs/3.2.6/sponsored-intelligence/tasks/index"},{"title":"si_get_offering","href":"/dist/docs/3.2.6/sponsored-intelligence/tasks/si_get_offering"},{"title":"si_initiate_session","href":"/dist/docs/3.2.6/sponsored-intelligence/tasks/si_initiate_session"},{"title":"si_send_message","href":"/dist/docs/3.2.6/sponsored-intelligence/tasks/si_send_message"},{"title":"si_terminate_session","href":"/dist/docs/3.2.6/sponsored-intelligence/tasks/si_terminate_session"}]}]},{"group":"Brand","expanded":false,"pages":[{"title":"Brand protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/brand-protocol/index"},{"title":"Brand protocol","sidebarTitle":"Key concepts","href":"/dist/docs/3.2.6/brand-protocol/key-concepts"},{"title":"Rights licensing walkthrough","sidebarTitle":"Rights licensing","href":"/dist/docs/3.2.6/brand-protocol/walkthrough-rights-licensing"},{"title":"For advertisers","href":"/dist/docs/3.2.6/brand-protocol/for-advertisers"},{"title":"For talent and rights holders","href":"/dist/docs/3.2.6/brand-protocol/for-rights-holders"},{"title":"Seller setup","sidebarTitle":"For sellers","href":"/dist/docs/3.2.6/brand-protocol/seller-setup"},{"title":"brand.json Specification","href":"/dist/docs/3.2.6/brand-protocol/brand-json"},{"title":"Building a brand agent","href":"/dist/docs/3.2.6/brand-protocol/building-a-brand-agent"},{"title":"UI guidance for rejected claims","href":"/dist/docs/3.2.6/brand-protocol/ui-guidance"},{"group":"Tasks","pages":[{"title":"search_brands","href":"/dist/docs/3.2.6/brand-protocol/tasks/search_brands"},{"title":"get_brand_identity","href":"/dist/docs/3.2.6/brand-protocol/tasks/get_brand_identity"},{"title":"verify_brand_claim","href":"/dist/docs/3.2.6/brand-protocol/tasks/verify_brand_claim"},{"title":"verify_brand_claims","href":"/dist/docs/3.2.6/brand-protocol/tasks/verify_brand_claims"},{"title":"get_rights","href":"/dist/docs/3.2.6/brand-protocol/tasks/get_rights"},{"title":"acquire_rights","href":"/dist/docs/3.2.6/brand-protocol/tasks/acquire_rights"},{"title":"update_rights","href":"/dist/docs/3.2.6/brand-protocol/tasks/update_rights"}]}]},{"group":"Signals","expanded":false,"pages":[{"title":"Signals protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/signals/overview"},{"title":"Key concepts","href":"/dist/docs/3.2.6/signals/key-concepts"},{"title":"Signals ecosystem","href":"/dist/docs/3.2.6/signals/ecosystem"},{"title":"Data Provider Guide","sidebarTitle":"Data Providers","href":"/dist/docs/3.2.6/signals/data-providers"},{"group":"Reference","expanded":false,"pages":[{"title":"Signals Specification","sidebarTitle":"Specification","href":"/dist/docs/3.2.6/signals/specification"},{"title":"get_signals","href":"/dist/docs/3.2.6/signals/tasks/get_signals"},{"title":"activate_signal","href":"/dist/docs/3.2.6/signals/tasks/activate_signal"}]}]},{"group":"Trusted Match","expanded":false,"pages":[{"title":"Trusted Match Protocol","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/trusted-match/index"},{"title":"How demand reaches AI assistants","sidebarTitle":"AI mediation","href":"/dist/docs/3.2.6/trusted-match/ai-mediation"},{"title":"TMP for Buyer Agents","sidebarTitle":"Buyer Guide","href":"/dist/docs/3.2.6/trusted-match/buyer-guide"},{"title":"The Execution Gap","href":"/dist/docs/3.2.6/trusted-match/execution-gap"},{"title":"Context Match and Identity Match","href":"/dist/docs/3.2.6/trusted-match/context-and-identity"},{"title":"TMP Specification","href":"/dist/docs/3.2.6/trusted-match/specification"},{"title":"The TMP Router","href":"/dist/docs/3.2.6/trusted-match/router-architecture"},{"title":"Identity Match Frequency-Cap Data Flow","sidebarTitle":"Frequency-Cap Data Flow","href":"/dist/docs/3.2.6/trusted-match/identity-match-implementation"},{"title":"Impression Tracker Implementation Reference","sidebarTitle":"Impression Tracker Reference","href":"/dist/docs/3.2.6/trusted-match/impression-tracker-implementation"},{"title":"Privacy Architecture","href":"/dist/docs/3.2.6/trusted-match/privacy-architecture"},{"title":"Data Protection Roles","href":"/dist/docs/3.2.6/trusted-match/data-protection-roles"},{"title":"Migrating from AXE to TMP","sidebarTitle":"AXE Migration","href":"/dist/docs/3.2.6/trusted-match/migration-from-axe"},{"group":"Surface Guides","pages":[{"title":"TMP for Web Publishers","href":"/dist/docs/3.2.6/trusted-match/surfaces/web"},{"title":"TMP for CTV","href":"/dist/docs/3.2.6/trusted-match/surfaces/ctv"},{"title":"TMP for Mobile Apps","href":"/dist/docs/3.2.6/trusted-match/surfaces/mobile"},{"title":"TMP for Retail Media","href":"/dist/docs/3.2.6/trusted-match/surfaces/retail-media"},{"title":"TMP for AI Assistants","href":"/dist/docs/3.2.6/trusted-match/surfaces/ai-assistants"}]}]}]},{"group":"Using AAO","pages":[{"title":"Connect Addie to your AI client","href":"/dist/docs/3.2.6/aao/connect-addie"},{"title":"AAO for Members","href":"/dist/docs/3.2.6/aao/users"},{"title":"AAO for Org Admins","href":"/dist/docs/3.2.6/aao/org-admins"},{"title":"Addie Tool Reference","href":"/dist/docs/3.2.6/aao/addie-tools"},{"title":"AAO Directory API — Agent ↔ Publisher Inverse Lookup","href":"/dist/docs/3.2.6/aao/directory-api"}]},{"group":"FAQ","pages":[{"title":"Frequently asked questions","sidebarTitle":"FAQ","href":"/dist/docs/3.2.6/faq"}]},{"group":"Trust \u0026 Security","expanded":false,"pages":[{"title":"Trust \u0026 Security","sidebarTitle":"Trust \u0026 Security","href":"/dist/docs/3.2.6/trust"},{"title":"Seller verification","sidebarTitle":"Seller verification","href":"/dist/docs/3.2.6/verification/overview"},{"title":"AI Disclosure","href":"/dist/docs/3.2.6/ai-disclosure"},{"title":"Privacy Considerations","sidebarTitle":"Privacy Considerations","href":"/dist/docs/3.2.6/reference/privacy-considerations"},{"title":"Protocol Boundaries and Known Limitations","sidebarTitle":"Boundaries \u0026 Limitations","href":"/dist/docs/3.2.6/reference/known-limitations"}]},{"group":"Reference","expanded":false,"pages":[{"group":"Registry API","pages":[{"title":"Registry API","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/registry/index"},{"title":"Registering an agent","sidebarTitle":"Registering an agent","href":"/dist/docs/3.2.6/registry/registering-an-agent"},{"title":"Maintaining your agent","sidebarTitle":"Maintaining your agent","href":"/dist/docs/3.2.6/registry/maintaining-your-agent"},{"group":"Search","pages":[{"title":"API discovery","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api","href":"/dist/docs/3.2.6/registry/api-reference/search/api-discovery"},{"title":"Search","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/search","href":"/dist/docs/3.2.6/registry/api-reference/search/search"},{"title":"Manifest reference lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/manifest-refs/lookup","href":"/dist/docs/3.2.6/registry/api-reference/search/manifest-reference-lookup"}]},{"group":"Brand Resolution","pages":[{"title":"Resolve brand","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/brands/resolve","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/resolve-brand"},{"title":"Bulk resolve brands","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/brands/resolve/bulk","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/bulk-resolve-brands"},{"title":"Get brand.json","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/brands/brand-json","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/get-brandjson"},{"title":"Save brand","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/brands/save","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/save-brand"},{"title":"List brands","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/brands/registry","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/list-brands"},{"title":"Brand activity history","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/brands/history","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/brand-activity-history"},{"title":"Enrich brand","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/brands/enrich","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/enrich-brand"},{"title":"Find brands by name","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/brands/find","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/find-brands-by-name"},{"title":"Set up a hosted brand.json","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/brands/setup-my-brand","href":"/dist/docs/3.2.6/registry/api-reference/brand-resolution/set-up-a-hosted-brandjson"}]},{"group":"Property Resolution","pages":[{"title":"Property activity history","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/properties/history","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/property-activity-history"},{"title":"Resolve property","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/properties/resolve","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/resolve-property"},{"title":"Bulk resolve properties","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/properties/resolve/bulk","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/bulk-resolve-properties"},{"title":"List properties","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/properties/registry","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/list-properties"},{"title":"Validate adagents.json","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/properties/validate","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/validate-adagentsjson"},{"title":"Save property","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/properties/save","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/save-property"},{"title":"Claim a domain for bind-on-verify","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/properties/hosted/{domain}/claim","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/claim-a-domain-for-bind-on-verify"},{"title":"Verify AAO-hosted publisher origin","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/properties/hosted/{domain}/verify-origin","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/verify-aao-hosted-publisher-origin"},{"title":"Check property list","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/properties/check","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/check-property-list"},{"title":"Get property check report","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/properties/check/{reportId}","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/get-property-check-report"},{"title":"Bulk property identifier check","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/properties/check/bulk","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/bulk-property-identifier-check"},{"title":"Get bulk check report","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/properties/check/bulk/{reportId}","href":"/dist/docs/3.2.6/registry/api-reference/property-resolution/get-bulk-check-report"}]},{"group":"Agent Discovery","pages":[{"title":"List agents","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/list-agents"},{"title":"List publishers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/publishers","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/list-publishers"},{"title":"Registry statistics","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/stats","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/registry-statistics"},{"title":"Search agent inventory profiles","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/search","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/search-agent-inventory-profiles"},{"title":"Request domain re-crawl","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/crawl-request","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/request-domain-re-crawl"},{"title":"Get publisher crawl request status","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/crawl-request/{crawlRequestId}","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/get-publisher-crawl-request-status"},{"title":"Request manager fan-out re-validation","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/manager-revalidation-request","href":"/dist/docs/3.2.6/registry/api-reference/agent-discovery/request-manager-fan-out-re-validation"}]},{"group":"Authorization Lookups","pages":[{"title":"Domain lookup (deprecated)","deprecated":true,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/lookup/domain/{domain}","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/domain-lookup-deprecated"},{"title":"Property identifier lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/lookup/property","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/property-identifier-lookup"},{"title":"Agent domain lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/lookup/agent/{agentUrl}/domains","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/agent-domain-lookup"},{"title":"AAO directory inverse-lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/v1/agents/{encodedUrl}/publishers","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/aao-directory-inverse-lookup"},{"title":"AAO directory inverse-lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /v1/agents/{encodedUrl}/publishers","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/aao-directory-inverse-lookup-1"},{"title":"Operator lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/operator","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/operator-lookup"},{"title":"Publisher lookup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/publisher","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/publisher-lookup"},{"title":"Revalidate publisher adagents.json","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/publisher/{domain}/adagents/revalidate","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/revalidate-publisher-adagentsjson"},{"title":"Per-agent authorization rollup","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/publisher/authorization","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/per-agent-authorization-rollup"},{"title":"Validate product property coverage","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/validate/product-authorization","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/validate-product-property-coverage"},{"title":"Verify an owner-sold supply path","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/verify/supply-path","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/verify-an-owner-sold-supply-path"},{"title":"Expand product identifiers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/expand/product-identifiers","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/expand-product-identifiers"},{"title":"Property authorization check","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/validate/property-authorization","href":"/dist/docs/3.2.6/registry/api-reference/authorization-lookups/property-authorization-check"}]},{"group":"Brand Discovery","pages":[{"title":"Force a synchronous brand.json crawl","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/brand/{domain}/force-crawl","href":"/dist/docs/3.2.6/registry/api-reference/brand-discovery/force-a-synchronous-brandjson-crawl"},{"title":"Request brand.json re-crawl","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/brand-crawl-request","href":"/dist/docs/3.2.6/registry/api-reference/brand-discovery/request-brandjson-re-crawl"}]},{"group":"Validation Tools","pages":[{"title":"Validate adagents.json","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/adagents/validate","href":"/dist/docs/3.2.6/registry/api-reference/validation-tools/validate-adagentsjson"},{"title":"Generate adagents.json","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/adagents/create","href":"/dist/docs/3.2.6/registry/api-reference/validation-tools/generate-adagentsjson"}]},{"group":"Community Mirrors","pages":[{"title":"List community mirror proposals","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/mirror-proposals","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/list-community-mirror-proposals"},{"title":"Get community mirror proposal","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/mirror-proposals/{id}","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/get-community-mirror-proposal"},{"title":"Approve community mirror proposal","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/mirror-proposals/{id}/approve","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/approve-community-mirror-proposal"},{"title":"Reject community mirror proposal","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/mirror-proposals/{id}/reject","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/reject-community-mirror-proposal"},{"title":"List community mirrors","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/mirrors","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/list-community-mirrors"},{"title":"Get community mirror","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/mirrors/{platform}","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/get-community-mirror"},{"title":"Publish or propose community mirror","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/mirrors/{platform}","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/publish-or-propose-community-mirror"},{"title":"Delete community mirror","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml delete /api/registry/mirrors/{platform}","href":"/dist/docs/3.2.6/registry/api-reference/community-mirrors/delete-community-mirror"}]},{"group":"Agent Probing","pages":[{"title":"Discover agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/public/discover-agent","href":"/dist/docs/3.2.6/registry/api-reference/agent-probing/discover-agent"},{"title":"Get creative-agent format capabilities","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/public/agent-formats","href":"/dist/docs/3.2.6/registry/api-reference/agent-probing/get-creative-agent-format-capabilities"},{"title":"Get agent publisher properties","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/public/agent-publishers","href":"/dist/docs/3.2.6/registry/api-reference/agent-probing/get-agent-publisher-properties"},{"title":"Get agent products","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/public/agent-products","href":"/dist/docs/3.2.6/registry/api-reference/agent-probing/get-agent-products"},{"title":"Validate publisher","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/public/validate-publisher","href":"/dist/docs/3.2.6/registry/api-reference/agent-probing/validate-publisher"}]},{"group":"Policy Registry","pages":[{"title":"List policies","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/policies/registry","href":"/dist/docs/3.2.6/registry/api-reference/policy-registry/list-policies"},{"title":"Resolve policy","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/policies/resolve","href":"/dist/docs/3.2.6/registry/api-reference/policy-registry/resolve-policy"},{"title":"Bulk resolve policies","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/policies/resolve/bulk","href":"/dist/docs/3.2.6/registry/api-reference/policy-registry/bulk-resolve-policies"},{"title":"Policy revision history","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/policies/history","href":"/dist/docs/3.2.6/registry/api-reference/policy-registry/policy-revision-history"},{"title":"Save policy","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/policies/save","href":"/dist/docs/3.2.6/registry/api-reference/policy-registry/save-policy"}]},{"group":"Change Feed","pages":[{"title":"Registry change feed","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/feed","href":"/dist/docs/3.2.6/registry/api-reference/change-feed/registry-change-feed"},{"title":"Registry change feed stream","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/feed/stream","href":"/dist/docs/3.2.6/registry/api-reference/change-feed/registry-change-feed-stream"},{"title":"Per-agent authorization pull","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/authorizations","href":"/dist/docs/3.2.6/registry/api-reference/change-feed/per-agent-authorization-pull"},{"title":"Bootstrap snapshot for inline verifiers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/authorizations/snapshot","href":"/dist/docs/3.2.6/registry/api-reference/change-feed/bootstrap-snapshot-for-inline-verifiers"}]},{"group":"Agent Compliance","pages":[{"title":"Get agent compliance detail","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/compliance","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-compliance-detail"},{"title":"Select an exact badge grading profile","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/grading-profile","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/select-an-exact-badge-grading-profile"},{"title":"AAO public key set","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/.well-known/jwks.json","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/aao-public-key-set"},{"title":"Get agent AgenticAdvertising.org Verified status","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/verification","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-agenticadvertisingorg-verified-status"},{"title":"Get agent verification badge SVG","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/badge/{role}.svg","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-verification-badge-svg"},{"title":"Get embeddable badge code","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/badge/{role}/embed","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-embeddable-badge-code"},{"title":"Get version-pinned agent verification badge SVG","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/badge/{role}/{version}.svg","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-version-pinned-agent-verification-badge-svg"},{"title":"Get version-pinned embeddable badge code","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/badge/{role}/{version}/embed","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-version-pinned-embeddable-badge-code"},{"title":"Get agent storyboard status","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/storyboard-status","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-storyboard-status"},{"title":"Bulk storyboard status","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/storyboard-status","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/bulk-storyboard-status"},{"title":"Get agent compliance history","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/compliance/history","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-compliance-history"},{"title":"Update agent lifecycle stage","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/lifecycle","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/update-agent-lifecycle-stage"},{"title":"Update compliance opt-out","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/compliance/opt-out","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/update-compliance-opt-out"},{"title":"Get monitoring settings","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/monitoring/settings","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-monitoring-settings"},{"title":"Pause or resume monitoring","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/monitoring/pause","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/pause-or-resume-monitoring"},{"title":"Update monitoring interval","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/monitoring/interval","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/update-monitoring-interval"},{"title":"Requeue agent for compliance heartbeat","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/{encodedUrl}/monitoring/requeue","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/requeue-agent-for-compliance-heartbeat"},{"title":"Get per-step diagnostics for a compliance run","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/compliance/diagnostics","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-per-step-diagnostics-for-a-compliance-run"},{"title":"Get outbound request log","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/monitoring/requests","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-outbound-request-log"},{"title":"Refresh agent snapshot","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/{encodedUrl}/refresh","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/refresh-agent-snapshot"},{"title":"Get agent refresh status","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/refreshes/{operationId}","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-refresh-status"},{"title":"Get agent auth status","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/auth-status","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-agent-auth-status"},{"title":"Connect agent credentials","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/connect","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/connect-agent-credentials"},{"title":"Save OAuth 2.0 client-credentials for an agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml put /api/registry/agents/{encodedUrl}/oauth-client-credentials","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/save-oauth-20-client-credentials-for-an-agent"},{"title":"Dry-run the saved OAuth 2.0 client-credentials config","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/{encodedUrl}/oauth-client-credentials/test","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/dry-run-the-saved-oauth-20-client-credentials-config"},{"title":"Get applicable storyboards for agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/agents/{encodedUrl}/applicable-storyboards","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-applicable-storyboards-for-agent"},{"title":"List storyboards","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/storyboards","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/list-storyboards"},{"title":"Get storyboard detail","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/storyboards/{id}","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-storyboard-detail"},{"title":"Run a single storyboard step","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/{encodedUrl}/storyboard/{storyboardId}/step/{stepId}","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/run-a-single-storyboard-step"},{"title":"Get first step preview","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/storyboards/{storyboardId}/first-step","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/get-first-step-preview"},{"title":"Run full storyboard evaluation","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/{encodedUrl}/storyboard/{storyboardId}/run","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/run-full-storyboard-evaluation"},{"title":"Compare storyboard against reference agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/agents/{encodedUrl}/storyboard/{storyboardId}/compare","href":"/dist/docs/3.2.6/registry/api-reference/agent-compliance/compare-storyboard-against-reference-agent"}]},{"group":"Member Agents","pages":[{"title":"List my registered agents","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/me/agents","href":"/dist/docs/3.2.6/registry/api-reference/member-agents/list-my-registered-agents"},{"title":"Register an agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/me/agents","href":"/dist/docs/3.2.6/registry/api-reference/member-agents/register-an-agent"},{"title":"Remove an agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml delete /api/me/agents/{url}","href":"/dist/docs/3.2.6/registry/api-reference/member-agents/remove-an-agent"},{"title":"Update an agent","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml patch /api/me/agents/{url}","href":"/dist/docs/3.2.6/registry/api-reference/member-agents/update-an-agent"}]},{"group":"Onboarding","pages":[{"title":"Create or adopt my organization","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/organizations","href":"/dist/docs/3.2.6/registry/api-reference/onboarding/create-or-adopt-my-organization"}]},{"group":"Property Catalog","pages":[{"title":"Resolve identifiers to property_rids (and contribute them)","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/resolve","href":"/dist/docs/3.2.6/registry/api-reference/property-catalog/resolve-identifiers-to-property_rids-and-contribute-them"},{"title":"Dispute a catalog fact","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml post /api/registry/catalog/disputes","href":"/dist/docs/3.2.6/registry/api-reference/property-catalog/dispute-a-catalog-fact"},{"title":"Get a catalog dispute","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/catalog/disputes/{id}","href":"/dist/docs/3.2.6/registry/api-reference/property-catalog/get-a-catalog-dispute"},{"title":"Browse the property catalog","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/catalog","href":"/dist/docs/3.2.6/registry/api-reference/property-catalog/browse-the-property-catalog"},{"title":"Sync catalog changes since a watermark","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/adcontextprotocol/adcp/v3.2.6/static/openapi/registry.yaml get /api/registry/catalog/sync","href":"/dist/docs/3.2.6/registry/api-reference/property-catalog/sync-catalog-changes-since-a-watermark"}]}]},{"title":"GMSF Reference","href":"/dist/docs/3.2.6/reference/gmsf-reference"},{"title":"Media Channel Taxonomy","href":"/dist/docs/3.2.6/reference/media-channel-taxonomy"},{"title":"Measurement Taxonomy","sidebarTitle":"Measurement Taxonomy","href":"/dist/docs/3.2.6/measurement/taxonomy"},{"title":"Roadmap","href":"/dist/docs/3.2.6/reference/roadmap"},{"title":"Versions \u0026 Compatibility","sidebarTitle":"Versions","href":"/dist/docs/3.2.6/reference/versions"},{"title":"Versioning \u0026 Governance","href":"/dist/docs/3.2.6/reference/versioning"},{"title":"Specification lifecycle","sidebarTitle":"Specification lifecycle","href":"/dist/docs/3.2.6/reference/specification-lifecycle"},{"title":"URL Canonicalization","href":"/dist/docs/3.2.6/reference/url-canonicalization"},{"title":"Verifying protocol tarballs","href":"/dist/docs/3.2.6/reference/verifying-protocol-tarballs"},{"title":"Reference Test Vectors","sidebarTitle":"Reference test vectors","href":"/dist/docs/3.2.6/reference/test-vectors/index"},{"title":"Experimental Status","sidebarTitle":"Experimental status","href":"/dist/docs/3.2.6/reference/experimental-status"},{"title":"Schema Extensions","sidebarTitle":"Schema Extensions","href":"/dist/docs/3.2.6/reference/schema-extensions"},{"title":"v2 sunset","sidebarTitle":"v2 sunset","href":"/dist/docs/3.2.6/reference/v2-sunset"},{"title":"Release Notes","href":"/dist/docs/3.2.6/reference/release-notes"},{"title":"Changelog","href":"/dist/docs/3.2.6/reference/changelog"},{"title":"Implementor FAQ","href":"/dist/docs/3.2.6/reference/implementor-faq"},{"title":"Glossary","href":"/dist/docs/3.2.6/reference/glossary"},{"title":"Working Group","href":"/dist/docs/3.2.6/community/working-group"},{"title":"Joining the Community Slack","href":"/dist/docs/3.2.6/community/joining-slack"}]},{"group":"Certification","expanded":false,"pages":[{"title":"AdCP certification program","sidebarTitle":"Overview","href":"/dist/docs/3.2.6/learning/overview"},{"title":"Instructional design framework","sidebarTitle":"How we teach","href":"/dist/docs/3.2.6/learning/instructional-design"},{"title":"Failure-mode competency scope","sidebarTitle":"Failure modes","href":"/dist/docs/3.2.6/learning/failure-mode-scope"},{"group":"Basics (free)","pages":[{"title":"A1: Why AdCP","sidebarTitle":"A1: Why AdCP","href":"/dist/docs/3.2.6/learning/foundations/a1-agentic-advertising"},{"title":"A2: Your first media buy","sidebarTitle":"A2: Your first media buy","href":"/dist/docs/3.2.6/learning/foundations/a2-protocol-architecture"},{"title":"A2B: Testing your first agent call","sidebarTitle":"A2B: Testing your first agent call","href":"/dist/docs/3.2.6/learning/foundations/a2b-testing-your-first-agent"},{"title":"A3: The AdCP landscape","sidebarTitle":"A3: The AdCP landscape","href":"/dist/docs/3.2.6/learning/foundations/a3-ecosystem-governance"}]},{"group":"For decision-makers","pages":[{"title":"Decision-Makers track","sidebarTitle":"Decision-makers","href":"/dist/docs/3.2.6/learning/decision-makers/overview"},{"title":"L1: Agentic advertising and the reversed data flow","sidebarTitle":"L1: Agentic advertising","href":"/dist/docs/3.2.6/learning/decision-makers/l1-agentic-advertising"},{"title":"L2: Your data, brand, and governance as the control surface","sidebarTitle":"L2: Data, brand, governance","href":"/dist/docs/3.2.6/learning/decision-makers/l2-data-brand-governance"},{"title":"L3: Deciding and leading","sidebarTitle":"L3: Deciding and leading","href":"/dist/docs/3.2.6/learning/decision-makers/l3-deciding-and-leading"},{"title":"How to explain agentic advertising","sidebarTitle":"Explaining it to others","href":"/dist/docs/3.2.6/learning/decision-makers/explaining-agentic-advertising"}]},{"group":"Role tracks","pages":[{"title":"Publisher / seller track","sidebarTitle":"Publisher track","href":"/dist/docs/3.2.6/learning/tracks/publisher"},{"title":"Buyer / brand track","sidebarTitle":"Buyer track","href":"/dist/docs/3.2.6/learning/tracks/buyer"},{"title":"Platform / intermediary track","sidebarTitle":"Platform track","href":"/dist/docs/3.2.6/learning/tracks/platform"}]},{"group":"Specialist modules","pages":[{"title":"S1: Media buy mastery","sidebarTitle":"S1: Media buy","href":"/dist/docs/3.2.6/learning/specialist/media-buy"},{"title":"S2: Creative mastery","sidebarTitle":"S2: Creative","href":"/dist/docs/3.2.6/learning/specialist/creative"},{"title":"S3: Signals and audiences","sidebarTitle":"S3: Signals","href":"/dist/docs/3.2.6/learning/specialist/signals"},{"title":"S4: Governance","sidebarTitle":"S4: Governance","href":"/dist/docs/3.2.6/learning/specialist/governance"},{"title":"S5: Sponsored Intelligence","sidebarTitle":"S5: Sponsored Intelligence","href":"/dist/docs/3.2.6/learning/specialist/sponsored-intelligence"},{"title":"S6: Security","sidebarTitle":"S6: Security","href":"/dist/docs/3.2.6/learning/specialist/security"},{"title":"S7: Brand identity and verification","sidebarTitle":"S7: Brand identity","href":"/dist/docs/3.2.6/learning/specialist/brand"}]},{"group":"Supplements","expanded":false,"pages":[{"title":"Buyer briefs and discovery request shape","sidebarTitle":"Buyer briefs","href":"/dist/docs/3.2.6/learning/supplements/buyer-briefs-and-get-products"},{"title":"Governance protocol by role","sidebarTitle":"Governance by role","href":"/dist/docs/3.2.6/learning/supplements/governance-protocol-by-role"},{"title":"Creative agent workflows","sidebarTitle":"Creative workflows","href":"/dist/docs/3.2.6/learning/supplements/creative-agent-workflows"},{"title":"Lab: reconcile a shared account","sidebarTitle":"Shared-account changes","href":"/dist/docs/3.2.6/learning/shared-account-change-feed"}]},{"group":"Policies","expanded":false,"pages":[{"title":"Nondiscrimination policy","sidebarTitle":"Nondiscrimination","href":"/dist/docs/3.2.6/learning/policies/nondiscrimination"},{"title":"Learner records and privacy","sidebarTitle":"Learner records","href":"/dist/docs/3.2.6/learning/policies/learner-records"},{"title":"Recertification and protocol-change updates","sidebarTitle":"Recertification","href":"/dist/docs/3.2.6/learning/policies/recertification"},{"title":"Complaints and grievances","sidebarTitle":"Complaints","href":"/dist/docs/3.2.6/learning/policies/complaints"},{"title":"Conflict of interest","sidebarTitle":"Conflict of interest","href":"/dist/docs/3.2.6/learning/policies/conflict-of-interest"},{"title":"Intellectual property","sidebarTitle":"Intellectual property","href":"/dist/docs/3.2.6/learning/policies/intellectual-property"},{"title":"Personnel qualifications","sidebarTitle":"Personnel qualifications","href":"/dist/docs/3.2.6/learning/policies/personnel-qualifications"},{"title":"Refund and cancellation","sidebarTitle":"Refund","href":"/dist/docs/3.2.6/learning/policies/refund"}]}]}]},{"version":"3.3-beta","tag":"Latest","pages":[{"title":"3.3-beta","href":"/dist/docs/3.3.0-beta.0/building/verification/compliance-catalog"}]},{"version":"3.1","pages":[{"title":"3.1","href":"/dist/docs/3.1.27/building/verification/compliance-catalog"}]},{"version":"3.0","pages":[{"title":"3.0","href":"/dist/docs/3.0.28/building/verification/compliance-catalog"}]},{"version":"2.5 (archived)","pages":[{"title":"2.5 (archived)","href":"/dist/docs/2.5.3/intro"}]}]},"title":"AdCP — Compliance Catalog","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":["10e4515597"],"chunks":["BannerMarkdown-DblVYOPe.js","dist-BnkC_6oA.js","lib--scc4DXi.js","lib-B8HbPgcC.js","clsx-CCOYKgaU.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}