VASTlint

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:

errorVAST-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:

warningVAST-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

Related reading