VAST examples / Required fields
An InLine ad missing the <AdSystem> element
VAST 2.01 error1 warningVAST-2.0-inline-adsystem
The scenario
An agency trading desk was debugging why a programmatic guaranteed line item kept getting rejected by the publisher's tag-quality gate before it could go live. The creative was a standard 30-second spot intended for desktop and mobile web video.
The broken tag
<?xml version="1.0" encoding="UTF-8"?>
<!-- InLine is missing AdSystem -->
<VAST version="2.0">
<Ad id="1">
<InLine>
<AdTitle>Test Ad</AdTitle>
<Impression><![CDATA[https://example.com/impression]]></Impression>
<Creatives>
<Creative>
<Linear>
<Duration>00:00:30</Duration>
<MediaFiles>
<MediaFile delivery="progressive" type="video/mp4" width="640" height="360">
<![CDATA[https://example.com/video.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-adsystemIAB VAST 2.0 §2.3.1line 5<InLine> is missing required <AdSystem>
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 10<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 hand-assembled VAST response includes AdTitle, Impression, and a full creative, but it is missing <AdSystem>. <AdSystem> identifies the ad server or system that generated the response, and the spec marks it as required on InLine ads. Players and downstream systems use it for logging, debugging, and trust decisions; some publisher-side validators hard-reject any InLine that omits it, which is exactly what the quality gate was doing.
What it costs
Because <AdSystem> is a required element, strict consumers treat its absence as a malformed response and discard the ad rather than render it. The result is a silent no-fill: the line item is technically trafficked, the tag returns 200 OK, but the publisher's player never plays it. Spend never materializes and the campaign under-delivers against its guarantee.
The fix
Add a single <AdSystem> element naming your ad server, optionally with a version attribute. It must appear inside <InLine> before the creatives.
<InLine>
<!-- required: names the system that served this ad -->
<AdSystem version="4.2">Acme Ad Server</AdSystem>
<AdTitle>Brand Spot 30s</AdTitle>
<Impression><![CDATA[https://ads.example.com/imp]]></Impression>
...
</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 with no <Impression> element — VAST-2.0-inline-impression
- 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