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:
VAST-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:
VAST-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
- An InLine ad with no <Impression> element — VAST-2.0-inline-impression
- An InLine ad missing the <AdSystem> element — VAST-2.0-inline-adsystem
- An InLine ad missing the <AdTitle> element — VAST-2.0-inline-adtitle
- A Linear creative with no <Duration> — VAST-2.0-linear-duration