On 10 November 2025, Marketing Brew laid out how PubMatic, Scope3, and others are pushing Ad Context Protocol (AdCP) as the negotiation layer above DSPs and SSPs. A week later IAB Tech Lab opened ARTF v1.0 for comment, another agentic path that still terminates in programmatic objects. Both stories share one operational risk: the UI or MCP tool can report success while the OpenRTB bid request and VAST asset your ad server or exchange still has to run were never validated for that environment.
AdCP is not a replacement envelope. A media buy still becomes impressions, deals, floors, and privacy fields. A creative sync still becomes XML a stitcher or player ingests. These are the mistakes I see when agents "close" a buy and fill still dies on the wire.
Ten mistakes after AdCP says done
Video intent without a video impression. The Media Buy Protocol can record a CTV or in-stream video selection, then hand activation a request whose
impobjects are banner-only or missingvideoentirely. The agent transcript looks complete. The exchange drops the bid for format mismatch before your creative is consulted.Deal IDs that never reach
imp.pmp.deals. Negotiation stores a private deal or curated package id in the agent layer. Activation emits open auction traffic, or puts the id in an extension the SSP ignores. You pay for a PMP line item that cleared as remnant, or never matched the seller seat.OpenRTB snapshot drift. AdCP does not pin which dated OpenRTB 2.6 train your partner runs. An agent emits
plcmt,durfloors, or AdCOM-shaped video objects valid on one snapshot. The exchange still validates against another. The JSON parses. The profile rejects it silently on fields that did not exist on their cut.adcp_versionechoed but capabilities stale. Version negotiation can succeed on the MCP response whileget_adcp_capabilitiesstill advertises formats the seller no longer serves. The buyer agent assumes linear video is in scope. The seller's activation path never maps that capability to animp.videoblock with matchingminduration/maxduration.Creative standards pass without servable VAST. Content standards tools return green when policy text matches. The synced VAST can still lack Duration, ship HTTP
MediaFileURLs againstimp.secure: 1, or omit mezzanine your SSAI master expects. Schema-valid XML is not creative readiness on a stitcher. See SSAI expectations for what ingest actually checks.Duration and format claims off by one break. AdCP format capabilities might declare a 30-second spot. The VAST
Durationreads00:00:29or the mezzanine is 15 seconds while the break is 30. Pods and ad servers reject the line without telling the agent the negotiation failed.Wrapper chains that never resolve before "ready"." Creative sync stores a top-level VAST URL or a shallow wrapper. Activation marks the asset attached. At serve time the player walks three hops and dies on an empty
VASTAdTagURIor SSL error on hop two. Wrapper depth is a delivery problem, not an AdCP task status.Trust at the agent layer without supply-chain proof.
/.well-known/adagents.jsoncan authorize an agent while ads.txt, sellers.json, and schain tell a different story on the bid. Authorized in the protocol is not authorized in the auction. Adagents.json does not audit schain for you.Integer flags on a protobuf hop. The same request is "fine" in spec JSON and fatal on a gRPC exchange that compiles IAB protobuf OpenRTB. AdCP activation pipelines often serialize JSON once. If the next hop is proto-json,
imp.secure: 1is nottrue, and the whole message fails. Mapping guides on AdCP to OpenRTB are where those fields have to land.Budget and pacing OK, floors wrong. A budget mutation returns success while
bidfloor, deal floors, or currency on the emitted request still reflect a template impression, not the negotiated CPM. The buy is "live" in the agent dashboard. Bids never compete.
One concrete footgun: an activation step copies format id from the creative task into OpenRTB ext but leaves video.protocols empty. The VAST carries VAST 4.x inline video. The impression still looks like an unspecified protocol set to the bidder, so nobody bids even though AdCP logged a successful attach.
How you catch it
An LLM implementing AdCP, wrapping MCP tools, or writing activation glue can hallucinate a field, omit a deal array, or paste VAST from an old template. The tool call can still return HTTP 200 or a structured success payload.
rtblint (cargo install rtblint, npm install rtblint-core, MCP rtblint-mcp) owns the OpenRTB object and AdCP-facing discovery checks (get_adcp_capabilities and the mapping into bid requests). Run it on whatever JSON your activation step forwards to the SSP or exchange, against the dated snapshot that partner actually uses. Rule-level detail lives in the rtblint docs and rule reference.
vastlint (cargo install vastlint, npm install vastlint) owns the VAST asset the creative protocol claimed. After sync, paste the tag URL into the VAST tag tester for fetch, preview, and tracking, then the VAST inspector to walk wrapper hops before you mark the line servable.
These packages are deterministic checks on the wire objects. They are independent of IAB Tech Lab and of AgenticAdvertising.org. The protocol does not require them, and nothing in AdCP replaces pass-two validation on the payloads activation still emits.
Where to go next
- Will agents replace OpenRTB? on what AdCP actually changes in the stack (negotiation, not the auction envelope).
- AdCP to OpenRTB mapping when you wire media buys into impressions.
- SSAI and VAST ingest when the buyer is CTV or stitched video, not browser CSAI.
- RTBlint blog for dated-snapshot and agentic-standard context as ARTF and AdCP roll out in parallel.