VASTlint

VAST examples / Icons

An <Icon> (e.g. AdChoices) with no resource

VAST 3.01 error1 warningVAST-3.0-icon-resource

The scenario

A brand needed its CTV and web video creatives to display the AdChoices icon — the privacy/transparency badge required by self-regulatory programs — which VAST carries in the <Icon> element so the player can overlay it during the ad.

The broken tag

<?xml version="1.0" encoding="UTF-8"?>
<!-- ERROR: VAST-3.0-icon-resource — <Icon> has all required attrs but no resource child -->
<VAST version="3.0">
  <Ad id="ad-001">
    <InLine>
      <AdSystem>Test</AdSystem>
      <AdTitle>Test Ad</AdTitle>
      <Impression><![CDATA[https://track.example.com/impression]]></Impression>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:30</Duration>
            <Icons>
              <Icon program="AdChoices" width="77" height="15" xPosition="right" yPosition="top">
                <!-- No StaticResource, IFrameResource, or HTMLResource -->
              </Icon>
            </Icons>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4" width="1920" height="1080">
                <![CDATA[https://cdn.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-3.0-icon-resourceIAB VAST 3.0 §2.3.6.4line 14

<Icon> must contain at least one StaticResource, IFrameResource, or HTMLResource

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 <Icon> element is present (with program and position) but carries no StaticResource, IFrameResource, or HTMLResource. An Icon needs a resource so the player knows what badge image or markup to render and where it links. Without a resource, the player has icon metadata but no actual icon to draw.

What it costs

The AdChoices badge fails to appear, which is not just a rendering nit — for many buys, visible AdChoices is a compliance requirement of the self-regulatory program. Missing it can put the campaign out of policy with the publisher and the program, risking takedowns and jeopardizing the advertiser's standing, all while the underlying ad plays normally and hides the problem.

The fix

Give every <Icon> a resource (commonly a StaticResource PNG) plus the program, dimensions, and position attributes, and an IconClicks/IconClickThrough so the badge links to the disclosure page.

<Icon program="AdChoices" width="20" height="20" xPosition="right" yPosition="top">
  <StaticResource creativeType="image/png">
    <![CDATA[https://cdn.example.com/adchoices.png]]></StaticResource>
  <IconClicks>
    <IconClickThrough><![CDATA[https://youradchoices.com]]></IconClickThrough>
  </IconClicks>
</Icon>

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