Blog · Video

A spec-valid video bid can still fill with empty VAST.

A bid request can carry a complete imp.video object. The response can carry a bid.adm that starts with <VAST. Both documents can pass an OpenRTB linter. The player can still print error 303, skip the interactive layer, or leave the companion slot blank. The auction never opened the XML.

The auction stops at adm

OpenRTB decides which ad won. For a video impression the markup is usually a VAST document stuffed into bid.adm, or a nurl that resolves to one. That is the handoff. After that, the player follows <VASTAdTagURI>, loads media, fires tracking, and matches companions by pixel size. None of those steps are fields on the Video object. The VAST and OpenRTB guide draws that boundary. The Video object reference lists every request constraint. Neither page can tell you what the last hop returned.

Validate the bid in the OpenRTB tester. That is the right tool for protocols, api, plcmt, and duration. It is the wrong tool for a wrapper that 200s with an empty <VAST>.

Three ways a clean bid still fails to play

The wrapper resolves and there is no ad. VAST error 303 is No Ads VAST response after Wrapper. The outer document was legal. The last hop was empty, a timeout dressed as XML, or another wrapper with nothing behind it. That is not an OpenRTB no-bid. The seat already won. Walk the chain on the VAST inspector, not in the bid JSON. How to validate the envelope, then the live hops, is How to Validate VAST Wrappers.

The interactive file is not the media. SIMID lives in <InteractiveCreativeFile type="text/html" apiFramework="SIMID">. Players that do not speak SIMID play the sibling <MediaFile>. A tag that only ships a JavaScript VPAID leftover fails as player error 901 on CTV. imp.video.api can list SIMID and still win a creative that never implemented it. Envelope checks are How to Validate SIMID in VAST Tags.

The companion has no size to match. Publishers match banners by width and height, not by creative id. A <Companion> with a JPEG and no dimensions is not a 300x250. required="all" can kill the linear if no size matches. That failure never appears in imp.banner because the companion is not the auctioned impression. How to Validate Companion Ads, plus the problem pages for companions that do not show and IAB sizes.

What to run on which document

Paste the bid request and the bid response into RTBlint. If adm is inline VAST, copy that XML into a VAST validator. If adm is a wrapper or a tag URL, fetch it. The VAST tester follows the live URL. The inspector is the hop-by-hop view when 303 or 302 shows up in the player log.

Do not treat a 200 on the wrapper host as a filled break. Do not treat a valid imp.video.maxduration as proof the inline has <Duration>. Those are two contracts. The second one is not in this repo.

Sources