vastlint

JW Player VAST errors: wrapper limits, VPAID support, and common fixes

Short answer: if a VAST tag fails in JW Player, the first places to look are wrapper depth, VPAID usage, and HTTPS compliance. JW Player can resolve wrappers, but long chains time out. It can run VPAID on desktop web, but not on mobile SDKs or OTT. And any HTTP asset in an HTTPS page is likely to be blocked before ad playback starts.

Use this page when you are debugging a live JW Player ad failure, especially wrapper-depth errors, VPAID compatibility problems, or media files that behave differently across web, mobile, and CTV inventory.

Debug a JW Player tag quickly

Start with the live tag URL, then check wrapper depth and whether the response still uses VPAID in an environment where JW Player will not execute it.

Quick reference

VAST versions2.0, 3.0, 4.0, 4.1, 4.2, 4.3
VPAID2.0 JS on desktop web only. Blocked on mobile SDKs and OTT.
Wrapper chain limitUp to 5 hops (publisher-configurable)
Media formats (web)MP4 H.264, WebM VP8/VP9, HLS
HTTPSRequired (mixed-content blocking on modern browsers)

VPAID policy

JW Player 8+ supports VPAID 2.0 JavaScript on desktop web browsers. However, VPAID is not supported in JW Player's Android and iOS SDKs or in JW OTT (used on Fire TV, Roku, and Smart TVs). If your tag serves across multiple environments, always include a native MP4 fallback alongside any VPAID creative.

JW Player has aligned with the industry move away from VPAID. Use OMID via <AdVerifications> for viewability measurement in new campaigns.

→ vastlint rule: VAST-4.1-vpaid-in-interactive-context

Wrapper chains

JW Player supports wrapper chains up to 5 hops by default. Publishers may configure a lower limit. Chains longer than 3 hops increase latency and ad abandonment, particularly on mobile web. Keep chains to 2–3 hops for reliable delivery.

Media file selection

JW Player evaluates all <MediaFile> entries and selects the one that best matches the viewer's browser and network. Provide multiple bitrate options and include both MP4 and WebM for maximum browser coverage.

<MediaFiles>
  <!-- Desktop/laptop — high quality -->
  <MediaFile type="video/mp4" width="1920" height="1080"
             bitrate="4500" delivery="progressive">
    <![CDATA[https://cdn.example.com/ad-1080p.mp4]]>
  </MediaFile>
  <!-- WebM for browsers preferring VP9 -->
  <MediaFile type="video/webm" width="1920" height="1080"
             bitrate="3500" delivery="progressive">
    <![CDATA[https://cdn.example.com/ad-1080p.webm]]>
  </MediaFile>
  <!-- Mobile / slower connections -->
  <MediaFile type="video/mp4" width="1280" height="720"
             bitrate="1500" delivery="progressive">
    <![CDATA[https://cdn.example.com/ad-720p.mp4]]>
  </MediaFile>
</MediaFiles>

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.

HTTPS requirement

Modern browsers block mixed content. Any HTTP URL in a VAST tag served on an HTTPS page will be blocked by the browser before JW Player can load it. This applies to media file URLs, impression pixels, tracking URLs, and any wrapper <VASTAdTagURI>.

Duration format

JW Player requires <Duration> in HH:MM:SS or HH:MM:SS.mmm format. Bare integers are not accepted.

<!-- ✅ Correct -->
<Duration>00:00:30</Duration>

<!-- ❌ Rejected -->
<Duration>30</Duration>

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.

→ vastlint rule: VAST-2.0-duration-format

Skippable ads

JW Player renders a skip button when skipoffset is present on <Linear>. The value must be a time (HH:MM:SS) or percentage (20%). JW Player fires a skip tracking event when the viewer skips.

Companion ads

JW Player renders companion ads when the page registers companion ad slots via the JW Player advertising API. Companion ads require correct width and height attributes on <CompanionAd> for slot matching.

Ad pods (VAST 3.0+)

JW Player supports ad pods via VAST 3.0 <AdPod> sequences. Set sequence attributes on each <Ad> element to define pod order. JW Player respects the sequence and fires pod-level tracking events.

<VAST version="4.0">
  <Ad id="1" sequence="1">
    <InLine>
      <AdSystem>JW Pod Demo</AdSystem>
      <AdTitle>Preroll 1</AdTitle>
      <Impression><![CDATA[https://track.example.com/pod-1-impression]]></Impression>
      <Creatives>
        <Creative>
          <UniversalAdId idRegistry="Ad-ID">8465903</UniversalAdId>
          <Linear>
            <Duration>00:00:15</Duration>
            <TrackingEvents>
              <Tracking event="start"><![CDATA[https://track.example.com/pod-1-start]]></Tracking>
              <Tracking event="firstQuartile"><![CDATA[https://track.example.com/pod-1-firstQuartile]]></Tracking>
              <Tracking event="midpoint"><![CDATA[https://track.example.com/pod-1-midpoint]]></Tracking>
              <Tracking event="thirdQuartile"><![CDATA[https://track.example.com/pod-1-thirdQuartile]]></Tracking>
              <Tracking event="complete"><![CDATA[https://track.example.com/pod-1-complete]]></Tracking>
            </TrackingEvents>
            <MediaFiles>
              <MediaFile type="video/mp4" width="1280" height="720" bitrate="1800" delivery="progressive">
                <![CDATA[https://cdn.example.com/pod-1.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
  <Ad id="2" sequence="2">
    <InLine>
      <AdSystem>JW Pod Demo</AdSystem>
      <AdTitle>Preroll 2</AdTitle>
      <Impression><![CDATA[https://track.example.com/pod-2-impression]]></Impression>
      <Creatives>
        <Creative>
          <UniversalAdId idRegistry="Ad-ID">8465904</UniversalAdId>
          <Linear>
            <Duration>00:00:30</Duration>
            <TrackingEvents>
              <Tracking event="start"><![CDATA[https://track.example.com/pod-2-start]]></Tracking>
              <Tracking event="firstQuartile"><![CDATA[https://track.example.com/pod-2-firstQuartile]]></Tracking>
              <Tracking event="midpoint"><![CDATA[https://track.example.com/pod-2-midpoint]]></Tracking>
              <Tracking event="thirdQuartile"><![CDATA[https://track.example.com/pod-2-thirdQuartile]]></Tracking>
              <Tracking event="complete"><![CDATA[https://track.example.com/pod-2-complete]]></Tracking>
            </TrackingEvents>
            <MediaFiles>
              <MediaFile type="video/mp4" width="1280" height="720" bitrate="2200" delivery="progressive">
                <![CDATA[https://cdn.example.com/pod-2.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

Pre-flight checklist for JW Player

  • VAST version attribute matches elements used
  • Include native MP4 fallback if using VPAID
  • All URLs use HTTPS
  • Wrapper chain ≤ 3 hops
  • MP4 H.264 <MediaFile> at multiple bitrates
  • <Duration> in HH:MM:SS format
  • <Impression> with HTTPS URL present
  • Companion width and height attributes set (if using companions)

References

Validate your tag against the IAB VAST spec →