Short answer
Wrapper validation in VAST starts with the XML. If VASTAdTagURI is missing or empty, the chain is a dead end. If the chain is too deep, players fire 302. If wrappers resolve but the last hop is empty, players fire 303.
vastlint can catch missing VASTAdTagURI and wrapper depth in pasted XML. Live hops need the inspector, which is the wrapper chain tester. Validate the wrapper document, then inspect the URL.
What wrappers are doing in the tag
A wrapper is not the ad. It is a redirect that must hand the player a next VAST URL. That URL is VASTAdTagURI. Each hop can add impressions, tracking, and companions. The player stops when it reaches InLine or hits a platform depth limit.
FollowAdditionalWrappers, allowMultipleAds, and followCompanions change what later hops may add. Mis-set flags look like missing creatives. They are wrapper policy, not a broken MediaFile.
What wrapper XML validation can catch before playback
- Wrapper without VASTAdTagURI.
- Empty or non-HTTPS redirect target.
- Chain depth that already exceeds typical player limits (often 3 to 5 hops).
- Ad that is neither InLine nor Wrapper.
- Wrapper ClickThrough that some VAST 4.0/4.1 players ignore.
<VAST version="4.2"> <Ad> <Wrapper> <AdSystem>Example Ad Server</AdSystem> <VASTAdTagURI><![CDATA[https://ads.example.com/next-vast.xml]]></VASTAdTagURI> <Impression><![CDATA[https://tracker.example.com/wrapper-imp]]></Impression> <Creatives /> </Wrapper> </Ad></VAST><VAST version="4.2"> <Ad> <Wrapper> <AdSystem>Example Ad Server</AdSystem> <Impression><![CDATA[https://tracker.example.com/wrapper-imp]]></Impression> </Wrapper> </Ad></VAST>What the wrapper rule set should complain about
- VAST-2.0-wrapper-vastadtaguri because the redirect target is missing.
- VAST-2.0-wrapper-depth when the declared chain is already too long.
- VAST-2.0-ad-has-inline-or-wrapper when the Ad has neither.
- Player error 303 when hops succeed but the last response is empty VAST.
- Player error 302 when the player refuses another redirect.
Get VAST spec updates, platform guides, and release notes in your inbox.
Which channel to use
- The validator at vastlint.org/validate is the paste check for VASTAdTagURI and wrapper structure.
- The inspector at vastlint.org/inspect is the wrapper chain tester: each hop, each response, the hop that went empty.
- The tester at vastlint.org/tester is for the resolved InLine: media, tracking, companions.
- Error pages 303, 302, and 301 map the player code to the XML cause.
vastlint check wrapper-example.xml --format json vastlint check wrapper-example.xml --fail-on-warningWhat wrapper XML validation cannot prove
A wrapper with a well-formed VASTAdTagURI is necessary. It does not prove the next hop returns InLine, or that the CDN is up. No-fill 303 is often legitimate demand, not a tag bug.
Validate the wrapper document, then inspect the live URL hop by hop. Do not treat a green XML paste as a green chain.
Related docs on vastlint
Wrapper chain tester: hop-by-hop fetch and validation.
Depth limits, follow* attributes, latency.
No ads after wrappers. Empty last hop.
Wrapper with no redirect target.
Paste wrapper XML for spec checks.
OpenRTB can pass while the VAST inside is an empty wrapper, leftover SIMID, or a companion with no size.
Inspect the live wrapper chain
Paste the live VAST URL into the inspector. Use the validator when you already have a single hop of XML.
Open the VAST inspector