VAST examples / Required fields
An InLine ad with no <Impression> element
VAST 2.01 error1 warningVAST-2.0-inline-impression
The scenario
A retail brand booked a 15-second non-skippable pre-roll across a publisher's free ad-supported streaming (FAST) channels. The deal was sold on a CPM basis, so the entire economic model depends on counting one billable impression each time the creative renders.
The broken tag
<VAST version="2.0">
<Ad id="1">
<InLine>
<AdSystem>Test</AdSystem>
<AdTitle>Test</AdTitle>
<!-- missing Impression -->
<Creatives>
<Creative>
<Linear>
<Duration>00:00:30</Duration>
<MediaFiles>
<MediaFile delivery="progressive" type="video/mp4" width="640" height="360">
https://cdn.example.com/ad.mp4
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
</InLine>
</Ad>
</VAST>What the validator reports
Running this tag through vastlint produces the following. The primary failure for this example:
VAST-2.0-inline-impressionIAB VAST 2.0 §2.3.4line 3<InLine> is missing required <Impression>
The same tag also surfaces these secondary findings — real tags rarely fail in isolation:
VAST-2.0-linear-tracking-quartilesIAB VAST 4.1 §3.14.2line 9<Linear> has no standard quartile tracking events (start/firstQuartile/midpoint/thirdQuartile/complete) — ad will serve but measurement system receives no signal
Why it breaks
The ad server exported an InLine response with a complete Linear creative and a valid MediaFile, but the <InLine> element contains no <Impression> child. The VAST spec has required at least one <Impression> on every InLine ad since 2.0 — it is the canonical signal a player fires the moment the ad render begins. Because the element is absent entirely (not just empty), the player has no impression beacon to call, even though the video itself will decode and play normally.
What it costs
This is the most expensive kind of failure because nothing looks broken on screen. The viewer sees the ad, the player reports success, but the publisher's ad server, the buyer's measurement vendor, and the billing reconciliation all record zero impressions. On a CPM deal that means the inventory is effectively delivered for free, and discrepancy reports between buyer and seller will not reconcile.
The fix
Add at least one <Impression> element inside <InLine>, with the measurement URL wrapped in CDATA. Most ad servers expect one first-party impression plus any third-party verification impressions. Re-validate to confirm the element is present and the URL is HTTPS.
<InLine>
<AdSystem>Retail AdServer</AdSystem>
<AdTitle>Spring Sale 15s</AdTitle>
<!-- required: at least one Impression on every InLine ad -->
<Impression id="srv"><![CDATA[https://ads.example.com/imp?cb=1234]]></Impression>
<Creatives>...</Creatives>
</InLine>VAST XML fragment only. This excerpt belongs inside a complete VAST document, so standalone validation will fail until it is wrapped in a full <VAST>response.
Check your own version of this tag
Paste the resolved XML to run the same spec check, test a live tag URL, or inspect the wrapper chain hop by hop.
Related examples
- An InLine ad missing the <AdSystem> element — VAST-2.0-inline-adsystem
- An InLine ad missing the <AdTitle> element — VAST-2.0-inline-adtitle
- A Linear creative with no <Duration> — VAST-2.0-linear-duration
- A Linear creative with no <MediaFiles> — VAST-2.0-linear-mediafiles