DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

The AdCP OpenRTB and VAST Mapping Cheat Sheet Every Agentic Bid Ops Engineer Needs

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

Agentic buying moved the negotiation up a layer. Fill still reads the same objects it always did.

Top comments (0)