vastlint

Bumper ads in VAST XML

A bumper ad is a short, non-skippable linear ad of 6 seconds or less. Bumpers are used as standalone brand awareness placements and as bookend ads in ad pods (a bumper before the main ad, and another after). They typically achieve near-100% completion rates due to their brevity.

In VAST XML, a bumper is simply a <Linear> creative with a <Duration> of 6 seconds or less and no skipoffset attribute. There is no dedicated bumper element in the VAST spec — the bumper format is a convention enforced by the platform or exchange, not by VAST itself.

Quick reference

Max duration6 seconds (enforced by platform/exchange, not VAST spec)
SkippableNo — omit skipoffset
Used in ad podsYes — sequence attribute on <Ad>
Completion rateNear 100% (no skip option, short duration)

Minimal bumper example

<VAST version="4.2">
  <Ad id="1">
    <InLine>
      <AdSystem>My Ad Server</AdSystem>
      <AdTitle>My 6s Bumper</AdTitle>
      <Impression id="imp1"><![CDATA[https://track.example.com/impression]]></Impression>
      <UniversalAdId idRegistry="Ad-ID">BUMP1234</UniversalAdId>
      <Creatives>
        <Creative id="creative1" sequence="1">
          <Linear>
            <!-- No skipoffset — bumpers are never skippable -->
            <Duration>00:00:06</Duration>
            <TrackingEvents>
              <Tracking event="start"><![CDATA[https://track.example.com/start]]></Tracking>
              <Tracking event="complete"><![CDATA[https://track.example.com/complete]]></Tracking>
            </TrackingEvents>
            <VideoClicks>
              <ClickThrough><![CDATA[https://example.com/landing]]></ClickThrough>
            </VideoClicks>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4"
                width="1920" height="1080" bitrate="2000">
                <![CDATA[https://cdn.example.com/bumper-1080p.mp4]]>
              </MediaFile>
              <MediaFile delivery="progressive" type="video/mp4"
                width="1280" height="720" bitrate="1000">
                <![CDATA[https://cdn.example.com/bumper-720p.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

Bumpers as bookends in an ad pod

A common pattern is to wrap a longer ad with bumpers: a 6s bumper plays first, then the main ad, then another 6s bumper. In VAST, this is represented using multiple <Ad> elements with sequence attributes inside a single VAST response, or via separate VAST tags served as an ad pod.

<VAST version="4.2">
  <!-- Sequence 1: opening bumper (6s) -->
  <Ad id="bumper-open" sequence="1">
    <InLine>
      <AdSystem>My Ad Server</AdSystem>
      <AdTitle>Opening Bumper</AdTitle>
      <Impression><![CDATA[https://track.example.com/bumper-open-imp]]></Impression>
      <Creatives>
        <Creative sequence="1">
          <Linear>
            <Duration>00:00:06</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4"
                width="1920" height="1080" bitrate="2000">
                <![CDATA[https://cdn.example.com/bumper-open.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>

  <!-- Sequence 2: main 30s ad -->
  <Ad id="main-ad" sequence="2">
    <InLine>
      <AdSystem>My Ad Server</AdSystem>
      <AdTitle>Main Ad</AdTitle>
      <Impression><![CDATA[https://track.example.com/main-imp]]></Impression>
      <Creatives>
        <Creative sequence="1">
          <Linear>
            <Duration>00:00:30</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4"
                width="1920" height="1080" bitrate="2500">
                <![CDATA[https://cdn.example.com/main-ad.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>

  <!-- Sequence 3: closing bumper (6s) -->
  <Ad id="bumper-close" sequence="3">
    <InLine>
      <AdSystem>My Ad Server</AdSystem>
      <AdTitle>Closing Bumper</AdTitle>
      <Impression><![CDATA[https://track.example.com/bumper-close-imp]]></Impression>
      <Creatives>
        <Creative sequence="1">
          <Linear>
            <Duration>00:00:06</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4"
                width="1920" height="1080" bitrate="2000">
                <![CDATA[https://cdn.example.com/bumper-close.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

See the ad pods & sequencing guide for full details on how players handle multiple <Ad> elements with sequence attributes.

Platform enforcement of the 6-second limit

The 6-second duration convention is enforced at the platform or exchange level, not by the VAST spec itself. How each platform handles a bumper that exceeds 6 seconds varies:

PlatformBehaviour if duration exceeds 6s
Google Ad Manager (GAM)Trafficker-defined. GAM line items for bumpers should set max duration to 6s.
YouTube (via GAM)Bumper line item type enforces 6s. Longer creatives are rejected at trafficking time.
Google IMA SDKPlays whatever duration is declared — does not truncate. Enforcement is upstream.
Roku RAFNo native bumper concept. Duration enforced by publisher configuration.

Common mistakes checklist

  • Duration exceeds 6 seconds — exchanges will reject the creative or reclassify it as a non-skippable linear. Keep to ≤6s.
  • skipoffset accidentally included — a bumper with skipoffset would show a skip button immediately (or after the offset), defeating the purpose. Omit it entirely.
  • Missing sequence attribute in ad pods — when bumpers are served as part of a pod, the sequence attribute on each <Ad> element determines play order. Missing or duplicate sequence values cause undefined player behaviour.
  • Reusing a 30s creative trimmed to 6s in the MediaFile — the <Duration> element must reflect the actual video file length. If the video is 30s but Duration is 6s, the player will cut off the ad at 6s and fire complete at the wrong point.