On October 22, 2026 AgenticAdvertising.org closed its October town hall with AdCP 3.2 in production and agent-to-agent TV buys moving from demos to repeat campaigns. Fox and Simulmedia alone reported more than 300 spot-level orders executed over A2A this quarter. Every one of those stories ends the same way in engineering: a media buy object, then an ad server or exchange that speaks OpenRTB, then a player that still reads VAST. The MCP task can return OK while the wire objects drift.
This sheet is for engineers wiring buyer agents, sell-side execution, or Prebid-style real-time modules: the people who need to know which AdCP field is supposed to show up as which integer, deal id, or XML child before traffic scales.
AdCP negotiation fields and where they must land
AdCP names constraints in agent tasks (get_products, create_media_buy, sync_creatives). Programmatic execution still uses OpenRTB on the auction hop and VAST on the creative hop. The specification defines several enums by reference to OpenRTB 2.6 and AdCOM; treat the table as the contract your emit layer must satisfy.
| AdCP surface | Wire target | What the buyer expects |
|---|---|---|
video_placement_types (e.g. instream) |
imp.video.plcmt (1–4) |
Same placement class the product filter selected; not deprecated video.placement
|
audio_distribution_types (e.g. podcast) |
imp.audio.feed |
AdCOM feed type on the impression that clears the auction |
| Media buy / package deal reference | imp.pmp.deals[].id |
Bid dealid must name a deal actually offered on that impression |
| Negotiated price and auction type |
deals[].bidfloor, bidfloorcur, at, guar
|
Deal floor beats impression floor; PG vs open auction must match the buy |
Creative format from sync_creatives
|
imp.video / imp.audio mimes, duration, protocols |
Creative accepted upstream must fit the emitted impression or loss reasons 203/204 apply |
| Duration-priced video |
imp.video.durfloors, mincpmpersec
|
Pod pricing fields require pod context on the impression |
| VAST asset from creative tasks | VAST InLine / Wrapper, Duration, MediaFile
|
Agentic brief does not replace a servable tag the player can fetch |
adagents.json authorization |
Paired with source.schain at serve time |
Agent allowed to sell ≠ chain complete on this impression |
AXE segment response (axei, axex, axem) |
OpenRTB user/data and substituted creative URLs | Malformed AXE context fails segment lookup quietly |
One cell is the example people paste wrong daily: instream negotiated on the buy but emitted as video.placement instead of video.plcmt. AdCP names align with plcmt; the older field uses a different enum. Schema validators that only know XML or a loose JSON schema will not catch the semantic swap.
Rows that pass agent tests and still break fill
video_placement_types: ["instream"] with only placement: 1 on the bid request. The integer might look plausible. Buyers filtered on plcmt semantics. Downstream reporting that reads AdCOM placement class sees a deprecated signal or none at all. The migration table lives in placement versus plcmt.
create_media_buy success with a deal id never copied into imp.pmp.deals. The agreement exists in the agent transcript. The auction request offers no private deal. Bids that cite the negotiated id die with loss reason 4. Nothing in AdCP task JSON proves the emit layer ran.
sync_creatives OK while the VAST asset URL 404s or omits Duration. Creative governance in AdCP is a different document from the tag the SSAI stitcher or client player pulls. I run those URLs through the VAST tag tester and wrapper chains through the VAST inspector because MCP success on the creative task does not fetch the tag.
How you catch it
Split the check by payload owner. rtblint (cargo install rtblint, npm install rtblint-core, MCP rtblint-mcp) validates the OpenRTB bid request and the bid response against the request that produced it, including AdCP-oriented discovery via get_adcp_capabilities. vastlint (cargo install vastlint, npm install vastlint) validates the VAST or VMAP creative the buy claimed. An implementation that lets a model emit either object still needs that deterministic pass: tool success and RPC OK are not the wire contract. These packages are independent of IAB Tech Lab and of AAO; the specs do not require them.
Practical loop: fixture one product type per placement class, validate the serialized bytes at the emit boundary, then validate the creative URL before launch. For agent stacks, call validation as an MCP tool in the same turn you assemble the request.
Where to go next
- Field-level walkthrough of the media-buy handoff: AdCP to OpenRTB mapping guide.
- How AdCP sits above VAST and OpenRTB without replacing them: AdCP and VAST on vastlint.org.
- When the exchange runs an older dated snapshot than your agent: OpenRTB version mismatch.
- AdCOM asset subtype gaps on 2.6 impressions: assetformat subtype required.
- MCP tools and capability discovery: rtblint MCP docs.
Agentic buying moved the negotiation up a layer. Fill still reads the same objects it always did.
Top comments (0)