Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt

Use this file to discover all available pages before exploring further.

Prerelease upgrade notes

If you adopted a prerelease version, review the relevant section below before upgrading. If you are migrating from v2, see the main migration guide.

rc.3 β†’ 3.0

Breaking for rc.3 adopters

Arearc.33.0What to do
idempotency_key on mutating requestsOptionalRequired on every mutating request (schema ^[A-Za-z0-9_.:-]{16,255}$; UUID v4 for Verified). Sellers declare adcp.idempotency = { supported: true/false } on capabilities.Generate fresh key per logical operation. Persist keys across agent instances. Declare adcp.idempotency on get_adcp_capabilities (sellers). When supported: true, handle IDEMPOTENCY_CONFLICT and IDEMPOTENCY_EXPIRED; conformance probes require a mutated-payload replay to return CONFLICT. When supported: false, use natural-key checks instead of blind retries. See Security Β§ Idempotency.
Webhook signingHMAC-SHA256 with push_notification_config.authentication (required)RFC 9421 profile (baseline-required for sellers); HMAC fallback available through 3.x via authentication.credentialsPublish the webhook-signing JWK in your JWKS at jwks_uri (referenced from brand.json agents[]). Set adcp_use: "webhook-signing" on the JWK itself (NOT as a field on the agents[] entry), and keep kid unique across purposes within the JWKS. Drop push_notification_config.authentication from new configs; buyers opt into legacy HMAC via authentication.credentials. Receivers verify against the sender’s JWKS. The entire authentication object (HMAC + Bearer) is removed in 4.0.
idempotency_key on webhook payloadsNot standardized (fragile (task_id, status, timestamp) tuple dedup)Required β€” sender-generated UUID v4 on every payloadSellers: generate a cryptographically-random UUID v4 per event. Receivers: dedupe on idempotency_key with 24h minimum TTL, sender-scoped cache. Schemas affected: mcp-webhook-payload, collection-list-changed-webhook, property-list-changed-webhook, artifact-webhook-payload, revocation-notification.
revocation-notification.notification_idField name on rights revocation payloadRenamed to idempotency_keyFind-and-replace in your rights-revocation receivers.
MediaBuy.pending_approval statusPresentRemoved β€” approvals are explicit approval tasksRemove pending_approval from media-buy state filters. Consume approval tasks from the task surface.
Budget autonomybudget.authority_level enum (agent_full | agent_limited | human_required)Removed. Split into budget.reallocation_threshold (number) + plan.human_review_required (boolean)Rewrite: agent_full β†’ reallocation_unlimited: true; agent_limited β†’ reallocation_threshold: <positive>; human_required β†’ human_review_required: true. Regulated verticals (fair housing, lending, employment, pharmaceutical) enforce human_review_required: true via schema if/then.
inventory-lists specialismPresentRenamed to property-lists; collection-lists split out as separate specialismUpdate specialism claims. Agents that governed collection lists should now claim both property-lists and collection-lists.
Compliance path taxonomy/compliance/{v}/domains//compliance/{v}/protocols/Update any internal references to compliance paths. Runner and catalog use protocols/ exclusively.
governance_context carrierOpaque stringSigned JWSSwitch to JWS format. Verify signature via governance agent JWKS (resolved via sync_governance). Bind to sub, aud, phase, exp.
Media buy statuspending_activationRemoved β€” replaced by pending_creatives and pending_startReplace pending_activation in status filters, comparisons, and state machine logic. Schema: enums/media-buy-status.json. See details below.
Capabilities modelRedundant boolean gates (features.content_standards, brand.identity, trusted_match.supported, etc.)Removed β€” object presence is the signalRemove boolean capability checks. Test for object presence instead. Schema: protocol/get-adcp-capabilities-response.json. See capabilities migration below.
reporting_capabilitiesOptional on productsRequired on every productEnsure all products returned from get_products include reporting_capabilities. Schema: core/product.json.
account on update_media_buyOptionalRequiredPass account on all update_media_buy calls, matching create_media_buy behavior. Schema: media-buy/update-media-buy-request.json.
preview_creative schemaoneOf unionFlat object with request_type discriminantUpdate request builders to use the flat schema with request_type field. Schema: creative/preview-creative-request.json. See preview_creative migration below.
signal_id on get_signals responseOptional on signal itemsRequiredEnsure all signal items in get_signals responses include signal_id. Schema: signals/get-signals-response.json.
GOVERNANCE_DENIED errorNot in error code enumAdded as correctable errorHandle GOVERNANCE_DENIED in error handling logic. Schema: enums/error-code.json.
Governance lifecyclemedia_buy_id as lifecycle correlatorRemoved β€” governance_context is sole lifecycle correlatorReplace media_buy_id in governance schemas with governance_context. Handle purchase_type field on check_governance and report_plan_outcome. Schema: governance/check-governance-request.json. See governance migration below.
Geo capability fieldssupported_geo_levels, supported_metro_systems, supported_postal_systems (from #2143)Removed β€” use typed objects (geo_countries, geo_regions, geo_metros, geo_postal_areas)If you adopted the flat array shape from #2143, revert to typed geo objects with additionalProperties: false. Schema: protocol/get-adcp-capabilities-response.json.
comply_test_controller schemaoneOf unionFlat object with scenario discriminant and if/then validationUpdate request builders to use the flat schema with scenario field instead of oneOf variants.
Compliance testing surfaceAn interim rc.4 build accepted "compliance_testing" as a supported_protocols valueRemoved before GA. Compliance testing is declared via a top-level compliance_testing: { scenarios: [...] } capability block, not via supported_protocols.Remove "compliance_testing" from supported_protocols if present. Agents implementing comply_test_controller add a top-level compliance_testing: { scenarios: [...] } block instead.
Specialism IDsbroadcast-platform, social-platform, property-governance, collection-governanceRenamed/merged: sales-broadcast-tv, sales-social, inventory-lists (merges property + collection governance)Update specialism claims in get_adcp_capabilities.specialisms. See Compliance Catalog.
audience-sync parent protocolUnder governanceMoved to media-buyIf claiming audience-sync, add media_buy to supported_protocols.
Sponsored Intelligence scopesponsored_intelligence as a specialismPromoted to full protocol in supported_protocolsMove from specialisms to supported_protocols.

Media buy status migration

pending_activation was a single state covering two distinct conditions. It has been split:
Conditionrc.3 status3.0 status
Buy approved, no creatives assignedpending_activationpending_creatives
Buy ready to serve, waiting for flight datepending_activationpending_start
Buy is servingactiveactive (unchanged)
What to change:
  1. Status filters β€” Replace pending_activation with both pending_creatives and pending_start in status_filter arrays on get_media_buys and get_media_buy_delivery.
  2. Status comparisons β€” Any if (status === 'pending_activation') needs to branch on which condition you’re checking. If you want β€œnot yet serving,” check for both pending_creatives and pending_start. If you want β€œready but waiting for flight date,” check only pending_start.
  3. State machine transitions β€” rejected is now valid from both pending_creatives and pending_start (previously only from pending_activation). pending_creatives β†’ pending_start happens when creatives are assigned via sync_creatives.
  4. Legacy alias β€” pending continues to be accepted as an alias for pending_start in delivery response status filters.
See the canonical lifecycle diagram for the full state machine.

Capabilities model simplification

PR #2143 removed redundant boolean capability fields. Object presence now signals support β€” if you have the object, you have the capability. Removed fields and replacements:
Removed fieldWhat to do instead
media_buy.reportingUse product-level reporting_capabilities (now required)
features.content_standardsCheck for content_standards object presence
features.audience_targetingCheck for audience_targeting object presence
features.conversion_trackingCheck for conversion_tracking object presence
content_standards_detailRenamed to content_standards
brand.identityImplied by brand protocol support
trusted_match.supportedCheck for trusted_match object presence
targeting.device_platform / targeting.device_typeImplied by media_buy protocol support
targeting.audience_include / targeting.audience_excludeImplied by audience_targeting presence
Before (rc.3):
{
  "features": {
    "content_standards": true,
    "audience_targeting": true
  },
  "trusted_match": {
    "supported": true,
    "uid_types": ["email_sha256"]
  }
}
After (3.0):
{
  "content_standards": { ... },
  "audience_targeting": { ... },
  "trusted_match": {
    "uid_types": ["email_sha256"]
  }
}

preview_creative schema flattening

The preview_creative request is flattened from a oneOf union to a single object with a request_type discriminant. Three modes:
request_typeRequired fieldPurpose
singlecreative_manifestPreview one creative
batchrequests (array, 1-50 items)Preview multiple creatives
variantvariant_idReplay a post-flight variant
Before (rc.3):
{
  "creative_manifest": { "format_id": { ... }, "assets": { ... } }
}
After (3.0):
{
  "request_type": "single",
  "creative_manifest": { "format_id": { ... }, "assets": { ... } }
}
Schema: schemas/creative/preview-creative-request.json

Governance lifecycle migration

media_buy_id is removed from governance schemas. governance_context is an opaque string that serves as the sole lifecycle correlator across sync_plans, check_governance, report_plan_outcome, and get_plan_audit_logs. Before (rc.3):
{
  "media_buy_id": "mb_456",
  "planned_delivery": { ... }
}
After (3.0):
{
  "governance_context": "campaign_2024_q4_nova",
  "purchase_type": "media_buy",
  "planned_delivery": { ... }
}
Schema: schemas/governance/check-governance-request.json

context and ext fields

All request and response schemas across governance, collection, property, sponsored-intelligence, and content-standards protocols now include optional context and ext fields for application metadata and protocol extensions.

Additive changes in 3.0

  • RFC 9421 request signing profile (optional in 3.0, mandatory under AdCP Verified) β€” Ed25519 HTTP Message Signatures with canonicalized covered-component list. Published test vectors at static/compliance/source/test-vectors/request-signing/. sf-binary encoding and URL canonicalization pinned for bit-identical canonical inputs. 15-step verification checklist with keyid cap-before-crypto.
  • Webhook signing unified on RFC 9421 β€” Baseline-required for sellers emitting webhooks. Sellers publish a webhook-signing JWK in their JWKS at jwks_uri with adcp_use: "webhook-signing" on the JWK, and keep kid unique across purposes in the JWKS. 14-step webhook verifier checklist in the Security guide. HMAC-SHA256 remains a legacy fallback through 3.x (the entire authentication object is removed in 4.0).
  • Required idempotency_key on every webhook payload β€” Sender-generated UUID v4 across all five webhook payload schemas. Replaces fragile (task_id, status, timestamp) dedup. revocation-notification.notification_id renamed to idempotency_key for protocol-wide consistency.
  • check_governance on every spend-commit β€” Governance invocation is required at commit, not just at plan approval. Closes the loophole where partial spends could skip governance.
  • Experimental status mechanism β€” status: experimental marker for fields and tasks in production use but not yet under full stability guarantees. custom pricing-model escape hatch on signals.
  • submitted branch on create_media_buy β€” Seller has accepted the payload for processing but has not yet confirmed the order. Distinct from pending_creatives and pending_start.
  • Time semantics + activate_signal idempotency β€” Unifies time-field semantics across the protocol. activate_signal added to the required-idempotency table.
  • Known limitations + privacy-considerations reference pages β€” New /docs/reference/known-limitations and /docs/reference/privacy-considerations. Platform-agnostic lint prevents vendor-specific language from creeping into the spec.
  • Signed JWS governance_context β€” Governance decisions are now cryptographically verifiable. Sellers resolve the governance agent’s JWKS via sync_governance and verify sub / aud / phase / exp before honoring the decision.
  • Universal security storyboard β€” Every agent runs /compliance/{version}/universal/security.yaml (unauth rejection, API key, OAuth/RFC 9728, audience binding). Agents declaring signing also run the signed_requests harness.
  • Cross-instance state persistence β€” Architecture spec requires persistent state (tasks, media buys, plans, signed artifacts, idempotency keys) across horizontally-scaled instances.
  • Security implementation guide β€” New docs/building/implementation/security.mdx documents threat model, three-principal model (brand / operator / agent), and verification paths. Retires ambiguous β€œprincipal” terminology.
  • GDPR Art 22 / EU AI Act Annex III as schema invariants β€” New registry policy eu_ai_act_annex_iii. requires_human_review on policies and categories. Schema-level enforcement of human_review_required: true for regulated verticals.
  • Operating an Agent guide β€” New doc for publishers without engineering teams β€” three paths: partner, self-host, build.
  • Release cadence policy β€” Named cadence: patch monthly, minor quarterly, major annual if needed. v2 EOL August 1, 2026.
  • CHARTER.md β€” Formal governance charter published.
  • Collection lists β€” Program-level brand safety using distribution identifiers (IMDb, Gracenote, EIDR) for cross-publisher matching. New targeting overlay fields (collection_list, collection_list_exclude). New genre taxonomy enum.
  • Broadcast TV support β€” Ad-ID identifiers, broadcast spot formats (:15, :30, :60), Agency Estimate Number, measurement windows (Live, C3, C7), delivery data completeness (is_final, measurement_window).
  • Offline reporting delivery β€” reporting_delivery_methods on capabilities, reporting_bucket on accounts, supports_offline_delivery on product reporting_capabilities. Avro and ORC added as file format options.
  • TMPX exposure tracking β€” Country-partitioned identity and macro connectivity for the Trusted Match Protocol execution layer.
  • TMP provider registration β€” provider-registration.json schema, GET /health endpoint, dual discovery models (static config and dynamic API), per-provider latency budget semantics.
  • TMP multi-identity Identity Match β€” identity-match-request replaces single user_token + uid_type with an identities array (minItems 1, maxItems 3). Router filters per provider and re-signs with RFC 8785 JCS canonicalization; cache key adds consent_hash. Adds rampid_derived to the uid-type enum. Breaking relative to prior pre-release TMP drafts only; TMP remains pre-release in 3.0 and stabilizes in 3.1.0.
  • GOVERNANCE_DENIED error β€” New correctable error code for governance-rejected operations.
  • context/ext fields β€” Optional context and ext on all request/response schemas across governance, collection, property, SI, and content-standards protocols.
  • Compliance testing capability β€” Agents include a compliance_testing: { scenarios: [...] } block in get_adcp_capabilities declaring which comply_test_controller scenarios they support. The block’s presence is the signal β€” compliance testing is NOT a supported_protocols value. Storyboard runners use the block to determine whether deterministic testing steps can be validated.
  • Specialisms + compliance catalog β€” Storyboards ship in the protocol at /compliance/{version}/ (universal + protocols + specialisms + test-kits). New specialisms field on get_adcp_capabilities with 19 values across 6 protocols. Per-version protocol tarball at /protocol/{version}.tgz. See the Compliance Catalog.
  • Structured measurement terms β€” measurement_terms on products and media buys for billing vendor, IVT threshold, and viewability floor negotiation. cancellation_policy on guaranteed products. viewability-standard enum. TERMS_REJECTED error code.
  • Unified vendor pricing β€” pricing_options[] on list_creatives, build_creative, get_creative_features, and property-list. Shared vendor-pricing-option.json schema.
  • Per-request version declaration β€” adcp_major_version on all v3 request schemas. VERSION_UNSUPPORTED error code. Multi-version sellers supporting v2 clients must detect v2 payloads by structural cues, not by this field (v2 schemas do not have it).
  • Broadcast forecast schema β€” measurement_source, packages, and guaranteed_impressions on DeliveryForecast. New forecast-range-unit and forecastable-metric enums.
  • Broadcast station identifiers β€” station_id and facility_id identifier types. linear_tv property type.
  • Brand schema extensions β€” Generic agents array on brand.json. Visual tokens (border_radius, elevation, spacing, extended color roles). Structured font definitions.
  • Per-item error schema β€” sync_creatives, sync_catalogs, and sync_event_sources response errors now use error.json ref.
  • Property relationship field β€” relationship on brand.json property definitions (owned, direct, delegated, ad_network) for bilateral verification with adagents.json delegation types.
  • sales agent type restored β€” sales restored to brand-agent-type enum. Sales agents (SSPs, publishers) are distinct from buying agents (DSPs, buyer platforms).
  • Required tasks reference β€” New reference page consolidating required, conditional, and optional tasks across all AdCP protocols by agent role.
  • Storyboard validation fixes β€” 20+ validation bugs fixed across 11 storyboard files: corrected field paths (creatives[0].action, media_buy_deliveries, renders[0].preview_url), added missing value: to field_value checks, added value property to storyboard validation schema.

rc.1 β†’ rc.2

Potentially breaking for rc.1 adopters

Arearc.1rc.2What to do
Account auth modelaccount_resolution capabilityRemoved β€” require_operator_auth now determines account modelUpdate capability parsing and auth/account branching logic
Creative library task boundarylist_creatives / sync_creatives documented under Media BuyCreative library operations live in the Creative ProtocolRoute library reads/writes through Creative Protocol assumptions, even when a sales agent implements both protocols
Sandbox capability discoverymedia_buy.features.sandboxaccount.sandboxRead sandbox support from the account capability block
DOOH flat rate parametersflat_rate.parameters without discriminatorflat_rate.parameters.type: "dooh" required when parameters are presentAdd the discriminator in request builders and validators
Deprecated governance task docsdelete_content_standards, get_property_features documentedRemovedUse update_content_standards, property lists, and get_adcp_capabilities instead

Additive changes in rc.2

  • Creative generation and preview β€” build_creative adds include_preview, preview_inputs, preview_quality, preview_output_format, quality, item_limit, and multi-format target_format_ids. Buyers can now preview inline, choose draft vs production generation, and request multiple output formats in one call.
  • Creative library retrieval β€” build_creative also supports library retrieval using creative_id, optional concept_id, media_buy_id, package_id, and macro_values, so ad servers and creative platforms can resolve stored creatives into delivery-ready manifests.
  • Creative capability discovery β€” Creative agents can declare supports_generation, supports_transformation, and has_creative_library. list_creatives now uses library-oriented fields like include_snapshot, has_served, and items.
  • Product discovery and planning β€” get_products adds exclusivity, preferred_delivery_types, and time_budget, with incomplete in the response. Products may omit delivery_measurement, and packages can now carry per-package start_time / end_time.
  • Compliance and governance β€” Creative disclosures add persistence semantics, and campaign governance introduces sync_plans, check_governance, report_plan_outcome, and get_plan_audit_logs.
  • Accounts and sandbox ergonomics β€” sync_accounts adds payment_terms, and sandbox now participates in the natural account key for implicit account references.

Need help?

  • Community: Slack β€” best for quick questions from other implementers
  • Issues: GitHub Issues β€” for bugs, spec questions, or migration edge cases
  • Full v2 β†’ v3 migration: Migration guide