What you'll learn
- VAST 4.2 InLine vs Wrapper XML tree architecture and elements
- Full tracking event lifecycle (impression, quartiles, audio, fullscreen)
- Standard IAB error codes (100–901) and how players handle them
Learn how Video Ad Serving Template (VAST) XML instructions tell video players what video files to stream, when to fire tracking beacons, and how to debug wrapper chains and playback failures.
Video Protocol Track
VAST (Video Ad Serving Template) is the universal language between video players and ad servers. Learn how to parse VAST tags, validate tracking events, resolve wrapper chains, and troubleshoot video playback errors.
Think of VAST as an instruction manual sent from an ad server to a video player (like YouTube, Roku, or a website player). Instead of sending the heavy MP4 video directly in the initial response, the ad server sends a lightweight XML document that says: "Here are 3 video files at different bitrates (HD, 720p, 480p), here is the click-through landing page, and here are the beacon URLs you must ping when the video reaches 25%, 50%, 75%, and 100% completion."
Understanding the two core types of VAST responses returned by ad servers:
| Response Type | What It Contains | Role in Ad Serving | Failure Risk |
|---|---|---|---|
| <InLine> (Primary Ad) | Contains the actual media files (MP4/HLS URLs), creative duration, click-through URLs, and final tracking beacons. | This is the final destination. The video player parses this document and starts buffering video segments immediately. | MediaFile codec incompatibility or broken CDN link. |
| <Wrapper> (Redirect Tag) | Contains a <VASTAdTagURI> pointing to a downstream ad server (e.g. SSP → DSP → 3rd party verification tracker). |
Used by intermediaries to insert tracking, verification scripts (OMID), or redirect to programmatic auction endpoints. | Wrapper Limit Exceeded (Error 302): More than 4–5 hops causes excessive player latency or timeout loops. |
Standard production VAST 4.2 response showing tracking events, error handling, and multi-bitrate MediaFiles:
<?xml version="1.0" encoding="UTF-8"?>
<VAST version ="4.2" xmlns:xs ="http://www.w3.org/2001/XMLSchema" >
<Ad id ="ad-camp-10928" sequence ="1" >
<InLine>
<AdSystem version ="2.0" > AdTechPilot Ad Server</AdSystem>
<AdTitle> Spring Performance Brand Spot</AdTitle>
<!-- Universal Ad ID for creative deduplication & podding -->
<UniversalAdId idRegistry ="Ad-ID" idValue ="ABCD1234000H" > ABCD1234000H</UniversalAdId>
<!-- Global error ping: fired by player if playback fails -->
<Error> </Error>
<!-- Impression beacon: fired when first frame of video renders -->
<Impression id ="imp-001" > </Impression>
<Creatives>
<Creative id ="cr-5501" sequence ="1" >
<Linear>
<Duration> 00:00:15</Duration> <!-- 15-second creative duration -->
<!-- Quartile and interaction tracking beacons -->
<TrackingEvents>
<Tracking event ="start" > </Tracking>
<Tracking event ="firstQuartile" > </Tracking>
<Tracking event ="midpoint" > </Tracking>
<Tracking event ="thirdQuartile" > </Tracking>
<Tracking event ="complete" > </Tracking>
<Tracking event ="mute" > </Tracking>
<Tracking event ="pause" > </Tracking>
</TrackingEvents>
<!-- Click destinations and click tracker -->
<VideoClicks>
<ClickThrough id ="landing" > </ClickThrough>
<ClickTracking> </ClickTracking>
</VideoClicks>
<!-- MediaFiles: Player chooses appropriate bitrate -->
<MediaFiles>
<MediaFile delivery ="progressive" type ="video/mp4" width ="1920" height ="1080" bitrate ="2500" >
</MediaFile>
<MediaFile delivery ="progressive" type ="video/mp4" width ="1280" height ="720" bitrate ="1200" >
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
</InLine>
</Ad>
</VAST>
When each tracking event must fire during video playback according to IAB Tech Lab standards:
| Tracking Event | When It Must Fire | Discrepancy & Billing Significance |
|---|---|---|
| <Impression> | Fires the exact instant the first video frame renders on the user's screen. | Billing Event: Most direct and programmatic video contracts bill upon this beacon firing. |
| start | Fires when playback starts (typically 0% progress, simultaneously with Impression). | Used to calculate video start rate (Start / Ad Opportunities). |
| firstQuartile (Q1) | Fires when video reaches 25% of total duration (e.g. 3.75s of a 15s ad). | Measures initial audience drop-off and hook retention. |
| midpoint (Q2) | Fires when video reaches 50% of total duration (e.g. 7.5s of a 15s ad). | Key retention benchmark for video campaign performance. |
| thirdQuartile (Q3) | Fires when video reaches 75% of total duration (e.g. 11.25s of a 15s ad). | Strongest signal of completion intent. |
| complete (100%) | Fires when video finishes playback to 100% duration. | VCR (Video Completion Rate) metric: (Completes / Starts) × 100%. |
Enter an IAB standard error code (100–901) or click a common code below to inspect root causes, diagnostic checks, and resolution playbooks:
| Error Code | IAB Description | Root Cause | AdOps / Engineering Resolution |
|---|---|---|---|
| 100 | XML Parsing Error | Malformed XML syntax, unescaped ampersands (& instead of &), unclosed tags. |
Validate XML syntax in an XML validator; ensure URLs with parameters use <![CDATA[...]]> blocks. |
| 301 | Timeout of VAST URI | Downstream redirect tag failed to return within player's timeout limit (e.g. 2000ms). | Check downstream server latency; remove redundant wrapper layers in the ad chain. |
| 302 | Wrapper Limit Reached | Too many redirect hops (>5 wrappers chained together without resolving to an InLine ad). | Cap wrapper chains to maximum 3 hops; instruct DSP/reseller to provide direct InLine tags. |
| 303 | No VAST Response (Empty VAST) | Ad server returned <VAST version="4.0"/> with no <Ad> nodes (No-Bid). |
Normal for programmatic unfilled impressions; check floor prices and targeting availability. |
| 401 | File Not Found | MediaFile URL returned HTTP 404 (Not Found) or expired CDN token. | Verify asset URL hosting; ensure CDN storage links have perpetual or refreshed tokens. |
| 405 | Unsupported MediaFile Display / Codec | Player cannot decode video codec (e.g. attempting to play WebM/VP9 on an Apple TV / Safari). | Provide standard H.264 (MP4, Baseline profile) MediaFiles alongside HLS (.m3u8). |
| 901 | General VPAID / Interactive Error | VPAID JavaScript crashed, blocked by CORS, or failed to fire AdImpression. |
Migrate verification and measurement use cases to OMID (Open Measurement), and interactive rich-media experiences to SIMID / native VAST 4.2 where supported. |
Practical diagnostic steps for resolving video delivery and measurement issues:
Symptom: Browser console reports "Access to video at 'https://cdn...' from origin 'https://publisher...' blocked by CORS policy".
Root Cause: The CDN hosting the MP4 or HLS media files is missing the HTTP header Access-Control-Allow-Origin: *.
Symptom: Video spinner spins indefinitely and player fires Error Code 302 without ever playing an ad.
Root Cause: Ad Server A redirects to SSP B, which redirects to Reseller C, which loops back to Ad Server A.
Symptom: Publisher reports 100,000 video ad starts, but DSP only records 48,000 impressions.
Root Cause: Publisher player fires the DSP <Impression> beacon upon ad request rather than after first frame render, or ad was skipped before frame 1.
Symptom: Desktop browsers play the ad smoothly, but Connected TV devices render a black screen with no audio.
Root Cause: VAST tag only provides a 1080p high-bitrate MediaFile exceeding the Roku hardware memory buffer, or uses non-standard audio codecs.
Symptom: Video player fails to parse VAST XML (Error 100) on specific campaign tags.
Root Cause: Tracking URL contains naked ampersands (e.g. https://track.com?a=1&b=2 instead of & or CDATA).
<![CDATA[ ... ]]> tags.Key technical explanations for AdOps and Solution Engineering interviews:
VAST (Video Ad Serving Template): A declarative XML specification that passes media file URLs and tracking beacons to the player. VPAID (Video Player-Ad Interface Definition): An executable JavaScript program that takes over the player to render interactive overlays, skip buttons, and measure viewability. VPAID is now largely deprecated in favor of VAST 4.x + OMID due to security and mobile compatibility issues.
Keywords: VAST XML instructions, VPAID JavaScript executable, OMID modern viewability.The <UniversalAdId> provides a unique, standardized registry ID (such as Ad-ID in the US or Clearcast in the UK) across all supply chains. This allows CTV publishers and SSAI stitchers to perform competitive separation (preventing two car commercials from playing back-to-back in the same commercial break) and deduplication.
Error 303 indicates that the ad server received the request successfully but had no eligible ad to serve (No-Bid). To troubleshoot, verify whether the placement's price floor is too high, check if targeting criteria (geo, frequency caps, brand safety categories) are too restrictive, and confirm that the buyer's campaign flight dates are active.
Keywords: Error 303, No-Bid, floor price calibration, flight date verification.URLs frequently contain query string delimiters like &, <, and >. In standard XML, these are reserved special characters that will cause XML parser crashes (Error 100). Wrapping URLs inside <![CDATA[ ... ]]> tells the XML parser to interpret the contents as raw text rather than XML markup.
A Companion Ad (defined inside the <CompanionAds> element) is an accompanying display banner (e.g. 300x250 or 728x90) served alongside the linear video. While the video plays, the player communicates with the page ad server or GPT slot to render the synchronized static or rich-media companion creative on the webpage surrounding the video player.
Enter any two values
to calculate the third
More tools coming soon