vastlint

Outstream VAST ads

An outstream ad (also called out-of-page video or in-article video) plays outside a dedicated video player — typically auto-expanding inline within article content, in a floating player, or in an interstitial. Unlike in-stream ads, there is no surrounding video content for the ad to interrupt.

Browser autoplay policies require outstream ads to start muted. The impression event is typically gated on a viewability threshold (e.g. 50% of the player in view for 2 continuous seconds) rather than firing immediately on load. The VAST tag structure is the same as a standard linear ad — the outstream behaviour is handled by the player container, not by VAST.

Quick reference

PlacementIn-article, interstitial, floating — outside a video stream
AutoplayMuted (browser policy requirement)
ImpressionViewability-gated (50% in-view for 2s per MRC standard)
VAST structureStandard <Linear> — outstream is a player convention
Companion adsRarely used in outstream; often ignored by outstream players

VAST tag for outstream

The VAST XML for an outstream ad is a standard linear creative. The difference from in-stream is entirely in the player: the outstream player handles muted autoplay, viewability detection, and player lifecycle (pause when scrolled out, resume when scrolled back in). Your VAST tag does not need to signal "this is an outstream ad".

<VAST version="4.2">
  <Ad id="1">
    <InLine>
      <AdSystem>My Ad Server</AdSystem>
      <AdTitle>Outstream Video Ad</AdTitle>
      <!-- Impression fires after viewability threshold is met, not on load -->
      <Impression id="imp1"><![CDATA[https://track.example.com/impression]]></Impression>
      <UniversalAdId idRegistry="Ad-ID">OUTS9012</UniversalAdId>
      <Creatives>
        <Creative id="creative1" sequence="1">
          <Linear>
            <Duration>00:00:30</Duration>
            <TrackingEvents>
              <Tracking event="start"><![CDATA[https://track.example.com/start]]></Tracking>
              <!-- mute/unmute are common in outstream — user often unmutes -->
              <Tracking event="mute"><![CDATA[https://track.example.com/mute]]></Tracking>
              <Tracking event="unmute"><![CDATA[https://track.example.com/unmute]]></Tracking>
              <Tracking event="firstQuartile"><![CDATA[https://track.example.com/q1]]></Tracking>
              <Tracking event="midpoint"><![CDATA[https://track.example.com/mid]]></Tracking>
              <Tracking event="thirdQuartile"><![CDATA[https://track.example.com/q3]]></Tracking>
              <Tracking event="complete"><![CDATA[https://track.example.com/complete]]></Tracking>
              <!-- viewableImpression is available in VAST 4.x -->
            </TrackingEvents>
            <VideoClicks>
              <ClickThrough><![CDATA[https://example.com/landing]]></ClickThrough>
              <ClickTracking><![CDATA[https://track.example.com/click]]></ClickTracking>
            </VideoClicks>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4"
                width="1280" height="720" bitrate="1500"
                scalable="true" maintainAspectRatio="true">
                <![CDATA[https://cdn.example.com/outstream-720p.mp4]]>
              </MediaFile>
              <MediaFile delivery="progressive" type="video/mp4"
                width="854" height="480" bitrate="800"
                scalable="true" maintainAspectRatio="true">
                <![CDATA[https://cdn.example.com/outstream-480p.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

ViewableImpression tracking (VAST 4.x)

VAST 4.0 introduced the <ViewableImpression> element, which lets you provide separate tracking URLs for when the ad is viewable, not viewable, and when viewability measurement is not applicable. This is distinct from the standard <Impression> URL.

<InLine>
  ...
  <!-- Standard impression — fires on load or viewability threshold (player-defined) -->
  <Impression><![CDATA[https://track.example.com/impression]]></Impression>

  <!-- VAST 4.x viewability tracking — fires based on MRC/OMID viewability signal -->
  <ViewableImpression id="vi1">
    <Viewable><![CDATA[https://track.example.com/viewable]]></Viewable>
    <NotViewable><![CDATA[https://track.example.com/not-viewable]]></NotViewable>
    <ViewUndetermined><![CDATA[https://track.example.com/view-undetermined]]></ViewUndetermined>
  </ViewableImpression>
  ...
</InLine>

For more reliable viewability measurement across all environments, use <Verification> with OMID (Open Measurement Interface Definition) instead of relying solely on <ViewableImpression>.

Mute/unmute tracking

Outstream ads start muted. A key engagement signal is whether the user chose to unmute. Include mute and unmute tracking events — they are among the most valuable metrics for outstream creative performance analysis.

Aspect ratio and scalable

Outstream players resize dynamically based on the content column width. Always set scalable="true" and maintainAspectRatio="true" on every <MediaFile> so the player can resize the video without distortion. A 16:9 (1280×720 or 1920×1080) creative works well in most outstream containers.

Common mistakes checklist

  • Assuming the impression fires on load — outstream players typically fire <Impression> after a viewability threshold is met. If your ad server measures fill rate based on impression fires, outstream traffic will show a lower fill rate than in-stream. This is expected behaviour.
  • No mute/unmute tracking — these are the primary engagement signals for outstream. Without them, creative performance data is incomplete.
  • scalable not set on MediaFile — without scalable="true", players render the ad at its declared pixel width and let it overflow or clip.
  • Very high bitrate as the only rendition — outstream placements are often on editorial pages where the user is not primarily there to watch video. Provide a low-bitrate (400–800 kbps) rendition so the ad loads quickly on any connection.
  • Companion ads in outstream — most outstream players have no companion ad slot. <CompanionAds> in an outstream tag will be silently ignored.