Overview
Server-Side Ad Insertion (SSAI) allows you to embed ads into your videos to provide a TV-like viewing experience where ads cannot be blocked by ad blockers in the browser. For SSAI, your videos need to be ingested using Dynamic Delivery, which is the next generation ingest and delivery system reducing your storage footprint and dynamically packaging media.
SSAI works with both DRM and non-DRM content.
Any video that you retrieve from Video Cloud that has been ingested with Dynamic Delivery, will include the ads specified in the VMAP file in your ad configuration.
To play server-side ads with your video content stored in Video Cloud, follow these steps:
- Defining an ad tag
- Testing your ad tag
- Creating an ad configuration
- Requesting a Video
- Configuring your player
Here are some additional topics:
Defining an ad tag
The ad tag defines the ad that will be retrieved and played. You can use one of the following formats:
- Digital Video Ad Serving Template (VAST) - Defines one ad.
- Video Multiple Ad Playlist (VMAP) - Defines a playlist of ads. The VMAP file is a collection of VAST tags.
Sample VMAP file
Here is an example of a VMAP file:
<vmap:VMAP xmlns:vmap="http://www.iab.net/videosuite/vmap" version="1.0">
<vmap:AdBreak timeOffset="start" breakType="linear" breakId="preroll">
<vmap:AdSource id="preroll-ad" allowMultipleAds="false" followRedirects="true">
<vmap:VASTAdData>
<VAST version="3.0">
<Ad id="1">
<InLine>
<AdSystem version="1.0">Test Ad Server</AdSystem>
<AdTitle>
<![CDATA[ Portals ]]>
</AdTitle>
<Description>
<![CDATA[ Demo ad number 6 ]]>
</Description>
<Error>
<![CDATA[ ]]>
</Error>
<Creatives>
<Creative>
<Linear>
<Duration>00:00:05</Duration>
<TrackingEvents/>
<AdParameters>
<![CDATA[ <xml></xml> ]]>
</AdParameters>
<VideoClicks/>
<MediaFiles>
<MediaFile type="video/mp4" width="1280" height="720" delivery="progressive" id="2" bitrate="4316" minBitrate="320" maxBitrate="320" scalable="true" maintainAspectRatio="true">
<![CDATA[ https://general.support.brightcove.com/assets/ads/bc-ads/bcls-ad-6-5seconds.mp4 ]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension>
<xml>data</xml>
</Extension>
</Extensions>
</InLine>
</Ad>
</VAST>
</vmap:VASTAdData>
</vmap:AdSource>
</vmap:AdBreak>
<vmap:AdBreak timeOffset="00:00:05" breakType="linear" breakId="midroll">
<vmap:AdSource id="midroll-ad" allowMultipleAds="false" followRedirects="true">
<vmap:VASTAdData>
<VAST version="3.0">
<Ad id="2">
<InLine>
<AdSystem version="1.0">Test Ad Server</AdSystem>
<AdTitle>
<![CDATA[ Marketing ]]>
</AdTitle>
<Description>
<![CDATA[ Demo ad number 4 ]]>
</Description>
<Error>
<![CDATA[ ]]>
</Error>
<Creatives>
<Creative>
<Linear skipoffset="00:00:05">
<Duration>00:00:12</Duration>
<TrackingEvents/>
<AdParameters>
<![CDATA[ <xml></xml> ]]>
</AdParameters>
<VideoClicks/>
<MediaFiles>
<MediaFile type="video/mp4" width="1280" height="720" delivery="progressive" id="3" bitrate="3026" minBitrate="320" maxBitrate="320" scalable="true" maintainAspectRatio="true">
<![CDATA[ https://general.support.brightcove.com/assets/ads/bc-ads/bcls-ad-4-12seconds.mp4 ]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension>
<xml>data</xml>
</Extension>
</Extensions>
</InLine>
</Ad>
</VAST>
</vmap:VASTAdData>
</vmap:AdSource>
</vmap:AdBreak>
<vmap:AdBreak timeOffset="end" breakType="linear" breakId="postroll">
<vmap:AdSource id="postroll-ad" allowMultipleAds="false" followRedirects="true">
<vmap:VASTAdData>
<VAST version="3.0">
<Ad id="3">
<InLine>
<AdSystem version="1.0">Test Ad Server</AdSystem>
<AdTitle>
<![CDATA[ Brand ]]>
</AdTitle>
<Description>
<![CDATA[ Demo ad number 1 ]]>
</Description>
<Error>
<![CDATA[ ]]>
</Error>
<Creatives>
<Creative>
<Linear>
<Duration>00:00:08</Duration>
<TrackingEvents/>
<AdParameters>
<![CDATA[ <xml></xml> ]]>
</AdParameters>
<VideoClicks/>
<MediaFiles>
<MediaFile type="video/mp4" width="1280" height="720" delivery="progressive" id="4" bitrate="2115" minBitrate="320" maxBitrate="320" scalable="true" maintainAspectRatio="true">
<![CDATA[ https://general.support.brightcove.com/assets/ads/bc-ads/bcls-ad-1-8seconds.mp4 ]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension>
<xml>data</xml>
</Extension>
</Extensions>
</InLine>
</Ad>
</VAST>
</vmap:VASTAdData>
</vmap:AdSource>
</vmap:AdBreak>
</vmap:VMAP>
Testing your ad tag
It is good practice to verify that your ad tags are valid and work as expected. This will help with debugging other issues during the implementation process.
Creating an ad configuration
The ad configuration defines various aspects of SSAI playback, including a URL to your Video Multiple Ad Playlist (VMAP) file, beacons, and other configurations.
Using Video Cloud Studio
To create an ad configuration using Studio, see the Configuring Server-Side Ad Settings document.
Using SSAI Ad Config API
To create an ad configuration using the API, see the Video Cloud SSAI Ad Config API document.
Requesting a Video
Next, get your video data with server-side ads. To do this, append your ad configuration id as a URL parameter to your Playback API video request.
- For details, see the Video request with SSAI section of the Overview: Playback API document.
Sample Playback API response
Here is an example of a Playback API response:
{
"poster": "https://cf-images.eu-west-1.prod.boltdns.net/v1/jit/1752604059001/dca41ae8-d8f5-48a6-9853-564764d60b84/main/1280x720/12s64ms/match/image.jpg",
"thumbnail": "https://cf-images.eu-west-1.prod.boltdns.net/v1/jit/1752604059001/dca41ae8-d8f5-48a6-9853-564764d60b84/main/160x90/12s64ms/match/image.jpg",
"poster_sources": [{
"src": "https://cf-images.eu-west-1.prod.boltdns.net/v1/jit/1752604059001/dca41ae8-d8f5-48a6-9853-564764d60b84/main/1280x720/12s64ms/match/image.jpg"
}],
"thumbnail_sources": [{
"src": "https://cf-images.eu-west-1.prod.boltdns.net/v1/jit/1752604059001/dca41ae8-d8f5-48a6-9853-564764d60b84/main/160x90/12s64ms/match/image.jpg"
}],
"description": null,
"tags": [],
"cue_points": [],
"custom_fields": {},
"account_id": "1752604059001",
"sources": [{
"ext_x_version": "4",
"src": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/hls/v4/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/master.m3u8?bc_token=NWZmNGQ4ZDlfZjJkMjdkY2ZlZjNhODljNzVmNzlhZTkxZTM0YTBhMmQ5NzI3ZDVmMmZmODIwYjcyMjM0NzMyZDIyZDQ3NTUwZQ%3D%3D",
"type": "application/x-mpegURL",
"vmap": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/hls/v4/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfOTY5ZjIzMzAzOTAxNzZhZjVlYjllOGJmMzA1YjI4MDE3OTM4NmEyZmRkYTc1OGNkZjM5NTAxMWUxYTE5ZGU5Yg%3D%3D"
}, {
"ext_x_version": "4",
"src": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/hls/v4/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/master.m3u8?bc_token=NWZmNGQ4ZDlfZjJkMjdkY2ZlZjNhODljNzVmNzlhZTkxZTM0YTBhMmQ5NzI3ZDVmMmZmODIwYjcyMjM0NzMyZDIyZDQ3NTUwZQ%3D%3D",
"type": "application/x-mpegURL",
"vmap": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/hls/v4/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfOTY5ZjIzMzAzOTAxNzZhZjVlYjllOGJmMzA1YjI4MDE3OTM4NmEyZmRkYTc1OGNkZjM5NTAxMWUxYTE5ZGU5Yg%3D%3D"
}, {
"codecs": "avc1,mp4a",
"ext_x_version": "7",
"src": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/hls/v7/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/master.m3u8?bc_token=NWZmNGQ4ZDlfNjVhYTczMDhmZWY5OWE5Zjk3OGJmNTczYjYyYWFmMGI3OWQxZTYyODc5YTk3NzJiOWY3MDk0NmZjOTVmZjVhMA%3D%3D",
"type": "application/x-mpegURL",
"vmap": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/hls/v7/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfNzk5NzY0NThhOTlhZWY0OWI3NDc0MDQxMTQxNWMwZjVkYTFlYzdiZTRkMWE2ZmJjODRjODRkY2JlYjZjZWI1Mg%3D%3D"
}, {
"codecs": "avc1,mp4a",
"ext_x_version": "7",
"src": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/hls/v7/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/master.m3u8?bc_token=NWZmNGQ4ZDlfNjVhYTczMDhmZWY5OWE5Zjk3OGJmNTczYjYyYWFmMGI3OWQxZTYyODc5YTk3NzJiOWY3MDk0NmZjOTVmZjVhMA%3D%3D",
"type": "application/x-mpegURL",
"vmap": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/hls/v7/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfNzk5NzY0NThhOTlhZWY0OWI3NDc0MDQxMTQxNWMwZjVkYTFlYzdiZTRkMWE2ZmJjODRjODRkY2JlYjZjZWI1Mg%3D%3D"
}, {
"profiles": "urn:mpeg:dash:profile:isoff-live:2011",
"src": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/dash/live-timeline/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/manifest.mpd?bc_token=NWZmNGQ4ZDlfN2Y5MzJhZmYxYjM5ZTRiZTIwNmFlNzg1NWIyOTY3NjlhMTMwZTllMGI2YzEwZmFlMTk2ZmEzODAwMDVlMWMxYw%3D%3D",
"type": "application/dash+xml",
"vmap": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/dash/live-timeline/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfY2JkMWY4NmY1ZDI2NDQ0NGY1YzAzYzMxNGY5NTJjY2MzYjljMTVjOGM3N2ZhZWRkNTU3YjgxYzkyMDQwOGIzYQ%3D%3D"
}, {
"profiles": "urn:mpeg:dash:profile:isoff-live:2011",
"src": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/dash/live-timeline/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/manifest.mpd?bc_token=NWZmNGQ4ZDlfN2Y5MzJhZmYxYjM5ZTRiZTIwNmFlNzg1NWIyOTY3NjlhMTMwZTllMGI2YzEwZmFlMTk2ZmEzODAwMDVlMWMxYw%3D%3D",
"type": "application/dash+xml",
"vmap": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/dash/live-timeline/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfY2JkMWY4NmY1ZDI2NDQ0NGY1YzAzYzMxNGY5NTJjY2MzYjljMTVjOGM3N2ZhZWRkNTU3YjgxYzkyMDQwOGIzYQ%3D%3D"
}, {
"codecs": "avc1,mp4a",
"profiles": "urn:mpeg:dash:profile:isoff-live:2011",
"src": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/dash/live-timeline/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/manifest.mpd?bc_token=NWZmNGQ4ZDlfNGY5Y2NlNjUyMjNiN2RjYTUyOTYyN2EwZjMzNmNiNjA3NzY4OTFjM2MxMDVhYzkzYzY0NzE5NDc4ZTI4MDc2ZQ%3D%3D",
"type": "application/dash+xml",
"vmap": "http://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/dash/live-timeline/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfZWUxN2FkNjUxZTZmMTZkMzJmM2VhOTY0MTY1NTU1ZmJkNzhiMjgxMTg1ZmI1ZGY1ODcwYmVjOWUzM2E2NGVjMw%3D%3D"
}, {
"codecs": "avc1,mp4a",
"profiles": "urn:mpeg:dash:profile:isoff-live:2011",
"src": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/dash/live-timeline/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/manifest.mpd?bc_token=NWZmNGQ4ZDlfNGY5Y2NlNjUyMjNiN2RjYTUyOTYyN2EwZjMzNmNiNjA3NzY4OTFjM2MxMDVhYzkzYzY0NzE5NDc4ZTI4MDc2ZQ%3D%3D",
"type": "application/dash+xml",
"vmap": "https://ssaimanifest.prod.boltdns.net/playback/once/v1/vmap/dash/live-timeline/clear/codec_avc1_mp4a/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/content.vmap?bc_token=NWZmNGQ4ZDlfZWUxN2FkNjUxZTZmMTZkMzJmM2VhOTY0MTY1NTU1ZmJkNzhiMjgxMTg1ZmI1ZGY1ODcwYmVjOWUzM2E2NGVjMw%3D%3D"
}],
"name": "Mt Audubon",
"reference_id": null,
"long_description": null,
"duration": 24128,
"economics": "AD_SUPPORTED",
"text_tracks": [],
"published_at": "2020-05-14T18:51:30.532Z",
"created_at": "2020-05-14T18:51:30.502Z",
"updated_at": "2020-05-14T19:46:00.320Z",
"offline_enabled": false,
"link": null,
"id": "6156696074001",
"ad_keys": null
}
Configuring your player
From the Playback API response (section above), locate the Sources
object, copy one of the vmap
URL's and paste it in a browser searchbar to see the VMAP response.
Sample VMAP response
Here is an example of a vmap response:
<vmap:VMAP xmlns:bc="bc" xmlns:vmap="http://www.iab.net/vmap-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<vmap:Extensions>
<bc:Brightcove ttl="3600" contenturi="https://ssaimanifest.prod.boltdns.net/us-east-1/playback/once/v1/hls/v4/clear/1752604059001/d6190656-2095-4ff3-8afe-1a0b60d67ed2/dca41ae8-d8f5-48a6-9853-564764d60b84/6830b2e4-3298-439d-beef-e04abef9f23c/content.m3u8?bc_token=NWZkMTE5NTlfZWQxNDAzNDRkNTAxNDRlMWEwODU3MTI1MzY2YjAyZWQ5YzlmZTkzY2UwMjM5NTM1MmI2NGRjZDNhNjE2ZDhlOA%3D%3D"
contentlength="24.0574" payloadlength="50.1835" contenttype="application/x-mpegURL" />
<bc:thumbnailURL type="thumbnail" width="480" height="270" bandwidth="0">https://ssai.playback.us-east-1.prod.deploys.brightcove.com/v1/thumbnail/1752604059001/dca41ae8-d8f5-48a6-9853-564764d60b84/low-res/6830b2e4-3298-439d-beef-e04abef9f23c/thumbnail.vtt?bc_token=NWZkMTE5NTlfMmVmODIzZDJjMGZkMDBjZjY1YWIxNDQ4Y2YyZmUxYTExNzg5YmIxZDI5ZTdkMjgyODBmMDBmYTViMTE2Yzc0MQ%3D%3D</bc:thumbnailURL>
</vmap:Extensions>
<vmap:AdBreak breakType="linear" breakId="PreRoll_0_0" timeOffset="start">
<vmap:AdSource allowMultipleAds="true" followRedirects="true" id="0">
<vmap:VASTData>
<VAST xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Ad id="1">
<InLine>
<AdSystem>Test Ad Server</AdSystem>
<AdTitle>Portals</AdTitle>
<Description>Demo ad number 6</Description>
<Error></Error>
<Creatives>
<Creative>
<Linear>
<CreativeExtensions>
<CreativeExtension>
<BrightcoveForeignKey>1</BrightcoveForeignKey>
</CreativeExtension>
</CreativeExtensions>
<Duration>00:00:05.9392</Duration>
<AdParameters>
<xml></xml>
</AdParameters>
<VideoClicks/>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension>
<xml>data</xml>
</Extension>
</Extensions>
</InLine>
</Ad>
</VAST>
</vmap:VASTData>
</vmap:AdSource>
</vmap:AdBreak>
<vmap:AdBreak breakType="linear" breakId="MidRoll_5_0" timeOffset="00:00:04.8381">
<vmap:AdSource allowMultipleAds="true" followRedirects="true" id="1">
<vmap:VASTData>
<VAST xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Ad id="2">
<InLine>
<AdSystem>Test Ad Server</AdSystem>
<AdTitle>Marketing</AdTitle>
<Description>Demo ad number 4</Description>
<Error></Error>
<Creatives>
<Creative>
<Linear skipoffset="00:00:05">
<CreativeExtensions>
<CreativeExtension>
<BrightcoveForeignKey>2</BrightcoveForeignKey>
</CreativeExtension>
</CreativeExtensions>
<Duration>00:00:12.1788</Duration>
<AdParameters>
<xml></xml>
</AdParameters>
<VideoClicks/>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension>
<xml>data</xml>
</Extension>
</Extensions>
</InLine>
</Ad>
</VAST>
</vmap:VASTData>
</vmap:AdSource>
</vmap:AdBreak>
<vmap:AdBreak breakType="linear" breakId="PostRoll_24_0" timeOffset="end">
<vmap:AdSource allowMultipleAds="true" followRedirects="true" id="2">
<vmap:VASTData>
<VAST xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Ad id="3">
<InLine>
<AdSystem>Test Ad Server</AdSystem>
<AdTitle>Brand</AdTitle>
<Description>Demo ad number 1</Description>
<Error></Error>
<Creatives>
<Creative>
<Linear>
<CreativeExtensions>
<CreativeExtension>
<BrightcoveForeignKey>3</BrightcoveForeignKey>
</CreativeExtension>
</CreativeExtensions>
<Duration>00:00:08.0080</Duration>
<AdParameters>
<xml></xml>
</AdParameters>
<VideoClicks/>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension>
<xml>data</xml>
</Extension>
</Extensions>
</InLine>
</Ad>
</VAST>
</vmap:VASTData>
</vmap:AdSource>
</vmap:AdBreak>
</vmap:VMAP>
VMAP extensions
In the VMAP response, Brightcove adds a <vmap:Extensions>
section.
The following attributes are associated with the <bc:Brightcove>
tag in the extensions section:
Attribute | Description |
---|---|
contenturi |
A reference to the session-specific manifest - This is what you should load into your player |
contentlength |
The duration of the content video |
payloadlength |
The duration of the total stitched stream |
Ad break
The following attributes are associated with each ad block:
Attribute | Description |
---|---|
timeoffset |
This can be start , end , or a specific time, which needs to be calculated. If a pod has multiple ads, they can have the same offset because they're inserted at the same "content time". |
The following tags are associated with each ad block:
Tag | Description |
---|---|
Duration |
This identifies the duration of the ad to be inserted. |
Notes
Here are some things to keep in mind when creating your ad strategy:
- At the
start
offset, you might have 3 ads of duration00:00:16.0000
, resulting in a total pre-roll pod length of 48 seconds. This means that the actual content start time will be the 48 second mark of the actual stitched manifest. - Of the various ad elements, the most relevant is probably the
ClickThrough
as it identifies the URL link to enable. Note that any associatedClickTracking
elements should be beaconed when a user clicks on a link.
Ad tag variables
Ad tag variables allow you to target your ads.
If your ad configuration has any {{url.*}}
macros, they should be appended as query parameters when requesting the VMAP.
For example, a macro like
{{url.deviceId}}
should be appended as a query parameter like
?deviceId=xyz
For details, see the Video Cloud SSAI Ad Config API document.
Server-side beaconing
You can configure beaconing to fire server-side impressions and quartile/complete beacons.
- VAST ad error beacons when using SSAI can be helpful for proactively finding and fixing problems with your ad workflow. For details, see the Ad Error Beacons with SSAI document.
- VAST standard beacons can also be used. For details, see the Digital Video Ad Serving Template (VAST) document.