Back to Publisher API Reference
+ +diff --git a/.sass-cache/a8ae1fbf8fe3cf0ae44282e4f927a25624204c54/main.scssc b/.sass-cache/a8ae1fbf8fe3cf0ae44282e4f927a25624204c54/main.scssc new file mode 100644 index 0000000000..6db4f74c3a Binary files /dev/null and b/.sass-cache/a8ae1fbf8fe3cf0ae44282e4f927a25624204c54/main.scssc differ diff --git a/_assets/sass/components/_autocomplete-filter.scss b/_assets/sass/components/_autocomplete-filter.scss new file mode 100644 index 0000000000..71eb86a31e --- /dev/null +++ b/_assets/sass/components/_autocomplete-filter.scss @@ -0,0 +1,12 @@ +.pb-content { + .autocomplete-filter { + padding: 10px 15px; + border: 1px solid #b3c1cc; + background-color: rgba(236, 243, 245, 0.35); + + &:focus { + outline: none; + } + } +} + diff --git a/_assets/sass/components/_bidder-list.scss b/_assets/sass/components/_bidder-list.scss index 55db573e20..53abc427a8 100644 --- a/_assets/sass/components/_bidder-list.scss +++ b/_assets/sass/components/_bidder-list.scss @@ -1,14 +1,4 @@ .pb-content { - .bidder-filter { - padding: 10px 15px; - border: 1px solid #b3c1cc; - background-color: rgba(236, 243, 245, 0.35); - - &:focus { - outline: none; - } - } - .c-bidder-list-group { h4 { color: #797f90; diff --git a/_assets/sass/main.scss b/_assets/sass/main.scss index 29af1a2147..ad4090dbd6 100644 --- a/_assets/sass/main.scss +++ b/_assets/sass/main.scss @@ -34,6 +34,7 @@ @import 'components/social-media'; @import 'components/table'; @import 'components/download-form'; +@import 'components/autocomplete-filter'; @import 'components/bidder-list'; @import 'components/search'; diff --git a/_data/dropdown_v2.yml b/_data/dropdown_v2.yml index a2e3139ba7..268f618bad 100644 --- a/_data/dropdown_v2.yml +++ b/_data/dropdown_v2.yml @@ -349,7 +349,7 @@ sectionId: 4 sectionName: Resources title: Prebid.org - link: http://www.prebid.org + link: https://www.prebid.org needsDivider: 1 isHeader: 0 isSubSectionStart: 1 @@ -358,7 +358,7 @@ sectionId: 4 sectionName: Resources title: Blog - link: http://www.prebid.org/blog + link: https://www.prebid.org/blog needsDivider: 0 isHeader: 0 isSubSectionStart: 1 diff --git a/_data/message.yml b/_data/message.yml deleted file mode 100644 index 987d4697f4..0000000000 --- a/_data/message.yml +++ /dev/null @@ -1,4 +0,0 @@ -#-------------Message---------------- -- messageId: 1 - messageText: Register for our webinar on Aug 27, 2020: How to Make Prebid the Supply Path Buyers Choose - messageCreateDt: 08_04_2020 diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 8219b1f587..a5a92549b0 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -180,7 +180,7 @@ - sbSecId: 1 title: Native Ads - link: /dev-docs/examples/native-ad-example.html + link: /formats/native.html isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -1326,21 +1326,13 @@ subgroup: 1 - sbSecId: 4 - title: 'JW Player (Hosted)' + title: 'JW Player (Self-Hosted)' link: /examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html isHeader: 0 isSectionHeader: 0 sectionTitle: subgroup: 1 -- sbSecId: 4 - title: 'JW Player (Playlist)' - link: /examples/video/instream/jwplayer/pb-ve-jwplayer-playlist.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 1 - - sbSecId: 4 title: 'Kaltura' link: /examples/video/instream/kaltura/pb-ve-kaltura.html @@ -1399,29 +1391,13 @@ subgroup: 1 - sbSecId: 4 - title: 'JW Player (Hosted)' + title: 'JW Player (Self-Hosted)' link: /examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html isHeader: 0 isSectionHeader: 0 sectionTitle: subgroup: 1 -- sbSecId: 4 - title: 'JW Player (Playlist)' - link: /examples/video/server/jwplayer/pbs-ve-jwplayer-playlist.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 1 - -- sbSecId: 4 - title: 'JW Player (Player 7)' - link: /examples/video/server/jwplayer/pbs-ve-jwplayer-jwplayer7.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 1 - - sbSecId: 4 title: 'Kaltura' link: /examples/video/server/kaltura/pbs-ve-kaltura.html @@ -1934,7 +1910,7 @@ - sbSecId: 6 title: Native - link: /dev-docs/show-native-ads.html + link: /prebid/native-implementation.html isHeader: 0 isSectionHeader: 0 sectionTitle: @@ -2046,3 +2022,41 @@ isSectionHeader: 0 sectionTitle: subgroup: 0 + +#-------------- Prebid Identity --------------| + +- sbSecId: 9 + title: + link: + isHeader: 0 + isSectionHeader: 1 + sectionTitle: Prebid Identity + sectionId: prebid-identity + subgroup: 1000 + sbCollapseId: prebid-identity + +- sbSecId: 9 + title: invis + link: + isHeader: 1 + headerId: invis + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 9 + title: Identity Overview + link: /identity/prebid-identity.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 9 + title: SharedID + link: /identity/sharedid.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + diff --git a/_includes/adops/adops-gam-video-setup.html b/_includes/adops/adops-gam-video-setup.html index 4583b57ea4..1825186ccd 100644 --- a/_includes/adops/adops-gam-video-setup.html +++ b/_includes/adops/adops-gam-video-setup.html @@ -29,7 +29,7 @@
1. For each line item you create, click on the Creatives tab, click the ADD CREATIVE button, and choose the size you're entering.
@@ -75,18 +70,21 @@4. Set the Duration to 1.
+4. Set the Duration to the max length of video ads you serve. If you don't know what the max length is, set it to 30.
+ +In the past Prebid used to recommend setting duration to 0 or 1, but GAM now requires that this field reflect the actual video ad length. Since ads flowing through header bidding are going to differ in length, choose a value that matches a common ad length like 15 or 30.
The resulting creative should look something like the following:
Back to Publisher API Reference
+ +pbjs.setConfig()
-- See the the API reference for more detail.
+- See the the API reference for more detail.
jsfiddle_link: jsfiddle.net/Lmspnt85/embedded/,result
code_height: 2152
diff --git a/dev-docs/faq.md b/dev-docs/faq.md
index 0767e28a96..d5a397137e 100644
--- a/dev-docs/faq.md
+++ b/dev-docs/faq.md
@@ -50,11 +50,11 @@ In both scenarios, your goal should be to see your inventory fill at the highest
There is an analysis from the Prebid team here which may be useful:
-[How many bidders should I work with?]({{site.baseurl}}/blog/how-many-bidders-for-header-bidding)
+[How many bidders should I work with?](https://prebid.org/blog/how-many-bidders-for-header-bidding)
## Does Prebid.js cache bids?
-It can. Versions 1.x of Prebid.js would re-consider previous bids under limited circumstances. In Prebid.js 2.0 and later, the [`useBidCache`](/dev-docs/publisher-api-reference.html#setConfig-Use-Bid-Cache) option can be used to enable this functionality.
+It can. Versions 1.x of Prebid.js would re-consider previous bids under limited circumstances. In Prebid.js 2.0 and later, the [`useBidCache`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Use-Bid-Cache) option can be used to enable this functionality.
The "limited bid caching" feature applies only:
@@ -66,7 +66,7 @@ The "limited bid caching" feature applies only:
Since the storage is in the browser, cached bids only apply to a single page context. If the user refreshes the page, the bid is lost.
Each bid adapter defines the amount of time their bids can be cached and reconsidered.
-This setting is called “Time to Live” (TTL), documented in the pbjs.getBidResponse
[parameter table here]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.getBidResponses).
+This setting is called “Time to Live” (TTL), documented in the pbjs.getBidResponse
[parameter table here](/dev-docs/publisher-api-reference/getBidResponses.html).
Examples of scenarios where a bid may be reconsidered in Prebid.js:
@@ -81,13 +81,13 @@ Here's how it works:
1. When all the new bids are back or the timeout is reached, Prebid.js considers both the new bids on that AdUnit and previously cached bids.
1. Previously cached bids will be discarded if they've reached their TTL or if they have status `targetingSet` or `rendered`.
1. A cached bid may be used if its CPM beats the new bids.
-1. Bids that win are removed from the pool. This is automatic for display and native ads, and can be done manually by the publisher for video ads by using the [markWinningBidAsUsed]({{site.github.url}}/dev-docs/publisher-api-reference.html#module_pbjs.markWinningBidAsUsed) function.
+1. Bids that win are removed from the pool. This is automatic for display and native ads, and can be done manually by the publisher for video ads by using the [markWinningBidAsUsed](/dev-docs/publisher-api-reference/markWinningBidAsUsed.html) function.
## Some of my demand partners send gross bids while others send net bids; how can I account for this difference?
You will want to adjust the gross bids so that they compete fairly with the rest of your demand, so that you are seeing the most revenue possible.
-In Prebid.js, you can use a `bidCpmAdjustment` function in [the `bidderSettings` object]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.bidderSettings) to adjust any bidder that sends gross bids.
+In Prebid.js, you can use a `bidCpmAdjustment` function in [the `bidderSettings` object](/dev-docs/publisher-api-reference/bidderSettings.html) to adjust any bidder that sends gross bids.
## Does Prebid.js support synchronous ad server tags?
@@ -131,7 +131,7 @@ Prebid.org does not support any version of Prebid.js prior to the previous versi
## How can I change the price granularity for different ad units?
-If you need different [price granularities]({{site.baseurl}}/dev-docs/publisher-api-reference.html#setConfig-Price-Granularity) for different AdUnits (e.g. video and display), the only way for now is to make sure the auctions don't run at the same time. e.g. Run one of them first, then kick off the other in the bidsBackHandler. e.g. here's one approach:
+If you need different [price granularities](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity) for different AdUnits (e.g. video and display), the only way for now is to make sure the auctions don't run at the same time. e.g. Run one of them first, then kick off the other in the bidsBackHandler. e.g. here's one approach:
1. Call `setConfig` to define the priceGranularity for the first set of AdUnits
1. Initiate the first auction with `requestBids`
@@ -144,11 +144,11 @@ The handling of this scenario will be improved in a future release.
## How can I control how many targeting variables are sent to my ad server?
-One way to limit the number of bytes sent to the ad server is to send only the winning bid by disabling the [enableSendAllBids](/dev-docs/publisher-api-reference.html#setConfig-Send-All-Bids) option. However, there are optimization and reporting
+One way to limit the number of bytes sent to the ad server is to send only the winning bid by disabling the [enableSendAllBids](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-All-Bids) option. However, there are optimization and reporting
benefits for sending more than one bid.
Once you find the right balance for your application, you can specify
-what's sent to the ad server with [targetingControls.auctionKeyMaxChars](/dev-docs/publisher-api-reference.html#setConfig-targetingControls) and/or [sendBidsControl.bidLimit](/dev-docs/publisher-api-reference.html#setConfig-Send-Bids-Control)
+what's sent to the ad server with [targetingControls.auctionKeyMaxChars](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) and/or [sendBidsControl.bidLimit](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-Bids-Control)
## Can I run multiple different versions of Prebid.js concurrently?
@@ -160,6 +160,15 @@ It's technically possible, but we don't recommend doing this:
If all this wasn't enough to warn you away from trying, it should work if you name the PBJS global differently for each instance (https://github.com/prebid/Prebid.js/blob/master/package.json#L20)
+## Does Prebid.js resolve the AUCTION_PRICE macro?
+
+Yes, but in a way that could cause discrepancies in reporting. It's recommended
+that [bid adapters resolve OpenRTB macros](/dev-docs/bidder-adaptor.html#resolve-openrtb-macros-in-the-creatives) themselves before giving them to Prebid.js.
+
+For historic reasons, Prebid will resolve the AUCTION_PRICE macro, but it will be after currency conversion and any bid adjustments.
+This differs from how OpenRTB defines this value as being the clearing price in the bid currency. Header Bidding is a first-price auction, the best candidate for “clearing price” is the original bid itself.
+
+
## Related Reading
+ [Prebid.js Dev Tips]({{site.baseurl}}/dev-docs/troubleshooting-tips.html)
diff --git a/dev-docs/integrate-with-the-prebid-analytics-api.md b/dev-docs/integrate-with-the-prebid-analytics-api.md
index 59a49042b1..15aec64b6b 100644
--- a/dev-docs/integrate-with-the-prebid-analytics-api.md
+++ b/dev-docs/integrate-with-the-prebid-analytics-api.md
@@ -71,7 +71,7 @@ Analytics adapter for Example.com. Contact prebid@example.com for information.
1. Create a JS file under `modules` with the name of the bidder suffixed with 'AnalyticsAdapter', e.g., `exAnalyticsAdapter.js`
-2. Create an analytics adapter to listen for [Prebid events](/dev-docs/publisher-api-reference.html#module_pbjs.onEvent) and call the analytics library or server. See the existing *AnalyticsAdapter.js files in the repo under [modules](https://github.com/prebid/Prebid.js/tree/master/modules).
+2. Create an analytics adapter to listen for [Prebid events](/dev-docs/publisher-api-reference/onEvent.html) and call the analytics library or server. See the existing *AnalyticsAdapter.js files in the repo under [modules](https://github.com/prebid/Prebid.js/tree/master/modules).
3. There are two types of analytics adapters. The example here focuses on the 'endpoint' type. See [AnalyticsAdapter.js](https://github.com/prebid/Prebid.js/blob/master/src/AnalyticsAdapter.js) for more info on the 'bundle' type.
diff --git a/dev-docs/modules/bidViewable.md b/dev-docs/modules/bidViewable.md
index 41aa46272b..b76fb8bf98 100644
--- a/dev-docs/modules/bidViewable.md
+++ b/dev-docs/modules/bidViewable.md
@@ -17,7 +17,7 @@ sidebarType : 1
## Overview
-This optional module will trigger a BID_VIEWABLE event which can be consumed by Analytics adapters, bidders will need to implement `onBidViewable` method to capture this event
+This optional module will trigger a BID_VIEWABLE event which can be consumed by Analytics adapters. In addition, the winning bidder can implement an `onBidViewable` method to capture this event.
Notes:
@@ -63,3 +63,8 @@ This feature doesn't seem to work with [Instream Video](/dev-docs/examples/instr
console.log('got bid details in bidViewable event', bid);
});
{% endhighlight %}
+
+## Related Reading
+
+- [Building a PBJS analytics adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html)
+- [Building a PBJS bidder adapter](/dev-docs/bidder-adaptor.html)
diff --git a/dev-docs/modules/categoryTranslation.md b/dev-docs/modules/categoryTranslation.md
index 6ba65349f7..4102eb82c6 100644
--- a/dev-docs/modules/categoryTranslation.md
+++ b/dev-docs/modules/categoryTranslation.md
@@ -24,7 +24,7 @@ The module provides the following:
## How to use the module:
1. A Prebid.js package is built that contains this module and the Ad server module. Prebid supports [FreeWheel](/dev-docs/modules/freewheel.html) and Google Ad Manager ad servers.
-2. The inclusion of this module and long-form ad server module causes Prebid to download a mapping file to local storage. The user also has the option to provide their own mapping file.
+2. The inclusion of this module and long-form ad server module causes Prebid to download a mapping file to local storage. The user also has the option to provide their own mapping file. The default ad server is Freewheel. To hook to the DFP video ad server module you must configure it in the mapping url.
3. At runtime, brand category translation happens as needed.
diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md
index e28579f9f8..a1dc9b9794 100644
--- a/dev-docs/modules/consentManagement.md
+++ b/dev-docs/modules/consentManagement.md
@@ -22,7 +22,7 @@ sidebarType : 1
{% include /alerts/alert_important.html content=legalNotice %}
{: .alert.alert-warning :}
-Prebid.org is working on updates that will enable support for reading and parsing TCF 2.0 consent strings. See the [blog post](/blog/tcf2) for timelines.
+Prebid.org is working on updates that will enable support for reading and parsing TCF 2.0 consent strings. See the [blog post](https://prebid.org/blog/tcf2) for timelines.
## Overview
@@ -58,7 +58,7 @@ Please start by understanding the IAB's [TCF Implementation Guide](https://githu
To utilize this module, a Consent Management Platform (CMP) compatible with the [IAB TCF v1.1 spec](https://iabeurope.eu/all-news/the-iab-europe-transparency-consent-framework-tcf-steering-group-votes-to-extend-technical-support-for-tcf-v1-1/) or [IAB TCF v2.0 spec](https://iabeurope.eu/tcf-2-0/) needs to be implemented on the site to interact with the user and obtain their consent choices. It's important to understand the details of how the CMP works before integrating it with Prebid.js
-In general, implementation details for CMPs are not covered by Prebid.org, but we do recommend to that you place the CMP code before the Prebid.js code in the head of the page in order to ensure the CMP's framework is loaded before the Prebid code executes. In addition, the community is collecting a set of [CMP best practices](/dev-docs/cmp-best-practices.html).
+In general, implementation details for CMPs are not covered by Prebid.org, but we do recommend to that you place the CMP code before the Prebid.js code in the head of the page in order to ensure the CMP's framework is loaded before the Prebid code executes. In addition, the community is collecting a set of [CMP best practices](/dev-docs/cmp-best-practices.html).
Once the CMP is implemented, simply include this module into your build and add a `consentManagement` object in the `setConfig()` call. Adapters that support this feature will then be able to retrieve the consent information and incorporate it in their requests.
@@ -318,8 +318,8 @@ Here are some things that publishers can do to control various activities:
1. If the current page view is known to be in GDPR scope, make sure the adapters are aware of it even on the first page where CMP hasn't been activated by setting the defaultGdprScope: `consentManagement.gdpr.defaultGdprScope: true`
2. If the user hasn't consented to Purpose 1:
- - Set [deviceAccess: false](/dev-docs/publisher-api-reference.html#setConfig-deviceAccess)
- - Don't enable [userSync](/dev-docs/publisher-api-reference.html#setConfig-Configure-User-Syncing)
+ - Set [deviceAccess: false](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess)
+ - Don't enable [userSync](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing)
- Don't enable [userId](/dev-docs/modules/userId.html) modules
3. If you're working with bidders that don't support GDPR, consider dynamically populating adunits as needed. See the list below for bidders supporting GDPR.
diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md
index 94a79fb63d..5f51829cf8 100644
--- a/dev-docs/modules/currency.md
+++ b/dev-docs/modules/currency.md
@@ -17,7 +17,7 @@ sidebarType : 1
This module supports the conversion of multiple bidder currencies into a single currency
used by the publisher's ad server. In previous versions of Prebid, this was accomplished
-by using [BidderSettings.bidCpmAdjustment]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.bidderSettings), but that's a static value not changed except when
+by using [BidderSettings.bidCpmAdjustment]({{site.baseurl}}/dev-docs/publisher-api-reference/bidderSettings.html), but that's a static value not changed except when
the web development team makes a manual update.
Publishers may continue to use the bidCpmAdjustment approach, or may begin using this optional module, gaining automatic updates as currency exchange rates fluctuate. Here's how it works at a high level:
@@ -181,8 +181,9 @@ pbjs.setConfig({
}
});
{% endhighlight %}
-Note that the `defaultRates` attribute is optional, but recommended in case
-there's an issue loading the currency file.
+
+{: .alert.alert-warning :}
+Note that the `defaultRates` attribute is optional, but recommended in case there's an issue loading the currency file.
In this example, the publisher is providing their own `conversionRateFile`:
{% highlight js %}
@@ -248,7 +249,7 @@ a currency object that may contain several parameters:
| granularityMultiplier | `decimal` | How much to scale the price granularity calculations. Defaults to 1. | 108 |
| conversionRateFile | `URL` | Optional path to a file containing currency conversion data. See below for the format. Prebid.org hosts a file as described in the next section. | `https://example.com/rates.json` |
| rates | object | This optional argument allows you to specify the rates with a JSON object, subverting the need for the conversionRateFile parameter. If this argument is specified, the conversion rate file will not be loaded. | { 'USD': { 'CNY': 6.8842, 'GBP': 0.7798, 'JPY': 110.49 } } |
-| defaultRates | `object` | An optional parameter that defines a default rate that can be used if the currency file cannot be loaded. This option isn't used when the `rates` parameter is supplied. | { 'USD': { 'GPB': 0.75 }} |
+| defaultRates | `object` | An optional **but highly recommended** parameter that defines a default rate that can be used if the currency file cannot be loaded. This option isn't used when the `rates` parameter is supplied. | { 'USD': { 'GPB': 0.75 }} |
| bidderCurrencyDefault | `object` | This is an optional argument to provide publishers a way to define which currency is used by a particular bidder. This option was provided as a transition until such a time that most bidder adapters define currency on bid response and is kept for legacy 0.x integrations. | { "bidderXYZ": "GBP" } |
## Currency Rate Conversion File
diff --git a/dev-docs/modules/dfp_video.md b/dev-docs/modules/dfp_video.md
index 8477587a42..95f51a11e7 100644
--- a/dev-docs/modules/dfp_video.md
+++ b/dev-docs/modules/dfp_video.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Google Ad Manager Video
-description: Addition of DFP Video to the Prebid package
+description: Addition of GAM Video to the Prebid package
module_code : dfpAdServerVideo
display_name : DFP Video
enable_download : true
@@ -11,22 +11,22 @@ sidebarType : 1
-# DFP Video
+# Google Ad Manager Video
{:.no_toc}
-This module is required to use the Prebid Instream video examples with DFP Adserver. For instructions showing how to add this module to Prebid.js, see below.
+This module is required to use the Prebid Instream video examples with Google Ad Manager. For instructions showing how to add this module to Prebid.js, see below.
### Step 1: Prepare the base Prebid file as usual
The standard options:
-- Build from a locally-cloned git repo
-- Receive the email package from the Prebid [Download]({{site.baseurl}}/download.html) page
-
+- Build from a locally-cloned git repo
+- Receive the email package from the Prebid [Download](/download.html) page
+
### Step 2: Integrate into your prebid.js configuration
-The method exposes the [`pbjs.adServers.dfp.buildVideoUrl`]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.adServers.dfp.buildVideoUrl) method to use. For an example, see the DFP video guide linked below.
+The method exposes the [`pbjs.adServers.dfp.buildVideoUrl`]({{site.baseurl}}/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html) method to use. For an example, see the DFP video guide linked below.
## Further Reading
-+ [Show Video Ads with DFP]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html)
++ [Show Video Ads with GAM](/dev-docs/show-video-with-a-dfp-video-tag.html)
diff --git a/dev-docs/modules/dgkeywordRtdProvider.md b/dev-docs/modules/dgkeywordRtdProvider.md
new file mode 100644
index 0000000000..2153cddc64
--- /dev/null
+++ b/dev-docs/modules/dgkeywordRtdProvider.md
@@ -0,0 +1,58 @@
+---
+layout: page_v2
+title: Digital Garage Keyword Module
+display_name: Digital Garage Keyword
+description: Digital Garage Keyword
+page_type: module
+module_type: rtd
+module_code : dgkeywordRtdProvider
+enable_download : true
+sidebarType : 1
+---
+
+# Digital Garage Keyword Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Integration
+
+1) Compile the Digital Garage Keyword Module and Appnexus Bid Adapter into your Prebid build:
+
+```
+gulp build --modules="dgkeywordRtdProvider,appnexusBidAdapter,..."
+```
+
+2) Use `setConfig` to instruct Prebid.js to initilize the dgkeyword module, as specified below.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders`
+
+```javascript
+var DGKEYWORD_TIMEOUT = 1000;
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: DGKEYWORD_TIMEOUT,
+ dataProviders: [{
+ name: 'dgkeyword',
+ waitForIt: true,
+ params: {
+ timeout: DGKEYWORD_TIMEOUT
+ }
+ }]
+ }
+});
+```
+
+Syntax details:
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | String | Real time data module name | Always 'dgkeyword' |
+| waitForIt | Boolean | Should be `true` if there's an `auctionDelay` defined (optional) | `false` |
+| params | Object | | |
+| params.timeout | Integer |timeout (ms)| 1000 |
+
diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md
new file mode 100644
index 0000000000..833b8c88e7
--- /dev/null
+++ b/dev-docs/modules/enrichmentFpdModule.md
@@ -0,0 +1,59 @@
+---
+layout: page_v2
+page_type: module
+title: Module - First Party Data Enrichment
+description: Enriches First Party Data
+module_code : enrichmentFpdModule
+display_name : First Party Data Enrichment
+enable_download : true
+sidebarType : 1
+---
+
+# First Party Data Enrichment Module
+{:.no_toc}
+
+This module adds a number of First Party Data (FPD) fields from the environment.
+
+Add it to the Prebid.js build with this command:
+```
+gulp build --modules=enrichmentFpdModule
+```
+
+If included in the build, it will automatically perform the enrichments unless controlled with setConfig:
+
+```
+pbjs.setConfig({
+ firstPartyData: {
+ skipEnrichments: true // defaults to false
+ }
+});
+```
+
+## How it works
+
+When the first auction on the page is run, this module merges a number of values into the `ortb2` object. Specific details below.
+
+If the publisher needs to refresh the enriched FPD after the first auction, this can be done using a function provided by this module:
+
+```
+pbjs.refreshFpd();
+```
+
+## Enrichments
+
+{: .table .table-bordered .table-striped }
+| Page Source | ortb2 field | Notes |
+|---+---+---|
+| page URL | site.page | Uses pbjs getRefererInfo().canonicalUrl |
+| referer URL | site.ref | Uses pbjs getRefererInfo().referer |
+| domain | site.domain | Pulled from the getRefererInfo().canonicalUrl, the host domain is used, with www dropped. |
+| viewport width | device.w | Hunts for window.innerWidth, window.document.documentElement.clientWidth, window.document.body.clientWidth |
+| viewport height | device.w | Hunts for window.innerHeight, window.document.documentElement.clientHeight, window.document.body.clientHeight |
+| meta keywords | site.keywords | Looks for a meta tag. e.g. |
+| currency | cur | Collects the currency defined by the [Currency module](/dev-docs/modules/currency.html). |
+
+
+# Related Reading
+- [Prebid.js First Party Data feature](/features/firstPartyData.html)
+- [First Party Data Validation Module](/dev-docs/modules/validationFpdModule)
+- [OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf)
diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md
index 380ba312e9..054907fa5f 100644
--- a/dev-docs/modules/floors.md
+++ b/dev-docs/modules/floors.md
@@ -49,7 +49,7 @@ There are several places where the Floor module changes the behavior of the Preb
![Floors Module Flow](/assets/images/floors/floors_flow.png)
-1. When building the Prebid.js package, the Floors module (and any analytics adapters) needs to be included with 'gulp build --modules=floors,...'
+1. When building the Prebid.js package, the Floors module (and any analytics adapters) needs to be included with 'gulp build --modules=priceFloors,...'
2. As soon as the setConfig({floors}) call is initiated, the Floors Module will build an internal hash table for each auction derived from a Rule Location (one of Dynamic, setConfig or adUnit)
- a. If an endpoint URL (a Dynamic Floor) is defined, the Floors Module will attempt to fetch floor data from the Floor Provider's endpoint. When requestBids is called, the Floors Module will delay the auction up to the supplied amount of time in floors.auctionDelay or as soon as the dynamic endpoint returns data, whichever is first.
3. Bid Adapters are responsible for utilizing the getFloors() from the bidRequest object for each ad slot media type, size combination. The Floors Module will perform currency conversion if the bid adapter requests floors in a different currency from the defined floor data currency.
@@ -106,6 +106,9 @@ Below are some basic principles of ad unit floor definitions:
];
{% endhighlight %}
+{: .alert.alert-info :}
+When defining floors at the adUnit level, the Floors Module requires the floors object to be defined in setConfig, even if the definition is an empty object as shown below: {% highlight js %}pbjs.setConfig({ floors: {} });{% endhighlight %}
+
Floor definitions are set in the “values” object containing one or more rules, where the rule is the criteria that needs to be met for that given ad unit, with an associated CPM floor. In the above example, the floors are enforced when the bid from a bidder matches the “mediaType” and “size” combination. Since many bid adapters are not able to ingest floors per size, a simpler setup can be:
{% highlight js %}
@@ -1001,6 +1004,11 @@ getFloor takes in a single object with the following params:
{% endhighlight %}
+
+{: .alert.alert-warning :}
+Consider how floors will behave in multi-currency scenarios. A common pitfall is requesting floors without specifying currency, or specifying the wrong currency back to the bid adapter's platform. This may lead to bidders requesting one currency and bidding in an alternate currency.
+
+
{: .table .table-bordered .table-striped }
| Param | Type | Description | Default |
|---+---+---+---|
@@ -1115,7 +1123,7 @@ For a bid adapter who does not wish to handle making a request for each size in
let floorInfo = bidRequest.getFloor({
currency: 'USD',
mediaType: 'banner',
- size: '\*'
+ size: '*'
});
data['adapter_floor'] = floorInfo.currency === 'USD' ? floorInfo.floor : undefined;
}
@@ -1256,6 +1264,7 @@ If the currency function is unable to derive the correct cpm in any of the scena
## Floors Providers
{: .table }
-| Partners| Contact |
-|
- If you define 'adserverTargeting' in your own bidderSettings
object, the setPriceGranularity
method won't have any effect, since it assumes you are setting your own custom values.
-
- If you define 'adserverTargeting' in your own bidderSettings
object, the setPriceGranularity
method won't have any effect, since it assumes you are setting your own custom values.
-
/pbjs_demo.html?pbjs_debug=true
See [Prebid.js troubleshooting tips](/dev-docs/troubleshooting-tips.html) for more information.
-
-Turn on debugging permanently in the page:
-{% highlight js %}
-pbjs.setConfig({ debug: true });
-{% endhighlight %}
-
-{: .alert.alert-warning :}
-Note that turning on debugging for Prebid Server causes most server-side adapters to consider it a test request, meaning that they won't count on reports.
-
-
-
-#### Device Access
-
-You can prevent Prebid.js from reading or writing cookies or HTML localstorage by setting this flag:
-
-{% highlight js %}
-pbjs.setConfig({ deviceAccess: false });
-{% endhighlight %}
-
-This can be useful in GDPR, CCPA, COPPA or other privacy scenarios where a publisher has determined that header bidding should not read from or write the user's device.
-
-
-
-#### Bidder Timeouts
-
-Set a global bidder timeout:
-
-{% highlight js %}
-pbjs.setConfig({ bidderTimeout: 3000 });
-{% endhighlight %}
-
-{: .alert.alert-warning :}
-**Bid Timeouts and JavaScript Timers**
-Note that it's possible for the timeout to be triggered later than expected, leading to a bid participating in the auction later than expected. This is due to how [`setTimeout`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout) works in JS: it queues the callback in the event loop in an approximate location that *should* execute after this time but *it is not guaranteed*.
-With a busy page load, bids can be included in the auction even if the time to respond is greater than the timeout set by Prebid.js. However, we do close the auction immediately if the threshold is greater than 200ms, so you should see a drop off after that period.
-For more information about the asynchronous event loop and `setTimeout`, see [How JavaScript Timers Work](https://johnresig.com/blog/how-javascript-timers-work/).
-
-#### Max Requests Per Origin
-
-
-
-Since browsers have a limit of how many requests they will allow to a specific domain before they block, Prebid.js
-will queue auctions that would cause requests to a specific origin to exceed that limit. The limit is different
-for each browser. Prebid.js defaults to a max of `4` requests per origin. That value can be configured with
-`maxRequestsPerOrigin`.
-
-{% highlight js %}
-// most browsers allow at least 6 requests, but your results may vary for your user base. Sometimes using all
-// `6` requests can impact performance negatively for users with poor internet connections.
-pbjs.setConfig({ maxRequestsPerOrigin: 6 });
-
-// to emulate pre 1-x behavior and have all auctions queue (no concurrent auctions), you can set it to `1`.
-pbjs.setConfig({ maxRequestsPerOrigin: 1 });
-{% endhighlight %}
-
-#### Disable Ajax Timeout
-
-
-
-Prebid core adds a timeout on XMLHttpRequest request to terminate the request once auction is timedout. Since Prebid is ignoring all the bids after timeout it does not make sense to continue the request after timeout. However, you have the option to disable this by using `disableAjaxTimeout`.
-
-{% highlight js %}
-pbjs.setConfig({ disableAjaxTimeout: true });
-{% endhighlight %}
-
-#### Set Timeout Buffer
-
-
-
-Prebid core adds a timeout buffer to extend the time that bidders have to return a bid after the auction closes. This buffer is used to offset the "time slippage" of the setTimeout behavior in browsers. Prebid.js sets the default value to 400ms. You can change this value by setting `timeoutBuffer` to the amount of time you want to use. The following example sets the buffer to 300ms.
-
-{% highlight js %}
-pbjs.setConfig({ timeoutBuffer: 300 });
-{% endhighlight %}
-
-#### Send All Bids
-
-
-
-When enableSendAllBids is **true** (the default), the page will send keywords for all bidders to your ad server. The ad server can then make the decision on which bidder will win. Some ad servers, such as Google Ad Manager, can then generate reporting on historical bid prices from all bidders.
-
-However, there will be a set of ad server targeting values for each bidder, so if you run many bidders this could cause an issue with how much data is being sent to the ad server.
-
-There are several ways to address the issue of sending too much data to the ad server:
-
-1. Set `enableSendAllBids` to **false**. This will minimize the number of targeting variables sent to the ad server; only the top bid will be sent.
-1. Define the `auctionKeyMaxChars` setting. This allows you to establish a limit on the number of bytes sent to the ad server. See [targetingControls](#setConfig-targetingControls) for more details.
-1. Set `enableSendAllBids` to **false** and `targetingControls.alwaysIncludeDeals` to **true**. This will send the top bid and any deals.
-1. Set `enableSendAllBids` to **false**, `targetingControls.alwaysIncludeDeals` to **true**, and `auctionKeyMaxChars`. This will send the top bid and any deals up to the maximum number of characters.
-
-Note that targeting config must be set before either `pbjs.setTargetingForGPTAsync()` or `pbjs.getAdserverTargeting()` is called.
-
-##### Example results where enableSendAllBids is true
-
-{% highlight bash %}
-{
- "hb_adid_audienceNetw": "1663076dadb443d",
- "hb_pb_audienceNetwor": "9.00",
- "hb_size_audienceNetw": "300x250",
- "hb_format_audienceNe": "banner",
- "hb_source_audienceNe": "client",
- "hb_adid_rubicon": "3485968928",
- "hb_pb_rubicon": "8.00",
- "hb_size_rubicon": "300x250",
- "hb_deal_rubicon": "11111111",
- "hb_format_rubicon": "banner",
- "hb_source_rubicon": "client",
- "hb_adid_appnexus": "191f4aca0c0be8",
- "hb_pb_appnexus": "10.00",
- "hb_size_appnexus": "300x250",
- "hb_format_appnexus": "banner",
- "hb_source_appnexus": "client",
- // the winning bid is copied to attributes without a suffix
- "hb_bidder": "appnexus",
- "hb_adid": "191f4aca0c0be8",
- "hb_pb": "10.00",
- "hb_size": "300x250",
- "hb_format": "banner"
-}
-{% endhighlight %}
-
-You can see how the number of ad server targeting variable could get large
-when many bidders are present.
-
-{% capture noteAlert %}
-The Prebid recommendation is to leave `enableSendAllBids` as **true** when ad server targeting volume is not a concern. This approach is more transparent and leaves the decisioning in the ad server.
-{% endcapture %}
-
-{% include alerts/alert_note.html content=noteAlert %}
-
-##### Example of setting enableSendAllBids to false
-
-Turning off `enableSendAllBids` will cause the system to return only the
-winning bid. However, this could be a problem if you need to support [deals](/adops/deals.html), as often a deal may be chosen to win over an open market bid.
-
-To make sure that deal bids are sent along with the winning bid in the enableSendAllBids:false scenario, use the `alwaysIncludeDeals` flag that's part of [targetingControls](#setConfig-targetingControls):
-
-```javascript
-pbjs.setConfig({
- enableSendAllBids: false,
- targetingControls: {
- alwaysIncludeDeals: true
- }
-});
-```
-
-
-
-#### Configure Send Bids Control
-
-
-
-The `sendBidsControl` object passed to `pbjs.setConfig` provides the publisher with the ability to adjust the targeting behavior when [sendAllBids](#setConfig-Send-All-Bids) is enabled.
-
-{: .table .table-bordered .table-striped }
-| Attribute | Type | Description |
-|------------+---------+---------------------------------|
-| `bidLimit` | integer | The maximum number of bids the system can add to ad server targeting. |
-| `dealPrioritization` | boolean | When `true`, bids with deals are prioritized before bids without deals. |
-
-##### Details on the bidLimit setting
-
-Below is an example config containing `bidLimit`:
-
-```javascript
-pbjs.setConfig({
- sendBidsControl: {
- bidLimit: 2
- }
-});
-```
-When this property is set, the value assigned to `bidLimit` is the maximum number of bids that will be sent to the ad server. If `bidLimit` is set to 0, sendAllBids will have no maximum bid limit and *all* bids will be sent. This setting can be helpful if you know that your ad server has a finite limit to the amount of query characters it will accept and process.
-
-{: .alert.alert-info :}
-Note that this feature overlaps and can be used in conjunction with [targetingControls.auctionKeyMaxChars](/dev-docs/publisher-api-reference.html#setConfig-targetingControls). Please see that section for tips on controlling the number of characters being sent to the ad server.
-
-#### Use Bid Cache
-
-
-
-Prebid.js currently allows for [caching and reusing bids in a very narrowly defined scope](/dev-docs/faq.html#does-prebidjs-cache-bids).
-However, if you'd like, you can disable this feature and prevent Prebid.js from using anything but the latest bids for
-a given auction.
-
-{: .alert.alert-warning :}
-This option is available in version 1.39 as true-by-default and became false-by-default as of Prebid.js 2.0. If you want to use this
-feature in 2.0 and later, you'll need to set the value to true.
-
-{% highlight js %}
-pbjs.setConfig({ useBidCache: true })
-{% endhighlight %}
-
-
-#### Bidder Order
-
-Set the order in which bidders are called:
-
-{% highlight js %}
-pbjs.setConfig({ bidderSequence: "fixed" }) /* default is "random" */
-{% endhighlight %}
-
-
-
-#### Page URL
-
-Override the Prebid.js page referrer algorithm.
-
-a{% highlight js %}
-pbjs.setConfig({ pageUrl: "https://example.com/index.html" )
-{% endhighlight %}
-
-
-
-#### Publisher Domain
-
-Set the publisher's domain where Prebid is running, for cross-domain iframe communication:
-
-{% highlight js %}
-pbjs.setConfig({ publisherDomain: "https://www.theverge.com" )
-{% endhighlight %}
-
-
-
-#### Price Granularity
-
-This configuration defines the price bucket granularity setting that will be used for the `hb_pb` keyword.
-
-{% highlight js %}
-pbjs.setConfig({ priceGranularity: "medium" })
-{% endhighlight %}
-
-Standard values:
-
-+ `"low"`: $0.50 increments, capped at $5 CPM
-+ `"medium"`: $0.10 increments, capped at $20 CPM (the default)
-+ `"high"`: $0.01 increments, capped at $20 CPM
-+ `"auto"`: Applies a sliding scale to determine granularity as shown in the [Auto Granularity](#autoGranularityBucket) table below.
-+ `"dense"`: Like `"auto"`, but the bid price granularity uses smaller increments, especially at lower CPMs. For details, see the [Dense Granularity](#denseGranularityBucket) table below.
-+ `customConfigObject`: If you pass in a custom config object (as shown in the [Custom CPM Bucket Sizing](#customCPMObject) example below), you can have much finer control over CPM bucket sizes, precision, and caps.
-
-
-
-##### Auto Granularity
-
-{: .table .table-bordered .table-striped }
-| CPM | Granularity | Example |
-|---------------------+----------------------------------+--------|
-| CPM <= $5 | $0.05 increments | $1.87 floored to $1.85 |
-| CPM <= $10 and > $5 | $0.10 increments | $5.09 floored to $5.00 |
-| CPM <= $20 and > $10 | $0.50 increments | $14.26 floored to $14.00 |
-| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 |
-
-
-
-##### Dense Granularity
-
-{: .table .table-bordered .table-striped }
-| CPM | Granularity | Example |
-|------------+-------------------------------+---------|
-| CPM <= $3 | $0.01 increments | $1.87 floored to $1.87 |
-| CPM <= $8 and >$3 | $0.05 increments | $5.09 floored to $5.05 |
-| CPM <= $20 and >$8 | $0.50 increments | $14.26 floored to $14.00 |
-| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 |
-
-
-
-##### Custom CPM Bucket Sizing
-
-To set up your own custom CPM buckets, create an object like the following, and pass it into `setConfig`:
-
-```javascript
-const customConfigObject = {
- "buckets" : [{
- "precision": 2, //default is 2 if omitted - means 2.1234 rounded to 2 decimal places = 2.12
- "max" : 5,
- "increment" : 0.01 // from $0 to $5, 1-cent increments
- },
- {
- "max" : 8,
- "increment" : 0.05 // from $5 to $8, round down to the previous 5-cent increment
- },
- {
- "max" : 40,
- "increment" : 0.5 // from $8 to $40, round down to the previous 50-cent increment
- }]
-};
-
-//set custom config object
-pbjs.setConfig({
- priceGranularity: customConfigObject
-})
-```
-
-Here are the rules for CPM intervals:
-
-- `max` and `increment` must be specified
-- A range's minimum value is assumed to be the max value of the previous range. The first interval starts at a min value of 0.
-- `precision` is optional and defaults to 2
-
-{% capture warning-granularity %}
-As of Prebid.js 3.0, the 'min' parameter is no longer supported in custom granularities.
-/pbjs_demo.html?pbjs_debug=true
See [Prebid.js troubleshooting tips](/dev-docs/troubleshooting-tips.html) for more information.
+
+Turn on debugging permanently in the page:
+{% highlight js %}
+pbjs.setConfig({ debug: true });
+{% endhighlight %}
+
+{: .alert.alert-warning :}
+Note that turning on debugging for Prebid Server causes most server-side adapters to consider it a test request, meaning that they won't count on reports.
+
+
+
+#### Device Access
+
+You can prevent Prebid.js from reading or writing cookies or HTML localstorage by setting this flag:
+
+{% highlight js %}
+pbjs.setConfig({ deviceAccess: false });
+{% endhighlight %}
+
+This can be useful in GDPR, CCPA, COPPA or other privacy scenarios where a publisher has determined that header bidding should not read from or write the user's device.
+
+
+
+#### Bidder Timeouts
+
+Set a global bidder timeout:
+
+{% highlight js %}
+pbjs.setConfig({ bidderTimeout: 3000 });
+{% endhighlight %}
+
+{: .alert.alert-warning :}
+**Bid Timeouts and JavaScript Timers**
+Note that it's possible for the timeout to be triggered later than expected, leading to a bid participating in the auction later than expected. This is due to how [`setTimeout`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout) works in JS: it queues the callback in the event loop in an approximate location that *should* execute after this time but *it is not guaranteed*.
+With a busy page load, bids can be included in the auction even if the time to respond is greater than the timeout set by Prebid.js. However, we do close the auction immediately if the threshold is greater than 200ms, so you should see a drop off after that period.
+For more information about the asynchronous event loop and `setTimeout`, see [How JavaScript Timers Work](https://johnresig.com/blog/how-javascript-timers-work/).
+
+#### Max Requests Per Origin
+
+
+
+Since browsers have a limit of how many requests they will allow to a specific domain before they block, Prebid.js
+will queue auctions that would cause requests to a specific origin to exceed that limit. The limit is different
+for each browser. Prebid.js defaults to a max of `4` requests per origin. That value can be configured with
+`maxRequestsPerOrigin`.
+
+{% highlight js %}
+// most browsers allow at least 6 requests, but your results may vary for your user base. Sometimes using all
+// `6` requests can impact performance negatively for users with poor internet connections.
+pbjs.setConfig({ maxRequestsPerOrigin: 6 });
+
+// to emulate pre 1-x behavior and have all auctions queue (no concurrent auctions), you can set it to `1`.
+pbjs.setConfig({ maxRequestsPerOrigin: 1 });
+{% endhighlight %}
+
+#### Disable Ajax Timeout
+
+
+
+Prebid core adds a timeout on XMLHttpRequest request to terminate the request once auction is timedout. Since Prebid is ignoring all the bids after timeout it does not make sense to continue the request after timeout. However, you have the option to disable this by using `disableAjaxTimeout`.
+
+{% highlight js %}
+pbjs.setConfig({ disableAjaxTimeout: true });
+{% endhighlight %}
+
+#### Set Timeout Buffer
+
+
+
+Prebid core adds a timeout buffer to extend the time that bidders have to return a bid after the auction closes. This buffer is used to offset the "time slippage" of the setTimeout behavior in browsers. Prebid.js sets the default value to 400ms. You can change this value by setting `timeoutBuffer` to the amount of time you want to use. The following example sets the buffer to 300ms.
+
+{% highlight js %}
+pbjs.setConfig({ timeoutBuffer: 300 });
+{% endhighlight %}
+
+#### Send All Bids
+
+
+
+When enableSendAllBids is **true** (the default), the page will send keywords for all bidders to your ad server. The ad server can then make the decision on which bidder will win. Some ad servers, such as Google Ad Manager, can then generate reporting on historical bid prices from all bidders.
+
+However, there will be a set of ad server targeting values for each bidder, so if you run many bidders this could cause an issue with how much data is being sent to the ad server.
+
+There are several ways to address the issue of sending too much data to the ad server:
+
+1. Set `enableSendAllBids` to **false**. This will minimize the number of targeting variables sent to the ad server; only the top bid will be sent.
+1. Define the `auctionKeyMaxChars` setting. This allows you to establish a limit on the number of bytes sent to the ad server. See [targetingControls](#setConfig-targetingControls) for more details.
+1. Set `enableSendAllBids` to **false** and `targetingControls.alwaysIncludeDeals` to **true**. This will send the top bid and any deals.
+1. Set `enableSendAllBids` to **false**, `targetingControls.alwaysIncludeDeals` to **true**, and `auctionKeyMaxChars`. This will send the top bid and any deals up to the maximum number of characters.
+
+Note that targeting config must be set before either `pbjs.setTargetingForGPTAsync()` or `pbjs.getAdserverTargeting()` is called.
+
+##### Example results where enableSendAllBids is true
+
+{% highlight bash %}
+{
+ "hb_adid_audienceNetw": "1663076dadb443d",
+ "hb_pb_audienceNetwor": "9.00",
+ "hb_size_audienceNetw": "300x250",
+ "hb_format_audienceNe": "banner",
+ "hb_source_audienceNe": "client",
+ "hb_adid_rubicon": "3485968928",
+ "hb_pb_rubicon": "8.00",
+ "hb_size_rubicon": "300x250",
+ "hb_deal_rubicon": "11111111",
+ "hb_format_rubicon": "banner",
+ "hb_source_rubicon": "client",
+ "hb_adid_appnexus": "191f4aca0c0be8",
+ "hb_pb_appnexus": "10.00",
+ "hb_size_appnexus": "300x250",
+ "hb_format_appnexus": "banner",
+ "hb_source_appnexus": "client",
+ // the winning bid is copied to attributes without a suffix
+ "hb_bidder": "appnexus",
+ "hb_adid": "191f4aca0c0be8",
+ "hb_pb": "10.00",
+ "hb_size": "300x250",
+ "hb_format": "banner"
+}
+{% endhighlight %}
+
+You can see how the number of ad server targeting variable could get large
+when many bidders are present.
+
+{% capture noteAlert %}
+The Prebid recommendation is to leave `enableSendAllBids` as **true** when ad server targeting volume is not a concern. This approach is more transparent and leaves the decisioning in the ad server.
+{% endcapture %}
+
+{% include alerts/alert_note.html content=noteAlert %}
+
+##### Example of setting enableSendAllBids to false
+
+Turning off `enableSendAllBids` will cause the system to return only the
+winning bid. However, this could be a problem if you need to support [deals](/adops/deals.html), as often a deal may be chosen to win over an open market bid.
+
+To make sure that deal bids are sent along with the winning bid in the enableSendAllBids:false scenario, use the `alwaysIncludeDeals` flag that's part of [targetingControls](#setConfig-targetingControls):
+
+```javascript
+pbjs.setConfig({
+ enableSendAllBids: false,
+ targetingControls: {
+ alwaysIncludeDeals: true
+ }
+});
+```
+
+
+
+#### Configure Send Bids Control
+
+
+
+The `sendBidsControl` object passed to `pbjs.setConfig` provides the publisher with the ability to adjust the targeting behavior when [sendAllBids](#setConfig-Send-All-Bids) is enabled.
+
+{: .table .table-bordered .table-striped }
+| Attribute | Type | Description |
+|------------+---------+---------------------------------|
+| `bidLimit` | integer | The maximum number of bids the system can add to ad server targeting. |
+| `dealPrioritization` | boolean | When `true`, bids with deals are prioritized before bids without deals. |
+
+##### Details on the bidLimit setting
+
+Below is an example config containing `bidLimit`:
+
+```javascript
+pbjs.setConfig({
+ sendBidsControl: {
+ bidLimit: 2
+ }
+});
+```
+When this property is set, the value assigned to `bidLimit` is the maximum number of bids that will be sent to the ad server. If `bidLimit` is set to 0, sendAllBids will have no maximum bid limit and *all* bids will be sent. This setting can be helpful if you know that your ad server has a finite limit to the amount of query characters it will accept and process.
+
+{: .alert.alert-info :}
+Note that this feature overlaps and can be used in conjunction with [targetingControls.auctionKeyMaxChars](#setConfig-targetingControls). Please see that section for tips on controlling the number of characters being sent to the ad server.
+
+#### Use Bid Cache
+
+
+
+Prebid.js currently allows for [caching and reusing bids in a very narrowly defined scope](/dev-docs/faq.html#does-prebidjs-cache-bids).
+However, if you'd like, you can disable this feature and prevent Prebid.js from using anything but the latest bids for
+a given auction.
+
+{: .alert.alert-warning :}
+This option is available in version 1.39 as true-by-default and became false-by-default as of Prebid.js 2.0. If you want to use this
+feature in 2.0 and later, you'll need to set the value to true.
+
+{% highlight js %}
+pbjs.setConfig({ useBidCache: true })
+{% endhighlight %}
+
+
+#### Bidder Order
+
+Set the order in which bidders are called:
+
+{% highlight js %}
+pbjs.setConfig({ bidderSequence: "fixed" }) /* default is "random" */
+{% endhighlight %}
+
+
+
+#### Page URL
+
+Override the Prebid.js page referrer for some bidders.
+
+{% highlight js %}
+pbjs.setConfig({ pageUrl: "https://example.com/index.html" })
+{% endhighlight %}
+
+
+
+#### Publisher Domain
+
+{: .alert.alert-warning :}
+This API is deprecated. Please use 'pageUrl' instead.
+
+Set the publisher's domain where Prebid is running, for cross-domain iframe communication:
+
+{% highlight js %}
+pbjs.setConfig({ publisherDomain: "https://www.theverge.com" )
+{% endhighlight %}
+
+
+
+#### Price Granularity
+
+This configuration defines the price bucket granularity setting that will be used for the `hb_pb` keyword.
+
+{% highlight js %}
+pbjs.setConfig({ priceGranularity: "medium" })
+{% endhighlight %}
+
+Standard values:
+
++ `"low"`: $0.50 increments, capped at $5 CPM
++ `"medium"`: $0.10 increments, capped at $20 CPM (the default)
++ `"high"`: $0.01 increments, capped at $20 CPM
++ `"auto"`: Applies a sliding scale to determine granularity as shown in the [Auto Granularity](#autoGranularityBucket) table below.
++ `"dense"`: Like `"auto"`, but the bid price granularity uses smaller increments, especially at lower CPMs. For details, see the [Dense Granularity](#denseGranularityBucket) table below.
++ `customConfigObject`: If you pass in a custom config object (as shown in the [Custom CPM Bucket Sizing](#customCPMObject) example below), you can have much finer control over CPM bucket sizes, precision, and caps.
+
+
+
+##### Auto Granularity
+
+{: .table .table-bordered .table-striped }
+| CPM | Granularity | Example |
+|---------------------+----------------------------------+--------|
+| CPM <= $5 | $0.05 increments | $1.87 floored to $1.85 |
+| CPM <= $10 and > $5 | $0.10 increments | $5.09 floored to $5.00 |
+| CPM <= $20 and > $10 | $0.50 increments | $14.26 floored to $14.00 |
+| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 |
+
+
+
+##### Dense Granularity
+
+{: .table .table-bordered .table-striped }
+| CPM | Granularity | Example |
+|------------+-------------------------------+---------|
+| CPM <= $3 | $0.01 increments | $1.87 floored to $1.87 |
+| CPM <= $8 and >$3 | $0.05 increments | $5.09 floored to $5.05 |
+| CPM <= $20 and >$8 | $0.50 increments | $14.26 floored to $14.00 |
+| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 |
+
+
+
+##### Custom CPM Bucket Sizing
+
+To set up your own custom CPM buckets, create an object like the following, and pass it into `setConfig`:
+
+```javascript
+const customConfigObject = {
+ "buckets" : [{
+ "precision": 2, //default is 2 if omitted - means 2.1234 rounded to 2 decimal places = 2.12
+ "max" : 5,
+ "increment" : 0.01 // from $0 to $5, 1-cent increments
+ },
+ {
+ "max" : 8,
+ "increment" : 0.05 // from $5 to $8, round down to the previous 5-cent increment
+ },
+ {
+ "max" : 40,
+ "increment" : 0.5 // from $8 to $40, round down to the previous 50-cent increment
+ }]
+};
+
+//set custom config object
+pbjs.setConfig({
+ priceGranularity: customConfigObject
+})
+```
+
+Here are the rules for CPM intervals:
+
+- `max` and `increment` must be specified
+- A range's minimum value is assumed to be the max value of the previous range. The first interval starts at a min value of 0.
+- `precision` is optional and defaults to 2
+
+{% capture warning-granularity %}
+As of Prebid.js 3.0, the 'min' parameter is no longer supported in custom granularities.
+Prebid Support for Enforcing TCF 2.0
Summary of Prebid TCF 2.0 Enforcement
Full Enforcement (Prebid Server Only)
Prebid.js Functional Requirements
Prebid SDK Functional Requirements
Prebid Server Functional Requirements
The IAB's Transparency and Consent Framework version 2.0 for enhanced support of GDPR is scheduled to take effect Apr 1 2020. It's a major update from TCF 1.1 which Prebid currently supports, and is not compatible with the previous release.
The key changes are:
References
Important Legal Note: Prebid.org cannot provide legal advice about GDPR or any other governmental regulation. Our aim is to provide a toolkit of functionality that will let publishers configure header bidding as defined by their legal counsel. We will consider feature suggestions, and review any code offered by the community. Enforcement of Purpose 2 (basic ad selection) looks to be one of the bigger areas of concern because the TCF policy could be interpreted to be a form of ad blocking. You will need to work with your legal counsel to determine how you intend to handle this scenario. Prebid.js and Prebid Server offer publishers the ability to enforce or not-enforce purposes individually. As an example of the kind of flexibility we aim to offer (*), here are some options you could discuss with your lawyers:
(*) - Note on phasing: Please be aware that Prebid.js and Prebid Server will likely not deliver on the full TCF functionality by April 1st. Our initial goal for both products is to support Purpose 1 (Device Access) enforcement by that date. The ability to enforce the other purposes will be developed as soon as we can. (**) Did we mention that you cannot rely on this document to learn how to configure your header bidding for GDPR? Seriously, talk to your lawyers. |
General
Prebid.js
Prebid Server
Prebid SDK
TCF Field | In-scope Activities | System | Enforcement | Publisher/ Host Company Controls |
Purpose 1 - Store and/or access information on a device | usersync pixels, user ID modules, and device storage | Prebid.js and Prebid Server and Prebid SDK | May result in preventing one or more uesrsync activities for one or more vendors. | Do not enforce purpose 1 Do not enforce purpose 1 for vendor V Enforce purpose 1 at the vendor level only. |
Purpose 2 - Select basic ads | call bid adapters | Prebid.js and Prebid Server | May result in skipping one or more bid adapters. All configured modules will be called as usual unless all bidders are eliminated. | Do not enforce purpose 2 Do not enforce purpose 2 for vendor V Enforce purpose 2 at the vendor level only. |
Purpose 4 - Select Personalized Ads | call bid adapters with userIds | Prebid.js and Prebid Server | May result in removing the userIds before calling one or more bid adapters. | Do not enforce purpose 4 Do not enforce purpose 4 for vendor V Enforce purpose 4 at the vendor level only. |
Purpose 7 - Measure ad performance | initiate analytics | Prebid.js and Prebid Server | May result in skipping one or more analytics adapters. | Do not enforce purpose 7 Do not enforce purpose 7 for vendor V Enforce purpose 7 at the vendor level only. |
Special Feature 1 - Use precise geolocation data | passing lat/long to server-side bid adapters | Prebid Server | May result in rounding lat/long values and IP address before sending to server-side adapters. | Do not enforce Special Feature 1 |
Special Purpose 2 - Technically deliver ads or content | n/a | Special Purposes do not require consent. If a publisher’s legal team wants to consider SP2, Prebid software should not be called. | ||
PurposeOneConsent | n/a | Prebid does not provide specific support for enforcing this flag. Instead, publishers may use the provided controls for Purpose 1 and other Prebid configuration to control whether the user’s device is accessed. |
Prebid offers publishers several controls for whether consent/legal basis confirmation is even performed. The following flowchart shows how the controls
The goal of 'basic enforcement' is to confirm that there's enough evidence of consent to pass data on to vendors who have access to the GVL and can fully parse and enforce.
Before allowing a Purpose for a given Vendor, one of these scenarios must be true: :
In terms of the TCF 2.0 fields, Purpose P is ok for vendor V if either of these is true:
Before allowing Special Feature 1, SpecialFeatureOptIns[1] must be true.
The big difference between 'basic' and 'full' enforcement is that Prebid Server has the GVL available to examine vendor legal bases.
Before allowing an activity that falls under a specific Purpose for a given Vendor, one of these 6 basic scenarios needs to be true:
Note that there are many more scenarios where the activity would not be allowed.
The technical definition in terms of the TCF 2.0 fields follows. Purpose P is ok for vendor V if any of these is true:
Before allowing Special Feature 1, SpecialFeatureOptIns[1] must be true.
1) An optional module must be available for reading the IAB TCF 2.0 API data. Publishers will include this module in their Prebid.js package when they need to support EEA users.
2) Prebid.js must support scenarios where the TCF string parsing functions are not available. If the codebase for parsing the TCF string is significant, it should be made an optional module separate from the enforcement functions. A key goal of Prebid.js is to include only the code that publishers need for their particular use case. The technical design should consider whether it makes sense to bundle all of these components together, or break them into 2 or 3 separate modules:
3) Prebid.js must support the following publisher controls:
Here's a set of proposed configurations within the existing consentManagement config object:
Param | Type | Description | Details |
gdpr.allowAuctionWithoutConsent | boolean | Available in 3.x only, defines behavior for backwards compatibility. | For 3.x: If true, consider all Purposes as not enforceable. If false, consider only Purpose 2 enforceable. |
gdpr.consentData | object | Consent data provided statically. | Used when cmpApi is "static". |
gdpr.defaultGdprScope | boolean | ||
gdpr.rules | object | Lets the publisher override the defaults set by the enforceMode | |
gdpr.rules[].purpose | string | Possible values are "storage", "basicAds", "personalizedAds", and "measurement" corresponding to Purposes 1,2,4, and 7 respectively. | For some reason, people tend to prefer using the string names rather than the numbers. |
gdpr.rules[].enforcePurpose | boolean | Whether to enforce this purpose or not. Overrides the setting from enforceMode. | The default in PBJS 3.x will be to enforce no purposes, and in 4.0 to enforce Purpose 1 and no others. |
gdpr.rules[].enforceVendor | boolean | Whether to enforce vendor consent/legal basis for this purpose or not.. | The default in PBJS 3.x will be to enforce no purposes, and in 4.0 to enforce Purpose 1 and no others. |
gdpr.rules[].vendorExceptions | array of strings | Which biddercodes or module names should be treated as the opposite of the enforceVendor flag. | If enforceVendor=false, then vendorExceptions are those that will be treated as true. If enforce=true, then vendorExceptions are those that will be treated as false. |
Example configurations:
pbjs.setConfig({ consentManagement: { gdpr: { cmpApi: 'iab', defaultGdprScope: true/false (0/1?) timeout: 3000, // allowAuctionWithoutConsent: false, // deprecated rules: [{ // don’t enforce Purpose 1 except for bidderA. // this means that TCF approval is only considered // for this one bidder. purpose: "storage", enforcePurpose: false, enforceVendor: false, vendorExceptions: ["bidderA"] },{ // Allow the user to object to vendors for Purpose 2 // but don’t allow them to turn off header bidding // altogether. // The exception is bidderB, which the user will // not be allowed to reject purpose: "basicAds", enforcePurpose: false, enforceVendor: true, vendorExceptions: ["bidderB"] },{ // allow the user to have their userId removed from // header bidding except for bidders A and B purpose: "personalizedAds", enforcePurpose: true, enforceVendor: true vendorExceptions: ["bidderA","bidderB"] },{ // analytics adapters are ok
purpose: "measurement", enforcePurpose: false, enforcePurpose: false }] } } }); |
You may notice that the examples above provide more flexibility than TCF requires. This allows publishers to establish custom legal bases in consultation with their legal counsel.
4) If the 'gdprApplies' flag is defined and is false, then Prebid.js may assume that GDPR is not in scope and therefore doesn't need to be enforced. All Purposes will be set to enforce=false.
4) There should be a way for bidAdapters to supply a GVL ID for each alias they support.
5) The aliasBidder() function should be extended to support specification of a GVL ID. e.g.
pbjs.aliasBidder('appnexus', 'newAlias', 999);
6) If a bidder code isn't associated with a GVL ID, enforcement should assume that the vendor is not allowed unless the publisher has specifically named their bidder code.
7) Analytics adapters must be associated with a GVL ID and/or a "name" to allow the system to determine which analytics adapter(s) are permitted to operate in the current context.
8) User ID modules and Real Time Data modules should be associated with a GVL ID and/or a "name" to allow the system to determine which modules are permitted to operate in the current context.
9) The system must be able to verify vendor consent in two ways:
10) The internal interface to bid adapters should remain the same: bidrequest.gdprConsent
11) The OpenRTB interface to Prebid Server should remain the same:
12) The system must support all the activity enforcement noted in the 'Summary of Prebid TCF 2.0 Enforcement' section.
13) If consentManagement.gdpr is configured but no consent string is available, the system must assume that the user does not consent to either purpose or vendor. Activities may still take place if the publisher has configured the relevant Purposes as 'not enforced'.
13) Bid adapters must do one of the following for all device access activities (reading or setting cookies or local storage):
14) Prebid core must make the following information available to analytics adapters:
15) It should be possible for a pub to define a mapping between a module code and a GVL ID
pbjs.setConfig({
gvlMapping: {
“id5”: 9999
“bidderX”: 8888
}
1) Prebid SDK must accept the following optional parameters to support TCF 2.0. It’s assumed the app will pass these values directly or indirectly from a mobile CMP.
2) When a request is defined to be GDPR in-scope, the SDK must confirm that the ‘deviceAccessConsent’ flag is true. Here’s the truth table for when the SDK is allowed to access the device ID:
deviceAccessConsent=true | deviceAccessConsent=false | deviceAccessConsent undefined | |
GDPR scope=false | Yes, read IDFA | No, don’t read IDFA | Yes, read IDFA |
GDPR scope=true | Yes, read IDFA | No, don’t read IDFA | No, don’t read IDFA |
GDPR scope undefined | Yes, read IDFA | No, don’t read IDFA | Yes, read IDFA |
3) The SDK must pass the consent data to Prebid Server on the same OpenRTB attributes as defined in TCF 1.1:
1) Optional configuration must be available for host companies to turn on and off enforcing GDPR with IAB TCF 2.0 API data. There should be global and publisher account level configuration. The default should be to enforce.
2) If enforcement is turned on for this request, Prebid Server must be able to determine whether it's in-scope for GDPR processing. If any of the following conditions are true, the request is in-scope:
3) Prebid Server must support the following host company controls:
4) Prebid Server must give host company config to say what to do with the purposeOneTreatment - both as a default and for each account:
The implementation of this “PurposeOneTreatmentInterpretation flag modifies the flowchart above: it may short-circuit the logic, jumping straight to Yes or No without a normal enforcement check.
5) It must be possible for a Host Company to define its GVL ID to use for confirming user user consent for setting cookies.
Example configuration/DB entries:
gdpr.host-vendor-id: 52
gdpr.enabled: true/false // default true
gdpr.purpose.P.enforcePurpose: no/basic/full // default full
gdpr.purpose.P.enforceVendors: true/false // default true
gdpr.purpose.P.vendorExceptions: list of biddercodes
gdpr.specialfeature.S.enforce: true/false // default true
gdpr.specialfeature.S.vendorExceptions: list of biddercodes
gdpr.purposeOneTreatmentInterpretation: ignore/no-access-allowed/access-allowed
account.A.gdpr.enabled: true/false // default true
account.A.gdpr.purpose.P.enforcePurpose
account.A.gdpr.purpose.P.enforceVendors
account.A.gdpr.purpose.P.vendorExceptions
account.A.gdpr.specialfeature.S.enforce
account.A.gdpr.specialfeature.S.vendorExceptions
account.A.gdpr.purposeOneTreatmentInterpretation
geolocation.VENDOR.server: url // location of geo lookup service
6) There should be a way for bidAdapters to supply a GVL ID for each alias they support.
7) The external definition of aliases should be extended to support specification of a GVL ID. e.g.
"ext": {
"prebid": {
"aliases": { // existing feature
"districtm": "appnexus"
},
"aliasgvlids": { // new feature
"districtm": 144
}
}
}
8) Prebid Server's enforcement should be "Full" mode unless it doesn't have access to the proper GVL version.
9) Prebid Server should be able to read the TCF2.0 GVL that's specified in the consent string. If it does not have immediate access to that version of the GVL, it may downgrade enforcement to "Basic". The assumption is that subsequent requests for that version of the GVL will succeed. The system should log any usage of Basic Enforcement.
10) If a bidder code isn't associated with a GVL ID, enforcement should assume that the vendor is not allowed unless the publisher has specifically named the bidder code as a configured exception.
11) Analytics adapters must be associated with a GVL ID and/or a "name" to allow the system to determine which analytics adapter(s) are permitted to operate in the current context.
12) User ID modules and Real Time Data modules should be associated with a GVL ID and/or a "name" to allow the system to determine which modules are permitted to operate in the current context.
13) The system must be able to verify vendor consent in two ways:
14) The internal interface to bid adapters should remain the same.
15) The OpenRTB interface to Prebid Server should remain the same:
16) The system must support all the activity enforcement noted in the 'Summary of Prebid TCF 2.0 Enforcement' section.
17) If GDPR is being enforced but no consent string is available, the system must assume that the user does not consent to either purpose or vendor. Activities may still take place if the Host Company has configured the relevant Purposes as 'not enforced'.
18) Prebid Server core must make the following information available to analytics adapters:
\ No newline at end of file +
Prebid Support for Enforcing TCF 2.0
Summary of Prebid TCF 2.0 Enforcement
Full Enforcement (Prebid Server Only)
Prebid.js Functional Requirements
Prebid SDK Functional Requirements
Prebid Server Functional Requirements
The IAB's Transparency and Consent Framework version 2.0 for enhanced support of GDPR is scheduled to take effect Apr 1 2020. It's a major update from TCF 1.1 which Prebid currently supports, and is not compatible with the previous release.
The key changes are:
References
Important Legal Note: Prebid.org cannot provide legal advice about GDPR or any other governmental regulation. Our aim is to provide a toolkit of functionality that will let publishers configure header bidding as defined by their legal counsel. We will consider feature suggestions, and review any code offered by the community. Enforcement of Purpose 2 (basic ad selection) looks to be one of the bigger areas of concern because the TCF policy could be interpreted to be a form of ad blocking. You will need to work with your legal counsel to determine how you intend to handle this scenario. Prebid.js and Prebid Server offer publishers the ability to enforce or not-enforce purposes individually. As an example of the kind of flexibility we aim to offer (*), here are some options you could discuss with your lawyers:
(*) - Note on phasing: Please be aware that Prebid.js and Prebid Server will likely not deliver on the full TCF functionality by April 1st. Our initial goal for both products is to support Purpose 1 (Device Access) enforcement by that date. The ability to enforce the other purposes will be developed as soon as we can. (**) Did we mention that you cannot rely on this document to learn how to configure your header bidding for GDPR? Seriously, talk to your lawyers. |
General
Prebid.js
Prebid Server
Prebid SDK
TCF Field | In-scope Activities | System | Enforcement | Publisher/ Host Company Controls |
Purpose 1 - Store and/or access information on a device | usersync pixels, user ID modules, and device storage | Prebid.js and Prebid Server and Prebid SDK | May result in preventing one or more uesrsync activities for one or more vendors. | Do not enforce purpose 1 Do not enforce purpose 1 for vendor V Enforce purpose 1 at the vendor level only. |
Purpose 2 - Select basic ads | call bid adapters | Prebid.js and Prebid Server | May result in skipping one or more bid adapters. All configured modules will be called as usual unless all bidders are eliminated. | Do not enforce purpose 2 Do not enforce purpose 2 for vendor V Enforce purpose 2 at the vendor level only. |
Purpose 4 - Select Personalized Ads | call bid adapters with userIds | Prebid.js and Prebid Server | May result in removing the userIds before calling one or more bid adapters. | Do not enforce purpose 4 Do not enforce purpose 4 for vendor V Enforce purpose 4 at the vendor level only. |
Purpose 7 - Measure ad performance | initiate analytics | Prebid.js and Prebid Server | May result in skipping one or more analytics adapters. | Do not enforce purpose 7 Do not enforce purpose 7 for vendor V Enforce purpose 7 at the vendor level only. |
Special Feature 1 - Use precise geolocation data | passing lat/long to server-side bid adapters | Prebid Server | May result in rounding lat/long values and IP address before sending to server-side adapters. | Do not enforce Special Feature 1 |
Special Purpose 2 - Technically deliver ads or content | n/a | Special Purposes do not require consent. If a publisher’s legal team wants to consider SP2, Prebid software should not be called. | ||
PurposeOneConsent | n/a | Prebid does not provide specific support for enforcing this flag. Instead, publishers may use the provided controls for Purpose 1 and other Prebid configuration to control whether the user’s device is accessed. |
Prebid offers publishers several controls for whether consent/legal basis confirmation is even performed. The following flowchart shows how the controls
The goal of 'basic enforcement' is to confirm that there's enough evidence of consent to pass data on to vendors who have access to the GVL and can fully parse and enforce.
Before allowing a Purpose for a given Vendor, one of these scenarios must be true: :
In terms of the TCF 2.0 fields, Purpose P is ok for vendor V if either of these is true:
Before allowing Special Feature 1, SpecialFeatureOptIns[1] must be true.
The big difference between 'basic' and 'full' enforcement is that Prebid Server has the GVL available to examine vendor legal bases.
Before allowing an activity that falls under a specific Purpose for a given Vendor, one of these 6 basic scenarios needs to be true:
Note that there are many more scenarios where the activity would not be allowed.
The technical definition in terms of the TCF 2.0 fields follows. Purpose P is ok for vendor V if any of these is true:
Before allowing Special Feature 1, SpecialFeatureOptIns[1] must be true.
1) An optional module must be available for reading the IAB TCF 2.0 API data. Publishers will include this module in their Prebid.js package when they need to support EEA users.
2) Prebid.js must support scenarios where the TCF string parsing functions are not available. If the codebase for parsing the TCF string is significant, it should be made an optional module separate from the enforcement functions. A key goal of Prebid.js is to include only the code that publishers need for their particular use case. The technical design should consider whether it makes sense to bundle all of these components together, or break them into 2 or 3 separate modules:
3) Prebid.js must support the following publisher controls:
Here's a set of proposed configurations within the existing consentManagement config object:
Param | Type | Description | Details |
gdpr.allowAuctionWithoutConsent | boolean | Available in 3.x only, defines behavior for backwards compatibility. | For 3.x: If true, consider all Purposes as not enforceable. If false, consider only Purpose 2 enforceable. |
gdpr.consentData | object | Consent data provided statically. | Used when cmpApi is "static". |
gdpr.defaultGdprScope | boolean | ||
gdpr.rules | object | Lets the publisher override the defaults set by the enforceMode | |
gdpr.rules[].purpose | string | Possible values are "storage", "basicAds", "personalizedAds", and "measurement" corresponding to Purposes 1,2,4, and 7 respectively. | For some reason, people tend to prefer using the string names rather than the numbers. |
gdpr.rules[].enforcePurpose | boolean | Whether to enforce this purpose or not. Overrides the setting from enforceMode. | The default in PBJS 3.x will be to enforce no purposes, and in 4.0 to enforce Purpose 1 and no others. |
gdpr.rules[].enforceVendor | boolean | Whether to enforce vendor consent/legal basis for this purpose or not.. | The default in PBJS 3.x will be to enforce no purposes, and in 4.0 to enforce Purpose 1 and no others. |
gdpr.rules[].vendorExceptions | array of strings | Which biddercodes or module names should be treated as the opposite of the enforceVendor flag. | If enforceVendor=false, then vendorExceptions are those that will be treated as true. If enforce=true, then vendorExceptions are those that will be treated as false. |
Example configurations:
pbjs.setConfig({ consentManagement: { gdpr: { cmpApi: 'iab', defaultGdprScope: true/false (0/1?) timeout: 3000, // allowAuctionWithoutConsent: false, // deprecated rules: [{ // don’t enforce Purpose 1 except for bidderA. // this means that TCF approval is only considered // for this one bidder. purpose: "storage", enforcePurpose: false, enforceVendor: false, vendorExceptions: ["bidderA"] },{ // Allow the user to object to vendors for Purpose 2 // but don’t allow them to turn off header bidding // altogether. // The exception is bidderB, which the user will // not be allowed to reject purpose: "basicAds", enforcePurpose: false, enforceVendor: true, vendorExceptions: ["bidderB"] },{ // allow the user to have their userId removed from // header bidding except for bidders A and B purpose: "personalizedAds", enforcePurpose: true, enforceVendor: true vendorExceptions: ["bidderA","bidderB"] },{ // analytics adapters are ok
purpose: "measurement", enforcePurpose: false, enforcePurpose: false }] } } }); |
You may notice that the examples above provide more flexibility than TCF requires. This allows publishers to establish custom legal bases in consultation with their legal counsel.
4) If the 'gdprApplies' flag is defined and is false, then Prebid.js may assume that GDPR is not in scope and therefore doesn't need to be enforced. All Purposes will be set to enforce=false.
4) There should be a way for bidAdapters to supply a GVL ID for each alias they support.
5) The aliasBidder() function should be extended to support specification of a GVL ID. e.g.
pbjs.aliasBidder('appnexus', 'newAlias', 999);
6) If a bidder code isn't associated with a GVL ID, enforcement should assume that the vendor is not allowed unless the publisher has specifically named their bidder code.
7) Analytics adapters must be associated with a GVL ID and/or a "name" to allow the system to determine which analytics adapter(s) are permitted to operate in the current context.
8) User ID modules and Real Time Data modules should be associated with a GVL ID and/or a "name" to allow the system to determine which modules are permitted to operate in the current context.
9) The system must be able to verify vendor consent in two ways:
10) The internal interface to bid adapters should remain the same: bidrequest.gdprConsent
11) The OpenRTB interface to Prebid Server should remain the same:
12) The system must support all the activity enforcement noted in the 'Summary of Prebid TCF 2.0 Enforcement' section.
13) If consentManagement.gdpr is configured but no consent string is available, the system must assume that the user does not consent to either purpose or vendor. Activities may still take place if the publisher has configured the relevant Purposes as 'not enforced'.
13) Bid adapters must do one of the following for all device access activities (reading or setting cookies or local storage):
14) Prebid core must make the following information available to analytics adapters:
15) It should be possible for a pub to define a mapping between a module code and a GVL ID
pbjs.setConfig({
gvlMapping: {
“id5”: 9999
“bidderX”: 8888
}
1) Prebid SDK must accept the following optional parameters to support TCF 2.0. It’s assumed the app will pass these values directly or indirectly from a mobile CMP.
2) When a request is defined to be GDPR in-scope, the SDK must confirm that the ‘deviceAccessConsent’ flag is true. Here’s the truth table for when the SDK is allowed to access the device ID:
deviceAccessConsent=true | deviceAccessConsent=false | deviceAccessConsent undefined | |
GDPR scope=false | Yes, read IDFA | No, don’t read IDFA | Yes, read IDFA |
GDPR scope=true | Yes, read IDFA | No, don’t read IDFA | No, don’t read IDFA |
GDPR scope undefined | Yes, read IDFA | No, don’t read IDFA | Yes, read IDFA |
3) The SDK must pass the consent data to Prebid Server on the same OpenRTB attributes as defined in TCF 1.1:
1) Optional configuration must be available for host companies to turn on and off enforcing GDPR with IAB TCF 2.0 API data. There should be global and publisher account level configuration. The default should be to enforce.
2) If enforcement is turned on for this request, Prebid Server must be able to determine whether it's in-scope for GDPR processing. If any of the following conditions are true, the request is in-scope:
3) Prebid Server must support the following host company controls:
4) Prebid Server must give host company config to say what to do with the purposeOneTreatment - both as a default and for each account:
The implementation of this “PurposeOneTreatmentInterpretation flag modifies the flowchart above: it may short-circuit the logic, jumping straight to Yes or No without a normal enforcement check.
5) It must be possible for a Host Company to define its GVL ID to use for confirming user user consent for setting cookies.
Example configuration/DB entries:
gdpr.host-vendor-id: 52
gdpr.enabled: true/false // default true
gdpr.purpose.P.enforcePurpose: no/basic/full // default full
gdpr.purpose.P.enforceVendors: true/false // default true
gdpr.purpose.P.vendorExceptions: list of biddercodes
gdpr.specialfeature.S.enforce: true/false // default true
gdpr.specialfeature.S.vendorExceptions: list of biddercodes
gdpr.purposeOneTreatmentInterpretation: ignore/no-access-allowed/access-allowed
account.A.gdpr.enabled: true/false // default true
account.A.gdpr.purpose.P.enforcePurpose
account.A.gdpr.purpose.P.enforceVendors
account.A.gdpr.purpose.P.vendorExceptions
account.A.gdpr.specialfeature.S.enforce
account.A.gdpr.specialfeature.S.vendorExceptions
account.A.gdpr.purposeOneTreatmentInterpretation
geolocation.VENDOR.server: url // location of geo lookup service
6) There should be a way for bidAdapters to supply a GVL ID for each alias they support.
7) The external definition of aliases should be extended to support specification of a GVL ID. e.g.
"ext": {
"prebid": {
"aliases": { // existing feature
"districtm": "appnexus"
},
"aliasgvlids": { // new feature
"districtm": 144
}
}
}
8) Prebid Server's enforcement should be "Full" mode unless it doesn't have access to the proper GVL version.
9) Prebid Server should be able to read the TCF2.0 GVL that's specified in the consent string. If it does not have immediate access to that version of the GVL, it may downgrade enforcement to "Basic". The assumption is that subsequent requests for that version of the GVL will succeed. The system should log any usage of Basic Enforcement.
10) If a bidder code isn't associated with a GVL ID, enforcement should assume that the vendor is not allowed unless the publisher has specifically named the bidder code as a configured exception.
11) Analytics adapters must be associated with a GVL ID and/or a "name" to allow the system to determine which analytics adapter(s) are permitted to operate in the current context.
12) User ID modules and Real Time Data modules should be associated with a GVL ID and/or a "name" to allow the system to determine which modules are permitted to operate in the current context.
13) The system must be able to verify vendor consent in two ways:
14) The internal interface to bid adapters should remain the same.
15) The OpenRTB interface to Prebid Server should remain the same:
16) The system must support all the activity enforcement noted in the 'Summary of Prebid TCF 2.0 Enforcement' section.
17) If GDPR is being enforced but no consent string is available, the system must assume that the user does not consent to either purpose or vendor. Activities may still take place if the Host Company has configured the relevant Purposes as 'not enforced'.
18) Prebid Server core must make the following information available to analytics adapters:
diff --git a/dev-docs/show-long-form-video-with-gam.md b/dev-docs/show-long-form-video-with-gam.md index 1891608559..b14d30180f 100644 --- a/dev-docs/show-long-form-video-with-gam.md +++ b/dev-docs/show-long-form-video-with-gam.md @@ -167,7 +167,7 @@ hb_pb_cat_dur = '10.00_10s' **4. Implement Custom Price Buckets** -By default, Prebid.js caps all CPMs at $20. With sell side video there may be an expecation to see CPMs over $20. In order to receive those bids, custom price buckets need to be implemented by setting the [priceGranularity](/dev-docs/publisher-api-reference.html#setConfig-Price-Granularity) object of the `setConfig` method. +By default, Prebid.js caps all CPMs at $20. With sell side video there may be an expecation to see CPMs over $20. In order to receive those bids, custom price buckets need to be implemented by setting the [priceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity) object of the `setConfig` method. For instructions on setting custom price buckets, view the [Custom Price Granularity Buckets](/dev-docs/examples/custom-price-buckets.html) documentation on prebid.org. diff --git a/dev-docs/show-multi-format-ads.md b/dev-docs/show-multi-format-ads.md index 6515a93c01..4d6bc1cb8d 100644 --- a/dev-docs/show-multi-format-ads.md +++ b/dev-docs/show-multi-format-ads.md @@ -34,7 +34,7 @@ Prebid multi-format ad units allow direct competition between banner, native, an At a high level, Prebid.js supports multi-format ads as follows: -1. An ad unit may define a [`mediaTypes`]({{site.baseurl}}/dev-docs/publisher-api-reference.html#addAdUnits-MediaTypes) object to specify one or more supported formats and their respective properties. +1. An ad unit may define a [`mediaTypes`](/dev-docs/publisher-api-reference/addAdUnits.html#addAdUnits-MediaTypes) object to specify one or more supported formats and their respective properties. 2. Each bidder specified on a given ad unit will be eligible to bid if the bidder supports at least one of the media types specified via `adUnit.mediaTypes`. 3. Prebid.js sends bid requests to each eligible bidder. @@ -76,7 +76,11 @@ The ad unit below supports the banner, native, and video media types. }, video: { context: 'outstream', - playerSize: [640, 480] + playerSize: [640, 480], + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 }, }, bids: [ diff --git a/dev-docs/show-native-ads.md b/dev-docs/show-native-ads.md index 8e47637677..f028b58528 100644 --- a/dev-docs/show-native-ads.md +++ b/dev-docs/show-native-ads.md @@ -267,7 +267,7 @@ it will respond to that request with the actual asset values for that `adId` in }, { "key": "clickUrl", - "value": "http://prebid.org/dev-docs/show-native-ads.html" + "value": "https://prebid.org/dev-docs/show-native-ads.html" } ] } diff --git a/dev-docs/show-outstream-video-ads.md b/dev-docs/show-outstream-video-ads.md index e7021607ee..6b4a9dde66 100644 --- a/dev-docs/show-outstream-video-ads.md +++ b/dev-docs/show-outstream-video-ads.md @@ -39,7 +39,11 @@ var videoAdUnits = [{ mediaTypes: { video: { context: 'outstream', - playerSize: [640, 480] + playerSize: [640, 480], + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 } }, bids: [{ @@ -47,7 +51,7 @@ var videoAdUnits = [{ params: { placementId: 13232385, video: { - skippable: true, + skip: 1, playback_method: ['auto_play_sound_off'] } } @@ -95,6 +99,11 @@ pbjs.addAdUnit({ video: { context: 'outstream', playerSize: [640, 480], + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 + // but a renderer passed in here would apply only to this mediaType. // This renderer would override the above renderer if it exists. renderer: { @@ -121,7 +130,11 @@ pbjs.addAdUnit({ mediaTypes: { video: { context: 'outstream', - playerSize: [640, 480] + playerSize: [640, 480], + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 } }, renderer: { @@ -188,9 +201,9 @@ pbjs.que.push(function () { For more information, see the API documentation for: -+ [requestBids]({{site.github.url}}/dev-docs/publisher-api-reference.html#module_pbjs.requestBids) -+ [getHighestCpmBids]({{site.github.url}}/dev-docs/publisher-api-reference.html#module_pbjs.getHighestCpmBids) -+ [renderAd]({{site.github.url}}/dev-docs/publisher-api-reference.html#module_pbjs.renderAd) ++ [requestBids](/dev-docs/publisher-api-reference/requestBids.html) ++ [getHighestCpmBids](/dev-docs/publisher-api-reference/getHighestCpmBids.html) ++ [renderAd](/dev-docs/publisher-api-reference/renderAd.html) ## Working Examples diff --git a/dev-docs/show-prebid-ads-on-amp-pages.md b/dev-docs/show-prebid-ads-on-amp-pages.md index ad6a833cbb..0195cc63fe 100644 --- a/dev-docs/show-prebid-ads-on-amp-pages.md +++ b/dev-docs/show-prebid-ads-on-amp-pages.md @@ -229,7 +229,7 @@ Replace `MACRO` in the preceding example with the appropriate macro for the ad s To sync user IDs with Prebid Server, the `amp-iframe` below may be added to your AMP pages referring to `load-cookie.html` or if you're running an IAB-compliant AMP CMP you can use `load-cookie-with-consent.html`. {% capture tipNote %} -The following examples include a transparent image as a placeholder which will allow you to place the example at the top within the HTML body. If this is not included the iFrame must be either 600px away from the top or not within the first 75% of the viewport when scrolled to the top – whichever is smaller. For more information on this, see [amp-iframe](https://ampbyexample.com/components/amp-iframe/) +The following examples include a transparent image as a placeholder which will allow you to place the example at the top within the HTML body. If this is not included the iFrame must be either 600px away from the top or not within the first 75% of the viewport when scrolled to the top – whichever is smaller. For more information on this, see [amp-iframe](https://amp.dev/documentation/components/amp-iframe/) {% endcapture %} {% include alerts/alert_tip.html content=tipNote %} diff --git a/dev-docs/show-video-with-a-dfp-video-tag.md b/dev-docs/show-video-with-a-dfp-video-tag.md index ad6def2f2e..929cffe49b 100644 --- a/dev-docs/show-video-with-a-dfp-video-tag.md +++ b/dev-docs/show-video-with-a-dfp-video-tag.md @@ -59,17 +59,17 @@ var videoAdUnit = { mediaTypes: { video: { context: 'instream', - playerSize: [640, 480] + playerSize: [640, 480], + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 }, }, bids: [{ bidder: 'appnexus', params: { - placementId: 13232361, - video: { - skippable: true, - playback_methods: ['auto_play_sound_off'] - } + placementId: 13232361 } }] }; @@ -77,7 +77,7 @@ var videoAdUnit = { ### 2. Implement Custom Price Buckets -By default, Prebid.js caps all CPMs at $20. As a video seller, you may expect to see CPMs over $20. In order to receive those bids, you'll need to implement custom price buckets setting the [priceGranularity](/dev-docs/publisher-api-reference.html#setConfig-Price-Granularity) object in the `setConfig` method. +By default, Prebid.js caps all CPMs at $20. As a video seller, you may expect to see CPMs over $20. In order to receive those bids, you'll need to implement custom price buckets setting the [priceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity) object in the `setConfig` method. For instructions and sample code, see [Custom Price Granularity Buckets ](/dev-docs/examples/custom-price-buckets.html). @@ -88,7 +88,7 @@ Next, we need to do the standard Prebid "add ad units and request bids" dance. In the example below, our callback builds the video URL the player needs using the `buildVideoUrl` method from the Google Ad Manager ad server module that we built into our copy of Prebid.js in the **Prerequisites** section. -For more information, see the API documentation for [pbjs.adServers.dfp.buildVideoUrl]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.adServers.dfp.buildVideoUrl). Understanding the arguments to this method is *especially* important if you plan to pass any custom parameters to Google Ad Manager. The `params` key in the argument to `buildVideoUrl` supports all parameters from the [Google Ad Manager API](https://support.google.com/admanager/answer/1068325). +For more information, see the API documentation for [pbjs.adServers.dfp.buildVideoUrl](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html). Understanding the arguments to this method is *especially* important if you plan to pass any custom parameters to Google Ad Manager. The `params` key in the argument to `buildVideoUrl` supports all parameters from the [Google Ad Manager API](https://support.google.com/admanager/answer/1068325). ```javascript pbjs.que.push(function() { @@ -120,9 +120,9 @@ pbjs.que.push(function() { The VAST XML has to be cached somewhere because most video players can only work with a URL that returns VAST XML, not VAST directly. Some bidders cache the VAST XML on the server side, while others depend on Prebid.js to perform the caching. + In general, video-enabled bidders must supply `bid.videoCacheKey`, `bid.vastXml`, or `bid.vastUrl` on their responses, and can provide any combination of the three. -+ If `pbjs.setConfig({cache: {URL}})` isn't set and the bidder supplies only `bid.vastXml` in its bid response, [`pbjs.adServers.dfp.buildVideoUrl`]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.adServers.dfp.buildVideoUrl) will not be able to generate a videoCacheKey, and it will be dropped from the auction. ++ If `pbjs.setConfig({cache: {URL}})` isn't set and the bidder supplies only `bid.vastXml` in its bid response, [`pbjs.adServers.dfp.buildVideoUrl`](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html) will not be able to generate a videoCacheKey, and it will be dropped from the auction. + If `pbjs.setConfig({cache: {URL}})` is defined and the bidder responds with `bid.videoCacheKey`, Prebid.js will not re-cache the VAST XML. -+ If `options.url` is passed as an argument to [`pbjs.adServers.dfp.buildVideoUrl`]({{site.baseurl}}/dev-docs/publisher-api-reference.html#module_pbjs.adServers.dfp.buildVideoUrl): ++ If `options.url` is passed as an argument to [`pbjs.adServers.dfp.buildVideoUrl`](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html): + If Prebid Cache is disabled, Prebid sets `description_url` field to the bid response's `bid.vastUrl`. + If Prebid Cache is enabled, Prebid sets `description_url` field to the cache URL. @@ -199,7 +199,6 @@ Below, find links to end-to-end "working examples" integrating Prebid.js demand + [Flowplayer]({{site.github.url}}/examples/video/instream/flowplayer/pb-ve-flowplayer.html) + [JWPlayer - Platform]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html) + [JWPlayer - Hosted]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html) -+ [JWPlayer - Playlist]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-playlist.html) + [Kaltura]({{site.github.url}}/examples/video/instream/kaltura/pb-ve-kaltura.html) + [Ooyala]({{site.github.url}}/examples/video/instream/ooyala/pb-ve-ooyala.html) + [VideoJS]({{site.github.url}}/examples/video/instream/videojs/pb-ve-videojs.html) @@ -210,8 +209,6 @@ Below, find links to end-to-end "working examples" integrating Prebid.js demand + [Brid]({{site.baseurl}}/examples/video/server/brid/pbs-ve-brid.html) + [JW Player - Platform]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-platform.html) + [JW Player - Hosted]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html) -+ [JW Player - Playlist]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-playlist.html) -+ [JW Player - Player 7]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-jwplayer7.html) + [Kaltura]({{site.baseurl}}/examples/video/server/kaltura/pbs-ve-kaltura.html) + [Ooyala]({{site.baseurl}}/examples/video/server/ooyala/pbs-ve-ooyala.html) + [VideoJS]({{site.baseurl}}/examples/video/server/videojs/pbs-ve-videojs.html) diff --git a/dev-docs/troubleshooting-tips.md b/dev-docs/troubleshooting-tips.md index dc685b4910..874e3d90e6 100644 --- a/dev-docs/troubleshooting-tips.md +++ b/dev-docs/troubleshooting-tips.md @@ -150,7 +150,7 @@ Right-click to add a **New** snippet: Paste in the following code using Control-V (or Command-V on Mac), and give the snippet a name, such as 'show-all-winning-bids': ```javascript -var bids = pbjs.getHighestCpmBids(); +var bids = pbjs.getAllWinningBids(); var output = []; for (var i = 0; i < bids.length; i++) { var b = bids[i]; diff --git a/developers.md b/developers.md index 8126bf86cf..274e831ba4 100644 --- a/developers.md +++ b/developers.md @@ -25,7 +25,7 @@ Key links for publisher developers. **Prebid for AMP** - integrating display ads into AMP pages: -+ [How Prebid on AMP works](/dev-docs/how-prebid-on-amp-works.html) ++ [How Prebid on AMP works](/prebid-server/use-cases/pbs-amp.html) + [Prebid AMP Implementation Guide](/dev-docs/show-prebid-ads-on-amp-pages.html) + [Prebid Server AMP endpoint documentation](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html) diff --git a/download.md b/download.md index c9683a5669..aec6962607 100644 --- a/download.md +++ b/download.md @@ -168,9 +168,6 @@ Prebid.js is open source software that is offered for free as a convenience. Whi {% assign module_pages = site.pages | where: "page_type", "module" %} {% assign analytics_pages = site.pages | where: "layout", "analytics" %} -{: .alert.alert-danger :} -**Note:** an important bug in the [DFP Video Module](/dev-docs/modules/dfp_video.html) was introduced with 3.27 and fixed in 4.3. The dfpVideoModule only looked in adunit.sizes but adunit.sizes was stripped. Unfortunately there's not a workaround - if you use that video module, you shouldn't use Prebid.js 3.27 through 4.2 inclusive. -