VASTlint
Back to blog
Wrapper chains/8 min read

How to Validate VAST Wrappers

Wrapper validation starts with VASTAdTagURI, chain depth, and the last hop. Catch missing redirects in XML, then inspect live hops when the player prints 303 or 302.

Author

Alex Sekowski

Published

August 29, 2026

Updated

August 29, 2026

Reading time

8 min read

WrappersVASTInspectorHow-to

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.
A wrapper that should pass
xml
<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>
A wrapper that looks valid but should be flagged
xml
<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.
Use the CLI when wrapper XML should block launch
sh
vastlint check wrapper-example.xml --format json vastlint check wrapper-example.xml --fail-on-warning

What 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

Keep reading

Related stories

All posts