What’s new in AdCP 3.3
AdCP 3.3 lets scheduled, human-gated, and offline media run through the same buy as programmatic. A booking can say when it will be confirmed. A proposal’s third-party definitions are pinned so they cannot drift after commitment. A proposal request can target a vendor-measured outcome, and a governance plan can budget by period. Products, audiences, and delivery reports can carry what a linear-TV, print, or DOOH seller actually knows: spot lifecycle and makegoods, break position, print proof of insertion and circulation, structured DOOH location, property-grain rollups, and audience sizes as honest ranges. Minute-level dayparts, broadcast mezzanine formats, and the NMO and VideoAmp demographic systems fill in the TV edges. Around that, 3.3 tightens the places where two conformant 3.2 implementations could still disagree: discovery never provisions an account, one agent-resolution rule covers every signing surface,required_for is enforced over A2A with its hardening clauses required, and reporting_webhook.operation_id correlation fails closed. Catalog intake becomes an optional declaration, verifiers can advertise A2A required_for enforcement through request_signing.operation_sources, and ext.adcp becomes a reserved namespace. New single-adopter surfaces ship as experimental, so 3.4 can reshape them without breaking stable integrations.
No stable field, enum value, or task is removed. Two result fields, one usage, and the RFC 9421 signing profiles are deprecated, all functional throughout 3.x: seller_id on event source and audience results (use platform_id), the natural key as the account reference after provisioning, and the RFC 9421 profiles (use the experimental Web Bot Auth profile). 3.3 adds optional fields, enum values, and capability declarations. Schema-valid 3.2 messages stay schema-valid except for the new domain identifier format, and unless they already used a name 3.3 now defines with a different shape; the list is in the migration guide. The normative narrowings are recorded in Versioning and governance and lead the migration guide.
Scheduled and human-gated buying
- Account IDs you can rely on. Sellers SHOULD return
account_idfromsync_accounts, and a seller that accepts it on every account-scoped task, for every account, and never changes it declares the optionalaccount.stable_account_idcapability. Buyers send the ID to those sellers instead of the natural key. Natural keys keep working throughout 3.x, but using them as the reference after provisioning is now deprecated and planned for removal in 4.0; they remain the way to open an account and to look up its ID. See Toward account IDs everywhere. - Expected confirmation time. The
submittedenvelope ofcreate_media_buy,buy_products, andaccept_proposalcan carryexpected_confirmation_at. A seller whose confirmation waits on a booking round or a manual review window SHOULD set it, and buyers SHOULD check status at that time instead of polling tightly. It is an estimate, not a commitment.refine_proposalscan carry it too, on asubmittedfinalize whose hold waits on a person’s agreement, such as a creator or host. Onbuy_products,accept_proposal, andrefine_proposals, send it only to callers negotiating 3.3. See Expected confirmation time. - Definition pins. For callers negotiating 3.3, a seller MUST pin the third-party definitions its proposal terms reference (publisher-catalog format options and placements,
adagents.jsoncollections, data-provider signals) incommercial_terms.definition_pins[]. A changed definition fails finalize with thedefinition_changedreason and failsaccept_proposalwithREFERENCE_DEFINITION_CHANGED, before any hold or mutation. See Definition pins. - Vendor-metric outcome goals.
criteria.outcome_target.goalacceptskind: "vendor_metric", so a buyer can plan “5,000 store visits measured by a foot-traffic vendor”, optionally with a cost per visit. The seller answers in each forecast point’svendor_metric_values[]and plans only(vendor, metric_id)pairs its products declare. Send it only on a negotiated 3.3 version. See Vendor-metric goals. - Governance budget periods (experimental). A campaign governance plan can split its budget by time with
budget.periods[].check_governancedenies a dated action that straddles a period, sits in unallocated budget, or overruns its period. Governance agents declaregovernance.supports_budget_periods. Part of the experimentalgovernance.campaigncluster. See Budget periods. - Holds you can plan and extend (experimental). Products and proposals can carry a
hold_policy(media_buy.hold_policy), andrefine_proposalsextend_holdlengthens a committed hold without re-finalizing (media_buy.hold_extension). See Hold policy. - Delegated composition (experimental). A platform that owns the catalog can make
product_idsthe complete composable universe withcriteria.product_ids_exclusive, and a seller that holds no inventory can declareterms_onlyfinalize (media_buy.delegated_composition). See delegated composition. - Fixed-price, non-guaranteed sellers. The new
sales-fixed-ratespecialism covers sellers in any medium, digital or linear TV, that publish a fixed price, reserve no inventory, make no delivery commitment, and may hold a buy for review.get_media_buyscan carryexpected_confirmation_atwhile a buy is provisional (confirmed_at: null). See Choosing a sales specialism. - Renewal and replacement lineage (experimental). A new buy can name the buy it succeeds with
predecessor_media_buy_idandlineage_reason(renewal,terms_change,migration,sunset,replacement). The link is forward-only and same-account; the predecessor is never mutated. Feature idmedia_buy.lineage. See Media Buy Lineage. - Did a failed mutation apply?
core/error.jsoncan carrymutation_outcome(not_applied,unknown,applied), so a buyer knows whether to re-plan after a failed state-changing request. See Mutation outcome. - Operator fees. The
operator_feeprice adjustment kind lets an agency’s buying platform show a fee it keeps out of the advertiser’s budget without changing the seller’s price. Sellers never author it. See Operator fees. - Change cutoff. Installment deadlines can carry
change_cutoff, the last moment a creative swap, pause, or stop still takes effect (traffic log close, posting-cycle lock, print issue close). See Installment deadlines.
Delivery data offline sellers actually have
- Spot lifecycle, makegoods, and break position (experimental).
by_spot[]rows can carryspot_status(scheduled,aired,preempted,makegood),scheduled_at,replaces_spot_id, andbreak_position. Sellers declare what they report, so a missing row is not read as non-delivery, and they never sendscheduledorpreemptedrows, or the new capability fields, to callers pinned below 3.3. Feature idmedia_buy.spot_lifecycle. See Spot lifecycle. - Print proof of insertion and circulation (experimental).
print_metricsonby_installmentrows reports the page and position delivered, circulation and its basis (auditedorseller_modeled), and a tearsheetevidencerecord. See Delivery evidence and circulation. - Property-grain rollups.
media_buy.features.supports_property_breakdownandsupports_installment_property_breakdowncommit a seller to returnby_propertyandby_installment_propertyon every product that declares the per-product flag. Two capability-gated scenarios grade it. Seeget_adcp_capabilities. - Structured DOOH location. Concrete screens can carry
dooh_placement_attributes.location(lat,lon, structuredaddress), and network products can carrydooh_inventory_summary.venue_counts[]. Both are disclosure metadata;locationnever changes placement identity. See DOOH. - Rows without impressions. Delivery rows may omit
impressionswhen the seller did not measure them, for example on rows that report plays or downloads instead. Absence means not measured, never zero; receivers do not derive impression-based rates, and sellers never omit it toward callers pinned below 3.3. See Rows without impressions. - Delivery projection (experimental). Top-level
by_package[]delivery rows can carry an advisoryprojectionof lifetime impressions and spend with aprojected_end_stateandbasis. It is a forecast, not a delivery record. Feature idmedia_buy.delivery_projection. See Delivery projection. - Installment lifecycle and proof of publication (experimental).
by_installment[]rows can carryinstallment_statusand apublicationrecord (published_at,posts[], optionalevidence), so a creator post, newsletter edition, or podcast episode reports whether and where it ran. Feature idmedia_buy.installment_lifecycle. See Installment lifecycle. - Report source custody. A Reliable Reporting report definition’s
sourcecan say whether the producer is thesystem_of_recordor derived its figuresupstream_derived. - Audience sizes as ranges.
sync_audiencesresults can carryaudience_sizeandtargetable_sizeas bounded ranges with aprecision, plusmatch_rate_basis.matched_countandeffective_match_ratemay now be absent, and buyers MUST NOT read absence as zero. See Audience size.
Creator and collection cards (experimental)
Collections can carry images, sample content, and follower counts, talent can link to its brand identity, and product and proposal responses can return full collection objects on request (media_buy.collection_cards, brand.collection_links). See Collection cards.
Open opportunities and later proposals (experimental)
A buyer can keep an opportunity open after the first response and let sellers send more.opportunity.later_proposals gives consent with optional until, max_count, and min_interval limits. Sellers then create draft-only later proposals, announce each with the identifiers-only proposal.created notification, and serve them through the new list_proposals read, which returns each snapshot beside its disposition. accept_proposal and buy_products accept an explicit opportunity.status: "open" so a buyer can buy part of a plan and keep sourcing. Everything is experimental under media_buy.open_opportunities and advertised in parts. See Open opportunities and later proposals and #8096.
Agent identity and buyer self-onboarding (experimental)
A buyer agent can now make itself known to a seller it has never spoken to. The new Web Bot Auth signing profile identifies the signer by its origin and verifies against that origin’s key directory, with no capabilities call and no seller-issued credential. The operator’s trust.json lists its agents; brands publish grants in theirs, and sellers publish their onboarding posture inaccount.agent_onboarding. get_principal reports relationship status and expiry. The RFC 9421 profile is deprecated in 3.3 and works through 3.x. See A buyer agent onboards itself and the agent identity migration guide.
Linear TV edges
- Minute-level dayparts (experimental). A daypart entry can use
start_timeandend_time(HH:MM) instead of whole hours, and products declare the finest resolution they honor intime_granularity. A seller rejects a finer time withUNSUPPORTED_FEATUREand never rounds it. Feature idmedia_buy.daypart_granularity. See Minute-resolution dayparts. - Broadcast formats and currencies.
demographic-systemgainsnmo(Netherlands) andvideoamp.video_hostedgains themxfcontainer and thempeg2,avc_intra, andxavccodecs as stable values, plus an experimentalloudnessobject (feature idcreative.broadcast_loudness). See Broadcast creative. - Broadcast TV guide. The broadcast guide now states the reconciliation contract between as-run logs and audience data and walks a CPM-on-demo buy end to end.
Playback events for hosted video and audio trackers
Thepixel_tracker event enum adds start, first_quartile, midpoint, third_quartile and complete, so a buyer can attach quartile measurement to video_hosted and audio_hosted files instead of sending event: custom names no seller is obliged to recognize. Downgrades to 3.0.x sellers drop these trackers with an advisory, and 3.2 buyers send them as custom events named for the 3.3 value until they move. See the migration guide.
Platform object IDs have one name
sync_event_sources and sync_audiences results now use optional platform_id for the object’s ID in the seller’s ad platform, matching creatives and catalogs. A seller reporting this ID in 3.3 and later 3.x responses MUST emit both platform_id and the deprecated seller_id alias with identical values, including discovery responses. Buyers MUST prefer platform_id and fall back to seller_id only when the new field is absent. Continue using event_source_id and audience_id in AdCP requests. The aliases keep working throughout 3.x; removal is no earlier than 4.0 under the six-month notice policy. Seller identity in adagents.json and publisher identifiers is unchanged. See Deprecations.
Tightened rules
These narrow what a conformant implementation may do. Each is detailed in the migration guide and recorded in Versioning and governance.- Discovery never provisions an account. Discovery and negotiation tasks MUST NOT create or activate an account or accept default terms. See Account references before provisioning.
- One agent-resolution rule. Request signing, webhook signing, governance JWS
iss, designated-task response signing, and rights attestations share one algorithm for which brand.json lists an agent and which keys it may sign with. Some signatures that verified under 3.2 now fail. See Agent resolution. required_forover A2A, hardened. The A2A operation-resolution errata shipped in 3.2.3. Its hardening clauses were SHOULD in 3.2.x and are MUST from 3.3. Verifiers declare support with the new optionalrequest_signing.operation_sourcescapability; a counterparty MUST NOT infer A2A enforcement from an absent field, and buyers sign every operation inrequired_forregardless of the marker. See Operation resolution over A2A.reporting_webhook.operation_idfails closed. The seller echoes it into everymedia_buy_deliverywebhook and sends none to a registration that omits it. See Reporting webhooks.- Definition pins are required for callers negotiating 3.3 (above).
- Advertise only the measurement terms you accept. See Advertise only what you accept.
- Audience identifiers keep their wire form.
uids[].valueforuid2andeuidis the raw identifier, never the encrypted token, and is never case-folded or re-encoded. - brand.json fetch limits. The cap rises to 2 MiB, with new MUSTs for streaming enforcement, nesting depth, and bounded fetches.
- Delivery rows may omit
impressionstoward 3.3 callers only, and receivers MUST NOT read absence as zero or derive impression-denominated values. The schema loosens; the rules around it narrow. - Receivers ignore
aggregated_totalsin delivery webhooks and do not reject a payload for carrying it. - Counterparty-asserted domain lists are bounded.
media_buy.portfolio.publisher_domainsandsignals.data_provider_domainshave a normative byte budget, with completeness flags for truncation; buyers never read absence from either list as a denial. See below. - Platform IDs under both names. A seller reporting an event source or audience platform ID emits
platform_idand the deprecatedseller_idalias with identical values. See Platform object IDs have one name. - Property domain identifiers have an enforceable format.
domainandsubdomainvalues must be lowercase ASCII hostnames; mixed-case, trailing-dot, and URL-shaped values are rejected. See the migration guide. - Property list references resolve through AdCP tasks. Issuers expose
get_property_listover MCP and accept the reference’s list-scoped Bearer token; a custom download route alone no longer suffices. See the migration guide. - Flight start activates committed buys only. A provisional buy (
confirmed_at: null) never auto-activates; it stayspending_startuntil the seller confirms or rejects it. See Provisional buys. - Seller revisions advance on every committed change. The media-buy
revisionadvances on every committed change to the stateget_media_buysreports, whatever its origin: an AdCP task, a seller operator, seller automation, another authorized principal, a connected platform, or async_creativesassignment.historyentries for externally originated changes carry the sameorigin.kindvocabulary asaccount.change, and creatives gain an optional seller-maintainedseller_revisionthataccount.change.resource_revisioncarries. Buyers that send a stalerevisionwill see moreCONFLICT; that is intended. Recorded as DR-0031. See the migration guide. - Multi-qualifier metrics omit flat totals. When a buy’s packages report a metric under more than one qualifier set, such as viewability at
mrcandgroupm, the seller omits that metric’s flat carrier from buy and windowtotals; read the package rows. See the migration guide. - Refinement carries compliance forward. A
build_creativerefinement keeps the parent leaf’s required disclosures and prohibited claims, and a refined leaf never inherits approval. See the migration guide.
ready audience no longer promises match counts. Separately, reporting_webhook.authentication and artifact_webhook.authentication become optional on requests served at 3.3, so an integration can drop HMAC before 4.0 (details). Many new fields sit inside objects 3.2 closes, so send them only to peers that negotiated 3.3; see Send only to 3.3 peers.
Optional declarations
- Catalog ingestion.
media_buy.features.catalog_ingestiondeclares accepted catalog types, ingestion modes, feed formats, content identifier types, an inline batch limit, and item-status granularity. A declaring seller rejects out-of-declaration requests withUNSUPPORTED_FEATUREbefore changing state. Seesync_catalogs. - SDK implementation metadata. Agents can report
adcp.implementation.sdks[]: package identifiers, exact resolved versions, and the server components they actually use. Missing metadata means unknown;sdks: []reports none. It is self-reported, does not establish approval or change conformance obligations, and cannot justify certification shortcuts without independently trusted evidence. See implementation metadata. - Targeting error details.
UNSUPPORTED_FEATUREfor an unsupported or removed targeting dimension SHOULD carry the newunsupported-targeting-dimensiondetails. No new error code. See Rejected targeting dimensions. - Assignment landing pages and trackers. A seller that declares
creative.supports_assignment_landing_pageaccepts a per-assignmentlanding_page_urlthat changes one creative’s destination on one package without touching the library creative, and one that declarescreative.supports_assignment_trackersfires assignment-scoped measurementtrackersalongside the creative’s own. See Assignment landing pages. - Age determination basis on signals. Signal listings, definitions, and enrichment can carry an optional
age_determination_bases(verified,declared,inferred) next todemographic_predicate, so a buyer who setsaccepted_basescan tell a verified age cohort from a modelled one. A signal listing passes the basis test only when its age range is within it and every one of its bases is accepted; absent means no basis claim. The field is stable, completing the basis vocabulary already on the wire asaccepted_bases,supported_bases, andapplied_bases. On 3.2, carry it asext.adcp.age_determination_bases. See Migrating from 3.2 to 3.3. - Several collection lists per package (experimental).
collection_listsandcollection_lists_excludelet a package run on the intersection of several lists and exclude their union. Feature idmedia_buy.collection_lists. See Combining several collection lists. - Signal readiness (experimental).
get_signalsresults can carrysignal_status(processing,ready,failed) and thesource_audience_ida custom segment was built from. Feature idsignals.signal_lifecycle. See Custom segments built from a seed audience. - Event source archive. A seller that declares
media_buy.event_source_archiveacceptsarchivedonsync_event_sourcesitems to archive or restore a source without losing its configuration. See Archiving an event source. - Creative and brand.
list_creativesechoes creative-levelprovenance; brand.json gains a brand-wideprohibited_termslist; rights constraints can carry advisorychannels[]andexcluded_channels[](experimental,brand.rights_lifecycle); and the HTML-markup legacy formats project todisplay_taginline markup instead ofhtml5. - The
ext.adcpnamespace.ext.adcpis a registered, AdCP-owned extension namespace. Its first member is an optionalopportunitybinding for cooperating 3.2get_productsintegrations. See AdCP opportunity extension.
Bounded agent responses
A seller agent that answers a discovery call with tens of megabytes is an availability attack on every buyer that reads the body before checking its size. 3.3 adds Response size bounds: clients SHOULD bound every AdCP response they read, enforce the bound while the body is received rather than after buffering or parsing, cover SSE per event and cumulatively, surface an oversized response as an error rather than truncating it, and bound JSON depth and node count once the byte cap passes — the byte cap bounds ingress, the parse bounds bound memory. The default is 4 MiB, matching what the SDKs and the hosted grader ship, and 4 MiB is the ceiling on what any default may be. This is a recommendation, not a conformance requirement, but the interop effect is real in both directions. A buyer adopting the default rejects a response it would previously have buffered, and the rejection arrives as a mid-body connection abort rather than anadcp_error. A buyer still on the older 1 MiB figure rejects a response a 3.3 buyer accepts.
The seller-side counterpart matters more than the number: keep discovery responses small. tools/list, get_adcp_capabilities, and the A2A agent card are the first bytes a counterparty reads, and an oversized one makes an agent unreachable rather than slow. get_adcp_capabilities is the sharpest case — above MAX_CAPABILITIES_BYTES your signing keys stop resolving too. See Discovery responses stay small.
Bounded inbound push and webhook bodies
The response bound covers what a client reads on its own call path. 3.3 adds the receiver-side counterpart: Inbound body bounds. Receivers of A2A push notifications and AdCP webhooks (reporting, artifact, collection-list, and account notification subscribers) SHOULD pre-reject an over-limitContent-Length, count decoded bytes while streaming, apply the 64-deep, 100,000-member parse bounds after the byte cap and before RFC 9421 or Web Bot Auth verification, apply connect, idle, and total deadlines, and reject with HTTP 413 rather than truncating. The default cap is 4 MiB, generalizing the attestation task-body cap rather than adding a new number, and a tighter per-feature cap governs. This is a recommendation, not a conformance requirement.
Nobody else gets to write your capabilities document
Two capability fields enumerate relationships a counterparty asserts:media_buy.portfolio.publisher_domains and signals.data_provider_domains are both
populated from those counterparties’ /.well-known/adagents.json, which any domain
owner publishes unilaterally and without the named agent’s consent. An agent that
mirrored every publisher claiming it had handed an unauthenticated stranger a write
primitive into its own discovery document — and since the signing-key path fetches
that document unnarrowed under MAX_CAPABILITIES_BYTES, pushing it past 64 KiB cost
the victim signature verification, arriving a cache cycle later with no visible
connection to its cause.
3.3 adds a normative byte budget — one eighth of the capabilities budget for any
single counterparty-asserted field, one quarter for both together — and declares
structural bounds (100 unique entries, 253 characters each) that the conformance
storyboard grades in 3.x and the schema enforces in 4.0. No previously-valid
document becomes schema-invalid; what changes is what counts as conformant. Because a bounded
list would otherwise make a large legitimate network look unauthorized for most of
its own inventory, the bound ships with publisher_domains_complete and
data_provider_domains_complete — default true, set false when you truncate.
Both lists are explicitly non-exhaustive, so a buyer must resolve the publisher named
on a product through that publisher’s own adagents.json and must never read absence
from the list as a denial.
Account change feed: recognize your own changes
The experimental account change feed (account.change_feed) gains two changes ahead of graduation. A record whose origin.kind is adcp can echo the originating request’s idempotency_key, so a buyer recognizes its own changes on a shared account; the seller includes it only on records served to the principal that sent the request, and every other reader sees the same record without it. And changed_paths is now required when origin.kind is adcp or seller_operator, staying best-effort for seller_system and connected_platform. See list_account_changes.
Experimental in 3.3
New feature ids aremedia_buy.spot_lifecycle, media_buy.daypart_granularity, creative.broadcast_loudness, media_buy.hold_policy, media_buy.hold_ranking, media_buy.installment_holds, media_buy.hold_extension, media_buy.delegated_composition, media_buy.collection_cards, media_buy.collection_catalog, brand.collection_links, media_buy.open_opportunities, media_buy.lineage, media_buy.delivery_projection, media_buy.installment_lifecycle, media_buy.collection_lists, media_buy.offline_delivery_metrics, signals.signal_lifecycle, signing.web_bot_auth, account.agent_onboarding, security.profiles, and identity.trust_json. media_buy.offline_delivery_metrics registers the new print_metrics block together with the 3.2 ooh_metrics block. identity.trust_json publishes the trust.json v1 schemas, identifying agents by origin with no keys in the record; the Web Bot Auth profile reads it, and publishers declare nothing (trust.json). Governance budget periods extend the existing governance.campaign cluster, get_principal relationship status extends protocol.principal, and rights channel restrictions extend brand.rights_lifecycle. The creative.evaluator surface on build_creative drops its account-arranged evaluator_id source form and withdraws the list_evaluators follow-on: sources are now inline exemplars or an allowlisted agent_url, and a seller’s house evaluator is an agent it lists in creative_policy.accepted_verifiers[] (migration). Reliable Reporting carries a new breaking-change notice: older superseded snapshots may be compacted no earlier than the first minor after November 20, 2026. The per-surface status table is in the release notes.
Clarifications and conformance
- Broadcast TV certification.
sales-broadcast-tvnow certifies one authorized TV transaction on a guaranteed or a non-guaranteed fixed-price path. Existing claimants should expect new checks; 1.0.x claims have a grace window. - Signing buyers serve
get_adcp_capabilitiesat their agent URL, because request-signature discovery starts there. See request signing. - Fixed-rate certification. The
sales_fixed_ratestoryboard grades the newsales-fixed-ratespecialism; its optional hold phases run only when the seller advertises theforce_media_buy_confirmationcontroller scenario. - Hold-failure testing. The experimental
force_hold_unavailablecontroller scenario lets a runner reach the all-or-none hold-failure path; storyboards that use it are still in review. - Storyboard and schema fixes. Storyboards that seed a sandbox fixture account send
sandbox: trueexplicitly, andvalidate_inputwarning items now declarefieldas a string, so a warning whosefieldis not a string fails validation. - New storyboards.
media_buy_seller/unprovisioned_account_reference(advisory until runner capability14.1.0), and capability-gatedmedia_buy_seller/stable_account_id,media_buy_seller/definition_pin_drift,governance/budget_periods,media_buy_seller/property_delivery_reporting,media_buy_seller/installment_property_delivery_reporting,media_buy_seller/outcome_target_vendor_metric, andmedia_buy_seller/outcome_target_event_cost.
Already shipped in 3.2.2, 3.2.3, and 3.2.4
These merged onmain during the 3.3 cycle and were also released on the 3.2 line. They appear again in the 3.3.0 changelog but are not new to 3.2.4 adopters.
- 3.2.2: the account-reference clarification and the trust-docs consistency fixes (
v3.2.2). - 3.2.3: the A2A operation-resolution security errata (GHSA-2pm6-6mc8-8xcm) with hardening at SHOULD, the
adagents.jsonagent-URL clarification, the evaluator feature-membership fix, storyboard capability gates for wholesale discovery and finalize replay, the polling-basedsales-guaranteedpath, thevalidate_inputgates, and the acceptance-policy sandbox account (v3.2.3). - 3.2.4: the experimental
REVISION_UNREADABLEreporting issue,requires: [controller]on controller-seeded storyboards and five storyboard fixes, request-signing step-1 vectors with thenegative/026re-code, completeprofile-3.2mirrors and step-5 canonicalization vectors, envelope composition and the bundled provenance hoist, the product channel-declaration guidance, and the principal-layer buyer walkthrough (v3.2.4).
What requires adopter attention
In review for 3.3
Open 3.3 proposals are not part of any beta until they merge. Five working-group decisions are ratified, and their normative text has merged:- Agent identity is an origin (DR-0023). Merged: the Web Bot Auth profile #7894, Web Bot Auth identities and the deprecation of the RFC 9421 brand.json profile #8162, first-contact binding #8168, the buyer walkthrough and migration guide #8172, the experimental production security profile #8155, seller onboarding posture #8170, and the R7/R8 erratum #8219. Open:
request_account#8293. - Responses conform to the served release (DR-0024, #8117). Merged. The rule is in Serving an older pin; grading is open in #8156.
- Demand-side grants (DR-0025). Merged: #8157, #8169.
- JWS artifacts use the Web Bot Auth key directory (DR-0026, #8299). Merged. It amends DR-0023: governance contexts, designated-task response signatures, and rights attestations from a listed origin verify against its key directory in 3.3.
- Seller revisions advance on every committed change (DR-0031, #8159). Merged; recorded in #8389. See Tightened rules.
sales-fixed-rate, delivery projection, and lineage) describe surfaces merged for beta.0 and await ratification. The open proposals are listed in the 3.3 beta program.
Start here
- Read the 3.3 beta program.
- Follow Migrating from 3.2 to 3.3.
- Choose the exact package and support level in Choose your SDK.
- Use the Release Notes for the cumulative record.