vastlint

What changed between VAST 4.0 and VAST 4.1

VAST 4.1 was published by the IAB in 2018. It contains a breaking syntax change to <UniversalAdId> and adds several new required elements. Documents that validated against VAST 4.0 will not necessarily validate against 4.1.

Breaking changes summary

ChangeVAST 4.0VAST 4.1
<UniversalAdId> value locationidValue attributeText content of element
<AdServingId>Did not existRequired in <InLine>
<Mezzanine> typeSimple string elementTyped element with required attributes
VPAIDDiscouragedOfficially deprecated in spec

Breaking: <UniversalAdId> syntax change

This is the most common source of VAST 4.x bugs. In VAST 4.0, the ad ID was placed in the idValue attribute. In VAST 4.1, the idValue attribute was removed and the ID moves to the element's text content. Using the 4.0 syntax in a 4.1 document will silently drop the ID value.

<!-- ❌ VAST 4.0 syntax — invalid in 4.1+ -->
<UniversalAdId idRegistry="ad-id.org" idValue="ADID-12345678" />

<!-- ✅ VAST 4.1+ correct syntax -->
<UniversalAdId idRegistry="ad-id.org">ADID-12345678</UniversalAdId>

→ Rule reference: VAST-4.1-universal-ad-id-value

<AdServingId> — new required element

Every <InLine> ad must now include <AdServingId>. This is a unique identifier for the specific ad serving event (as opposed to the creative identifier in <UniversalAdId>). It is used for impression deduplication in SSAI environments.

<InLine>
  <AdServingId>a532d16d-ac45-11ec-b909-0242ac120002</AdServingId>
  <AdTitle>Brand Campaign Q1</AdTitle>
  ...
</InLine>

→ Rule reference: VAST-4.1-ad-serving-id

<Mezzanine> becomes a typed element

In VAST 4.0, <Mezzanine> was a free-form element. In 4.1 it gained four required attributes matching the <MediaFile> structure.

<!-- ✅ VAST 4.1 Mezzanine with required attributes -->
<Mezzanine delivery="progressive" type="video/mp4" width="1920" height="1080">
  <![CDATA[https://example.com/mezzanine-1080p.mp4]]>
</Mezzanine>

→ Rule reference: VAST-4.1-mezzanine-required-attrs

<ExecutableResource> in <Verification>

Alongside <JavaScriptResource>, 4.1 adds <ExecutableResource> for native/non-browser measurement SDKs. It carries an apiFramework and a type attribute identifying the platform SDK.

<Verification vendor="moat.com-omid">
  <ExecutableResource apiFramework="omid" type="application/vnd.omid+native">
    <![CDATA[moat-sdk://verify?ctx=12345]]>
  </ExecutableResource>
</Verification>

Unified <AdVerifications> type

In 4.0, <AdVerifications> existed only in <InLine>. In 4.1, it can also appear in <Wrapper>, allowing verification scripts to be injected at the wrapper level without waiting for the inner ad to resolve.

VPAID officially deprecated

While VPAID was discouraged from VAST 4.0 onward, 4.1 marks it as officially deprecated. CTV players typically zero-fill VPAID ads since there is no browser JavaScript runtime on most streaming TV hardware. Use <InteractiveCreativeFile> with apiFramework="SIMID" for interactive content.

→ See the VPAID migration guide for a full replacement guide.

adType attribute for audio ads

The adType attribute on <Ad> allows the ad server to declare that the ad is an audio-only creative, enabling audio ad workflows without a video track.

<Ad id="audio1" adType="audio">
  <InLine>...</InLine>
</Ad>

renderingMode on <Companion>

Tells the player how to render the companion ad: default (normal companion slot), concurrent (displayed alongside the video), or end-card (displayed after the video completes).

<Companion width="320" height="50" renderingMode="end-card">
  <StaticResource creativeType="image/png">
    <![CDATA[https://example.com/end-card.png]]>
  </StaticResource>
</Companion>

<ClosedCaptionFiles>

Accessibility element added in 4.1. Contains one or more <ClosedCaptionFile> elements pointing to caption tracks (WebVTT, TTML, SRT).

<ClosedCaptionFiles>
  <ClosedCaptionFile type="text/vtt" language="en">
    <![CDATA[https://example.com/captions-en.vtt]]>
  </ClosedCaptionFile>
</ClosedCaptionFiles>

<BlockedAdCategories>

Allows the publisher to signal which IAB content categories must not appear in the ad position. Typically populated by the SSP and passed through the wrapper chain.

<Expires>

An integer (seconds) after which a cached VAST response should be considered stale and re-fetched. Useful for SSAI systems that cache ad responses.

<Survey> deprecated

The <Survey> element, which had historically been used to embed survey URLs, was deprecated in 4.1.


Migration checklist: VAST 4.0 → 4.1

  • Update version attribute on <VAST> to "4.1"
  • Critical: change <UniversalAdId idValue="..." /> to <UniversalAdId ...>value</UniversalAdId>
  • Add <AdServingId> to every <InLine> (required)
  • Add delivery, type, width, height attributes to all <Mezzanine> elements
  • Replace VPAID <MediaFile> with <InteractiveCreativeFile apiFramework="SIMID">
  • Add <ExecutableResource> to <Verification> for native measurement SDKs
  • Add <ClosedCaptionFiles> for accessibility
  • Add adType="audio" to audio-only ads
  • Add renderingMode to <Companion> elements where applicable
  • Add browserOptional attribute to all <JavaScriptResource> elements
  • Remove or replace <Survey> (deprecated)
  • Add <Expires> if responses may be cached

Validate your VAST 4.1 documents at vastlint.org/validate. Continue to the VAST 4.1 to 4.2 migration guide →