Monetize your content by inserting ads into:
Live Streams
Ad insertions may take place:
Live Events Only
After Playback: Use post-roll ads to play ads after a live event.
Video On-Demand (VOD)
Upon initiating playback, our service determines the set of pre-roll, mid-roll, and post-roll ads that will be stitched into your on-demand content based off of your ad configuration.
Ads are stitched into your content to provide a seamless transition between your content and ads. Additionally, this prevents ad blockers from blocking your ads.
Ads are automatically upscaled to the highest quality rayA stream with a specific quality configuration based on set bit rate and resolution targets. Each ray is divided into slices. in your encoding profile. Our service upscales your ads without altering their frame rate.
The ad insertion workflow for live streams and VODVideo On-Demand (VOD) allows the playback of content that was previously encoded and stored within our system. One use for VOD is to allow viewers to stream your content at any time. is similar. The only difference between them is the timing for ad retrieval.
Request ads from one or more of the following third-party ad servers:
Perform the following steps to integrate a third-party ad server with live content, VOD, or both:
Create an ad configuration for the desired third-party ad server.
Ad break duration may be specified for an asset that is played back within a live stream. However, the length of an ad break for an asset that is played back as on-demand content is determined by the response from the ad decision server. As a result, you may not specify ad break duration for VOD and ad slate will not be inserted during playout. For example, if the ad decision server returns a 45.35 second ad response, then the duration of the ad break will be 45.35 seconds.
Query string parameter names vary by third-party ad server.
Metadata describing each ad should be included as query string parameters in the playback URL provided by the third-party ad server.
Example:
The following sample playback URL identifies an ad server configuration (i.e., VideoSSP) and a keyword (i.e., marketing).
A set of ads are requested prior to the start of an ad break. However, the total duration for those ads will rarely be an exact match to the ad break's duration. Ads that extend beyond the ad break's duration cause the viewer to fall further behind the live stream (i.e., latencyIndicates the delay between the capture of the source video and when it is displayed to the viewer.). For this reason, we provide the capability to determine how ad spots are handled when they exceed an ad break's duration.
Define the duration of an ad break when creating an ad pod or boundary.
The advantages and disadvantages for each method of handling ad breaks are shown below.
Method |
Latency |
Ad Fill |
Ad Slate |
Playback Drift |
|
---|---|---|---|---|---|
More |
More |
Less |
More |
No |
|
Less |
Less |
Less |
Less |
Yes |
|
Less |
Less |
More |
Less |
Yes |
By default, ads from the ad pool will be inserted into the ad break as long as the amount of time left in the ad break is greater than playback driftIndicates the amount of time that the live stream is behind the targeted latency. Configure artificial latency for each playback session via the delay parameter within the playback URL.. If playback drift exceeds the amount of time left in the ad break, all remaining ads will be dropped and the stream will cut back over to content.
Playback drift measures the amount of time that playback has fallen behind the targeted latency. Configure artificial latency for each playback session via the delay parameter.
Your ad.flex configuration increases the ad insertion window using the following formula:
If ad.flex has not been defined in your playback URL, then ads may be inserted for an additional 4 seconds beyond the requested ad break duration.
The timing for switching the stream back to content varies according to the quantity of ads served by the ad decision server.
Ad Underfill: If the last ad ends before the end of the requested ad break duration, slate will be played until the end of the requested ad break duration.
Slate may extend beyond an ad break by a few seconds.
This example demonstrates how:
Calculate ad break overages via the following formula:
This example makes the following assumptions:
The first ad break in this sample scenario is for a 60 second ad spot. An ad server returns 3 ads with a total duration of 61.62 seconds30.18 + 15.2 + 16.24 = 61.62 seconds. This will cause the viewer to experience 1.62 seconds61.62 - 60 = 1.62 seconds. of additional latency. A breakdown of each ad break is provided below.
Requested / Adjusted DurationRequested and adjusted ad break duration in seconds. |
Playback Drift |
|
---|---|---|
Ad Break #1 60 / 64 seconds |
Ads: 30.18 + 15.20 + 16.24 = 61.62
|
Total playback drift: 61.62 - 60 = 1.62
|
Ad Break #2 90 / 94 seconds |
Ads: 30.52 + 30.82 + 30.81 = 92.15
|
Total playback drift: 1.62 + (92.15 - 90) = 3.77
|
Ad Break #3 120 / 124 seconds |
Ads: 31.34 + 31.84 + 30.71 + 30.58 = 124.47
|
Total playback drift: 3.77 + (128.24 - 120) = 8.24
|
Ad Break #4 90 / 94 seconds |
Ads: 30.94 + 31.87 + 31.76 = 94.57
|
Total playback drift: 8.24 + (94.57 - 90) = 12.81
|
Ad Break #5 120 /124 seconds |
Ads: 30.75 + 31.02 + 30.49 + 30.77 = 123.03
|
Total playback drift: 12.81 + (123.03 - 120) = 15.9
|
Ad Break #6 90 / 94 seconds |
Ads: 31.29 + 30.87 + 31.36 = 93.52
|
Total playback drift: 15.9 + (93.52 - 90) = 19.42
|
Ad Break #7 60 / 64 seconds |
Ads: 30.45 + 16.88 + 16.96 = 47.33
|
Total playback drift: 19.42 + (47.33 - 60) = 6.75
|
Each subsequent ad break causes the viewer to fall further behind as indicated in the Playback Drift column. After the sixth ad break, playback drift is at 19.42 seconds. After the second ad in the seventh ad break, there will only be 16.67Adjusted Ad break duration (64 seconds) - Ads played (30.45+16.88) = Remaining ad time (16.67 seconds) seconds left in the ad break. Playback drift now exceeds the amount of time left in the ad break (i.e., 19.42 seconds > 16.67 seconds). As a result, this triggers the end of the ad break, all remaining ads will be dropped, and the stream will cut back over to content. Ending the ad break early allows the player to recover 12.67Requested Ad break duration (60 seconds) - Ads played (30.45+16.88) = Time Recovered (12.67 seconds) seconds and thus reduces playback drift to 6.75 seconds.
By default, an entire ad is played regardless of whether it exceeds an ad break's duration. Use the following query string parameters to override this behavior:
ad.breakend: Use this parameter to prevent ads from exceeding an ad break's duration by either:
Chopping Ads: Upon reaching the end of the ad break, the current ad will be chopped, all remaining ads will be dropped, and the stream will switch over to content at the end of an ad break.
An ad may extend slightly beyond an ad break.
Learn more.
Dropping Ads: Ads that do not fit within an ad break will not be played and ad slate will be played until the end of the ad break.
Slate may extend slightly beyond an ad break.
Learn more.
Sample URL:
A digital signature should be applied to the above URL.
As mentioned above, you may define the duration of each ad break via ad pods and boundaries. However, if you enable either the chopping or dropping of ads, then ad break duration will be automatically adjusted to account for playback drift using the following formula:
This example makes the following assumptions:
Ad slate is a 5 second asset. Slate is sliced in 4 second segments. This means that it consists of the following segments:
A stream may only consist of whole segments. In the case of the above ad slate, the stream cannot cut over to content 6 seconds into ad slate. Rather, the stream will cut over after 9 secondsIn order to exceed six seconds, three segments (i.e., 4 + 1 + 4) must be played out. of ad slate. Alternatively, if ad slate is a 3 second asset, then the stream can cut over to content after six secondsIn order to meet or exceed six seconds of slate, two segments (i.e., 3 + 3) must be played out. of ad slate.
The first ad break in this sample scenario is for a 60 second ad spot. Using the above formula and assuming that only ad break overages cause playback drift, we end up with an ad break duration of 65 seconds.
An ad server returns 3 ads with a total duration of 61.62 seconds30.18 + 15.2 + 16.24 = 61.62 seconds. These ads will be served since they fit within the ad break. This will cause the viewer to experience 1.62 seconds61.62 - 60 = 1.62 seconds. of additional latency. A breakdown of each ad break is provided below.
Requested / Adjusted DurationRequested and adjusted ad break duration in seconds. |
Playback Drift |
|
---|---|---|
Ad Break #1 60 / 65 seconds 60 - 0 + 5 = 65
|
Ads: 30.18 + 15.20 + 16.24 = 61.62
|
Total playback drift: 61.62 - 60 = 1.62
|
Ad Break #2 90 / 93.38 seconds 90 - 1.62 + 5 = 93.38
|
Ads: 30.52 + 30.82 + 30.81 = 92.15
|
Total playback drift: 1.62 + (92.15 - 90) = 3.77
|
Ad Break #3 120 / 121.23 seconds 120 - 3.77 + 5 = 121.23
|
Ads: 31.34 + 31.84 + 30.75 + 30.58 = 93.93
|
Total playback drift: 3.77 + (93.93 - 120) = -22.30 + 29 = 6.70
|
Each subsequent ad break causes the viewer to fall further behind as indicated in the Playback Drift column. After the third ad in the third ad break, there will only be 27.30Adjusted ad break duration (121.23 seconds) - Ads played (31.34 + 31.84 + 30.75) = Remaining ad time (27.30 seconds) seconds left in the ad break. The duration of the next ad in the ad break (i.e., 30.58 seconds) exceeds the remaining time in the ad break (i.e., 27.30) and therefore all remaining ads will be dropped. Additionally, slate will be played until the end of the ad break. Due to the slate's segment size, slate will actually be played for 29 seconds (as calculated below) resulting in 6.70 seconds of playback drift. After which, the stream will cut back over to content.
Ad slate segments:
A stream may only consist of whole segments and therefore the stream may only switch over to content at the time intervals identified above. This means that the stream cannot switch over to content at exactly 27.30 seconds. Rather, it must wait until the end of that segment which occurs at the 29 second mark.
This example makes the following assumptions:
Ads are sliced in 4 second segments.
A stream may only consist of whole segments and therefore the stream may only switch over to content at 4 second intervals or at the end of the ad. This means that the stream cannot cut over to content 6 seconds into a chopped ad. Rather, the stream will cut over after eight secondsIn order to meet or exceed six seconds, two segments (i.e., 4 + 4) must be played out. or the end of the ad, whichever occurs first.
The first ad break in this sample scenario is for a 60 second ad spot. Using the above formula and assuming that only ad break overages cause playback drift, we end up with an ad break duration of 65 seconds.
An ad server returns 3 ads with a total duration of 61.62 seconds30.18 + 15.2 + 16.24 = 61.62 seconds. These ads will be served since they fit within the ad break. This will cause the viewer to experience 1.62 seconds61.62 - 60 = 1.62 seconds. of additional latency. A breakdown of each ad break is provided below.
Requested / Adjusted DurationRequested and adjusted ad break duration in seconds. |
Playback Drift |
|
---|---|---|
Ad Break #1 60 / 65 seconds 60 - 0 + 5 = 65
|
Ads: 30.18 + 15.20 + 16.24 = 61.62
|
Total playback drift: 61.62 - 60 = 1.62
|
Ad Break #2 90 / 93.38 seconds 90 - 1.62 + 5 = 93.38
|
Ads: 30.52 + 30.82 + 30.81 = 92.15
|
Total playback drift: 1.62 + (92.15 - 90) = 3.77
|
Ad Break #3 120 / 121.23 seconds 120 - 3.77 + 5 = 121.23
|
Ads: 31.34 + 31.84 + 30.75 + 28 (30.58) = 121.93
|
Total playback drift: 3.77 + (121.93 - 120) = 5.70
|
Each subsequent ad break causes the viewer to fall further behind as indicated in the Playback Drift column. After the third ad in the third ad break, there will only be 27.30Adjusted ad break duration (121.23 seconds) - Ads played (31.34 + 31.84 + 30.75) = Remaining ad time (27.30 seconds) seconds left in the ad break. The duration of the next ad in the ad break (i.e., 30.58 seconds) exceeds the remaining time in the ad break (i.e., 27.30) and therefore that ad will be chopped after 28 seconds (as calculated below) resulting in 5.70 seconds of playback drift. After which, the stream will cut back over to content.
Ad segments:
A stream may only consist of whole segments and therefore the stream may only switch over to content at 4 second intervals or at the end of the ad. This means that the stream cannot switch over to content at exactly 27.30 seconds. Rather, it must wait until the end of that segment which occurs at the 28 second mark.
Maximize content monetization by leveraging our PrebidAllows real-time bidding to occur before submitting a request for ads to an Ad Decision Server. service to ensure that ads that correspond to the highest value bids are served to your viewers. Prebid seamlessly inserts an additional step at the start of your ad workflow to ensure real-time biddingAllows advertisers to bid on ad supply in real time. (RTB) for your ad supplyIdentifies the opportunity to insert ads.. Your request for ads, along with these bids, are then submitted to the ad decision server. This allows an ad decision server to choose from:
Third-party ads (standard): Identifies ads generated by demand partners through real-time bidding (RTB) requested by an ad decision server.
If an ad decision server prioritizes direct ads, then it will not initiate RTB. In turn, this prevents bids from advertisers without direct buys from being considered.
Prebid grants more flexibility to your ad decision server by allowing it to choose from a wider variety of bids to determine the optimal set of creatives to fill your ad breaks. The benefits of using Prebid are:
To set up Prebid
Contact your account manager to activate the Prebid feature.
Set up a Prebid server.
Set up an adapter within your Prebid server for each desired demand partner.
Define a Prebid configuration for your Prebid server.
Optional. From the podconfig.configid option, indicate the ID for the desired custom Prebid configuration.
Contact your account manager if you would like to set up a custom Prebid configuration. Once configured, your account manager will provide its ID.
Optional. Restrict bidding to ads that satisfy predefined criteria.
From the pricegranularity.range.increment option, define how similarly priced bids will be grouped. Define the maximum number of cents by which bids in the same group may differ.
Use a larger value to reduce the number of line items that you will need to define within your ad decision server to target bids.
From the includebrandcategory.publisher option, indicate the ID assigned to your organization by Google Ad Manager.
This option is required when using Google Ad Manager as your ad decision server.
Click Save.
Add an ad.prbd query string parameter to the playback URL and set it to the name of the Prebid configuration, as defined in step 4.iii, that identifies your Prebid server and provides bidding instructions.
Example:
Ad verification is only supported when using VAST 3.x or 4.0.
Measure ad viewability by customizing your player to extract verification data from the manifest file and send it to an ad verification system via the Open Measurement Interface Definition (OMID).
Ad verification requires an Interactive Advertising Bureau account. If you do not currently have an account, please create one.
Setting up ad verification requires updating your player to:
Steps 2 and 3 are outside the scope of this document. Please refer to the documentation provided by your ad verification system to learn how to provide ad verification data via OMID.
Add ad verification data to the manifest by including one or more of the following query string parameter(s) in the playback URL:
Query String Parameter | Description |
---|---|
Inserts tracking event data from the VAST response. This data is reported within an EXT-X-DATERANGE ad marker tag whose class/scheme identifier is urn:uplynk:ad-data:events. Example: timedmeta.events=complete,midpoint
|
|
Inserts custom VAST extensions data. This data is reported within an EXT-X-DATERANGE ad marker tag whose class/scheme identifier is urn:uplynk:ad-data:data:extensions. Example: timedmeta.extensions=waterfall,geo
|
|
Inserts ad viewability data. This data is reported within an EXT-X-DATERANGE ad marker tag whose class/scheme identifier is urn:uplynk:ad-data:omsdk. Example: timedmeta.schemas.ads=omsdk
|
Initiating a playback session with one of the above query string parameters will include the requested data from the ad node returned by the Preplay API within the manifest file. Information on how this data is inserted into the manifest file for HLS and DASH is provided below.
Test your ad verification workflow by passing staticomsdk=1 as a query string parameter in the playback URL for the desired live event or live channel. This parameter, which inserts a static JSON payload into the manifest, cannot be used to test the ad verification workflow for VOD content.
An ad marker tag (i.e., EXT-X-DATERANGE) will be inserted for each parameter defined in the playback URL. For example, if you specify both timedmeta.events.ads and timedmeta.extensions.ads, then two ad marker tags will be added to the manifest file.
Timed metadata does not currently return data that allows a player to signal their position in a stream. This means that players must still use data from the Ping API to signal their position in a stream.
Inserts a Base64-encoded JSON payload into the X-DATA attribute of the EXT-X-DATERANGE tag of an HLS manifest.
For each ad, the START-DATE attribute of the EXT-X-DATERANGE tag will have the same value as the corresponding EXT-X-PROGRAM-DATE-TIME tag. The specified timestamp doesn't reflect playback time. Instead, the first ad in a stream will be assigned a timestamp of 1970-01-01T00:00:00+00:00. Each subsequent ad will be assigned a value that takes place after the previous ad.
For each ad, an Event node will be inserted within an EventStream node in that ad's period within the DASH manifest. This Event node will contain the JSON payload as shown below.
In order to improve readability, a formatted version of the above sample JSON payload is provided below.
{ "AdVerifications": [{ "vendor": "iabtechlab.com-omid", "Verification": [{ "browserOptional": "true", "apiFramework": "omid", "JavaScriptResource": "<![CDATA[https://s3-us-west-2.amazonaws.com/omsdk...https://s3-us-west-2.amazonaws.com/omsdk-files/compliance-js/omid-validation-verification-script-v1.js]]>" }, { "VerificationParameters": "<![CDATA[iabtechlab]]>" } ] } ], "adID": "90000035", "creative": "ed85dfa6e5b74442a2df7d8bfe15bed5", "creativeID": null }