VASTlint

VAST examples / Required fields

A Linear creative with no <Duration>

VAST 2.01 error1 warningVAST-2.0-linear-duration

The scenario

An SSAI (server-side ad insertion) vendor was stitching ads into a live sports stream. The ad decisioning system needs to know exactly how long each creative runs so it can fill a fixed 90-second commercial break without leaving black slate or clipping the next segment.

The broken tag

<?xml version="1.0" encoding="UTF-8"?>
<!-- Linear is missing Duration -->
<VAST version="2.0">
  <Ad id="1">
    <InLine>
      <AdSystem>Test AdServer</AdSystem>
      <AdTitle>Test Ad</AdTitle>
      <Impression><![CDATA[https://example.com/impression]]></Impression>
      <Creatives>
        <Creative>
          <Linear>
            <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-linear-durationIAB VAST 2.0 §2.3.5.1line 11

<Linear> is missing required <Duration>

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 11

<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 Linear creative provides MediaFiles but omits <Duration>. <Duration> is required on every Linear and expresses the creative's runtime as HH:MM:SS. SSAI stitchers and most players read it before playback to schedule the timeline and to compute quartile tracking offsets. Without it, the stitcher cannot place the ad deterministically in the break.

What it costs

In a server-side stitching context a missing Duration is fatal: the ad decisioning system either drops the creative from the break (causing under-fill and lost revenue) or guesses a length, which desynchronizes the timeline and can cut off content. Even client-side, the player cannot compute firstQuartile/midpoint/thirdQuartile offsets, so measurement is degraded.

The fix

Add a <Duration> element in HH:MM:SS form (milliseconds optional) that matches the actual encoded length of the media. Keep it consistent with the real file duration — stitchers trust this value over the container metadata.

<Linear>
  <!-- required: actual runtime, HH:MM:SS[.mmm] -->
  <Duration>00:00:30</Duration>
  <MediaFiles>...</MediaFiles>
</Linear>

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