AdCP 3.0 expands the protocol beyond media buying into brand identity, governance, media planning, and conversational brand experiences.Documentation Index
Fetch the complete documentation index at: https://agenticadvertisingorg-changeset-release-main.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
At a glance
| Area | v2.x | v3.x |
|---|---|---|
| Protocol scope | Media Buy, Signals, Creative | Adds Brand Protocol, Governance, Sponsored Intelligence (experimental) |
| Brand identity | No standard mechanism | brand.json + community brand registry |
| Governance | No brand suitability protocol | Property lists, content standards, campaign governance, policy registry, and brand calibration |
| Sponsored Intelligence (experimental) | No conversational brand protocol | Consent-first brand sessions in AI assistants |
| Accounts Protocol | No formal account model | Named protocol layer: sync_accounts, list_accounts, report_usage, brand registry-grounded identity |
| Catalogs | promoted_offerings creative asset | First-class sync_catalogs task with 13 catalog types |
| Media planning | Products only | Proposals with budget allocations + delivery forecasts |
| Brand rights | No licensing protocol | get_rights, acquire_rights, update_rights with HMAC-authenticated webhooks β shipping experimental in 3.0 |
| Visual guidelines | No structured brand visuals | visual_guidelines on brand.json for generative creative systems |
| Creative workflows | Basic build / preview / sync separation | Inline preview, multi-format build_creative, library retrieval, quality tiers, and catalog item_limit |
| Creative libraries | Media Buy-centric creative reads/writes | list_creatives / sync_creatives as Creative Protocol operations plus supports_generation, supports_transformation, and has_creative_library discovery |
| Creative governance | No creative evaluation protocol | get_creative_features for security scanning, quality, content categorization |
| Disclosure matching | Position-only disclosure handling | Position + persistence-aware disclosure matching (continuous, initial, flexible) |
| Collections and installments | No content programming model | shows on products with distribution IDs, installment lifecycle, break-based inventory |
| Planning ergonomics | No time_budget, preferred_delivery_types, exclusivity, or per-package flights | time_budget + incomplete, preferred_delivery_types, exclusivity, optional delivery_measurement, and package-level start_time / end_time |
| Channel model | 9 channels | 20 planning-oriented channels (including sponsored_intelligence) with broadcast TV support (Ad-ID, measurement windows, spot formats) |
| Capability discovery | Agent card extensions | Runtime get_adcp_capabilities task |
| Sandbox discovery | Mixed capability locations | require_operator_auth for auth model, account.sandbox for sandbox support, sandbox in natural account references |
| Creative assignment | Simple ID arrays | Weighted assignments with placement targeting |
| Geo targeting | Implicit US-centric | Explicit named systems (global) |
| Keyword targeting | No keyword support | keyword_targets with match types and bid prices |
| Optimization | Single optimization goal | Multi-goal optimization_goals array with metric and event types |
| Delivery reporting | Aggregate delivery only | Opt-in dimension breakdowns (geo, device, audience, placement, keyword) |
| Signal pricing | Simple CPM | Structured pricing models: CPM, percent of media, flat fee, per-unit, and custom escape hatch for non-standard constructs |
| Device targeting | No form-factor targeting | device_type (desktop, mobile, tablet, ctv, dooh, unknown) distinct from device_platform (OS) |
| Proximity targeting | No point-based geo targeting | geo_proximity with travel time, radius, and GeoJSON methods |
| Refinement | Free-text with proposal_id | Typed change-request array with seller acknowledgment |
| Error handling | Unstructured errors | recovery field (transient, correctable, terminal) + 18 standard error codes |
| AI provenance | No provenance model | provenance object with IPTC source types, C2PA references, regulatory disclosures |
| Creative compliance | No compliance on briefs | required_disclosures, prohibited_claims, disclosure positions |
| Agent ergonomics | Full payloads on every call | fields projection, opt-in breakdowns, pre-flight capability filtering |
| Signal lifecycle | Activate only | activate / deactivate action on activate_signal |
New capabilities
Trust surface: idempotency, request signing, and signed governance
3.0 makes agent-to-agent transactions safe for real money by turning three operational disciplines into first-class protocol primitives.idempotency_key is required on every mutating request. Buyers generate a fresh key per logical operation β the schema requires ^[A-Za-z0-9_.:-]{16,255}$; AdCP Verified additionally requires a cryptographically-random UUID v4. Sellers declare dedup semantics on get_adcp_capabilities as either adcp.idempotency = { supported: true, replay_ttl_seconds: <1hβ7d, 24h recommended> } or { supported: false }. When supported: true, replay is safe: the seller returns replayed: true on exact replay, IDEMPOTENCY_CONFLICT when the same key accompanies a different payload, and IDEMPOTENCY_EXPIRED after the TTL. When supported: false, sending an idempotency_key is a no-op β naive retries double-process, and buyers MUST use natural-key checks (e.g., get_media_buys by buyer_ref) before retrying spend-committing operations. Clients MUST NOT assume a default; a seller missing this block is non-compliant. Since supported: true is a trust-bearing claim, conformance runners probe it with a deliberate payload-mutation replay β sellers claiming support MUST pass this probe before the declaration is considered verified.
RFC 9421 HTTP Message Signatures are optional in 3.0 and mandatory under AdCP Verified. Agents sign mutating requests with Ed25519 over a canonicalized covered-component list (method, target URI, content-digest, protocol-level fields). The spec pins sf-binary encoding and URL canonicalization so independent implementations produce bit-identical canonical inputs. A 15-step verification checklist defines the sellerβs path: alg allowlist, keyid cap-before-crypto (defense against unbounded verification), JWKS resolution via SSRF-validated fetch, jti replay dedup, audience binding. Published test vectors at static/compliance/source/test-vectors/request-signing/ let implementers validate correctness offline.
Webhooks are signed under the same RFC 9421 profile β baseline-required for sellers. Webhook authentication unifies on the AdCP 9421 profile as a symmetric variant of request signing: the seller signs outbound webhook requests with a key published in its JWKS at jwks_uri (discoverable via brand.json agents[]). The JWK itself carries adcp_use: "webhook-signing" (distinct from adcp_use: "request-signing"); kid values MUST be unique across purposes within a JWKS. No shared secret crosses the wire. The buyer verifies the signature using the sellerβs JWKS. A 14-step webhook verifier checklist β documented in the Security guide β covers trust-anchor scoping, downgrade-and-injection resistance, and per-keyid replay dedup (100K per keyid, 10M aggregate); verification failures return typed reason codes defined there. HMAC-SHA256 remains a legacy fallback through 3.x (opt-in via push_notification_config.authentication.credentials); the entire authentication object is removed in 4.0.
Every webhook payload carries a required idempotency_key. Webhooks use at-least-once delivery, so receivers must dedupe. Every webhook payload β MCP, collection-list changes, property-list changes, content-standards artifacts, rights revocations β carries a sender-generated, cryptographically-random UUID v4 idempotency_key stable across retries of the same event. Same name and format as the request-side field. Predictable keys allow pre-seeding a receiverβs dedup cache to suppress legitimate events, so sellers MUST generate keys from a cryptographic source.
governance_context is a signed JWS. When a governance agent approves a plan it returns a JWS β not an opaque string β signed with the governance agentβs key. The buyer echoes it in the media-buy envelope. Sellers verify the signature using the governance agentβs JWKS (resolved via sync_governance) and bind decisions to a specific buyer, plan, phase, and time without a round-trip. Stale or forged decisions are rejected at the transport layer. When a governance agent is configured on the plan, sellers MUST invoke check_governance before committing budget and MUST reject a spend-commit lacking a valid governance_context with PERMISSION_DENIED.
The compliance runner validates all of this. Every agent runs /compliance/{version}/universal/security.yaml regardless of which protocols or specialisms it claims β covering unauthenticated rejection, API key enforcement, OAuth discovery per RFC 9728, and audience binding. Agents that declare signing run the signed_requests and signed_webhooks harnesses: positive flows, tampering (header injection, body mutation, timestamp skew), replay (jti reuse), and the keyid-cap-before-crypto path. Runner output is a structured, verifiable runner-output.json artifact with a hash chain over the test-kit corpus so tampering is detectable.
Cross-instance state persistence is now a spec requirement. Agent state β tasks, media buys, plans, signed artifacts, idempotency keys β MUST be persistent across horizontally-scaled instances. In-memory-only state is non-compliant for production.
See the Security implementation guide for the full threat model, principal roles (brand / operator / agent), and step-by-step verification paths.
Security implementation
Specialisms and storyboard-driven compliance
Storyboards β scripted compliance scenarios that agents must pass β now live in the protocol at/compliance/{version}/, alongside schemas and task definitions. Agents declare two things in get_adcp_capabilities:
supported_protocolsβ broad domain claims (media_buy,creative,signals,governance,brand,sponsored_intelligence). Each commits the agent to the domainβs baseline storyboard.specialismsβ 19 narrow capability claims across the 6 domains. Examples:sales-guaranteed,sales-broadcast-tv,creative-generative,property-lists,signal-marketplace,brand-rights. Each rolls up to one parent protocol.
/protocol/{version}.tgz lets clients bulk-sync schemas, storyboards, and examples in one request.
runner-output.json with a hash chain over the test-kit corpus. AAO does not audit the output or gate issuance β the Verified stamp means βthis agent published passing runner output,β not βan auditor confirmed the claim.β Verifying parties (buyers, integrators, regulators) can re-run any claim against the referenced storyboards and compare output hashes.The compliance runner and the storyboards are themselves software shipping at 3.0 β they have bugs, coverage gaps, and in a few places they encode our best guess at spec intent where the working group is still refining the exact rule. When an implementer sees a storyboard failure, three things are possible: their agent has a bug, the storyboard has a bug, or the spec is ambiguous. All three are legitimate issues to file.Why self-attested and not audited at 3.0: the reference implementations AAO operates β the training agent and the @adcp/sdk / Python / Go SDKs β arenβt fully clean against the 3.0 storyboard suite yet. The training agent currently passes 32 of 55 applicable storyboards; SDK coverage is similar. We are working those pass rates to 100% over the 3.0 β 3.1 window on a 4β6 week cadence. When the reference implementations pass cleanly and the remaining spec ambiguities are resolved, the formal AdCP Verified program launches with 3.1 β agents will be able to submit runner output for independent re-execution by AAO, with a public registry of verified agents. Self-attestation in 3.0 is the bridge, not the end state.Compliance Catalog
Brand Protocol
Buy-side identity through/.well-known/brand.json. Just as publishers use adagents.json to declare properties and authorized agents, brands use brand.json to declare their identity, brand hierarchy, and authorized operators.
| Sell side | Buy side |
|---|---|
| Publisher | House (corporate entity) |
| Property | Brand (advertising identity) |
adagents.json | brand.json |
authorized_operators), reporting roll-up (group campaigns by house).
Brand Protocol
Brand rights lifecycle
Three tasks for licensing and usage rights between brands and content owners:| Task | Purpose |
|---|---|
get_rights | Discover available rights for a brandβs content |
acquire_rights | Request and negotiate rights acquisition |
update_rights | Modify active rights (extend, restrict, revoke) |
visual_guidelines on brand.json complement rights by giving generative creative systems structured rules for on-brand asset production: photography style, graphic elements, composition, motion, logo placement, colorways, type scale, and restrictions.
Brand rights
Collections and installments
Products can now reference persistent content programs β podcasts, TV series, YouTube channels β viacollections, which follows the same publisher-scoped selector pattern as publisher_properties. Collections are declared in the publisherβs adagents.json and products reference them by publisher domain and collection ID. Buyers resolve full collection objects from adagents.json. Collections include distribution identifiers for cross-seller matching, installment lifecycle states (scheduled, tentative, live, postponed, cancelled, aired, published), break-based ad inventory configuration, talent linking to brand.json, and international content rating systems.
Shows support relationships (spinoff, companion, sequel, prequel, crossover) and derivative content (clips, highlights, recaps) for comprehensive content modeling.
Collections and installments
Registry API
The AgenticAdvertising.org registry provides a public REST API for resolving brands and properties, discovering agents, and validating authorization. Most endpoints require no authentication.| Capability | Endpoint | Description |
|---|---|---|
| Brand resolution | /api/brands/resolve | Resolve domain to canonical brand |
| Property resolution | /api/properties/resolve | Resolve publisher domain to property info |
| Agent discovery | /api/registry/agents | List registered agents with capabilities |
| Authorization check | /api/registry/validate/property-authorization | Real-time authorization validation |
| Search | /api/search | Search across brands, publishers, and properties |
| Community brands | /api/brands/save | Contribute brand data (auth required) |
Registry API
Proposals and delivery forecasts
Publishers can return proposals alongside products β structured media plans with percentage-based budget allocations that buyers can execute directly viacreate_media_buy. Proposals encode publisher expertise, replacing ad-hoc product lists with actionable buying strategies. They can be refined through session continuity β subsequent get_products calls within the same session carry conversation history.
Delivery forecasts attach to proposals and allocations. Each forecast contains budget points with metric ranges (low/mid/high), showing how delivery scales with spend. Three forecast methods: estimate (rough approximation), modeled (predictive models), guaranteed (contractually committed). Forecasts can predict delivery metrics (impressions, reach, GRPs) and outcomes (purchases, leads, app installs). TV and radio forecasts use demographic_system and demographic for GRP-based planning.
Proposals and forecasting
Accounts
Formal billing relationships between buyers and sellers viasync_accounts.
Four entities:
| Entity | Question | How identified |
|---|---|---|
| Brand | Whose products are advertised? | House domain + brand_id via brand.json |
| Account | Who gets billed? | Account reference β account_id from list_accounts or natural key |
| Operator | Who operates on the brandβs behalf? | Domain (e.g., acmeagency.example.com) |
| Agent | What software places buys? | Authenticated session |
operator (operator or brand buying direct is invoiced) and agent (agent consolidates billing). Two trust models: agent-trusted (default, agent declares brands/operators) and operator-scoped (seller requires operator-level credentials).
Workflow: get_adcp_capabilities -> sync_accounts -> get_products with account -> create_media_buy with account.
Accounts Protocol
Catalogs
First-class catalog lifecycle withsync_catalogs. Thirteen catalog types: structural (offering, product, inventory, store, promotion) and industry-vertical (hotel, flight, job, vehicle, real_estate, education, destination, app). Vertical types have canonical item schemas drawn from Google Ads, Meta, LinkedIn, and Microsoft feed specs.
Formats declare what catalogs they need via catalog_requirements. Creatives reference synced catalogs by catalog_id instead of embedding items in assets. Catalogs declare conversion_events and content_id_type for attribution alignment.
Catalogs
Capability discovery
get_adcp_capabilities replaces both adcp-extension.json and the MCP agent card with runtime capability discovery. It returns supported protocols, account billing models, portfolio information, targeting systems, and governance features β all schema-validated.
get_adcp_capabilities
Governance Protocol
Brand suitability and inventory curation. Governance agents manage property lists (curated sets of properties for targeting or exclusion) and content standards (brand suitability policies with per-category block/allow rules). Buyers pass property lists toget_products for filtered inventory discovery, and use calibrate_content for collaborative alignment between brand and governance agent. Governance agents can enforce provenance_required on creative policy and support third-party AI content verification via the verification array on provenance claims.
Campaign governance extends this with plan-level policy and budget enforcement via sync_plans, check_governance, report_plan_outcome, and get_plan_audit_logs. Governance agents can operate in audit, advisory, or enforce mode, validate seller-side actions against delegated authority, and resolve standardized policies through the shared policy registry.
Art 22 / Annex III as schema invariants. For regulated verticals (credit, insurance pricing, recruitment, housing), AdCP 3.0 enforces mandatory human oversight at the protocol layer, not in deployer policy PDFs. policy_categories intersecting fair_housing | fair_lending | fair_employment | pharmaceutical_advertising makes plan.human_review_required: true a schema requirement β buyers cannot opt out. Governance agents MUST escalate every action on such plans regardless of budget. See Annex III & Art 22 obligations.
Governance Protocol
Sponsored Intelligence Protocol
Conversational brand experiences in AI assistants. SI defines how AI assistants invoke brand agents for rich engagement (text, voice, UI components) without breaking the conversational flow. Sessions follow a consent-first model: user expresses interest, grants consent, then the brand agent engages conversationally with optional transaction handoff.sponsored_intelligence.core) β session lifecycle, UI components, identity/consent, and capability negotiation may change between 3.x releases with at least 6 weeksβ notice. Sellers implementing SI MUST declare sponsored_intelligence.core in experimental_features. See experimental status for the full contract and the 3.1.0 roadmap for planned changes.SI Chat Protocol
Signal catalogs for data providers
Data providers can publish signal catalogs viaadagents.json, following the same pattern as publishers declaring properties.
| Publishers | Data providers |
|---|---|
| Declare properties | Declare signals |
Use property_ids / property_tags | Use signal_ids / signal_tags |
Buyers verify via publisher_domain | Buyers verify via data_provider_domain |
value_type (binary, categorical, numeric) with typed targeting, and structured signal_id objects that reference the data providerβs catalog.
Data provider guide
rc.1 to rc.2 highlights
This page covers the full v2 β v3 shift. If you already adopted3.0.0-rc.1, these are the most important rc.2 changes to review before upgrading.
Creative workflow and library changes
build_creative now supports inline preview (include_preview), multi-format output (target_format_ids), quality tiers, catalog-driven item_limit, and library retrieval using creative_id with optional concept_id, media_buy_id, package_id, and macro_values. preview_creative also adds quality control. Creative library operations are now explicitly Creative Protocol tasks: list_creatives and sync_creatives live with the rest of the creative lifecycle, and capability discovery adds supports_generation, supports_transformation, and has_creative_library so buyers can route requests intentionally.
Planning, accounts, and sandbox refinements
account_resolution is removed; buyers now use require_operator_auth to determine the auth and account model. Sandbox support moves to account.sandbox, and sandbox can participate in the natural account key for implicit-account flows. Product discovery adds preferred_delivery_types, exclusivity, and time_budget, with incomplete in responses when the seller cannot finish within the requested budget. Packages and product allocations can now carry per-package start_time / end_time, and delivery_measurement becomes optional on products.
Compliance and governance refinements
Creative compliance now includes disclosure persistence semantics in addition to position and duration, allowing formats to declare which persistence modes they can enforce. Campaign governance also lands in rc.2 withsync_plans, check_governance, report_plan_outcome, and get_plan_audit_logs, plus governance_context for canonical plan extraction. sync_governance provides a dedicated task for syncing governance agent endpoints to accounts, replacing the previous approach of embedding governance_agents on sync_accounts and list_accounts requests.
For the exhaustive rc.2 change list, see the Release Notes and CHANGELOG.md.
rc.3 to 3.0 highlights
Specialisms and compliance catalog
Storyboards move into the protocol at/compliance/{version}/ with a new specialisms field on get_adcp_capabilities. 21 specialisms roll up to 6 domains; four 3.1 archetypes ship with status: preview. See the Compliance Catalog. Renames: broadcast-platform β sales-broadcast-tv, social-platform β sales-social. Merge: property-governance + collection-governance β inventory-lists. Promotion: sponsored_intelligence specialism β full protocol.
Capabilities model simplification
The capabilities model is streamlined for 3.0: redundant boolean gates are removed. If acontent_standards object exists in get_adcp_capabilities, the agent supports content standards β no separate boolean needed.
reporting_capabilities is now required on every product. Geo capability fields keep their typed shapes: geo_countries and geo_regions as booleans, geo_metros and geo_postal_areas as structured objects.
See the prerelease upgrade notes for the full list of removed fields and migration steps.
Governance across purchase types
Campaign governance extends beyond media buys to cover brand rights licensing, signal activation, and creative services β any purchase where budget or policy rules apply.governance_context replaces media_buy_id as the identifier that ties governance actions together across a campaignβs lifecycle. A purchase_type field on check_governance and report_plan_outcome distinguishes the governed activity.
GOVERNANCE_DENIED error and schema consistency
GOVERNANCE_DENIED is added to the standard error codes with correctable recovery, enabling governance-rejected operations to return structured errors. All request/response schemas across governance, collection, property, sponsored-intelligence, and content-standards protocols gain optional context and ext fields for application metadata and protocol extensions. signal_id is now required on signal items in get_signals responses. The comply_test_controller schema is flattened from a oneOf union to a flat object with scenario discriminant.
Per-request version declaration
All request schemas now includeadcp_version (release-precision, e.g., "3.1"), allowing v3 buyers to declare which release their payloads conform to. Sellers validate against their advertised adcp.supported_versions array on get_adcp_capabilities and echo adcp_version at the envelope root on every response. Unsupported releases return VERSION_UNSUPPORTED. When omitted, sellers default to their highest supported version.
3.1 also retains adcp_major_version (integer) as a backwards-compatible legacy field, but release-precision adcp_version is the primary wire field going forward. See Version negotiation for the negotiation contract, migration timeline, and SDK pinning examples.
Note: both fields are v3-only β v2 clients cannot set either (the fields do not exist in v2 schemas). Multi-version sellers detect v2 payloads by structural cues (missing buying_mode, fixed_rate vs fixed_price, geo_postal_codes vs geo_postal_areas, etc.) rather than by these fields.
Collection lists
Collection lists extend brand safety from properties to content programs. Like property lists, collection lists are curated sets β but they target shows, series, and other content programs across platforms using distribution identifiers (IMDb, Gracenote, EIDR) for cross-publisher matching. New targeting overlay fieldscollection_list and collection_list_exclude enable both inclusion and exclusion targeting. A new genre taxonomy enum normalizes genre classification across buyers and sellers.
Collection lists
Broadcast TV support
Linear TV sellers can now fully participate in AdCP. This release adds the protocol primitives that distinguish broadcast from digital:- Ad-ID identifiers β
industry_identifierson creative assets and manifests, withcreative-identifier-typeenum (ad_id,isci,clearcast_clock). Broadcast creatives are identified by Ad-ID, which ties spots to rotation instructions and traffic systems. - Broadcast spot formats β Reference formats for :15, :30, and :60 spots. Video file only β no VAST, no impression trackers, no clickthrough URLs. The absence of tracker asset slots in a format signals that third-party pixel tracking is not supported.
- Agency Estimate Number β
agency_estimate_numberon media buys and packages. The financial reference that links broadcast orders to agency media plans and billing. - Measurement windows β
measurement_windowsonreporting_capabilitiesfor Live, C3, and C7 maturation.measurement_windowonbilling_measurementdeclares which window the guarantee is reconciled against. - Delivery data completeness β
is_finalandmeasurement_windowon per-package delivery data. Buyers know whether numbers are provisional or closed, and which measurement window they represent. Applies to any channel with maturing data (broadcast, podcast, long-tail content).
Broadcast TV
Structured measurement terms
Guaranteed buys gain a formal negotiation surface:measurement_terms defines billing measurement vendor, IVT threshold, and viewability floor. Sellers declare defaults on products, buyers propose overrides at create_media_buy, sellers accept/reject/adjust. A cancellation_policy schema declares notice periods and penalties for guaranteed products.
Unified vendor pricing
Pricing models extend from signals to creative, governance, and property list agents. Creative agents returnpricing_options[] on list_creatives and build_creative responses. Property lists carry pricing_options[]. All vendor pricing uses a shared vendor-pricing-option.json schema (cpm, percent_of_media, flat_fee).
Offline reporting delivery
Sellers can declare offline reporting delivery methods (SFTP, S3, GCS, Azure Blob) inget_adcp_capabilities via reporting_delivery_methods. Accounts specify a reporting_bucket for file delivery. Products declare supports_offline_delivery in reporting_capabilities. File formats include CSV, JSON, Parquet, Avro, and ORC.
Trusted Match Protocol extensions
TMP gains a provider registration schema (provider-registration.json) formalizing provider endpoints, capabilities, lifecycle status (active/inactive/draining), and per-provider timeout budgets. A GET /health endpoint enables router-side health monitoring. TMPX adds exposure tracking with country-partitioned identity resolution and macro connectivity.
Identity Match requests now accept an identities array (1-3 tokens per request) instead of a single user_token + uid_type pair. Publishers send every identity token they have; buyers resolve on whichever graph matches. The router filters identities per provider (minimum-necessary-data) and re-signs before forwarding β the forwarded set must be a subset of what the publisher sent. RFC 8785 JCS canonicalization is used for both signature and cache-key derivation, and consent_hash partitions the cache by consent state. rampid_derived is added to the uid-type enum.
TMP remains pre-release in 3.0. The stable surface is targeted for 3.1.0.
Brand schema extensions
brand.json gains a generic agents array for declaring brand-associated agents, visual tokens (border_radius, elevation, spacing, extended color roles), and structured font definitions with weight, style, stretch, optical_size, and usage fields.
Required tasks reference
A new Required tasks by protocol reference page consolidates required, conditional, and optional tasks across all AdCP protocols by agent role β a single page to verify your implementation covers the minimum surface.Experimental surfaces
AdCP 3.0 ships a core of stable surfaces under the 3.x stability guarantees, plus four surfaces that are part of the core protocol but not yet frozen. These surfaces are being co-developed with design partners β OpenAds, Scope3, Yahoo, ONX, and Triton Digital β running them in production engagements that shape the graduation path. Experimental surfaces carryx-status: experimental in their schemas, and sellers implementing them declare the feature id in experimental_features on get_adcp_capabilities. They may change between 3.x releases with at least 6 weeksβ notice.
| Surface | Feature id | Why experimental |
|---|---|---|
| Brand rights lifecycle | brand.rights_lifecycle | Legal-construct surface added late in the 3.0 cycle. First enterprise deployments will expose edge cases in partial rights, sublicensing, revocation, and dispute resolution. |
| Campaign governance | governance.campaign | Multi-party governance semantics (approval conflicts, audit provenance, tie-breaking under Embedded Human Judgment) are not yet settled. |
| Trusted Match Protocol | trusted_match.core | Privacy architecture will evolve with regulator engagement; TMPX exposure tokens, country-partitioned identity, and Offer macros are expected to change. |
| Sponsored Intelligence | sponsored_intelligence.core | Conversational brand experiences are a new advertising model. Session lifecycle, UI components, identity/consent object shape, and capability negotiation are expected to evolve as first-party AI hosts and brand agents integrate. |
Signal pricing: custom escape hatch
Vendor pricing gains acustom model alongside cpm, percent_of_media, flat_fee, and per_unit. Requires a human-readable description and a structured metadata object. Buyers SHOULD route custom pricing through operator review before commitment β automatic selection is not recommended.
Motivation: performance kickers, tiered volume, hybrid (flat + CPM), and outcome-shared pricing are already appearing in the field. Shipping the escape hatch now avoids retrofit pain when real deployments hit a construct the enumerated models cannot express. Structured metadata keeps the model machine-inspectable without a schema change per new pattern.
Breaking changes
Media channel taxonomy
v2βs 9 channels are replaced by 20 planning-oriented channels. Five channels carried over unchanged (display, social, ctv, podcast, dooh). The remaining four are split, removed, or renamed.
| v2 channel | v3 channel(s) | Notes |
|---|---|---|
display | display | Unchanged |
video | olv, linear_tv, cinema | Split by distribution context (ctv was already separate in v2) |
audio | radio, streaming_audio | Split by distribution (podcast was already separate in v2) |
native | Removed | Use format-level properties instead |
social | social | Unchanged |
ctv | ctv | Unchanged |
podcast | podcast | Unchanged |
dooh | dooh | Unchanged |
retail | retail_media | Renamed for clarity |
search, linear_tv, radio, streaming_audio, ooh, print, cinema, email, gaming, retail_media, influencer, affiliate, product_placement, sponsored_intelligence.
gaming channel covers intrinsic in-game ads, rewarded video, and playable ads. Rewarded video in gaming apps could also be classified as olv β use gaming when the inventory comes from a gaming budget.Channels deep dive
Pricing option field renames
v3 separates hard constraints (publisher-enforced prices) from soft hints (historical percentiles).fixed_rate becomes fixed_price, and price_guidance.floor moves to top-level floor_price.
| v2 field | v3 field | Notes |
|---|---|---|
fixed_rate | fixed_price | Renamed for clarity (itβs a price, not a rate) |
price_guidance.floor | floor_price | Moved to top level as hard constraint |
fixed_price corresponds to Programmatic Guaranteed (PG) and Preferred Deals, while floor_price corresponds to Private Marketplace (PMP) auctions. Open auction inventory omits both fields.
Pricing deep dive
Creative assignments with weighting
creative_ids string arrays are replaced by creative_assignments objects that support delivery weighting and placement targeting.
| v2 field | v3 field |
|---|---|
creative_ids (string array) | creative_assignments (object array with creative_id, weight, placement_ids) |
Creatives deep dive
assets array, repeatable groups, and format cards.Geo targeting with named systems
Metro and postal targeting now require explicit system specification, supporting global markets. Values are grouped by system using{ "system": "...", "values": [...] } objects.
| v2 field | v3 field |
|---|---|
geo_metros (string array) | geo_metros (system/values objects) |
geo_postal_codes (string array) | geo_postal_areas (system/values objects) |
geo_metros_exclude and geo_postal_areas_exclude for negative targeting (e.g., target the US except the New York DMA).
Geo targeting deep dive
Other targeting changes
v3 adds several targeting fields beyond geo:| Field | Description |
|---|---|
daypart_targets | Time-of-day and day-of-week targeting windows |
age_restriction | Age-gating for restricted content |
device_platform | Operating system targeting (iOS, Android, Windows, tvOS, etc.) |
device_type | Device form factor targeting (desktop, mobile, tablet, ctv, dooh, unknown) |
language | Content language targeting |
keyword_targets / negative_keywords | Keyword targeting for search and retail media with match types (broad, phrase, exact) and per-keyword bid prices |
device_type_exclude | Negative device form factor targeting |
geo_proximity | Point-based proximity targeting via travel time isochrones, radius, or GeoJSON geometry |
Unified asset discovery
Formats now use anassets array with required boolean instead of assets_required. See the creatives deep dive.
Catalogs replace promoted_offerings
Thepromoted_offerings creative asset type and promoted_offering string field are removed. Catalogs are now first-class protocol objects with their own sync lifecycle (sync_catalogs), format-level requirements (catalog_requirements), and conversion event alignment.
| v2 field | v3 replacement |
|---|---|
promoted_offerings (creative asset) | catalogs field on creative manifest |
promoted_offering (string on media-buy) | Removed β use brand + brief |
promoted_offering (string on creative-manifest) | Removed β use catalogs field |
Catalogs deep dive
Brand identity unification
Inlinebrand_manifest objects are replaced by brand references (BrandRef). Task schemas reference brands by { domain, brand_id } instead of passing manifests inline. Brand data is resolved from brand.json or the registry at execution time.
| v2/beta field | v3 rc.1 field |
|---|---|
brand_manifest (inline object) | brand ({ domain, brand_id }) |
get_products, create_media_buy, build_creative, and property list schemas.
Brand identity deep dive
Product delivery forecasts
estimated_exposures is replaced by a structured forecast field using the DeliveryForecast type.
| v2/beta field | v3 rc.1 field |
|---|---|
estimated_exposures (integer) | forecast (DeliveryForecast with time periods, metric ranges, methodology) |
Proposal refinement via buying mode
proposal_id is removed from the get_products request. Refinement now uses buying_mode: "refine" with a typed refine array of change-requests (see typed refinement). Session continuity (context_id in MCP, contextId in A2A) carries conversation history across calls.
Proposal execution via create_media_buy with proposal_id is unchanged.
| v2/beta field | v3 rc.1 field |
|---|---|
proposal_id on get_products request | Removed β use buying_mode: "refine" |
Optimization goals redesign
optimization_goal (singular object) is replaced by optimization_goals (array). Each goal is a discriminated union on kind:
| v2/beta field | v3 rc.1 field |
|---|---|
optimization_goal (single object) | optimization_goals (array) |
| Implicit single goal | priority field for multi-goal ordering |
metricβ Seller-native delivery metrics (clicks, views, reach, engagements, etc.) withcost_perorthreshold_ratetargetseventβ Conversion tracking withevent_sourcesarray and optionalvalue_field/value_factor
Optimization goals deep dive
Signals pricing restructure
The legacypricing: { cpm } object on signals is replaced by a structured pricing_options array with three pricing models.
| v2/beta field | v3 rc.1 field |
|---|---|
pricing.cpm (number) | pricing_options[] (array of pricing model objects) |
cpm, percent_of_media (with optional max_cpm), flat_fee.
Signals deep dive
Signals deliver_to flattening
The nesteddeliver_to object in get_signals request is replaced with two top-level fields.
| v2/beta field | v3 rc.1 field |
|---|---|
deliver_to.destinations | destinations (top-level) |
deliver_to.countries | countries (top-level) |
AudienceMember external_id required
external_id is promoted from a uid-type enum value to a required top-level field on AudienceMember. Every member must have a buyer-assigned stable identifier plus at least one matchable identifier.
Audiences deep dive
Typed refinement with seller acknowledgment
refine is redesigned from a nested object with overall/products/proposals to a flat typed array. Each entry is discriminated by scope:
| v2/beta field | v3 rc.1 field |
|---|---|
refine.overall (string) | { "scope": "request", "ask": "..." } array entry |
refine.products[].product_id | { "scope": "product", "product_id": "..." } |
refine.proposals[].proposal_id | { "scope": "proposal", "proposal_id": "..." } |
refine.products[].notes | ask field |
product_id, proposal_id) matching AdCPβs id naming convention throughout the protocol. action is optional on product and proposal entries and defaults to "include" β orchestrators only need to set it explicitly for "omit", "more_like_this" (product), or "finalize" (proposal).
Sellers respond with refinement_applied β a positionally-matched array where each entry reports status (applied, partial, unable) and optional notes. Entries echo the matching id field (product_id / proposal_id) for cross-validation.
refinement_applied MUST now echo scope and the matching id field (product_id for product scope, proposal_id for proposal scope) β the pre-rename {status, notes}-only entries are rejected by the tightened response schema. Missing action on incoming refine entries MUST be treated as action: "include", not as a parse error. Re-issue your seller tests against the 3.0 request schema to catch any orchestrator code still emitting the generic id field β the validator now rejects it with must NOT have additional properties.
Refinement deep dive
Creative assignments restructured
SyncCreativesRequest.assignments changed from a { creative_id: package_id[] } map to a typed array with explicit fields.
| v2/beta field | v3 rc.1 field |
|---|---|
assignments (object map) | assignments (array of { creative_id, package_id, weight, placement_ids }) |
Signals account and field consistency
Two consistency changes to signals schemas:| v2/beta field | v3 rc.1 field |
|---|---|
account_id (string) on get_signals and activate_signal | account (AccountReference object) |
deployments on activate_signal | destinations (renamed for consistency with get_signals) |
Package catalogs as array
| v2/beta field | v3 rc.1 field |
|---|---|
catalog (single Catalog object) on Package | catalogs (array of Catalog refs) |
Brand tone structured format
Brandtone is now an object type only β string format is removed. Structured tone includes voice, attributes, dos, and donts fields. Existing string values should migrate to { "voice": "<previous-string>" }.
| v2/beta field | v3 rc.2 field |
|---|---|
tone (string or object) | tone (object: { voice, attributes, dos, donts }) |
Account resolution removed
account_resolution capability field is removed. require_operator_auth now determines both the auth model and account reference style: true means explicit accounts (discover via list_accounts, pass account_id), false means implicit accounts (declare via sync_accounts, pass natural key).
| v2/beta/rc.1 field | v3 rc.2 field |
|---|---|
account_resolution capability | Removed β use require_operator_auth |
Privacy and consent
AdCP does not define its own consent framework. Privacy signals (TCF 2.0, GPP, US Privacy String) should be passed via the briefβsext field or through transport-level headers. Sellers that require consent signals should declare this in get_adcp_capabilities using the extension mechanism.
Removed in v3
| Removed | Replacement |
|---|---|
adcp-extension.json agent card | get_adcp_capabilities task |
list_authorized_properties task | get_adcp_capabilities portfolio section |
assets_required in formats | assets array with required boolean |
preview_image in formats | format_card object |
creative_ids in packages | creative_assignments array |
geo_postal_codes | geo_postal_areas |
fixed_rate in pricing | fixed_price |
price_guidance.floor | floor_price (top-level) |
promoted_offerings asset type | catalogs field on creative manifest |
promoted_offering on media-buy | Removed β use brand + brief |
promoted_offering on creative-manifest | catalogs field |
brand_manifest (inline object) | brand ref ({ domain, brand_id }) |
estimated_exposures on Product | forecast (DeliveryForecast) |
proposal_id on get_products request | Session continuity (context_id / contextId) |
refine object with overall/products/proposals | refine array of typed change-requests |
creative_brief on build_creative request | brief asset type in manifest assets map |
supports_brief capability | supports_compliance |
creative-brief-ref.json schema | Deleted β briefs are now asset types |
deployments on activate_signal | destinations |
account_id (string) on signals tasks | account (AccountReference) |
report_usage.kind and report_usage.operator_id | Removed |
catalog (singular) on Package | catalogs (array) |
account_resolution capability | require_operator_auth determines account model |
X-Dry-Run HTTP header | sandbox: true on account reference |
X-Test-Session-ID HTTP header | Removed β sandbox accounts provide test isolation |
X-Mock-Time HTTP header | Removed |
delete_content_standards task | Archive via update_content_standards instead |
get_property_features task | Property list filters + get_adcp_capabilities for feature discovery |
tone as string on brand.json | Object only: { voice, attributes, dos, donts } |
FormatCategory enum / type on formats | Filter by asset_types or format_ids instead |
broadcast-platform specialism | Renamed to sales-broadcast-tv |
social-platform specialism | Renamed to sales-social |
property-governance + collection-governance specialisms | Merged into inventory-lists |
sponsored_intelligence specialism | Promoted to full protocol in supported_protocols |
Migration checklists
All implementations
All implementations
- Update channel enum values to new taxonomy
- Rename
fixed_rate->fixed_pricein pricing options - Move
price_guidance.floor->floor_price(pricing details) - Replace
creative_idswithcreative_assignments - Add system specification to metro/postal targeting
- Rename
geo_postal_codes->geo_postal_areas - Handle new
geo_metros_excludeandgeo_postal_areas_excludefields - Update format parsing to use
assetsarray - Replace
preview_imagereads withformat_cardrendering - Replace
list_authorized_propertiescalls withget_adcp_capabilitiesportfolio - Remove
promoted_offeringsfrom creative manifest assets and replace withcatalogsfield - Remove
promoted_offeringstring from media buy and creative manifest objects - Update
optimization_goaltooptimization_goals(array of discriminated union) - Handle
external_idas required field on AudienceMember - Replace
brand_manifestwithbrandref ({ domain, brand_id }) in all task calls - Replace
estimated_exposuresreads withforecast(DeliveryForecast) on products - Remove
proposal_idfromget_productsrequests β use session continuity for refinement - Update
refinefrom object to typed array withscopediscriminator - Handle
recoveryfield on errors for retry/correction logic - Update
catalogtocatalogs(array) on packages - Update signals
account_idtoaccount(AccountReference) - Rename signals
deploymentstodestinations - Pass
buying_mode(now required) onget_products - Move
creative_brieftobriefasset type in manifestassetsmap - Handle
report_usagewithoutkindandoperator_idfields - Update
SyncCreativesRequest.assignmentsfrom object map to typed array - Migrate brand
tonefrom string to object format ({ voice, attributes, dos, donts }) - Remove
account_resolutionreads β userequire_operator_authinstead - Read sandbox support from
account.sandboxinstead ofmedia_buy.features.sandbox - Remove
X-Dry-Run,X-Test-Session-ID, andX-Mock-Timeheader handling β usesandbox: trueon account references instead - Add
type: "dooh"insideflat_rate.parameterswhen DOOH parameters are provided - Treat
list_creativesandsync_creativesas Creative Protocol operations - Remove
delete_content_standardscalls β archive viaupdate_content_standards - Remove
get_property_featurescalls β use property list filters - Remove
format_types/typefilters β useasset_typesorformat_idsinstead - Validate all requests/responses against v3 schemas
Seller agents (publishers, SSPs, networks)
Seller agents (publishers, SSPs, networks)
- Implement
get_adcp_capabilitiestask (includingaccountcapabilities) - Remove
adcp-extension.jsonfrom agent card - Implement
sync_accountsfor account provisioning - Return proposals with delivery forecasts from
get_productswhen applicable - Support property list filtering in
get_productsif integrating with governance agents - Handle catalogs synced via
sync_catalogswith approval workflow - Declare
metric_optimizationcapabilities on products - Declare
reportingcapabilities inget_adcp_capabilitiesfor dimension breakdowns - Support
reporting_dimensionsparameter onget_media_buy_delivery - Return
refinement_appliedarray when processingrefinerequests - Implement
rejectedstatus andrejection_reasonon media buys - Support
fieldsprojection parameter onget_products - Declare
supported_pricing_modelsinget_adcp_capabilities - Support
time_budgetonget_productsand returnincompletewhen work cannot finish in budget - Declare sandbox support in
account.sandbox, notmedia_buy.features.sandbox - Stop checking for
X-Dry-Runheader β honorsandbox: trueon account references instead - Support
preferred_delivery_types,exclusivity, optionaldelivery_measurement, and package-levelstart_time/end_time
Buyer agents and orchestrators (DSPs, agencies, brands)
Buyer agents and orchestrators (DSPs, agencies, brands)
- Resolve brands via
brand.jsonbefore placing buys - Call
sync_accountsto establish billing relationships - Update to call
get_adcp_capabilitiesfor runtime discovery - Evaluate proposals and delivery forecasts when returned by sellers
- Use the Registry API for brand/property resolution and agent discovery
- Pass property lists to filter inventory when working with governance agents
- Invoke SI sessions when connecting users with brand agents
- Sync catalogs via
sync_catalogsbefore submitting creatives - Add
conversion_eventsto catalogs for attribution tracking - Update
optimization_goaltooptimization_goalsarray increate_media_buy - Pass
pricing_option_idwhen activating signals with pricing options - Use
reporting_dimensionsfor dimension breakdowns in delivery reporting - Handle
refinement_appliedresponse for typed refinement feedback - Use
recoveryfield on errors for automated retry/correction - Use
fieldsprojection onget_productsfor efficient discovery - Handle
rejectedstatus on media buys - Use
action: "deactivate"onactivate_signalfor campaign cleanup - Integrate
get_rights/acquire_rightsfor licensed content campaigns - Handle
visual_guidelinesfrombrand.jsonfor creative generation - Read
require_operator_authandaccount.sandboxwhen choosing account and sandbox flows - Handle
time_budget/incompletefor bounded-latency product discovery - Use creative capability flags (
supports_generation,supports_transformation,has_creative_library) to route build vs library workflows - Submit plans to governance agents via
check_governancewhen campaign governance is in use
Signals agents (data providers, measurement vendors)
Signals agents (data providers, measurement vendors)
- Update schema references from v2 to v3
- Ensure
get_adcp_capabilitiesreturnsmajor_versions: [3] - Return structured
signal_idobjects inget_signalsresponses - Include
value_typefield in signal responses - Support
signal_idsparameter inget_signalsrequests for ID-based lookup - Update from legacy
pricingto structuredpricing_optionsarray - Handle top-level
destinations/countriesinstead of nesteddeliver_to - Add
idempotency_keysupport toreport_usage - Support
action: "deactivate"onactivate_signal - Include
categoriesandrangemetadata in signal entries - Update
account_idtoaccount(AccountReference) - Rename
deploymentstodestinations
Data providers (new in v3)
Data providers (new in v3)
adagents.json. See Data Provider Guide.- Create signal catalog in
/.well-known/adagents.json - Define signals with
id,name,value_type, and optional metadata - Add
signal_tagsfor grouping and efficient authorization - Authorize signals agents using
signal_idsorsignal_tagsauthorization types - Validate catalog using AdAgents.json Builder
Creative agents (creative management, DCO providers)
Creative agents (creative management, DCO providers)
FormatCategory enum and format type field are removed in v3 β filter formats by asset_types or format_ids instead.- Support
assetsarray withrequiredboolean (replacesassets_required) - Replace
preview_imagewithformat_cardrendering - Resolve brand identity via
brand.jsonfor on-brand creative generation - Support
catalogfield on creative manifests (replacespromoted_offeringsasset) - Declare
catalog_requirementson formats that render catalog items - Update schema references from v2 to v3
- Support
provenanceobject on creative manifests and assets - Support
briefandcatalogas asset types in theassetsmap - Handle
compliance.required_disclosureson creative briefs - Check format
supported_disclosure_positionscompatibility - Declare
supports_compliancein capabilities (replacessupports_brief) - Handle
visual_guidelinesfrombrand.jsonfor on-brand asset generation - Support
include_preview,target_format_ids,quality, anditem_limitonbuild_creative - Support library retrieval via
creative_idand declaresupports_generation,supports_transformation,has_creative_library - Implement
list_creativesandsync_creativesas Creative Protocol operations - Support
qualityparameter onpreview_creative - Declare disclosure persistence support via format
disclosure_capabilities
Brands (new in v3)
Brands (new in v3)
- Host
/.well-known/brand.jsonon your domain - Declare brand portfolio, properties, and authorized operators
- Optionally provide brand data (logos, colors, fonts, tone) inline in
brand.jsonor via brand agent - Add
visual_guidelinestobrand.jsonfor generative creative systems - Implement
get_rights/acquire_rights/update_rightsif licensing content - Register in the community brand registry if not hosting
brand.json
Governance agents (new in v3)
Governance agents (new in v3)
- Implement property list tasks (
create_property_list,get_property_list, etc.) - Implement content standards tasks (
create_content_standards,calibrate_content, etc.) - Implement
get_adcp_capabilitieswithgovernanceinsupported_protocols - Implement
provenance_requiredenforcement on creative policy - Support
verificationresults from AI detection services - Implement
get_creative_featuresfor creative evaluation - Declare
creative_featuresinget_adcp_capabilities - Implement campaign governance tasks (
sync_plans,check_governance,report_plan_outcome,get_plan_audit_logs) when offering plan-level governance
Sponsored Intelligence agents (new in v3 β experimental)
Sponsored Intelligence agents (new in v3 β experimental)
sponsored_intelligence.core) β session lifecycle, UI components, and capability negotiation may change between 3.x releases with 6 weeksβ notice. Sellers MUST declare sponsored_intelligence.core in experimental_features. See SI Chat Protocol.- Implement SI session tasks (
si_initiate_session,si_send_message,si_terminate_session) - Implement
get_adcp_capabilitieswithsponsored_intelligenceinsupported_protocolsandsponsored_intelligence.coreinexperimental_features
Getting help
- Community: Slack
- Issues: GitHub Issues
- Support: support@adcontextprotocol.org