In the New line item dialog, under Inventory sizes, select the Video VAST radio button.
-
-
-
In the Master text area, add your video player size(s).
-
-
+
+
In the New line item dialog, choose "Video".
+
Select the appropriate Line Item Type, etc.
+
In the Expected creatives section, choose your video size, e.g., 640x480v.
+
Set the dates, rate, limit, and targeting as desired. For example, for SendAllBids include targeting for "hb_bidder_rubicon=rubicon" as well as the hb_pb_rubicon targeting. This isn't needed if only creating one set of orders for all bidders.
+
Remember to set the hb_pb=BUCKET targeting for each line item, or hb_pb_BIDDER=BUCKET if using separate line items for each bidder.
+
Save the line item.
+
+
Be sure to duplicate your line item and video creative for each Prebid price bucket you intend to create.
+
By default, Prebid.js caps all CPMs at $20. As a video seller, you may expect to see CPMs higher than $20. In order to receive those bids, you’ll need to make sure your dev team implements custom price buckets as described in the engineering setup instructions. Once those changes are made on the engineering side, there should be no changes required from the ad ops side to support CPMs over $20.
-
+
Multiple Cache Services You might need separate video line items for each cache service being used. For example, if both AppNexus and Rubicon Project are bidders, you’ll either need to create separate line items to support the different cache URLs required or provide separately-targeted creatives, as described below.
+When setting up video creatives, it's important to understand where the VAST XML is stored for each of your bidders. The most common place to store VAST XML is AppNexus' cache, but some bidders (such as RubiconProject and SpotX) use their own cache services. To support such
+bidders, you will need to have either:
-
By default, Prebid.js caps all CPMs at $20. As a video seller, you may expect to see CPMs higher than $20. In order to receive those bids, you’ll need to make sure your dev team implements custom price buckets as described in the engineering setup instructions. Once those changes are made on the engineering side, there should be no changes required from the ad ops side to support CPMs over $20.
+
a separate line item for each bidder, or
+
a creative for each cache service utilized by your implementation.
-
Be sure to duplicate your line item and video creative for each Prebid price bucket you intend to create. You may also need separate video line items for each cache service being used. For example, if both AppNexus and Rubicon Project are bidders, you’ll need separate line items to support the different cache URLs required.
+
Single Cache Location
-
Creative Setup
+
1. For each line item you create, click on the Creatives tab, click the ADD CREATIVE button, and choose the size you're entering.
-
1. For each line item you created above, select new creative set.
+
2. In the dialog that appears, choose Redirect.
-
2. In the dialog that appears, set the creative set type to “Redirect”
-
-
3. Set the VAST tag URL to the cache location. Note that each bidder, e.g. Rubicon Project, may have a different cache location URL.
+
3. Set the VAST tag URL to the cache location.
If you’re using a single order for all bidders, then the VAST URL will be the same for each bidder:
@@ -53,29 +53,59 @@
Creative Setup
or
[other bidder cache location]
-
If you’re using different orders for each bidder, the VAST URL for each will need to be different:
+
If you’re using different orders for each bidder, the VAST URL for each will include the bidder-specific targeting variable:
https://prebid.adnxs.com/pbc/v1/cache?uuid=%%PATTERN:hb_uuid_BIDDERCODE%%
or
[other bidder cache location]
-
This VAST tag URL is required in order to show video ads. It points to
- a server-side cache hosted by your Prebid Server provider.
+
This VAST tag URL is required in order to show video ads. It points to a server-side cache hosted by your Prebid Server provider.
Prebid Cache and the VAST creative URL warning
- Google Ad Manager will show you a warning that fetching VAST from the creative
+ Google Ad Manager will show you a warning stating that fetching VAST from the creative
URL failed. This is expected, since the creative URL above points
to a server-side asset cache hosted by Prebid Server.
-
4. Set the duration to 1
+
4. Set the Duration to 1.
The resulting creative should look something like the following:
-
+
+
+
Multiple Cache Locations
+
+To set up multiple video creatives in the same line item (i.e., to run AppNexus, Rubicon, and SpotX all together in the same video line item), you can utilize creative targeting.
+
+
+
+1. In the line item's Expected creatives box, choose Creative Targeting and "Add New Targeting".
+
+
+2. Give the targeting set a name like "Prebid Default Video Cache URL" and set Custom Targeting as appropriate, e.g., "hb_bidder is none of rubicon, spotx". Save the targeting.
-
That’s it as far as Prebid setup is concerned. At this point you can add any other options you would normally use, e.g., labels or tracking URLs.
+
+3. For each bidder that uses their own cache, click ADD SIZE in the "Expected creatives" section. Again, choose Creative Targeting and "Add New Targeting".
-
Additional Setup for Long-Form (ad pods)
+
+4. Give the targeting a name like "Prebid Rubicon Video Cache URL". Set Custom Targeting appropriately, e.g., "hb_bidder is any of rubicon". Save the targeting.
+
+
+5. Save the line item.
+
+
Now that the targeting is defined, we're going to add the creatives.
+
+
+6. Go to the line item's Creatives tab.
+
+
+7. Make one creative for each of the targets. There are a couple of ways to do this on the GAM UI, but each approach will result in a creative entry screen similar to the screenshot above for the "Single Cache Location" process. Enter a name (e.g. "AppNexus VAST tag") and the VAST URL as described above.
+
+
+8. The end result should look something like this:
+
+
+
+
That’s it as far as Prebid setup is concerned. At this point you can add any other options you would normally use, such as labels or tracking URLs.
"` |
| `ttl` | Required | Time-to-Live - how long (in seconds) Prebid can use this bid. See the [FAQ entry](/dev-docs/faq.html#does-prebidjs-cache-bids) for more info. | 360 |
| `creativeId` | Required | A bidder-specific unique code that supports tracing the ad creative back to the source. | `"123abc"` |
| `netRevenue` | Required | Boolean defining whether the bid is Net or Gross. The value `true` is Net. Bidders responding with Gross-price bids should set this to false. | `false` |
-| `currency` | Required | 3-letter ISO 4217 code defining the currency of the bid. | `"EUR"` |
| `vastUrl` | Either this or `vastXml` required for video | URL where the VAST document can be retrieved when ready for display. | `"https://vid.example.com/9876` |
| `vastImpUrl` | Optional; only usable with `vastUrl` and requires prebid cache to be enabled | An impression tracking URL to serve with video Ad | `"https://vid.exmpale.com/imp/134"` |
| `vastXml` | Either this or `vastUrl` required for video | XML for VAST document to be cached for later retrieval. | `...` |
| `dealId` | Optional | Deal ID | `"123abc"` |
+| `meta` | Optional | Object containing metadata about the bid | |
+| `meta.networkId` | Optional | Bidder-specific Network/DSP Id | 1111 |
+| `meta.networkName` | Optional | Network/DSP Name | `"NetworkN"` |
+| `meta.agencyId` | Optional | Bidder-specific Agency ID | 2222 |
+| `meta.agencyName` | Optional | Agency Name | `"Agency, Inc."` |
+| `meta.advertiserId` | Optional | Bidder-specific Advertiser ID | 3333 |
+| `meta.advertiserName` | Optional | Advertiser Name | `"AdvertiserA"` |
+| `meta.advertiserDomains` | Optional | Array of Advertiser Domains for the landing page(s). This is an array to align with the OpenRTB 'adomain' field. | `["advertisera.com"]` |
+| `meta.brandId` | Optional | Bidder-specific Brand ID (some advertisers may have many brands) | 4444 |
+| `meta.brandName` | Optional | Brand Name | `"BrandB"` |
+| `meta.primaryCatId` | Optional | Primary [IAB category ID](https://www.iab.com/guidelines/iab-quality-assurance-guidelines-qag-taxonomy/) | `"IAB-111"` |
+| `meta.secondaryCatIds` | Optional | Array of secondary IAB category IDs | `["IAB-222","IAB-333"]` |
@@ -402,18 +433,26 @@ See below for an example implementation. For more examples, search for `getUser
{% highlight js %}
{
- getUserSyncs: function(syncOptions, serverResponses) {
- const syncs = []
+ getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
+ const syncs = []
+
+ var gdpr_params;
+ if (typeof gdprConsent.gdprApplies === 'boolean') {
+ gdpr_params = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
+ } else {
+ gdpr_params = `gdpr_consent=${gdprConsent.consentString}`;
+ }
+
if (syncOptions.iframeEnabled) {
syncs.push({
type: 'iframe',
- url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html'
+ url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html?' + gdpr_params
});
}
if (syncOptions.pixelEnabled && serverResponses.length > 0) {
syncs.push({
type: 'image',
- url: serverResponses[0].body.userSync.url
+ url: serverResponses[0].body.userSync.url + gdpr_params
});
}
return syncs;
@@ -886,18 +925,26 @@ export const spec = {
* @param {ServerResponse[]} serverResponses List of server's responses.
* @return {UserSync[]} The user syncs which should be dropped.
*/
- getUserSyncs: function(syncOptions, serverResponses) {
- const syncs = []
+ getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
+ const syncs = []
+
+ var gdpr_params;
+ if (typeof gdprConsent.gdprApplies === 'boolean') {
+ gdpr_params = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
+ } else {
+ gdpr_params = `gdpr_consent=${gdprConsent.consentString}`;
+ }
+
if (syncOptions.iframeEnabled) {
syncs.push({
type: 'iframe',
- url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html'
+ url: '//acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html?' + gdpr_params
});
}
if (syncOptions.pixelEnabled && serverResponses.length > 0) {
syncs.push({
type: 'image',
- url: serverResponses[0].body.userSync.url
+ url: serverResponses[0].body.userSync.url + gdpr_params
});
}
return syncs;
diff --git a/dev-docs/bidders/9MediaOnline.md b/dev-docs/bidders/9MediaOnline.md
index e5c7584c2a..e29dedbfd1 100644
--- a/dev-docs/bidders/9MediaOnline.md
+++ b/dev-docs/bidders/9MediaOnline.md
@@ -8,7 +8,7 @@ media_types: banner, video
gdpr_supported: true
schain_supported: true
usp_supported: true
-userIds: unifiedId/tradedesk, id5Id
+userIds: id5Id, unifiedId
aliasCode: gamoshi
---
diff --git a/dev-docs/bidders/aardvark.md b/dev-docs/bidders/aardvark.md
index 8d502b1e9e..bdc41c6f33 100644
--- a/dev-docs/bidders/aardvark.md
+++ b/dev-docs/bidders/aardvark.md
@@ -5,9 +5,10 @@ description: Prebid Aardvark Bidder Adaptor
hide: true
biddercode: aardvark
gdpr_supported: true
+tcf2_supported: true
usp_supported: true
schain_supported: true
-userIds: unifiedId/tradedesk
+userIds: unifiedId
---
### Bid Params
diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md
index d2fe9fe13d..564313bfd0 100644
--- a/dev-docs/bidders/adagio.md
+++ b/dev-docs/bidders/adagio.md
@@ -6,6 +6,8 @@ hide: true
biddercode: adagio
media_types: banner
gdpr_supported: true
+schain_supported: true
+tcf2_supported: true
---
### Note
@@ -14,7 +16,7 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea
### Bid Params
-**Important**: Adagio needs to collect attention data about the ads displayed on a page and must listen to some specifics ad-server events. Please refer to the [Adagio user guide](https://support.adagio.io/hc/en-us/articles/360019849112-Adagio-PreBid-Installation-guide-for-publishers) for details.
+**Important**: Adagio needs to collect attention data about the ads displayed on a page and must listen to some specifics ad-server events. Please refer to the [Adagio user guide](https://adagio-team.atlassian.net/wiki/spaces/AH/pages/67272705/EN+Adagio+Prebid.js+installation+guide+for+publishers) for details.
{: .table .table-bordered .table-striped }
@@ -23,8 +25,8 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea
| `organizationId` | required | Id of the Organization. Handed out by Adagio. | `'1010'` | `string` |
| `site` | required | Name of the site. Handed out by Adagio. - max length: 50 | `'mysite-com'` | `string` |
| `adUnitElementId` | required | Refers to the adunit html attribute id in a page. | `'gpt-ban-atf'` | `string` |
-| `environment`* | highly recommended | Environment where the page is displayed. - max length: 30 - max distinctives values: 10 | `'desktop'` | `string` |
-| `placement`* | highly recommended | Refers to the placement of an adunit in a page. Must not contain any information about the type of device. - max length: 30 - max distinctives values: 10 | `'ban_atf'` | `string` |
+| `environment`* | required | Environment where the page is displayed. - max length: 30 - max distinctives values: 10 | `'desktop'` | `string` |
+| `placement`* | required | Refers to the placement of an adunit in a page. Must not contain any information about the type of device. - max length: 30 - max distinctives values: 10 | `'ban_atf'` | `string` |
| `pagetype`* | recommended | Describes what kind of content will be present in the page. - max length: 30 - max distinctives values: 50 | `'article'` | `string` |
| `category`* | recommended | Category of the content displayed in the page. - max length: 30 - max distinctives values: 50 | `'sport'` | `string` |
| `subcategory`* | optional | Subcategory of the content displayed in the page. - max length: 30 - max distinctives values: 50 | `'handball'` | `string` |
diff --git a/dev-docs/bidders/adfinity.md b/dev-docs/bidders/adfinity.md
index 8192ccfbbb..162f005d20 100644
--- a/dev-docs/bidders/adfinity.md
+++ b/dev-docs/bidders/adfinity.md
@@ -5,6 +5,7 @@ description: Prebid Adfinity Bidder Adaptor
hide: true
biddercode: adfinity
media_types: banner, video, native
+gdpr_supported: true
---
### Bid Params
diff --git a/dev-docs/bidders/adkernel.md b/dev-docs/bidders/adkernel.md
index 9f6764a07d..da75aa8ec2 100644
--- a/dev-docs/bidders/adkernel.md
+++ b/dev-docs/bidders/adkernel.md
@@ -4,7 +4,7 @@ title: AdKernel
description: Prebid AdKernel Bidder Adaptor
hide: true
biddercode: adkernel
-media_types: banner, video
+media_types: banner, native, video
gdpr_supported: true
usp_supported: true
---
diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md
new file mode 100644
index 0000000000..fc68317fa1
--- /dev/null
+++ b/dev-docs/bidders/adnuntius.md
@@ -0,0 +1,52 @@
+---
+layout: bidder
+title: Adnuntius
+description: Prebid Adnuntius Bidder Adaptor
+hide: true
+biddercode: adnuntius
+media_types: banner
+gdpr_supported: false
+---
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------|----------------------------------------------------------------------|----------|----------|
+| `auId` | required | The ad unit ID `'0000000000072345'` leading zeros can be omitted. | `string` | |
+| `network` | optional | Used if you want to make requests to multiple networks in adnuntius. | `string` | |
+| `targeting` | optional | Targeting to be sent through to adnuntius with the request. | `string` | |
+
+
+
+#### Targeting
+
+The [Adnuntius Documentation](https://docs.adnuntius.com/adnuntius-advertising/requesting-ads/intro) provides detailed information on sending targeting data to the Adnuntius adserver.
+
+
+#### Example
+
+Here's an example of sending targeting information about categories to adnuntius via the bid request:
+```
+{
+ code: "0000000000072345",
+ mediaTypes: {
+ banner: {
+ sizes: [[980, 360], [980, 300], [980, 240], [980, 120]]
+ }
+ },
+ bids: [
+ {
+ bidder: "adnuntius",
+ params: {
+ auId: "8b6bc",
+ network: "adnuntius",
+ targeting: {
+ c: ['prebids']
+ }
+ }
+ }
+ ]
+}
+```
\ No newline at end of file
diff --git a/dev-docs/bidders/adot.md b/dev-docs/bidders/adot.md
new file mode 100644
index 0000000000..d995d14f0e
--- /dev/null
+++ b/dev-docs/bidders/adot.md
@@ -0,0 +1,34 @@
+---
+layout: bidder
+title: Adot
+description: Prebid Adot Bidder Adapter
+biddercode: adot
+hide: true
+media_types: banner, video, native
+gdpr_supported: true
+---
+
+### Table of Contents
+
+- [Bid Params](#bid-params)
+- [Video Object](#video-object)
+
+#### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------|
+| `placementId` | optional | The placement ID from Adot. | `'adot_placement_224521'` | `string` |
+| `position` | optional | Specify the position of the ad as a relative measure of visibility or prominence. Allowed values: Unknown: `0` (default); Above the fold: `1` ; Below the fold: `3`. | `0` | `integer-` |
+| `video` | optional | Object containing video targeting parameters. See [Video Object](#video-object) for details. | `video: { mimes: ['video/mp4'] }` | `object` |
+
+#### Video Object
+
+{: .table .table-bordered .table-striped }
+| Name | Description | Type |
+|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| `mimes` | Array of strings listing the content MIME types supported, e.g., `['video/mp4']`. | `Array` |
+| `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` |
+| `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` |
+| `protocols` | Array of supported video protocols, e.g., `[2, 3]` | `Array` |
+| `container` | Selector used for finding the element in which the video player will be displayed, e.g., `#div-1`. The `ad unit code` will be used if no `container` is provided. | `string` |
\ No newline at end of file
diff --git a/dev-docs/bidders/adtarget.md b/dev-docs/bidders/adtarget.md
deleted file mode 100644
index ec2ed9fd00..0000000000
--- a/dev-docs/bidders/adtarget.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: bidder
-title: adtarget
-description: Prebid adtarget Bidder Adaptor
-biddercode: adtarget
-hide: true
-media_types: banner, video
-gdpr_supported: true
-schain_supported: true
-usp_supported: true
-userIds: unifiedId/tradedesk, id5Id
-aliasCode: gamoshi
----
-
-### Bid params
-
-{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|-------------------|----------|---------------------------------------------------------------|----------------------|----------|
-| `supplyPartnerId` | required | ID of the supply partner you created in the adtarget dashboard. | `'12345'` | `string` |
diff --git a/dev-docs/bidders/adxcg.md b/dev-docs/bidders/adxcg.md
index 37b1edfd1f..3879d9cb42 100644
--- a/dev-docs/bidders/adxcg.md
+++ b/dev-docs/bidders/adxcg.md
@@ -6,7 +6,7 @@ hide: true
biddercode: adxcg
media_types: native, video
gdpr_supported: true
-userIds: pubCommon, unifiedId/tradedesk
+userIds: id5Id, identityLink, pubCommonId, unifiedId
---
### Bid Params
diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md
index 5fde36757b..395e2fa413 100644
--- a/dev-docs/bidders/appnexus.md
+++ b/dev-docs/bidders/appnexus.md
@@ -11,6 +11,7 @@ userIds: criteo
schain_supported: true
coppa_supported: true
usp_supported: true
+tcf2_supported: true
---
### Table of Contents
diff --git a/dev-docs/bidders/automatadBidAdapter.md b/dev-docs/bidders/automatadBidAdapter.md
new file mode 100644
index 0000000000..dc2d5a631b
--- /dev/null
+++ b/dev-docs/bidders/automatadBidAdapter.md
@@ -0,0 +1,17 @@
+---
+layout: bidder
+title: Automatad OpenRTB Bid Adapter
+description: Automatad OpenRTB Bid Adapter
+biddercode: automatad
+hide: true
+media_types: banner
+---
+
+#### Bid Params
+
+{: .table .table-bordered .table-striped }
+
+| Name | Scope | Description | Example | Type |
+|-----------|----------|---------------------------|------------|----------|
+| `siteId` | required | The site ID from automatad. | `"12adf45c"` | `string` |
+| `placementId` | required | The placement ID from automatad. | `"a34gh6d"` | `string` |
diff --git a/dev-docs/bidders/beachfront.md b/dev-docs/bidders/beachfront.md
index a4e02261d4..02538b9b56 100644
--- a/dev-docs/bidders/beachfront.md
+++ b/dev-docs/bidders/beachfront.md
@@ -7,7 +7,7 @@ biddercode: beachfront
media_types: video
gdpr_supported: true
usp_supported: true
-userIds: unifiedId/tradedesk
+userIds: unifiedId
---
### Bid Params
diff --git a/dev-docs/bidders/bidlab.md b/dev-docs/bidders/bidlab.md
new file mode 100644
index 0000000000..96bb86b0ad
--- /dev/null
+++ b/dev-docs/bidders/bidlab.md
@@ -0,0 +1,21 @@
+---
+layout: bidder
+title: Bidlab
+description: Prebid Bidlab Bidder Adapter
+hide: true
+biddercode: bidlab
+gdpr_supported: true
+media_types: banner, video
+---
+
+### Note:
+
+The Bidlab Bidding adapter requires setup before beginning. Please contact us at hello@bidlab.ai
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `id` | required | Bidlab placement id | `1234asdf` | `string` |
+
diff --git a/dev-docs/bidders/cleanmedia.md b/dev-docs/bidders/cleanmedia.md
index d681cc3e96..6dce7f3995 100644
--- a/dev-docs/bidders/cleanmedia.md
+++ b/dev-docs/bidders/cleanmedia.md
@@ -8,7 +8,7 @@ media_types: banner, video
gdpr_supported: true
schain_supported: true
usp_supported: true
-userIds: unifiedId/tradedesk, id5Id
+userIds: id5Id, unifiedId
aliasCode: gamoshi
---
diff --git a/dev-docs/bidders/clicktripz.md b/dev-docs/bidders/clicktripz.md
new file mode 100644
index 0000000000..819a9772e4
--- /dev/null
+++ b/dev-docs/bidders/clicktripz.md
@@ -0,0 +1,16 @@
+---
+layout: bidder
+title: Clicktripz
+description: Prebid Clicktripz Bidder Adaptor
+hide: true
+biddercode: clicktripz
+media_types: banner
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------|---------|----------|
+| `placementId` | required | The Placement ID from Clicktripz | `'4312c63f'` | `string` |
+| `siteId` | required | The site ID from Clicktripz | `'prebid'` | `string` |
\ No newline at end of file
diff --git a/dev-docs/bidders/colossusssp.md b/dev-docs/bidders/colossusssp.md
index 854dec42e7..62ffd30fd6 100644
--- a/dev-docs/bidders/colossusssp.md
+++ b/dev-docs/bidders/colossusssp.md
@@ -7,6 +7,8 @@ biddercode: colossusssp
usp_supported: true
schain_supported: true
media_types: banner, video, native
+userIds: britepoolid, identityLink, unifiedId, id5Id
+gdpr: true
---
### Bid Params
diff --git a/dev-docs/bidders/connectad.md b/dev-docs/bidders/connectad.md
index f642ea0239..f12474e478 100644
--- a/dev-docs/bidders/connectad.md
+++ b/dev-docs/bidders/connectad.md
@@ -1,10 +1,15 @@
---
layout: bidder
title: ConnectAd
-description: Prebid Serverbid Bidder Adaptor
+description: ConnectAd Prebid Adaptor
hide: true
biddercode: connectad
-aliasCode: serverbid
+media_types: banner
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+schain_supported: true
+userIds: digitrust, id5Id, liveIntentId, parrableId, pubCommonId, unifiedId
---
@@ -13,5 +18,6 @@ aliasCode: serverbid
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|-------------|----------|--------------------------------|---------|-----------|
-| `siteId` | required | The site ID from ConnectAd. | `12345` | `integer` |
-| `networkId` | required | The network ID from ConnectAd. | `10047` | `integer` |
+| `siteId` | required | The site ID from ConnectAd. | 12345 | integer |
+| `networkId` | required | The network ID from ConnectAd. | 10047 | integer |
+| `floorprice`| optional | Requested Floorprice | 0.15 | integer |
diff --git a/dev-docs/bidders/converge.md b/dev-docs/bidders/converge.md
new file mode 100755
index 0000000000..cf6a3e9b2a
--- /dev/null
+++ b/dev-docs/bidders/converge.md
@@ -0,0 +1,20 @@
+---
+layout: bidder
+title: Converge
+description: Prebid Converge Bidder Adaptor
+hide: true
+biddercode: converge
+media_types: banner, video
+gdpr_supported: true
+usp_supported: true
+---
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------|
+| `uid` | required | Represents the Converge bidder system Ad Slot ID associated with the respective div id from the site page. | `59` | `integer` |
+| `priceType` | optional | Can take the values `gross` or `net`, default value is `net`. Net represents the header bid price with the Converge header bidder margin already extracted. Gross price does contain the Converge bidder margin within. | `'gross'` | `string` |
+| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Values can be empty. | `keywords: { topic: ['stress', 'fear'] }` | `object` |
diff --git a/dev-docs/bidders/conversant.md b/dev-docs/bidders/conversant.md
index 5caa13e052..59c95106ed 100644
--- a/dev-docs/bidders/conversant.md
+++ b/dev-docs/bidders/conversant.md
@@ -6,7 +6,7 @@ hide: true
biddercode: conversant
media_types: video
gdpr_supported: true
-userIds: pubCommon
+userIds: criteo, digitrust, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId
---
diff --git a/dev-docs/bidders/emoteev.md b/dev-docs/bidders/emoteev.md
index a2d37ae14c..42e68fabd3 100644
--- a/dev-docs/bidders/emoteev.md
+++ b/dev-docs/bidders/emoteev.md
@@ -5,7 +5,7 @@ description: Prebid Emoteev Bidder Adaptor
hide: true
biddercode: emoteev
gdpr_supported: true
-userIds: pubCommon
+userIds: pubCommonId
---
### Bid Params
diff --git a/dev-docs/bidders/evolution_tech.md b/dev-docs/bidders/evolution_tech.md
new file mode 100644
index 0000000000..a6f6de689c
--- /dev/null
+++ b/dev-docs/bidders/evolution_tech.md
@@ -0,0 +1,21 @@
+---
+layout: bidder
+title: E-volution tech
+description: Prebid E-volution tech Bidder Adapter
+hide: true
+biddercode: e_volution
+gdpr_supported: true
+media_types: banner, video
+---
+
+### Note:
+
+The E-volution Bidding adapter requires setup before beginning. Please contact us at admin@e-volution.ai
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `id` | required | E-volution tech placement id | `1234asdf` | `string` |
+
diff --git a/dev-docs/bidders/fidelity.md b/dev-docs/bidders/fidelity.md
index 114554980a..acf4cd7840 100644
--- a/dev-docs/bidders/fidelity.md
+++ b/dev-docs/bidders/fidelity.md
@@ -3,6 +3,7 @@ layout: bidder
title: Fidelity Media
description: Prebid Fidelity Media Bidder Adapter
hide: true
+schain_supported: true
biddercode: fidelity
media_types: banner
gdpr_supported: true
diff --git a/dev-docs/bidders/gambid.md b/dev-docs/bidders/gambid.md
index afbf08f298..3b41b81ffd 100644
--- a/dev-docs/bidders/gambid.md
+++ b/dev-docs/bidders/gambid.md
@@ -10,7 +10,7 @@ hide: true
media_types: banner, video
biddercode: gambid
aliasCode: gamoshi
-
+userIds: id5Id, unifiedId
---
### Bid params
diff --git a/dev-docs/bidders/gamoshi.md b/dev-docs/bidders/gamoshi.md
index 3066fae21a..d1e8736181 100644
--- a/dev-docs/bidders/gamoshi.md
+++ b/dev-docs/bidders/gamoshi.md
@@ -8,7 +8,7 @@ media_types: banner, video
gdpr_supported: true
schain_supported: true
usp_supported: true
-userIds: unifiedId/tradedesk, id5Id
+userIds: id5Id, unifiedId
---
### Bid params
diff --git a/dev-docs/bidders/gridNM.md b/dev-docs/bidders/gridNM.md
new file mode 100755
index 0000000000..8d0d63c955
--- /dev/null
+++ b/dev-docs/bidders/gridNM.md
@@ -0,0 +1,36 @@
+---
+layout: bidder
+title: TheMediaGridNM
+description: Prebid TheMediaGridNM Bidder Adapter
+hide: true
+biddercode: gridNM
+media_types: video
+gdpr_supported: true
+usp_supported: true
+---
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|------------------------|----------|------------------------------------------------------------------------------------------------------------------------|-----------------------------------|-----------------|
+| `secid` | required | section id, will be used by JW Player to pass their info | `'11'` | `string` |
+| `pubid` | required | publisher id, will be used by JW Player to pass their info | `'22'` | `string` |
+| `source` | required | source of traffic, in JW Player case should be 'jwp' | `'jw_player'` | `string` |
+| `pubdata` | optional | publisher data, will be used by JW Player to pass their info | `{"jwpseg" : ["1111", "2222"]})` | `object` |
+| `floorcpm` | optional | floor cpm | `0.56` | `float` |
+| `video` | required | video parameters which should be passed for no-mapping approach | | `object` |
+| `video.mimes` | required | Content MIME types supported | `['video/mp4', 'video/x-ms-wmv']` | `string array` |
+| `video.mind` | optional | Minimum video ad duration in seconds. | `1` | `integer` |
+| `video.maxd` | optional | Maximum video ad duration in seconds | `60` | `int` |
+| `video.protocols` | required | Array of supported video protocols | `[1,2,3,4,5,6]` | `integer array` |
+| `video.size` | optional | player size wxh | `'300x250'` | `string` |
+| `video.linearity` | optional | Indicates if the impression must be linear, nonlinear, etc. | `1` | `int` |
+| `video.skip` | optional | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes. | `0` | `int` |
+| `video.skipmin` | optional | Videos of total duration greater than this number of seconds can be skippable; only applicable if the ad is skippable. | `0` | `int` |
+| `video.skipafter` | optional | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable. | `0` | `int` |
+| `video.api` | optional | List of supported API frameworks for this impression | `[1,2,3,4,5,6]` | `integer array` |
+| `video.startdelay` | optional | Indicates the start delay in seconds | `0` | `int` |
+| `video.placement` | optional | Placement type for the impression. | `1` | `int` |
+| `video.playbackmethod` | optional | Playback methods that may be in use | `[1]` | `integer array` |
\ No newline at end of file
diff --git a/dev-docs/bidders/gumgum.md b/dev-docs/bidders/gumgum.md
index 273c732589..9f37bb50b2 100644
--- a/dev-docs/bidders/gumgum.md
+++ b/dev-docs/bidders/gumgum.md
@@ -6,9 +6,10 @@ hide: true
biddercode: gumgum
media_types: banner, video
schain_supported: true
-userIds: unifiedId/tradedesk, digitrustId
+userIds: digitrust, unifiedId
gdpr_supported: true
usp_supported: true
+tcf2_supported: true
---
### Note:
diff --git a/dev-docs/bidders/hybrid.md b/dev-docs/bidders/hybrid.md
new file mode 100644
index 0000000000..bed1b8892a
--- /dev/null
+++ b/dev-docs/bidders/hybrid.md
@@ -0,0 +1,66 @@
+---
+layout: bidder
+title: Hybrid.ai
+description: Prebid Hybrid.ai Bidder Adapter
+hide: true
+media_types: banner, video
+biddercode: hybrid
+gdpr_supported: true
+---
+
+### Note
+
+You can use this adapter to get a bid from Hybrid.ai
+Please reach out to your Hybrid.ai account team before using this plugin to get placeId.
+The code below returns a demo ad.
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------------|---------------------|-------------------------------------------------------------------|-------------------------------------|----------|
+| `placeId` | required | The place id. | '5af45ad34d506ee7acad0c26' | `string` |
+| `placement` | required | Adunit placement, possible values: banner, video | 'banner' | `string` |
+
+
+### Sample Banner Ad Unit
+
+```js
+var adUnits = [{
+ code: 'banner_ad_unit',
+ mediaTypes: {
+ banner: {
+ sizes: [[728, 90]]
+ }
+ },
+ bids: [{
+ bidder: "hybrid",
+ params: {
+ placement: "banner", // required
+ placeId: "5af45ad34d506ee7acad0c26" // required
+ }
+ }]
+}];
+```
+
+### Sample Video Ad Unit
+
+```js
+var adUnits = [{
+ code: 'video_ad_unit',
+ mediaTypes: {
+ video: {
+ context: 'outstream', // required, possible values: instream, outstream
+ playerSize: [640, 480] // required
+ }
+ },
+ bids: [{
+ bidder: 'hybrid',
+ params: {
+ placement: "video", // required
+ placeId: "5af45ad34d506ee7acad0c26" // required
+ }
+ }]
+}];
+```
diff --git a/dev-docs/bidders/indexExchange.md b/dev-docs/bidders/indexExchange.md
index 9d4145ace6..64aad5e038 100644
--- a/dev-docs/bidders/indexExchange.md
+++ b/dev-docs/bidders/indexExchange.md
@@ -7,6 +7,7 @@ hide: true
schain_supported: true
gdpr_supported: true
usp_supported: true
+tcf2_supported: true
media_types: banner, video
---
@@ -273,6 +274,23 @@ pbjs.setConfig({
});
```
+#### User Sync
+Add the following code to enable user sync. IX strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the IX bid rate and bid price. Be sure to call `pbjs.setConfig()` only once.
+
+```
+pbjs.setConfig({
+ userSync: {
+ iframeEnabled: true,
+ filterSettings: {
+ iframe: {
+ bidders: ['ix'],
+ filter: 'include'
+ }
+ }
+ }
+});
+```
+
### 2. Include `ixBidAdapter` in your build process
When running the build command, include `ixBidAdapter` as a module, as well as `dfpAdServerVideo` if you require video support.
diff --git a/dev-docs/bidders/justpremium.md b/dev-docs/bidders/justpremium.md
index 8c3a2303b2..e97901d5ab 100644
--- a/dev-docs/bidders/justpremium.md
+++ b/dev-docs/bidders/justpremium.md
@@ -6,6 +6,7 @@ hide: true
biddercode: justpremium
gdpr_supported: true
usp_supported: true
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md
index f35cddaa20..b785fc6ed9 100644
--- a/dev-docs/bidders/kargo.md
+++ b/dev-docs/bidders/kargo.md
@@ -4,7 +4,7 @@ title: Kargo
description: Prebid Kargo Bidder Adaptor
hide: true
biddercode: kargo
-userIds: unifiedId/tradedesk
+userIds: unifiedId
usp_supported: true
---
diff --git a/dev-docs/bidders/livewrapped.md b/dev-docs/bidders/livewrapped.md
index e43914b819..690c8d80d6 100644
--- a/dev-docs/bidders/livewrapped.md
+++ b/dev-docs/bidders/livewrapped.md
@@ -6,7 +6,7 @@ biddercode: livewrapped
hide: true
media_types: banner
gdpr_supported: true
-userIds: pubcommon
+userIds: id5Id, pubCommonId
---
### Note:
diff --git a/dev-docs/bidders/medianet.md b/dev-docs/bidders/medianet.md
index 80adc8e487..fcc8293e15 100644
--- a/dev-docs/bidders/medianet.md
+++ b/dev-docs/bidders/medianet.md
@@ -7,6 +7,7 @@ hide: true
gdpr_supported: true
media_types: banner,native
usp_supported: true
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
### Bid Params
diff --git a/dev-docs/bidders/mobsmart.md b/dev-docs/bidders/mobsmart.md
index a0c4ea1d5d..fc12ffd1f9 100644
--- a/dev-docs/bidders/mobsmart.md
+++ b/dev-docs/bidders/mobsmart.md
@@ -5,7 +5,7 @@ description: Prebid Mobsmart SSP Bidder Adaptor
hide: true
biddercode: mobsmart
media_types: banner
-userIds: pubCommon
+userIds: pubCommonId
---
### Note:
diff --git a/dev-docs/bidders/nobidBidAdapter.md b/dev-docs/bidders/nobidBidAdapter.md
index e7c85ac0a1..9d0a48b517 100644
--- a/dev-docs/bidders/nobidBidAdapter.md
+++ b/dev-docs/bidders/nobidBidAdapter.md
@@ -9,13 +9,15 @@ gdpr_supported: true
usp_supported: true
schain_supported: true
coppa_supported: true
+---
### Bid Params
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|---------------|----------|-------------|---------|----------|
-| `siteId` | required | siteId is provided by your Nobid account manager | | `integer` |
+| `siteId` | required | siteId is provided by your NoBid account manager(s) | | `integer` |
+| `placementId` | optional | placementId is provided by your NoBid account manager(s). This parameter allows to report on a specific ad unit | | `integer` |
# Test Parameters
```
@@ -31,7 +33,8 @@ coppa_supported: true
{
bidder: "nobid",
params: {
- siteId: 2
+ siteId: 2,
+ placementId: 3
}
}
]
diff --git a/dev-docs/bidders/oneVideo.md b/dev-docs/bidders/oneVideo.md
index 8fff0bb293..bca090e9c7 100644
--- a/dev-docs/bidders/oneVideo.md
+++ b/dev-docs/bidders/oneVideo.md
@@ -6,6 +6,7 @@ hide: true
biddercode: oneVideo
media_types: video
gdpr_supported: true
+tcf2_supported: true
usp_supported: true
---
diff --git a/dev-docs/bidders/onetag.md b/dev-docs/bidders/onetag.md
index 3761f23760..23bada9d2d 100644
--- a/dev-docs/bidders/onetag.md
+++ b/dev-docs/bidders/onetag.md
@@ -4,9 +4,10 @@ title: OneTag
description: Prebid OneTag Bidder Adaptor
hide: true
biddercode: onetag
-media_types: banner
+media_types: banner, video
gdpr_supported: true
usp_supported: true
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
@@ -17,4 +18,7 @@ usp_supported: true
| Name | Scope | Description | Example | Type |
|---------|----------|-----------------------------------|--------------|----------|
| `pubId` | required | | `'386276e072'` | `string` |
-| `type` | optional | The media type, default is banner | `'banner'` | `string` |
+
+### Video Additional Information
+
+Note that right now video support is only provided when the context is "instream" or "outstream". Also a renderer should be included when defining an outstream adUnit.
diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md
index f88d716f1f..845f6fd74f 100644
--- a/dev-docs/bidders/openx.md
+++ b/dev-docs/bidders/openx.md
@@ -9,8 +9,9 @@ schain_supported: true
gdpr_supported: true
usp_supported: true
coppa_supported: true
-userIds: pubCommon, unifiedId, identityLink
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
prebid_member: true
+tcf2_supported: true
---
### Bid Parameters
diff --git a/dev-docs/bidders/ozone.md b/dev-docs/bidders/ozone.md
index c2f2b86e27..bf9a458861 100644
--- a/dev-docs/bidders/ozone.md
+++ b/dev-docs/bidders/ozone.md
@@ -6,6 +6,7 @@ biddercode: ozone
hide: true
media_types: banner
gdpr_supported: true
+userIds: criteo, id5Id, identityLink, liveIntentId, parrableId, pubCommonId
---
#### Bid Params
diff --git a/dev-docs/bidders/platformio.md b/dev-docs/bidders/platformio.md
index 9ef208f358..df6f1f7f25 100644
--- a/dev-docs/bidders/platformio.md
+++ b/dev-docs/bidders/platformio.md
@@ -15,7 +15,6 @@ gdpr_supported: true
|---------------|----------|----------------------------------|----------------|----------|
| `pubId` | required | The publisher account ID | `'28082'` | `string` |
| `siteId` | required | The publisher site ID | `'26047'` | `string` |
-| `size` | required | Ad size identifier | `'300X250'` | `string` |
| `placementId` | required | Identifies specific ad placement | `'17394'` | `string` |
| `bidFloor` | optional | The bid floor | `'0.001'` | `string` |
| `ifa` | optional | IFA ID | `'XXX-XXX'` | `string` |
@@ -25,9 +24,8 @@ gdpr_supported: true
### test params
```
- var adUnits = [{
+ var adUnits = [{
code: 'dfp-native-div',
- mediaType: 'native',
mediaTypes: {
native: {
title: {
@@ -48,9 +46,13 @@ gdpr_supported: true
bids: [{
bidder: 'platformio',
params: {
- pubId: '29521',
+ pubId: '29521',
siteId: '26048',
placementId: '123',
+ bidFloor: '0.001', // optional
+ ifa: 'XXX-XXX', // optional
+ latitude: '40.712775', // optional
+ longitude: '-74.005973', // optional
}
}]
},
@@ -59,7 +61,7 @@ gdpr_supported: true
mediaTypes: {
banner: {
sizes: [
- [300, 250]
+ [300, 250],[300,600]
],
}
},
@@ -68,16 +70,15 @@ gdpr_supported: true
params: {
pubId: '29521',
siteId: '26049',
- size: '300X250',
placementId: '123',
}
}]
},
{
code: 'dfp-video-div',
- sizes: [640, 480],
mediaTypes: {
video: {
+ playerSize: [[640, 480]],
context: "instream"
}
},
@@ -86,7 +87,6 @@ gdpr_supported: true
params: {
pubId: '29521',
siteId: '26049',
- size: '640X480',
placementId: '123',
video: {
skippable: true,
diff --git a/dev-docs/bidders/pubmatic.md b/dev-docs/bidders/pubmatic.md
index f2bb87c1b8..18342b6068 100644
--- a/dev-docs/bidders/pubmatic.md
+++ b/dev-docs/bidders/pubmatic.md
@@ -9,7 +9,7 @@ gdpr_supported: true
usp_supported: true
coppa_supported: true
schain_supported: true
-userIds: pubcommonId, unifiedId/tradedesk, digitrustId, id5Id, criteo, identityLink, liveIntent, parrable, britepoolId
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
prebid_member: true
---
diff --git a/dev-docs/bidders/pulsepoint.md b/dev-docs/bidders/pulsepoint.md
index 34b94e6f01..b9a45d4d59 100644
--- a/dev-docs/bidders/pulsepoint.md
+++ b/dev-docs/bidders/pulsepoint.md
@@ -8,7 +8,7 @@ gdpr_supported: true
usp_supported: true
schain_supported: true
media_types: banner, video, native
-userIds: pubcommonId, unifiedId, digitrustId, id5Id, britepoolId, criteo, identityLink, parrable, liveIntent
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId
---
diff --git a/dev-docs/bidders/quantcast.md b/dev-docs/bidders/quantcast.md
index 1829efd51f..042c83b62e 100644
--- a/dev-docs/bidders/quantcast.md
+++ b/dev-docs/bidders/quantcast.md
@@ -7,6 +7,8 @@ biddercode: quantcast
media_types: video
gdpr_supported: true
usp_supported: true
+tcf2_supported: true
+coppa_supported: true
---
### Bid Params
diff --git a/dev-docs/bidders/readpeak.md b/dev-docs/bidders/readpeak.md
index e0846db0c9..e114bb3b00 100644
--- a/dev-docs/bidders/readpeak.md
+++ b/dev-docs/bidders/readpeak.md
@@ -1,7 +1,7 @@
---
layout: bidder
-title: ReadPeak
-description: ReadPeak Bidder Adaptor
+title: Readpeak
+description: Readpeak Bidder Adaptor
hide: true
biddercode: readpeak
media_types: native
@@ -10,7 +10,8 @@ media_types: native
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|---------------|----------|-----------------------------------|------------------------------------------|----------|
-| `publisherId` | required | Publisher ID provided by ReadPeak | `'11bc5dd5-7421-4dd8-c926-40fa653bec76'` | `string` |
-| `bidfloor` | optional | CPM Bid Floor | `0.5` | `float` |
+| Name | Scope | Description | Example | Type |
+|---------------|-------------|------------------------------------|----------------------|----------|
+| `publisherId` | required | Publisher ID provided by Readpeak | `'c2aca92893d1b989'` | `string` |
+| `siteId` | recommended | Site/Media ID provided by Readpeak | `'5d1aef6a9088ced0'` | `string` |
+| `bidfloor` | optional | CPM Bid Floor | `0.5` | `float` |
diff --git a/dev-docs/bidders/relaido.md b/dev-docs/bidders/relaido.md
new file mode 100644
index 0000000000..f66ea77b64
--- /dev/null
+++ b/dev-docs/bidders/relaido.md
@@ -0,0 +1,15 @@
+---
+layout: bidder
+title: Relaido
+description: Prebid Relaido Bidder Adapter
+biddercode: relaido
+hide: true
+media_types: banner, video
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `placementId` | required | Relaido placement id | `1234567` | `string` |
diff --git a/dev-docs/bidders/richaudience.md b/dev-docs/bidders/richaudience.md
index 8424679615..a765162bb5 100644
--- a/dev-docs/bidders/richaudience.md
+++ b/dev-docs/bidders/richaudience.md
@@ -4,7 +4,7 @@ title: Rich Audience
description: Prebid Rich Audience Bidder Adapter
hide: true
biddercode: richaudience
-userIds: pubcommonId, unifiedId/tradedesk, id5Id, criteo, identityLink, liveIntent
+userIds: criteo, id5Id, identityLink, liveIntentId, pubCommonId, unifiedId
media_types: banner, video
gdpr_supported: true
---
diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md
index 11ec8071e5..dfab7df5e1 100644
--- a/dev-docs/bidders/rubicon.md
+++ b/dev-docs/bidders/rubicon.md
@@ -5,11 +5,12 @@ description: Rubicon Project Prebid Bidder Adaptor
hide: true
biddercode: rubicon
gdpr_supported: true
+tcf2_supported: true
usp_supported: true
coppa_supported: true
schain_supported: true
media_types: video
-userIds: unifiedId/tradedesk, digitrust, liveIntent
+userIds: digitrust, identityLink, liveIntentId, pubCommonId, unifiedId
prebid_member: true
---
diff --git a/dev-docs/bidders/sharethrough.md b/dev-docs/bidders/sharethrough.md
index 9da90a29e3..4bab3d9c00 100644
--- a/dev-docs/bidders/sharethrough.md
+++ b/dev-docs/bidders/sharethrough.md
@@ -7,7 +7,7 @@ biddercode: sharethrough
media_types: native
gdpr_supported: true
usp_supported: true
-userIds: unifiedId/tradedesk
+userIds: unifiedId
schain_supported: true
---
diff --git a/dev-docs/bidders/smartadserver.md b/dev-docs/bidders/smartadserver.md
index f1e2cda773..bd95585686 100644
--- a/dev-docs/bidders/smartadserver.md
+++ b/dev-docs/bidders/smartadserver.md
@@ -6,6 +6,9 @@ hide: true
biddercode: smartadserver
media_types: display, video
gdpr_supported: true
+schain_supported: true
+tcf2_supported: true
+usp_supported: true
---
### Note:
@@ -14,19 +17,20 @@ The Smart AdServer bidder adaptor requires setup and approval from the Smart AdS
### Bid params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|------------|----------|----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|-----------|
-| `siteId` | required | The placement site ID | `1234` | `integer` |
-| `pageId` | required | The placement page ID | `1234` | `integer` |
-| `formatId` | required | The placement format ID | `1234` | `integer` |
-| `domain` | optional | The network domain (default see example) | `'http://prg.smartadserver.com', 'https://prg.smartadserver.com'` | `string` |
-| `target` | optional | The keyword targeting | `'sport=tennis'` | `string` |
-| `currency` | optional | Override the default currency code (ISO 4217) of the ad request. (Default: `'USD'`) | `'EUR'` | `string` |
-| `bidfloor` | optional | Bid floor for this placement in USD or in the currency specified by the `currency` parameter. (Default: `0.0`) | `0.42` | `float` |
-| `appName` | optional | Mobile application name | `'Smart AdServer Preview'` | `string` |
-| `buId` | optional | Mobile application bundle ID | `'com.smartadserver.android.dashboard'` | `string` |
-| `ckId` | optional | Unique Smart AdServer user ID | `1234567890123456789` | `integer` |
-| `video` | optional | Parameter object for instream video. See [video Object](#smartadserver-video-object) | `{}` | `object` |
+| Name | Scope | Description | Example | Type |
+|------------|----------|----------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------|-----------|
+| `siteId` | required | The placement site ID | `1234` | `integer` |
+| `pageId` | required | The placement page ID | `1234` | `integer` |
+| `formatId` | required | The placement format ID | `1234` | `integer` |
+| `domain` | optional | The network domain (default see example) | `'http://prg.smartadserver.com', 'https://prg.smartadserver.com'` | `string` |
+| `target` | optional | The keyword targeting | `'sport=tennis'` | `string` |
+| `currency` | optional | Override the default currency code (ISO 4217) of the ad request. (Default: `'USD'`) | `'EUR'` | `string` |
+| `bidfloor` | optional | Bid floor for this placement in USD or in the currency specified by the `currency` parameter. (Default: `0.0`) | `0.42` | `float` |
+| `appName` | optional | Mobile application name | `'Smart AdServer Preview'` | `string` |
+| `buId` | optional | Mobile application bundle ID | `'com.smartadserver.android.dashboard'` | `string` |
+| `ckId` | optional | Unique Smart AdServer user ID | `1234567890123456789` | `integer` |
+| `video` | optional | Parameter object for instream video. See [video Object](#smartadserver-video-object) | `{}` | `object` |
+| `schain` | optional | Supply Chain | `'1.0,1!exchange1.com,1234,1,bid-request-1,publisher,publisher.com'` | `string` |
diff --git a/dev-docs/bidders/smartrtb.md b/dev-docs/bidders/smartrtb.md
index 0de6c48dba..d8d5a7c6a5 100644
--- a/dev-docs/bidders/smartrtb.md
+++ b/dev-docs/bidders/smartrtb.md
@@ -6,7 +6,7 @@ hide: true
biddercode: smartrtb
gdpr_supported: true
media_types: banner, video
-userIds: unifiedId,pubCommonId,id5id,digitrust
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
### bid params
diff --git a/dev-docs/bidders/sonobi.md b/dev-docs/bidders/sonobi.md
index f0f1f63fba..630603eea9 100644
--- a/dev-docs/bidders/sonobi.md
+++ b/dev-docs/bidders/sonobi.md
@@ -6,7 +6,7 @@ hide: true
biddercode: sonobi
media_types: video
gdpr_supported: true
-userIds: pubCommon, unifiedId/tradedesk
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
### Note:
@@ -25,6 +25,7 @@ implementing our adapter please don't hesitate to contact us at apex.prebid@sono
| `hfa` | optional | Publisher Unique Identifier | `'123985'` | `string` |
| `referrer` | optional | Overrides the default value for the ref param in a bid request | `'prebid.org'` | `string` |
| `keywords` | optional | Comma separated list of keywords about the site | `'sports,news,food'` | `string` |
+| `bid_request_url`| optional | String representing the url the Sonobi adapter should make to request bids | `'https://iad-2-apex.go.sonobi.com/trinity.json'` | `string` |
### Configuration
*You *must* only include one ID field - either `placement_id` or `ad_unit`, not both. If you have questions on which parameter to use, please reach out to your Account Manager.
diff --git a/dev-docs/bidders/sovrn.md b/dev-docs/bidders/sovrn.md
index 6f47b10cc6..c40c01993b 100644
--- a/dev-docs/bidders/sovrn.md
+++ b/dev-docs/bidders/sovrn.md
@@ -6,6 +6,7 @@ hide: true
biddercode: sovrn
gdpr_supported: true
usp_supported: true
+userIds: digitrust
---
diff --git a/dev-docs/bidders/spotx.md b/dev-docs/bidders/spotx.md
index deaed6dafe..7df17cd654 100644
--- a/dev-docs/bidders/spotx.md
+++ b/dev-docs/bidders/spotx.md
@@ -6,7 +6,7 @@ hide: true
biddercode: spotx
media_types: video
gdpr_supported: true
-userIds: unifiedId/tradedesk, id5Id
+userIds: id5Id, pubCommonId, unifiedId
prebid_member: true
schain_supported: true
usp_supported: true
diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md
index 011291784d..269a147d0e 100644
--- a/dev-docs/bidders/teads.md
+++ b/dev-docs/bidders/teads.md
@@ -5,6 +5,7 @@ description: Prebid Teads Bidder Adapter
hide: true
biddercode: teads
gdpr_supported: true
+tcf2_supported: true
usp_supported: true
schain_supported: true
media_types: banner, video
diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md
index 8ba3a46d69..fbfff42004 100644
--- a/dev-docs/bidders/triplelift.md
+++ b/dev-docs/bidders/triplelift.md
@@ -8,7 +8,7 @@ usp_supported: true
schain_supported: true
coppa_supported: true
biddercode: triplelift
-userIds: unifiedId/tradedesk, identityLink
+userIds: criteo, identityLink, unifiedId
---
### Bid Params
diff --git a/dev-docs/bidders/ucfunnel.md b/dev-docs/bidders/ucfunnel.md
index 27bf593873..f8a02e8687 100644
--- a/dev-docs/bidders/ucfunnel.md
+++ b/dev-docs/bidders/ucfunnel.md
@@ -7,6 +7,7 @@ biddercode: ucfunnel
media_types: video, native
gdpr_supported: true
usp_supported: true
+userIds: unifiedId
---
### Bid params
diff --git a/dev-docs/bidders/undertone.md b/dev-docs/bidders/undertone.md
index 35206b0e08..f3b237beb1 100644
--- a/dev-docs/bidders/undertone.md
+++ b/dev-docs/bidders/undertone.md
@@ -6,6 +6,7 @@ hide: true
biddercode: undertone
gdpr_supported: true
usp_supported: true
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
diff --git a/dev-docs/bidders/unicorn.md b/dev-docs/bidders/unicorn.md
new file mode 100644
index 0000000000..6bad86489a
--- /dev/null
+++ b/dev-docs/bidders/unicorn.md
@@ -0,0 +1,18 @@
+---
+layout: bidder
+title: UNICORN
+description: Prebid UNICORN Bidder Adaptor
+hide: true
+media_types: banner
+biddercode: unicorn
+---
+
+### bid params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------------------------------------|------------|-----------|
+| `placementId` | optional | Your placement ID | `'rectangle-ad-1'` | `string` |
+| `accountId` | required | Account ID for charge request (provided by UNICORN) | `12345` | `integer` |
+| `bidfloorCpm` | optional | Floor CPM (JPY); defaults to 0. | `0.2` | `float` |
+| `bcat` | optional | Blocked IAB categories | `['IAB-1', 'IAB-2']` | `[string]` |
diff --git a/dev-docs/bidders/valueimpression.md b/dev-docs/bidders/valueimpression.md
new file mode 100644
index 0000000000..019df8aeec
--- /dev/null
+++ b/dev-docs/bidders/valueimpression.md
@@ -0,0 +1,19 @@
+---
+layout: bidder
+title: Valueimpression
+description: Prebid Valueimpression Bidder Adapter
+hide: true
+biddercode: valueimpression
+media_types: banner, video
+gdpr_supported: true
+schain_supported: true
+usp_supported: true
+---
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------|--------------------------------------------------------------------------------------------------------------------------------|------------|----------|
+| `siteId` | required | Publisher site ID from Valueimpression | `'vi-site-id'` | `string` |
diff --git a/dev-docs/bidders/visx.md b/dev-docs/bidders/visx.md
index ff59f381bf..63823bfafa 100644
--- a/dev-docs/bidders/visx.md
+++ b/dev-docs/bidders/visx.md
@@ -5,6 +5,8 @@ description: Prebid VIS.X Bidder Adaptor
hide: true
biddercode: visx
gdpr_supported: true
+schain_supported: true
+userIds: digitrust, id5Id, unifiedId
---
### Note
diff --git a/dev-docs/bidders/windtalker.md b/dev-docs/bidders/windtalker.md
new file mode 100644
index 0000000000..f2dbbe9e23
--- /dev/null
+++ b/dev-docs/bidders/windtalker.md
@@ -0,0 +1,98 @@
+---
+layout: bidder
+title: Windtalker
+description: Prebid Windtalker Bidder Adapter
+hide: true
+biddercode: windtalker
+media_types: native, video
+gdpr_supported: true
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|----------------------------------|----------------|----------|
+| `pubId` | required | The publisher account ID | `'28082'` | `string` |
+| `siteId` | required | The publisher site ID | `'26047'` | `string` |
+| `size` | required | Ad size identifier | `'300X250'` | `string` |
+| `placementId` | required | Identifies specific ad placement | `'17394'` | `string` |
+| `bidFloor` | optional | The bid floor | `'0.001'` | `string` |
+| `ifa` | optional | IFA ID | `'XXX-XXX'` | `string` |
+| `latitude` | optional | Latitude | `'40.712775'` | `string` |
+| `longitude` | optional | Longitude | `'-74.005973'` | `string` |
+
+### test params
+
+```
+ var adUnits = [{
+ code: 'dfp-native-div',
+ mediaType: 'native',
+ mediaTypes: {
+ native: {
+ title: {
+ required: true,
+ len: 75
+ },
+ image: {
+ required: true
+ },
+ body: {
+ len: 200
+ },
+ icon: {
+ required: false
+ }
+ }
+ },
+ bids: [{
+ bidder: 'windtalker',
+ params: {
+ pubId: '29521',
+ siteId: '26048',
+ placementId: '123',
+ }
+ }]
+ },
+ {
+ code: 'dfp-banner-div',
+ mediaTypes: {
+ banner: {
+ sizes: [
+ [300, 250]
+ ],
+ }
+ },
+ bids: [{
+ bidder: 'windtalker',
+ params: {
+ pubId: '29521',
+ siteId: '26049',
+ size: '300X250',
+ placementId: '123',
+ }
+ }]
+ },
+ {
+ code: 'dfp-video-div',
+ sizes: [640, 480],
+ mediaTypes: {
+ video: {
+ context: "instream"
+ }
+ },
+ bids: [{
+ bidder: 'windtalker',
+ params: {
+ pubId: '29521',
+ siteId: '26049',
+ size: '640X480',
+ placementId: '123',
+ video: {
+ skippable: true,
+ }
+ }
+ }]
+ }
+ ];
+```
diff --git a/dev-docs/bidders/wipes.md b/dev-docs/bidders/wipes.md
new file mode 100644
index 0000000000..c8b9f59291
--- /dev/null
+++ b/dev-docs/bidders/wipes.md
@@ -0,0 +1,19 @@
+---
+layout: bidder
+title: WIPES
+description: Prebid WIPES Bidder Adaptor
+hide: true
+biddercode: wipes
+media_types: video
+---
+
+### Note:
+Publishers needs to be set up and approved by WIPES team to enable this adapter.
+Please contact support@wipestream.com for further information.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|------------------|--------------------------------------------------------|----------|
+| `asid` | required | The AD Slot ID | `'bX9mYMAi3ckOrv04tmHjPHUemnwrvZlCvDygJgHMHWhmUuMEPZI'`| `string` |
diff --git a/dev-docs/bidders/yieldlab.md b/dev-docs/bidders/yieldlab.md
index e18abbe8c6..28e56868f5 100644
--- a/dev-docs/bidders/yieldlab.md
+++ b/dev-docs/bidders/yieldlab.md
@@ -6,6 +6,7 @@ hide: true
biddercode: yieldlab
media_types: video
gdpr_supported: true
+userIds: britepoolId, criteo, digitrust, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
---
diff --git a/dev-docs/bidders/yieldlift.md b/dev-docs/bidders/yieldlift.md
new file mode 100644
index 0000000000..18ea489e40
--- /dev/null
+++ b/dev-docs/bidders/yieldlift.md
@@ -0,0 +1,26 @@
+---
+layout: bidder
+title: YieldLift
+description: Prebid YieldLift Bidder Adaptor
+hide: true
+biddercode: yieldlift
+media_types: banner
+gdpr_supported: true
+usp_supported: true
+schain_supported: true
+
+---
+
+### Integration Note:
+
+The YieldLift Header Bidding adapter requires approval from the YieldLift team. Please reach out to for more information.
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|------|----------|--------------------|-------------|-----------|
+| `unitId` | optional | Unit Id | `'13000'` | `string` |
+| `networkId` | optional | Network Id | `'2300000'` | `string` |
+| `publisherId` | optional | Publisher Id | `'8ba96b13-540d-4f8a-9f1b-2a7e804769cc'` | `string` |
diff --git a/dev-docs/bidders/yieldmo.md b/dev-docs/bidders/yieldmo.md
index bd3d8e9c8f..3d3048c52a 100644
--- a/dev-docs/bidders/yieldmo.md
+++ b/dev-docs/bidders/yieldmo.md
@@ -5,7 +5,7 @@ description: Prebid Yieldmo Bidder Adaptor
hide: true
biddercode: yieldmo
media_types: native
-userIds: pubCommon
+userIds: pubCommonId, unifiedId
---
diff --git a/dev-docs/get-started-with-prebid-server.md b/dev-docs/get-started-with-prebid-server.md
index 91f3e1956e..e5fdc258c6 100644
--- a/dev-docs/get-started-with-prebid-server.md
+++ b/dev-docs/get-started-with-prebid-server.md
@@ -37,7 +37,7 @@ Prebid Server is an open source project. [The source code is hosted under the P
- When approved, you will receive an email with your assigned `accountId`. You will need this for configuring Prebid.js to use Prebid Server.
- **Rubicon Project**
- - Reach out to your Rubicon Project account manager and proceed to **Step 2** below. You do not have to wait for a verification email to get started.
+ - [Learn more](https://rubiconproject.com/demand-manager-hosted-prebid-server/) about Rubicon Project's Hosted Prebid Server offering.
## Step 2. Download Prebid.js with Prebid Server enabled
diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md
index 3d18f40a0e..b7b82630d8 100644
--- a/dev-docs/modules/consentManagement.md
+++ b/dev-docs/modules/consentManagement.md
@@ -24,18 +24,19 @@ This consent management module is designed to support the EU General Data Protec
This module works with supported [Consent Management Platforms](https://www.cmswire.com/information-management/what-is-a-consent-management-platform/) (CMPs) to fetch an encoded string representing the user's consent choices and make it available for adapters to consume and process.
-{: .alert.alert-info :}
-See also the [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html) for supporting the California Consumer Protection Act (CCPA)
-
{: .alert.alert-warning :}
Prebid functionality created to address regulatory requirements does not replace each party's responsibility to determine its own legal obligations and comply with all applicable laws.
**We recommend consulting with your legal counsel before determining how to utilize these features in support of your overall privacy approach.**
-Here's a summary of the interaction process:
+This base EU GDPR consent management module performs these actions:
1. Fetch the user's GDPR consent data from the CMP.
2. Incorporate this data into the auction objects for adapters to collect.
-3. Proceed with the auction.
+
+The optional [GDPR enforcement module](/dev-docs/modules/gdprEnforcement.html) adds on these actions:
+
+3. Allows the page to define which activities should be enforced at the Prebid.js level.
+4. Actively enforces those activities based on user consent data.
In the case of a new user, CMPs will generally respond only after there is consent information available (i.e., the user has made their consent choices).
Making these selections can take some time for the average user, so the module provides timeout settings.
@@ -65,6 +66,7 @@ but we recommend migrating to the new config structure as soon as possible.
| gdpr | `Object` | | |
| gdpr.cmpApi | `string` | The CMP interface that is in use. Supported values are **'iab'** or **'static'**. Static allows integrations where IAB-formatted consent strings are provided in a non-standard way. Default is `'iab'`. | `'iab'` |
| gdpr.timeout | `integer` | Length of time (in milliseconds) to allow the CMP to obtain the GDPR consent string. Default is `10000`. | `10000` |
+| gdpr.defaultGdprScope | `boolean` | (TCF v2.0 only) Defines what the `gdprApplies` flag should be when the CMP doesn't respond in time. | `true` |
| gdpr.allowAuctionWithoutConsent | `boolean` | (TCF v1.1 only) Determines what will happen if obtaining consent information from the CMP fails; either allow the auction to proceed (`true`) or cancel the auction (`false`). Default is `true` | `true` |
| gdpr.consentData | `Object` | An object representing the GDPR consent data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | |
| gdpr.consentData.getTCData.tcString | `string` | (TCF v2.0 only) Base64url-encoded TCF v2.0 string with segments. | |
@@ -87,7 +89,7 @@ A related parameter is `deviceAccess`, which is at the global level of Prebid.js
### TCF v2.0 Examples
-Example 1: IAB CMP using custom timeout
+Example 1: IAB CMP using custom timeout and setting GDPR in-scope by default
{% highlight js %}
var pbjs = pbjs || {};
@@ -97,7 +99,8 @@ Example 1: IAB CMP using custom timeout
consentManagement: {
gdpr: {
cmpApi: 'iab',
- timeout: 8000
+ timeout: 8000,
+ defaultGdprScope: true
}
}
});
@@ -182,10 +185,12 @@ Follow the basic build instructions in the GitHub Prebid.js repo's main [README]
gulp build --modules=consentManagement,bidAdapter1,bidAdapter2
{% endhighlight %}
+You can also use the [Prebid.js Download](/download.html) page.
+
## Adapter Integration
{: .alert.alert-info :}
-Prebid.js adapters don't need to change to support TCF v2.0 if they already support TCF 1.1 -- the consent string is passed through the same bidrequest location. The bidder's endpoint, however, will need to change to support TCF v2.0. Once the endpoint supports TCF2, you can update the documentation.md file as described below above the table showing the list of TCF2-compliant bidders.
+Prebid.js adapters don't need to change to support TCF v2.0 if they already support TCF 1.1 -- the consent string is passed through the same bidrequest location. The bidder's endpoint, however, will need to change to support TCF v2.0. Once the endpoint supports TCF2, you can update the documentation.md file as described below above the table showing the list of TCF2-compliant bidders.
If you are submitting changes to an adapter to support this approach, please also submit a PR to the [docs repo](https://github.com/prebid/prebid.github.io) to add the `gdpr_supported: true` variable to your respective page in the [bidders directory](https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders). **This will ensure that your adapter's name will automatically appear on the list of adapters supporting GDPR.**
@@ -271,12 +276,13 @@ Page JavaScript can prevent Prebid.js from performing various activities that co
Here are some things that publishers can do to control various activities:
-1. If the user hasn't consented to Purpose 1:
+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)
- Don't enable [userId](/dev-docs/modules/userId.html) modules
-2. 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.
+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.
### Publishers Not Using an IAB-Compliant CMP
@@ -376,7 +382,7 @@ This should be be set to true once the parameters listed above are processed.
## Adapters Supporting TCF v1.1
-Bidders on this list have self-declared their TCF 1.1 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "gdpr_supported: true".
+Bidders on this list have self-declared their TCF 1.1 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "gdpr_supported: true".
@@ -402,7 +408,7 @@ var idx_gdpr=0;
## Adapters Supporting TCF v2.0
-Bidders on this list have self-declared their TCF 2.0 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "tcf2_supported: true".
+Bidders on this list have self-declared their TCF 2.0 support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "tcf2_supported: true".
+
+## Further Reading
+
+- [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html)
+- [IAB Transparancy and Consent Framework Policies](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/)
+- [Prebid Consent Management - US Privacy Module](/dev-docs/modules/consentManagementUsp.html)
diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md
index 3c1e70a288..1f2c6cfab4 100644
--- a/dev-docs/modules/floors.md
+++ b/dev-docs/modules/floors.md
@@ -12,9 +12,6 @@ sidebarType : 1
# Price Floors Module
{:.no_toc}
-{: .alert.alert-warning :}
-DRAFT
-
* TOC
{:toc}
@@ -22,447 +19,896 @@ DRAFT
The Floors module provides an open source framework in Prebid for Publishers to configure price floors on their own or to work with a vendor who can provide floors.
-A 'floor' is defined as the lowest price that a publisher will accept for a
-bid on a Prebid AdUnit. It's a way for publishers to protect the value of
-their inventory by requiring buyers to keep bids at a minimum level.
+A ‘floor’ is defined as the lowest CPM price a bid will need to meet for each Prebid auction. It’s a way for publishers to signal to bidders the price to beat, thereby protecting the value of their inventory.
-The module provides several ways for floors to be defined, passes them to
-bidders and enforces that bid responses meet the floor in any supported currency. The floors utilized by Prebid.js are fairly simple, spanning only three dimensions:
+The module provides several ways for floors to be defined, that are used by bidder adapters to read floors and enforced on bid responses in any supported currency. The floors utilized by the Prebid.js floors module are defined by one or more set of rules containing any or all of the following dimensions:
-- AdUnit or AdSlot
+
+- AdUnit
+- GPT Slot Name
- MediaType
- Ad Size
+- Domain
-The entire set of floors defined for a given page view are called 'Page Floors'. They may be defined in several ways:
+{: .alert.alert-warning :}
+When using GPT Slot name, the gpt library is required to load first. Failing to do so may yield unexpected results and could impact revenue performance.
-1. Right in the AdUnit
-1. With `setConfig`
-1. Retrieved from a real-time data service
+The entire set of floors selected by the Floors Module for a given auction is called a “Rule Location”. A Rule Location can be any one of:
+1. Within the AdUnit (AdUnit)
+2. Within setConfig (Package)
+3. Retrieved from a real-time data service (Dynamic)
-Examples for each of these scenarios follows.
{: .alert.alert-info :}
-Even though Page Floors are defined with only three attributes,
-it's possible to utilize other attributes of the page or user to define the
-Page Floors. For example, of floor values could be dynamically created
-based on device type, country, page category, etc.
+Even though floors are defined with five pre-configured dimensions, it’s possible to extend the list of dimensions to attributes of the page, user, auction or other data by supplying a dimension matching function. For example, a publisher can provide a matching function that returns the device type to allow the price floor module to use device type as an attribute within a prebid floor rules file.
+
+
+## How it Works
+There are several places where the Floor module changes the behavior of the Prebid.js auction process. Below is a diagram describing the general flow of the Floors Module:
+
+
+
+1. When building the Prebid.js package, the Floors module (and any analytics adapters) needs to be included with 'gulp build --modules=floors,...'
+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.
+4. Bid Adapters will pass the floor values to their bidding endpoints, to request bids, responding with any bids that meet or exceed the provided floor
+5. Bid adapters will submit bids to back to Prebid core, where the Floors Module will perform enforcement on each bid
+6. The Floors Module will mark all bids below the floor as bids rejected. Prebid core will submit all eligible bids to the publisher ad server
+ - a. The Floors module emits floor event / bid data to Analytics adapters to allow Floor Providers a feedback loop on floor performance for model training
+
## Defining Floors
-How price floors are defined in the page environment will depend on how you're
-obtaining the floors and how Prebid.js is integrated into the pages. We strongly recommend an automated analytical process rather than sporadic manual updates.
+How price floors are used in the page will depend on how you’re obtaining the floors and how Prebid.js is integrated into the pages. For optimal revenue performance, we strongly recommend an automated flooring method compared to manual, sporadic updates.
### Floors Defined in the AdUnit
-In this approach, the Publisher configures the floors directly into the Prebid.js
-AdUnits. This method can be used on simple pages or as part of a content
-management system that dynamically creates AdUnits.
-
-{% highlight js %}
- var adUnits = [
- {
- code: 'test-div',
- mediaTypes: {
- banner: { sizes: [[300,250],[300,600]] },
- video: {
- context: 'outstream',
- playerSize: [300,250],
- ...
- }
- },
- floors: {
- currency: 'USD',
- schema: {
- delimiter: '|',
- fields: [ 'mediaType', 'size' ]
- },
- values: [
- {key: 'banner|300x250', floor: 1.10},
- {key: 'banner|300x600', floor: 1.35},
- {key: 'video|300x250', floor: 2.00}
- ]
- },
- bids: [
- ...
- ]
+In this approach, the Publisher configures the floors directly into the Prebid.js AdUnits. This method can be used on simple pages or as part of a content management system that dynamically creates AdUnits.
+
+Below are some basic principles of ad unit floor definitions:
+
+- Ad unit defined rules only apply to the ad unit they are created in
+- Setting a rule with a value that does not match the context of that given ad unit will never be used
+- If multiple ad units have configured floor objects, the first ad unit’s schema would apply to all subsequent ad unit floor definitions
+ - Values can differ between ad units
+
+
+{% highlight js %}
+ var adUnits = [
+ {
+ code: 'test-div',
+ mediaTypes: {
+ banner: { sizes: [[300,250],[300,600]] },
+ video: {
+ context: 'outstream',
+ playerSize: [300,250],
+ ...
+ }
+ },
+ floors: {
+ currency: 'USD',
+ schema: {
+ delimiter: '|',
+ fields: [ 'mediaType', 'size' ]
+ },
+ values: {
+ 'banner|300x250': 1.10,
+ 'banner|300x600': 1.35,
+ 'video|300x250': 2.00
+ }
+ },
+ bids: [
+ ...
+ ]
+ }
+ ];
+{% 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 %}
+floors: {
+ currency: 'USD',
+ skipRate: 5,
+ modelVersion: 'Sports Ad Unit Floors',
+ schema: {
+ fields: [ 'mediaType']
+ },
+ values: {
+ 'banner': 0.8,
+ 'video': 2.01
}
- ];
+ }
{% endhighlight %}
-Note that the `values` object is what contains the actual floors, and in this
-example they're based on a combination of the mediaType and size. Since many
-adapters don't currently support defining a floor for each size, a simpler
-definition would be:
+For more advanced publisher setups, values can accept a “\*” to denote a catch all when a bid comes back that the floors module does not have an exact match and for bid adapters who are not able to use a floor per size, the bid adapter will automatically receive the “\*” rule’s floor if available. Example setup can be:
{% highlight js %}
- ...
- floors: {
- currency: 'USD',
- schema: {
- fields: [ 'mediaType' ]
- },
- values: [
- {key: 'banner', floor: 1.10},
- {key: 'video', floor: 2.00}
- ]
- },
- ...
+floors: {
+ currency: 'USD',
+ skipRate: 5,
+ modelVersion: 'Sports Ad Unit Floors',
+ schema: {
+ fields: [ 'mediaType', 'size']
+ },
+ values: {
+ 'banner|300x250': 0.8,
+ 'banner|300x600': 1.8,
+ 'banner|728x90': 0.90,
+ 'banner|*': 1.00,
+ 'video|300x250': 2.01,
+ 'video|*': 2.01
+ }
+}
{% endhighlight %}
-Or if there's only one mediaType in the AdUnit and a single global floor, the syntax gets easier:
+Alternatively, if there’s only one mediaType in the AdUnit and a single global floor, the syntax gets easier:
{% highlight js %}
- ...
- floors: {
- default: 1.00 // default currency is USD
- },
- ...
+...
+ floors: {
+ default: 1.00 // default currency is USD
+ },
+ ...
{% endhighlight %}
### Package-Level Floors
-This approach is intended for scenarios where the Publisher or their Prebid managed
-service provider periodically appends updated floor data to the Prebid.js package.
-In this model, there could be a more floor data present to
-cover AdUnits across many pages.
+This approach is intended for scenarios where the Publisher or their Prebid managed service provider periodically appends updated floor data to the Prebid.js package. In this model, there could be more floor data present to cover AdUnits across many pages.
{% highlight js %}
pbjs.setConfig({
floors: {
- auctionDelay: 0, // this is the default
- data: {
+ enforcement: {
+ floorDeals: false, //default to false
+ bidAdjustment: true
+ },
+ data: { // default if endpoint doesn't return in time
currency: 'USD',
+ skipRate: 5,
+ modelVersion: 'some setconfig model version',
schema: {
- fields: [ 'gptSlot' ]
+ fields: [ 'gptSlot', 'mediaType' ]
},
- values: [
- {key: '/1111/homepage/top-rect', floor: 0.80},
- {key: '/1111/homepage/left-nav', floor: 0.90},
+ values: {
+ '/1111/homepage/top-rect|banner': 0.80,
+ '/1111/homepage/top-rect|video': 2.20,
+ '/1111/homepage/top-rect|*': 1.50,
+ '/1111/homepage/left-nav|banner': 1.20,
+ '/1111/homepage/left-nav|video': 2.20,
+ '/1111/homepage/left-nav|*': 1.50,
... there could be hundreds of these ...
- {key: '/1111/tech/left-nav', floor: 1.50}
- ],
- default: 0.75
+ '*|banner': 0.98,
+ '*|video': 1.74
+ }
}
}
});
{% endhighlight %}
-By defining floor data with setConfig, the Floors module will map GPT ad slots to AdUnits as needed. It does this in the same way as the setTargetingForGPTAsync() function -- first looking for an AdUnit.code that matches the slot name, then looking for an AdUnit.code that matches the div id of the named GPT slot.
+By defining floor data with setConfig, the Floors module will map GPT ad slots to AdUnits as needed. It does this in the same way as the setTargetingForGPTAsync() function – first looking for an AdUnit.code that matches the slot name, then looking for an AdUnit.code that matches the div id of the named GPT slot.
-Here's another example that includes more fields:
+Here’s another example that includes more fields:
{% highlight js %}
pbjs.setConfig({
floors: {
- data: {
+ data: { // default if endpoint doesn't return in time
currency: 'USD',
+ skipRate: 5,
+ modelVersion: 'some setconfig model version',
schema: {
- fields: [ 'gptSlot', 'mediaType' ]
+ fields: [ 'domain', 'gptSlot', 'mediaType', 'size']
},
- values: [
- {key: '/1111/homepage/top-rect|banner', floor: 0.80},
- {key: '/1111/homepage/top-rect|video', floor: 1.20},
- {key: '/1111/homepage/left-nav|banner', floor: 0.90},
+ values: {
+ 'www.plublisher.com|/1111/homepage/top-rect|banner|300x250': 0.80,
+ 'www.publisher.com|/1111/homepage/top-rect|video|300x250': 2.20,
+ 'www.plublisher.com|/1111/homepage/left-nav|banner|300x250': 1.77,
+ 'www.publisher.com|/1111/homepage/left-nav|video|300x250': 2.88
...
- {key: '/1111/tech/left-nav|banner', floor: 1.50}
- ],
- default: 0.75
+ }
}
}
});
{% endhighlight %}
### Dynamic Floors
-The final method of obtaining floor data allows the publisher to delay the auction for a certain time period to obtain up-to-date floor data tailored to this specific pageview. The assumed workflow is:
-
+The final method of obtaining floor data allows the publisher to delay the auction for a certain time period to obtain up-to-date floor data tailored to each page or auction context. The assumed workflow is:
+
1. The Publisher signs up with a floor data provider
-1. The Publisher configures Prebid.js to resolve and enforce the price floor
-1. The Floor provider makes a JSON file available with floor data
+2. The Publisher configures Prebid.js to resolve and enforce the price floor
+3. The Floor provider makes a JSON file available with floor data
+
+Here’s an example defining a simple GET endpoint:
+
+{% highlight js %}
+pbjs.setConfig({
+ floors: {
+ enforcement: {
+ floorDeals: true, //default to false
+ },
+ auctionDelay: 100, // in milliseconds
+ endpoint: {
+ url: 'https://floorprovider.com/a1001-mysite.json'
+ }
+ }
+});
+{% endhighlight %}
+
+The floors module is flexible to handle floors set in multiple locations. Like in the below example a publisher can configure Dynamic floors in addition to Package floors (in setConfig). While the floors module is only able to use one set of rules (either Package, adUnit or Dynamic) defined as a Floor Location, setting floors in the Package will be utilized when the Dynamic floors fail to return data or another error condition occurs with the Dynamic fetch.
-Here's an example defining a simple GET endpoint:
{% highlight js %}
pbjs.setConfig({
floors: {
+ enforcement: {
+ floorDeals: false, //default to false
+ },
auctionDelay: 100, // in milliseconds
endpoint: {
- url: 'https://floorprovider.com/a1001-mysite.json',
- method: 'GET'
+ url: 'https://floorprovider.com/a1001-mysite.json'
},
data: { // default if endpoint doesn't return in time
currency: 'USD',
+ skipRate: 5,
+ modelVersion: ‘new model 1.0’
schema: {
fields: [ 'mediaType' ]
},
- values: [
- {key: 'banner', floor: 0.80},
- {key: 'video', floor: 1.20}
- ]
+ values: {
+ 'banner': 0.80,
+ 'video': 1.20
+ }
}
}
});
{% endhighlight %}
-If the dynamic data doesn't come back from the endpoint in time, the floors defined in the data object will be utilized.
-### SetConfig Syntax
+### Floors Syntax
The examples above covered several different scenarios. Here are all the options supported by the Floors module.
{: .table .table-bordered .table-striped }
-| Param | Required? | Type | Description | Default |
+| Param | Type | Description | Default |
|---+---+---+---+---|
-| auctionDelay | no | integer | number of milliseconds to delay the auction. Will always be 0 if there's no endpoint param. Must be > 0 if endpoint is defined. | 100 if the 'endpoint' param is defined. 0 otherwise.|
-| endpoint | no | object | defines how PBJS should call out to a floor provider to obtain dynamic floor data | none |
-| endpoint.url | no | string | URL of the endpoint | none |
-| endpoint.method | no | string | Only GET is currently supported. | "GET" |
-| data | object | yes | floor data that may be used by the module to send to bidders and enforce floors. Used as a fallback if a dynamic floor service doesn't respond within the auctionDelay period. | none |
-| data.currency | no | floor data will expressed in a given currency, which will be converted as needed to pass to adapters or enforce. | 'USD' |
-| data.schema | no | allows for flexible definition of how floor data is formatted. | none |
-| data.schema.delimiter | no | which character separates the floor keys | '\|' |
-| data.schema.fields | no | array of strings | supported values are: gptSlot, adUnitCode, mediaType, size | none |
-| data.values | no | array of objects | a series of attributes representing a hash of floor data in a format defined by the schema object. | none |
-| data.values.key | no | string | delimited field of attribute values that define a floor | none |
-| data.values.floor | no | float | the floor value for this key | none |
-| data.default | no | float | floor to use if there aren't any values or if none of them match | none |
+| enforcement | object | Controls the enforcement behavior within the Floors Module.| - |
+| enforcement.enforceJS | boolean | If set to true, the floor module will provide floors to bid adapters for bid request matched rules and suppress any bids not exceeding a matching floor. If set to false, the prebid floors module will still provide floors for bid adapters, there will be no floor enforcement.| true |
+| enforcement.enforcePBS | boolean | If set to true, the prebid js floors module will signal to PBS to pass floors to it’s bid adapters and enforce floors. If set to false, the pbjs should still pass matched bid request floor data to PBS, however no enforcement will take place. | false |
+| enforcement.floorDeals | boolean | Enforce floors for deal bid requests | false |
+| enforcement.bidAdjustment | boolean | Adjust floors passed to Bid Aapters. If bid adjustment is passed to PBS and flag set is not set to false | true |
+| endpoint | object | Controls behavior for dynamically retrieving floors | - |
+| endpoint.url | string | URL of endpoint to retrieve dynamic floor data | - |
+| data | object (required) | Floor data used by the Floors Module to pass floor data to bidders and floor enforcement | - |
+| data.currency | string |Currency of floor data. Floor Module will convert currency where necessary. See Currency section for more details. | 'USD' |
+| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. | 0 |
+| data.modelVersion | string | Used by floor providers to train on model version performance. The expectation is a floor provider’s analytics adapter will pass the model verson back for algorithm training. | - |
+| data.schema | object |allows for flexible definition of how floor data is formatted. | - |
+| data.schema.delimiter | string | Character separating the floor keys | '\|' |
+| data.schema.fields | array of strings | supported values are: gptSlot, adUnitCode, mediaType, size | - |
+| data.values | key / values | a series of attributes representing a hash of floor data in a format defined by the schema object. | - |
+| data.values."rule key" | string | delimited field of attribute values that define a floor | - |
+| data.values."floor" | float | the floor value for this key | - |
+| data.default | float | Floor used if no matching rules are found | - |
-## How it Works
-There are several places where the Floor module changes the behavior of the Prebid.js auction process.
+## Rule Handling
+
+### Rule Location Priority
+
+As defined in the overview, a Rule Location is where a particular rule is located, either defined in the Ad Unit, within setConfig or via a fetch from the browser (named Dynamic) for fresh rules. It may be possible (rather more than likely) that floor rules can be set in one or more locations for a given Prebid auction (i.e. on requestBids). At auction, the Floors Module will only ever use rules from one Rule Location, decided at run-time. Each auction will be assigned an immutable set of rules from one Rule Location, even if the rules change prior to auction complete.
+
+The Floors Module will use the below prioritization scheme on determining which Rule Location is selected at run-time:
+
+- Dynamic
+- setConfig
+- adUnit
+
+
+### Rule Selection Process
+
+The job of the Prebid floors module is to select a matching Prebid floor rule for enforcement \(when a bid adapter bids in the auction\) given the context of each Ad Unit. With the usage of “\*” values in rules definitions \(where “\*” applies when no specific value matches\) multiple Prebid floor rules can match for a given ad unit auction.
+
+The Prebid Floors module algorithm will produce a list of every possible permutation for each ad unit auction based on the defined schema types. The best matching rule for each enforced bid request and getFloor is based on specificity of values \(meaning match an exact value\) weighted from left to right, where the specificity of a value in the left most column would match over a rule with it’s “\*” equivalent if “\*” is supplied.
+
+Priority order behavior where “\_” is a specific value, and the “\*” is a catch all
+
+Priority order for one column rule sets:
+
+ \_
+ \*
+
+Priority order for two column rule set:
+
+ \_ \| \_
+ \_ \| \*
+ \* \|\_
+ \* \| \*
+
+Priority order for three column rule sets:
+
+ \_ \| \_ \| \_
+ \_ \| \_ \| \*
+ \_ \| \* \| \_
+ \* \| \_ \| \_
+ \* \| \_ \| \*
+ \_ \| \* \| \*
+ \* \| \_ \| \*
+ \* \| \* \| \_
+ \* \| \* \| \*
+
+
+
+Below are some real example behaviors.
+
+#### Example 1
+
+Domain = www.website.com
+
+Floor provider rule definition
+
+{% highlight js %}
+{
+ "modelVersion": "Fancy Model",
+ "currency": "USD",
+ "schema": {
+ "fields": [ "mediaType", "size", "domain"],
+ },
+ "values": {
+ "banner|300x250|www.website.com": 1.01,
+ "banner|300x250|*": 2.01,
+ "banner|300x600|www.website.com": 3.01,
+ "banner|300x600|*": 4.01,
+ "banner|728x90|www.website.com": 5.01,
+ "banner|728x90|*": 6.01,
+ "banner|*|www.website.com": 7.01,
+ "banner|*|*": 8.01,
+ "*|300x250|www.website.com": 9.01,
+ "*|300x250|*": 10.01,
+ "*|300x600|www.website.com": 11.01,
+ "*|300x600|*": 12.01,
+ "*|728x90|www.website.com": 13.01,
+ "*|728x90|*": 14.01,
+ "*|*|www.website.com": 15.01,
+ "*|*|*": 16.01
+ },
+ "default": 0.01
+}
+{% endhighlight %}
+
+**Bidder A Bid**
+
+mediaType = banner
+Size = 300x600
+Domain context = www.website.com
+
+The Price Floor Module produces an internal hash table of all possible permutations of “banner”, “300x600”, “www.website.com” and “\*” with the most specific hash values up top, weighting rules priority from left column specific values to right. Each left value will weigh more than the subsequent column’s specific values. The Floors Module attempt to find the matching rule by cycling through each below possible rule (from top to bottom) against the above rule provider data set.
+
+{% highlight js %}
+{
+ "banner|300x600|www.website.com", //Most specific possible rule match against floor provider rule set
+ "banner|300x600|*",
+ "banner|*|www.website.com",
+ "*|300x600|www.website.com”,
+ "banner|*|*",
+ "*|300x600|*",
+ "*|300x600|*",
+ "*|*|www.website.com",
+ "*|*|*"
+ }
+{% endhighlight %}
+
+Matching rule: "banner|300x600|www.website.com"
+Floor enforced: 3.01
+
+
+**Bidder B Bid**
+
+mediaType = video
+Size = 640x480
+Domain context = www.website.com
+
+Price Floor internal possible permutations sorted by priority:
+{% highlight js %}
+{
+ "video|640x480|www.website.com", //Fails to match due to no video specific rule
+ "video|640x480|*", //Fails to match due to no video specific rule
+ "video|*|www.website.com", //Fails match due to no video specific rule
+ "*|640x480|www.website.com", //Fails match due to no size 480 specific rule
+ "video|*|*", //Fails match due to no size video specific rule
+ "*|640x480|*", //Fails match due to no size 480 specific rule
+ "*|*|www.website.com", //Matching rule
+ "*|*|*"
+ }
+{% endhighlight %}
+
+Matching rule: "\*|\*|www.website.com"
+Enforced Floor: 15.01
+
+
+**Bidder C Bid**
+
+mediaType = video
+Size = 300x250
+Domain context = www.website.com
+
+Price Floor internal possible permutations sorted by priority:
+{% highlight js %}
+{
+ "video|300x250|www.website.com", //Fails to match due to no video specific rule
+ "video|300x250|*", //Fails to match due to no video specific rule
+ "video|*|www.website.com", //Fails to match due to no video specific rule
+ "*|300x250|www.website.com", //Matching rule
+ "video|*|*",
+ "*|300x250|*",
+ "*|*|www.website.com",
+ "*|*|*"
+ }
+{% endhighlight %}
+
+Matching Rule "\*|300x250|www.website.com”
+Enforced floor: 10.01
+
+#### Example 2
+
+Similar data set with slightly different rules and same bids from each bidder. Matching rules will differ from example 1.
+
+Domain = www.website.com
+
+Floor provider rule definition
+
+{% highlight js %}
+{
+ "modelVersion": "Fancy Model",
+ "currency": "USD",
+ "schema": {
+ "fields": [ "mediaType", "size", "domain"],
+ },
+ "values": {
+ "banner|300x250|www.publisher.com": 1.01,
+ "banner|300x250|*": 2.01,
+ "banner|300x600|www.publisher.com": 3.01,
+ "banner|300x600|*": 4.01,
+ "banner|728x90|www.website.com": 5.01,
+ "banner|728x90|*": 6.01,
+ "banner|*|www.website.com": 7.01,
+ "banner|*|*": 8.01,
+ "video|*|*": 9.01,
+ "*|300x250|www.website.com": 9.01,
+ "*|300x250|*": 10.01,
+ "*|300x600|www.website.com": 11.01,
+ "*|300x600|*": 12.01,
+ "*|728x90|www.website.com": 13.01,
+ "*|728x90|*": 14.01,
+ "*|*|www.website.com": 15.01,
+ "*|*|*": 16.01
+ },
+ "defaultValue": 0.01
+}
+{% endhighlight %}
+
+**Bidder A Bid**
+
+mediaType = banner
+Size = 300x600
+Domain context = www.website.com
+
+{% highlight js %}
+{
+ "banner|300x600|www.website.com", // Fails due to website.com does not match with banner and 300x600
+ "banner|300x600|*", // Banner, 300x600 * matches first
+ "banner|*|www.website.com",
+ "*|300x600|www.website.com”,
+ "banner|*|*",
+ "*|300x600|*",
+ "*|300x600|*",
+ "*|*|www.website.com",
+ "*|*|*"
+ }
+{% endhighlight %}
+
+Matching rule: "banner|300x600|\*"
+Floor enforced: 4.01
+
+**Bidder B Bid**
+
+mediaType = video
+Size = 640x480
+Domain context = www.website.com.
+
+Price Floor internal possible permutations sorted by priority:
+
+{% highlight js %}
+{
+ "video|640x480|www.website.com", //Fails to match due to no video specific rule
+ "video|640x480|*", //Fails to match due to no video specific rule
+ "video|*|www.website.com", //Fails match due to no video specific rule
+ "*|640x480|www.website.com", //Fails match due to no size 480 specific rule
+ "video|*|*", //Matches existing rule
+ "*|640x480|*",
+ "*|*|www.website.com",
+ "*|*|*"
+ }
+{% endhighlight %}
+
+Matching rule: "video\|\*\|\*"
+Enforced Floor: 9.01
+
+
+**Bidder C Bid**
+
+mediaType = video
+Size = 300x250
+Domain context = www.website.com
+
+Price Floor internal possible permutations sorted by priority:
+
+{% highlight js %}
+{
+ "video|300x250|www.website.com", //Fails to match due to no video specific rule
+ "video|300x250|*", //Fails to match due to no video specific rule
+ "video|*|www.website.com", //Fails to match due to no video specific rule
+ "*|300x250|www.website.com", //Matching existing rule
+ "video|*|*",
+ "*|300x250|*",
+ "*|*|www.website.com",
+ "*|*|*"
+ }
+{% endhighlight %}
+
+Matching Rule "\*|300x250|www.website.com”
+Enforced floor: 10.01
-1. When building the Prebid.js package, the Floors module needs to be included with 'gulp build --modules=floors,...'
-1. As soon as the setConfig({'floors'}) call is made, the Floors module will immediately initiate any calls to a dynamic floor endpoint.
-1. When an auction is initiated with requestBids(), the Floors module will request to delay the auction if the auctionDelay option is set.
-1. If it hasn't converted floor currencies already, the Floors module will look for the existence of a configured Ad Server Currency, converting floor prices as needed.
-1. Bid Adapters are responsible for utilizing the getFloors() function and passing the floor values to their bidding endpoints.
-1. Prebid.js core gives the Floors module a chance to review each bid response, which will be invalidated if they exceed the floor value.
-1. Analytics adapters have access to the floor data and any invalidated bid statuses.
## Interfaces
### Floor Data Provider Interface
-Dynamic endpoints must return JSON data that's formatted like the data object
-in the floor `setConfig` call. Floor data should be returned quickly because
-the auction may be waiting on it. This implies that it should either be
-stored on a CDN or be provided by a distributed tier of high performance servers.
+Floor data providers can supply data to publishers either within the setConfig as part of a Prebid.js Package if the provider is also a host provider of the Prebid library, or via a real-time Dynamic fetch, prior to the auction.
+
+Data providers can optionally build Analytics Adapters to ingest bid data within Prebid for algorithm learning and review floor performance. Please refer to the Analytics Interface section for more details.
+
+
+
+{% capture warning_note %}
+As a floor provider, your goal is to provide effective floors, with minimal page impact. If you are performing a Dynamic fetch to retrieve data prior to auctions, the following recommendations are advised to reduce page performance issues:
+
+- Return results to the page quickly. This implies data should be stored on a CDN or be provided by a distributed tier of high performance services
+- Work with publishers on setting appropriate auction delays to retrieve dynamic data
+- Implement client-side caching (such as max-age headers) whenever possible
+- Evaluate data freshness vs frequency of new fetches to the CDN to reduce unnecessary calls
+- Be aware of file sizes returned to the browser, implementing trimmiming algorithms for extremely large data sets
+{% endcapture %}
+{% include /alerts/alert_important.html content=warning_note %}
+
+For Dynamic fetches, the floors module will perform a GET request to the supplied endpoint, that must return valid JSON, formatted like the data object in the “setConfig” Package configuration.
+
+
+On rule creation, we recommend supplying various rules with catch all \(“\*”\) values with associated floors. This is to accommodate bid adapters who cannot retrieving floors on a per size basis, as well as using various permutations of rules with “\*” values to match auctions that do not have an exact match on a specific rule. Please refer to the Rule Selection Process when determining floors as attribute order and number of “\*”s may have an impact on which rule is selected.
+
+#### Example Dynamic fetch
-Example Response 1 - floor determined by GPT Ad Slot and mediatype
{% highlight js %}
-{
- data: {
- currency: 'USD',
- schema: {
- fields: [ 'gptSlot', 'mediaType' ]
- },
- values: [
- {key: '/1111/homepage/top-rect|banner', floor: 0.80},
- {key: '/1111/homepage/top-rect|video', floor: 1.20},
- {key: '/1111/homepage/left-nav|banner', floor: 0.90},
- ...
- {key: '/1111/tech/left-nav|banner', floor: 1.50}
- ],
- default: 0.75
+pbjs.setConfig({
+ floors: {
+ enforcement: {
+ floorDeals: true
+ },
+ auctionDelay: 100,
+ endpoint: {
+ url: 'https://floorprovider.com/a1001-mysite.json'
}
+ }
+});
+{% endhighlight %}
+
+#### Example Response 1
+
+floor determined by AdUnit code and Media Type:
+
+{% highlight js %}
+{
+ currency: 'USD',
+ skipRate: 5,
+ modelVersion: ‘new model 1.0’
+ schema: {
+ fields: [ 'gptSlot', 'mediaType' ]
+ },
+ values: {
+ '/1111/homepage/top-rect|banner': 0.80,
+ '/1111/homepage/top-rect|video': 1.20,
+ '/1111/homepage/left-nav|banner': 0.90,
+ ...
+ '/1111/tech/left-nav|banner': 1.50
+ },
+ default: 0.75
}
+
{% endhighlight %}
-Example Response 2 - floor determined by AdUnit code and size:
+#### Example Response 2
+
+floor determined by Domain, GPT Slot, Media Type and Size:
+
{% highlight js %}
{
- data: {
- currency: 'EUR',
- schema: {
- fields: [ 'adUnitCode', 'size' ]
- },
- values: [
- {key: 'div-1|300x250', floor: 0.80},
- {key: 'div-2|300x600', floor: 1.20},
- {key: 'div-2|300x250', floor: 0.90},
- ...
- {key: 'div-3|640x480', floor: 1.50}
- ],
- default: 0.75
- }
+ currency: 'EU',
+ skipRate: 20,
+ modelVersion: ‘High_skip_rate’
+ schema: {
+ fields: [ 'domain', 'gptSlot', 'mediaType', 'size' ]
+ },
+ values: {
+ 'www.publisher.com|/1111/homepage/top-banner|banner|728x90': 1.00,
+ 'www.publisher.com|/1111/homepage/top-rect|banner|300x250': 1.20,
+ 'www.publisher.com|/1111/homepage/top-rect|banner|300x600': 1.80,
+ ...
+ 'www.domain.com|/1111/homepage/top-banner|banner|728x90': 2.11
+ ...
+ 'www.publisher.com|*|*|*': 0.80,
+ },
+ default: 0.75
}
{% endhighlight %}
-The format of the request for dynamic floor data has been left open -
-each floor provider can determine the URL structure, working
-with the publisher to integrate their service into the page.
-### Prebid.js Bid Adapter Interface
+### Bid Adapter Interface
+
+The Prebid Floors Module is capable of handling an arbitrarily large set of floor rules of any combination of supported dimensions. To reduce the need for each bid adapter to process each and every rule in the selected rule data set, an encapsulated function (getFloor) was created to allow bid adapters to query the Floors Module for a floor for each mediaType, size and currency the bid adapter needs.
-Many Prebid.js bid adapters already allow the publisher to define a floor in
-their bidder-specific params. This module establishes a new and more powerful
-convention, but requires each adapter look for the floor data in the
-appropriate place. Rather than forcing adapters to look in the AdUnit and
-the global config and parse complicated floor data, we've thoughtfully
-provided a utility function called 'getFloors()'. To use it:
+If the price floors module is enabled for a given auction, the Floors Module will add to the bidRequest object the getFloor function. All bid adapters are recommended to call getFloor to retrieve a desired floor. The job of the getFloor function will be to return the floor CPM of a matched rule based on the rule selection process (written out above), using the getFloor inputs.
-1. import getFloor function
-1. call getFloors() with the desired parameters
-1. parse the results
-1. pass floor value(s) to the bid endpoint
+Intended changes for bid adapters:
+
+
+1. Check for presence of getFloor within the bidRequest obect
+1. If getFloors exists, call getFloor with desired parameters
+1. Parse floor and currency response
+1. Pass floor and / or currency to bid adapter endpoint
+
+getFloor takes in a single object with the following params:
{% highlight js %}
-getFloors(paramsObj);
+getFloor({
+ currency: string,
+ mediaType: string //Required
+ size : [ w, h] OR "*"
+});
{% endhighlight %}
{: .table .table-bordered .table-striped }
-| Param | Required? | Type | Description | Default |
-|---+---+---+---+---|
-| bidRequest | yes | object | bidRequest object passed to buildRequests function | none |
-| currency | no | string | preferred floor currency | adServerCurrency |
-| mediaType | no | string | some adapters don't support all media types, so this constrains results to just the type needed by the current ad unit. e.g. 'banner' | none |
-| supportMultipleSizes | no | boolean | supporting different floors per size isn't yet a common feature, but we default it to true. By supplying 'false' to this argument, a single floor value will be returned | true |
+| Param | Type | Description | Default |
+|---+---+---+---|
+| bidRequest | object | bidRequest object passed to buildRequests function | none |
+| mediaType | string | The media type within the current bidRequest context to receive a floor from the Floors Module. Floors Module will return best matching floor. Possible values are one of “banner”, “video”, “Native” or "\*" | "banner" |
+| size | Size array or ‘\*’ (required) | The size within the current bidRequest context to receive a floor from the Floors Module. Defaults to ‘\*’Array of size [w, h] for a specific size. If your bid adapter cannot handle size specific floors, use ‘\*’ to retrieve catch all size floor if defined by the publisher or floor provider | "\*" |
+| currency | String | The desired currency to return the floor in. Please refer to the currency section to understand how currency conversion is applied. If no currency is supplied, the floor module will assume USD. If the Floor Module cannot convert a floor to the supplied currency, bid adapters will be required to handle the supplied floor. | "USD" |
+
+#### getFloor Response
+
+{% highlight js %}
+{
+ currency: string,
+ floor: float
+}
+{% endhighlight %}
+
+Or empty object if a floor was not found for a given input
-The JSON object returned by the function looks similar to the floors object in the adunit.
+{% highlight js %}
+{ }
+{% endhighlight %}
-For example, a bidder adapter that can only handle one floor value could make this call:
+#### Example getFloor scenarios
+
+Example rules file used for getFloor
{% highlight js %}
-getFloors({
- bidRequest: bidRequestObj,
+{
+ "data": {
+ "currency": "USD",
+ "schema": {
+ "fields": [ "gptSlot", "mediaType", "size"]
+ },
+ "values": {
+ "/1111/homepage/top-rect|banner|300x250": 0.60,
+ "/1111/homepage/top-rect|banner|300x600": 1.78,
+ "/1111/homepage/top-rect|banner|*": 1.10,
+ "/1111/homepage/top-rect|video|480x600": 3.20,
+ "/1111/homepage/top-leaderboard|banner|728x90": 1.50
+ },
+ "default": 0.75
+ }
+}
+{% endhighlight %}
+
+**Example getFloor 1**
+
+getFloor for media type Banner for a bid request in the context of the gpt slot “/1111/homepage/top-rect” where the bid adapter does not support floors per size.
+
+{% highlight js %}
+getFloor({
currency: 'USD',
- mediaType: 'banner',
- supportMultipleSizes: false
+ mediatype: ‘banner’,
+ Size: ‘*’
});
{% endhighlight %}
-The response in this case would quite easy to parse:
+**Response**
{% highlight js %}
{
currency: 'USD',
- default: 1.80
+ floor: 1.10
}
{% endhighlight %}
-But if the `mediaType` field isn't passed in the params object, the response would provide different floor values for each mediaType:
+To aid in the accuracy of floor selection when using size ”\*” in getFloor, the Floors Module has built-in smart rule selection when an ad unit in the internal bidRequest to the bid adapters interface has one ad unit type and one size. In the above example, if the ad unit within the bidRequest object has an ad unit type of “banner” with only one size, say “300x250”, the Floors Module will intelligently select the rule with "banner\|300x250" in it, as opposed to the "banner\|\*" rule producing the following response:
{% highlight js %}
{
currency: 'USD',
- schema: {
- fields: [ 'mediaType' ]
- },
- data: [
- {key: 'banner', floor: 1.60},
- {key: 'video', floor: 1.80}
- ]
+ floor: 0.60
}
{% endhighlight %}
-And adapters that support full floor flexibility could receive something they need to parse:
+
+**Example getFloor 2**
+
+getFloor for media type Banner for a bid requests in the context of the gpt slot “/1111/homepage/top-rect” with size of 300x600 where bid adapter does support floors per size.
+
+{% highlight js %}
+getFloor({
+ currency: 'USD',
+ size: [300,600],
+ mediatype: ‘banner’
+});
+{% endhighlight %}
+
+**Response**
{% highlight js %}
{
currency: 'USD',
- schema: {
- fields: [ 'mediaType', 'size' ]
- },
- data: [
- {key: 'banner|300x250', floor: 1.50},
- {key: 'banner|300x600', floor: 1.60},
- {key: 'video|300x250', floor: 1.80},
- ]
+ floor: 1.78
}
{% endhighlight %}
-{: .alert.alert-info :}
-Note that whenever the `getFloors` function combines multiple underlying floors
-into one, it always chooses the highest floor in order to avoid any scenario
-where a bid is later discarded due to more granular flooring rules. Yes,
-this will affect bid density.
+Here are some examples of how a bid adapter may wish to configure their adapter to handle getFloor function:
+
+For a bid adapter who does not wish to handle making a request for each size in a given bid request they can leverage the \* attribute which is meant to be a skewed average for a floor.
+
+{% highlight js %}
+ if (typeof bidRequest.getFloor === 'function') {
+ let floorInfo = bidRequest.getFloor({
+ currency: 'USD',
+ mediaType: 'banner',
+ size: '\*'
+ });
+ data['adapter_floor'] = floorInfo.currency === 'USD' ? floorInfo.floor : undefined;
+ }
+{% endhighlight %}
+
+### Analytics Adapter Interface
-### Prebid.js Analytics Adapter Interface
+Price Floors providers will most likely rely heavily on their associated (or their partner’s) prebid analytics adapter in order to make the most informed and optimal price floor rule sets. Because of this, the price floors module needs to relay important information about the flooring and decisions made in the lifecycle of an auction.
-Analytics adapters may want to report on floor-related events:
+The price floors module will do this by leveraging the already existing implementation for prebid analytics adapters by exposing floorData information onto the bidRequest and bidResponse objects. Thus, when an analytics adapter hooks into these prebid events, it will be able to pick out the price floors data and pass it along to their servers.
-- which floors were sent to the bidders on each AdUnit
-- whether any bids were discarded because the bidder did not respect the floor
+**bidRequest**: Bid Requests objects are updated to contain some basic top level information which a floor provider may need:
-Like bid adapters, analytics adapters can call the 'getFloors()' utility
-function with each bidrequest object to obtain the floor data. They can
-check the status of the bid, which would be NO_BID_FLOOR if the bid was
-discarded because it was below the floor.
+{: .table .table-bordered .table-striped }
+| bidRequest.floorData. | Type | Description | example |
+|---+---+---+---+---|
+| skipped | Boolean | Whether the skipRate resolved to be true or false| true |
+| modelVersion | String | The name of the model| ‘floor-model-4.3’ |
+| location | String | Where the floor rules came from adUnit, setConfig, fetch | ‘floor-model-4.3’ |
+
+**bidResponse**: When a bid response is being processed it is important for analytics adapters to know the decision which was made and the context of the rule selection. Here is the data which is attached to each bidResponse:
+
+{: .table .table-bordered .table-striped }
+| bidResponse.floorData. | Type | Description | example |
+|---+---+---+---+---|
+| floorValue | number | The value of the floor chosen | 2.33 |
+| modelVersion | String | The name of the model| ‘floor-model-4.3’ |
+| floorRule | String | The matching rule for the given bidResponse | ‘div-1\|300x250\|\*’ |
+| floorCurrency | string | Currency of the matched floor | ‘USD’ |
+| cpmAfterAdjustments | number | The bidder response CPM after any applicable adjustments (currency and / or bidCpmAdjustments) | 2.20 |
+| enforcements | object | The input floor enforcements object. Keys are enforceJS, enforcePBS, floorDeald, bidAdjustment | { enforceJS: true, enforcePBS: false, floorDeals: false, bidAdjustment: true } |
+| matchedFields | object | Fields of the prebid auction used to match against the floorData.schema.fields. | { mediaType: ‘banner’, Size: ‘300x250, Domain: ‘www.prebid.org’, gptSlot: ‘/12345/prebid/sports’ } |
### Prebid Server Interface
-The Prebid Server Bid Adapter copies floor configuration to the OpenRTB2 protocol:
+Not supported in initial build. S2S config support will be coming in the subsequent release.
+
+
+## Currency
-- It copies AdUnit-specific floor values directly to the relevant imp object
-- It copies floors data coming from setConfig to ext.prebid.floors
-- It does not copy any endpoint information -- it is assumed that if dynamic floor data is used, that transaction is being handled by Prebid.js and should not be done again on the server side.
-- It always sets ext.prebid.options.enforcefloors to false because there's no way in OpenRTB to return no-bid status per-impression.
+The floors module will default the floor CPM currency with any associated rule to USD if none is supplied in the data object of the floors configuration. For any non-USD currency support, a publisher is required to specify the desired currency. If you are working with a floor provider, please speak to them about supplying the desired currency for your integration.
-AdUnit-specific Floors in OpenRTB:
+{% capture warning_note %}
+For publishers seeking to perform currency conversions within the floors module (for example if the floors data currency is not the same as a bid adapter’s supported currency), failure to include the currency module may result in unexpected behavior and / or may impact revenue performance.
+{% endcapture %}
+{% include /alerts/alert_warning.html content=warning_note %}
+
+Currency conversion can occur in two areas of the Floor Module code:
+- On the **getFloor** call when Bid Adapters request a floor
+- On the **enforcement** side when each bidder submits a bidResponse
+
+
+**getFloor**
+
+The job of the getFloor method is to retrieve an appropriate floor for the requesting Bid Adapter, for a given auction context. If a Bid Adapter performs a getFloor call with a currency different than the currency of the floor data, the Floors Module will attempt to perform a currency conversion, utilizing the convertCurrency function in the global Prebid object.
+
+If a currency conversion is successful in getFloor, the resulting floor will be returned to the requesting Bid Adapter. If the conversion failed, the Floors Module will return the original floor currency defined within the selected rule location data set.
+
+Example Rule:
+currency = ‘USD’,
+‘banner|300x250’: 1.00
+
+{% highlight js %}
+getFloor({
+ currency: ‘EUR’,
+ mediaType: ‘banner’,
+ size: [300, 250]
+});
+{% endhighlight %}
+
+If successfully returned the requested currency:
{% highlight js %}
{
- "cur": "USD",
- "imp": [{
- ...
- "ext": {
- "prebid": {
- "floors": {
- "data": {
- "currency": "USD",
- "schema": {
- "delimiter": "|",
- "fields": [ "mediaType", "size" ]
- },
- "values": [
- {"key": "banner|300x250", "floor": 0.90},
- {"key": "banner|300x360", "floor": 1.07},
- {"key": "banner|*", "floor": 0.56},
- ]
- }
- }
- }
- }
- }],
- "ext": {
- "prebid": {
- "options": {
- "enforcefloors": false,
- }
- }
- }
+ floor: 0.85,
+ currency: ‘EUR’
}
{% endhighlight %}
-Floors defined in `setConfig` are placed in the top-level `ext` object:
+If unsuccessfully returned the requested currency:
{% highlight js %}
{
- "cur": "USD",
- "imp": [{
- ...
- }],
- "ext": {
- "prebid": {
- "options": {
- "enforcefloors": false,
- },
- "floors": {
- "data": {
- "currency": "USD",
- "schema": {
- "delimiter": "|",
- "fields": [ "mediaType", "size" ]
- },
- "values": [
- {"key": "banner|300x250", "floor": 0.90},
- {"key": "banner|300x360", "floor": 1.07},
- {"key": "banner|*", "floor": 0.56},
- ]
- }
- }
- }
- }
+ floor:1.0,
+ currency: ‘USD’
}
{% endhighlight %}
-When called from Prebid.js, the convention is that Prebid Server will pass floors provided by Prebid.js to the adapters, but will not enforce floors.
+Currency conversion can fail for the following reasons:
+- Currency module is not included in the prebid bundle.
+- Currency module is included but not enabled
+- Currency module is included and enabled but:
+ - No default rates were set
+ - Currency rates fetch failed
+ - Data has not returned yet
+- Bidder passes in a currency code which does not have a conversion rate
+- Floors was set with a currency which does not have a conversion rate
+
+**Enforcement**
+
+Enforcement in the Floors module occurs when bidders respond (i.e. bid) with a bidResponse object into the Prebid auction. The Floors Module will read the bid submitted within each valid bidResponse and its associated currency, performing currency conversion where necessary.
-A separate document will describe how Prebid Server handles floors for SDK and AMP.
+There exist three locations where currencies can differ within enforcement:
+
+- adServerCurrency: The currency the publisher set in their currency module setConfig call
+- Price Floor Currency: Currency set in the price floors data object
+- bidResponse Currency: The currency the bidder returned with their bidResponse back to Prebid
+
+When a bid adapter submits a bid into the auction, the currency module will first determine if any conversion logic is necessary, afterwhich the bid is passed to the Floors Module. If currency conversion occurs at this stage, the bidResponse object will have the following attributes:
+
+- Cpm: The adServerCurrency converted CPM currency
+- Currency: The currency the adServerCurrency was set in
+- originalCpm: The original CPM the bidder responded with
+- originalCurrency: The original currency the bidder responded with
+
+Below is a chart explaining the behavior of currency conversion, if necessary, within the Floors Module when comparing bid CPM to floor CPM for enforcement:
+
+{: .table .table-bordered .table-striped }
+| bid.currency | bid.originalCurrency | floor.currency | result |
+|---+---+---+---+---|
+| USD | USD | USD | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. |
+| USD | USD | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.originaCpm is sent to the ad server. |
+| USD | EUR | EUR | bid.originalCpm is compared to floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. |
+| USD | JPY | EUR | Bid.cpm is converted to EUR then compared with floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. |
+| EUR | USD | EUR | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.Cpm is sent to the ad server. |
+| USD | Undefined (currency module possibly not included) | USD | Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. |
+| USD | Undefined (currency module possibly not included) | EUR | Bid.cpm is converted to EUR then compared with floor. Bid.cpm is compared to floor. If bid meets or exceeds the floor, bid.originalCpm is sent to the ad server. |
+
+If the currency function is unable to derive the correct cpm in any of the scenarios above where a conversion is needed, then the associated bidResponse will just pass through into the auction as if a matching floor was not found.
diff --git a/dev-docs/modules/gdprEnforcement.md b/dev-docs/modules/gdprEnforcement.md
new file mode 100644
index 0000000000..eb0caf12bc
--- /dev/null
+++ b/dev-docs/modules/gdprEnforcement.md
@@ -0,0 +1,201 @@
+---
+layout: page_v2
+page_type: module
+title: GDPR Enforcement Module
+description: Module to enforce GDPR consent
+module_code : gdprEnforcement
+display_name : GDPR Enforcement
+enable_download : true
+sidebarType : 1
+---
+
+# GDPR Enforcement Module
+{: .no_toc }
+
+* TOC
+{: toc }
+
+{: .alert.alert-warning :}
+This module requires the [EU GDPR consent management module](/dev-docs/modules/consentManagement.html), which reads consent values from the Consent Management Platform (CMP). The GDPR enforcement module
+will then enforce the results. See the base module page for general background, usage, and legal disclaimers.
+
+## Overview
+
+The base [EU GDPR consent management module](/dev-docs/modules/consentManagement.html) performs the following actions:
+
+1. Fetch the user's GDPR consent data from the CMP.
+2. Incorporate this data into the auction objects for adapters to collect.
+
+This GDPR enforcement module adds the following:
+
+3. Allows the page to define which activities should be enforced at the Prebid.js level.
+4. Actively enforces those activities based on user consent data.
+
+The following table details the Prebid.js activities that fall under the [Transparency and Consent Framework (TCF)](https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/) scope:
+
+{: .table .table-bordered .table-striped }
+| TCF Purpose | In-Scope Activity | Enforcement Activity | Optional Controls |
+| --- | --- | --- | --- |
+| Purpose 1 - Store and/or access information on a device | usersync pixels | May prevent one or more vendor usersyncs. | Do not enforce Purpose 1. Do not enforce Purpose 1 vendor signals. Do not enforce Purpose 1 for vendor V. |
+| Purpose 1 - Store and/or access information on a device | user ID modules | May prevent one or more UserID modules from activating. | Do not enforce Purpose 1. Do not enforce Purpose 1 vendor signals. Do not enforce Purpose 1 for vendor V. |
+| Purpose 1 - Store and/or access information on a device | device storage | May prevent one or more adapters or modules from being able to read or write cookies or localstorage in the user's browser. | Do not enforce Purpose 1. Do not enforce Purpose 1 vendor signals. Do not enforce Purpose 1 for vendor V. |
+
+There are plans to add more TCF Purposes and activities in future releases.
+
+## Page Integration
+
+A page needs to define configuration rules about how Prebid.js should enforce each in-scope activity.
+
+{: .alert.alert-warning :}
+**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.
+
+These are the fields related to GDPR enforcment that are supported in the [`consentManagement.gdpr`](/dev-docs/modules/consentManagement.html) object:
+
+{: .table .table-bordered .table-striped }
+| Param | Type | Description | Example |
+| --- | --- | --- | --- |
+| gdpr.rules | `Array of Objects` | Lets the publisher override the default behavior. | |
+| gdpr.rules[].purpose | `String` | The only currently supported value is "storage", corresponding to TCF Purpose 1. | "storage" |
+| gdpr.rules[].enforcePurpose | `Boolean` | Determines whether to enforce the purpose consent or not. The default in Prebid.js 3.x is not to enforce purposes. The plan for Prebid.js 4.0 is to enforce consent for Purpose 1 and no others. | true |
+| gdpr.rules[].enforceVendor | `Boolean` | Determines whether to enforce vendor signals for this purpose or not. The default in Prebid.js 3.x is not to enforce vendor signals. The plan for Prebid.js 4.0 to enforce signals for Purpose 1 and no others. | true |
+| gdpr.rules[].vendorExceptions | `Array of Strings` | Defines a list of biddercodes or module names that are exempt from the enforcement of this Purpose. | true |
+
+Note:
+
+- The vendorExceptions list is based on Prebid.js biddercodes instead of Global Vendor List (GVL) IDs, i.e. "rubicon" instead of "52". This was done to accomodate Prebid.js modules and adapters that don't have GVL IDs.
+
+### Examples
+
+The following examples cover a range of use cases and how Prebid.js supports
+configuration of different business rules.
+
+1) Enforce that the user consents to DeviceAccess as an activity and consider their per-vendor selection.
+
+```
+pbjs.setConfig({
+ consentManagement: {
+ gdpr: {
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: true,
+ enforceVendor: true
+ }
+ }
+ }
+});
+```
+
+2) Enforce that the user consents to DeviceAccess as an activity and consider their per-vendor selection. However, BidderA is a special case - the publisher has entrusted BidderA for this activity regardless of what the user says.
+
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: true,
+ enforceVendor: true,
+ vendorExceptions: ["bidderA"]
+ }
+
+3) Enforce that the user consents to DeviceAccess as an activity, but don't consider their per-vendor selection.
+
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: true,
+ enforceVendor: false,
+ }
+
+4) Enforce that the user consents to DeviceAccess as an activity, but don't consider their per-vendor selection for any bidders except BidderA. BidderA is entrusted to enforce the rules on their own.
+
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: true,
+ enforceVendor: false,
+ vendorExceptions: ["bidderA"]
+ }
+
+5) Turn off enforcement of Purpose 1: don't enforce either the user's DeviceAccess consent or their per-vendor selection.
+
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: false,
+ enforceVendor: false
+ }
+
+6) Don't enforce the user's DeviceAccess consent, but do consider their per-vendor selection.
+
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: false,
+ enforceVendor: true
+ }
+
+7) Don't enforce the user's DeviceAccess consent, but do consider their per-vendor selection; don't enforce vendor selection for BidderA.
+
+ ...
+ rules: [{
+ purpose: "storage",
+ enforcePurpose: false,
+ enforceVendor: true,
+ vendorExceptions: ["bidderA"]
+ }
+
+## Basic Enforcement
+
+Prebid.js does not have access to the Global Vendor List (GVL), so it implements
+a "basic" form of TCF validation using the supplied consent string.
+
+A goal of basic enforcement is to confirm that there's enough evidence of consent to pass data on to vendors who do have access to the GVL and can fully parse and enforce.
+
+Before allowing an activity tied to a TCF-protected Purpose for a given vendor, one of these scenarios must be true:
+
+- Configuration rules enforce both consent and vendor signals and either:
+ - we have the user’s purpose consent and the user’s vendor consent, or
+ - we confirmed the user’s LI (Legitimate Interest) Transparency is established for this purpose and the user’s Vendor LI field didn’t reject this vendor.
+- Configuration rules enforce only purpose consent and either:
+ - we have the user’s purpose consent, or
+ - we confirmed the user’s LI Transparency is established for this purpose.
+- Configuration rules enforce only vendor signals and either:
+ - we have the user’s vendor consent, or
+ - we confirmed the user’s Vendor LI field didn’t reject this vendor
+- Configuration rules enforce neither purpose consent nor vendor signal.
+
+Technically these rules are defined as follows:
+
+1. enforcePurpose[P]==true AND PurposesConsent[P]==1 AND enforceVendor[P,V]==true AND VendorConsentBitfield[V]==1
+1. enforcePurpose[P]==true AND PurposesConsent[P]==1 AND enforceVendor[P,V]==false
+1. enforcePurpose[P]==false AND enforceVendor[P,V]==true AND VendorConsentBitfield[V]==1
+1. enforcePurpose[P]==true AND PurposesLITransparency[P]==1 AND enforceVendor[P,V]==true AND VendorLegitimateInterestBitfield[V]==1
+1. enforcePurpose[P]==true AND PurposesLITransparency[P]==1 AND enforceVendor[P,V]==false
+1. enforcePurpose[P]==false AND enforceVendor[P,V]==true AND VendorLegitimateInterestBitfield[V]==1
+1. enforcePurpose[P]==false AND enforceVendor[P,V]==false
+
+Where:
+
+- P is the Purpose number
+- V is the vendor ID
+- 'enforcePurpose' and 'enforceVendor' are Prebid.js config rules
+- 'PurposesConsent' is the consent string field of the same name
+- 'VendorConsentBitfield' is the consent string 'Vendor Consent Section'
+- 'PurposesLITransparency' is the consent string field of the same name
+- 'VendorLegitimateInterestBitfield' is the consent string 'Vendor Legitimate Interest Section'
+
+See the [IAB TCF Consent String Format](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md) for details.
+
+## Build the Package
+
+Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). Include the base consent management module and this enforcement module as additional options on the **gulp build** command:
+
+{% highlight bash %}
+gulp build --modules=consentManagement,gdprEnforcement,bidAdapter1,bidAdapter2
+{% endhighlight %}
+
+You can also use the [Prebid.js Download](/download.html) page.
+
+## Further Reading
+
+- [EU GDPR Consent Management Module](/dev-docs/modules/consentManagement.html)
+- [IAB TCF Consent String Format](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md)
diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md
index 1db7e6a8e9..41806bdfab 100644
--- a/dev-docs/modules/index.md
+++ b/dev-docs/modules/index.md
@@ -31,7 +31,7 @@ If you are looking for bidder adapter parameters, see [Bidders' Params]({{site.b
| Module | Description |
|---------------------+--------------|
| [**Currency**](/dev-docs/modules/currency.html) | Converts bid currency into ad server currency based on data in a supplied exchange rate file. |
-| **ConsentManagement** | Facilitates collecting and passing consent information in support of privacy regulations: [EU GDPR](/dev-docs/modules/consentManagement.html) and [US Privacy](/dev-docs/modules/consentManagementUsp.html) (CCPA). |
+| **ConsentManagement** | Collecting and passing consent information in support of privacy regulations:{::nomarkdown}
{:/} |
| [**Google Ad Manager Express**](/dev-docs/modules/dfp_express.html) | A simplified installation mechanism for publishers that have Google Publisher Tag (GPT) ad calls in their pages. |
| [**Supply Chain Object**](/dev-docs/modules/schain.html) | Validates and makes the Supply Object available to bidders |
| [**User ID**](/dev-docs/modules/userId.html) | Sub-modules are available to support a range of identification approaches: Criteo RTUS, DigiTrust, ID5 Universal ID, IdentityLink, PubCommon ID, and Unified ID. |
diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md
index a7dbd3873b..73b172f321 100644
--- a/dev-docs/modules/userId.md
+++ b/dev-docs/modules/userId.md
@@ -36,8 +36,9 @@ The User ID module supports multiple ways of establishing pseudonymous IDs for u
1. The publisher builds Prebid.js by specifying one or more ID sub-modules they would like to include. e.g. "gulp build --modules=____IdSystem"
1. The page defines User ID configuration in `pbjs.setConfig()`
1. When `setConfig()` is called, and if the user has consented to storing IDs locally, the module is invoked to call the URL if needed
- 1. If the relevant local storage is present, the module doesn't call the URL and instead parses the scheme-dependent format, injecting the resulting ID into bidRequest.userIds.
-1. An object containing one or more IDs (bidRequest.userIds) is made available to Prebid.js adapters and Prebid Server S2S adapters.
+ 1. If the relevant local storage is present, the module doesn't call the URL and instead parses the scheme-dependent format, injecting the resulting ID into bidRequest.userId.
+1. An object containing one or more IDs (bidRequest.userId) is made available to Prebid.js adapters and Prebid Server S2S adapters.
+1. In addition to bidRequest.userId, bidRequest.userIdAsEids is made available to Prebid.js adapters and Prebid Server S2S adapters. bidRequest.userIdAsEids has userIds in ORTB EIDS format.
Note that User IDs aren't needed in the mobile app world because device ID is available in those ad serving scenarios.
@@ -95,7 +96,7 @@ The BritePool privacy policy is at [https://britepool.com/services-privacy-notic
#### BritePool Configuration
{: .table .table-bordered .table-striped }
-| Param under usersync.userIds[] | Scope | Type | Description | Example |
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"britepoolId"` | `"britepoolId"` |
| params | Required | Object | Details for britepool initialization. | |
@@ -109,7 +110,7 @@ The BritePool privacy policy is at [https://britepool.com/services-privacy-notic
{% highlight javascript %}
pbjs.setConfig({
- usersync: {
+ userSync: {
userIds: [{
name: "britepoolId",
storage: {
@@ -377,14 +378,14 @@ pbjs.setConfig({
### LiveIntent ID
-LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent ID is a user identifier tied to an active, anonymized email hash in our graph that functions in cookie-challenged environments like mobile browsers.
+LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent ID is a user identifier tied to an active, encrypted email in our graph and functions in cookie-challenged environments and browsers.
Add LiveIntent ID to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=liveIntentIdSystem
+gulp build --modules=userId,liveIntentIdSystem
-The `request.userId.lipb` object would then look like
+The `request.userId.lipb` object would look like:
```
{
"lipbid": "T7JiRRvsRAmh88",
@@ -392,13 +393,29 @@ The `request.userId.lipb` object would then look like
}
```
-The adapters can be implemented to use the lipibid as the identifier, and segments to which that identifier is associated with.
+The adapters can be implemented to use the lipibid as the identifier and segments to which that identifier is associated with. To enable identity resolution for a specific publisher, LiveIntent builds a model on the backend with data collected via an additional call issued on each page load.
-#### LiveIntent ID Registration
+#### How does LiveIntent ID work
+
+The LiveIntent ID sub-module resolves the identity of audiences by connecting impression opportunities to a stable identifier (LIID). In order to provide resolution one or more first-party cookies are used to create a stable identifier.
+
+How does LiveIntent ID sub-module decide, which first-cookies to use:
+1. By default LiveIntent ID sub-module generates its own first-party identifier on the publisher’s domain. Publishers have the option to disable the cookie generation when configuring the LiveIntent ID sub-module.
+2. A publisher can also define in the configuration which additional first-party cookies should be used. These can be used in a combination with the LiveIntent first-party cookie.
+
+The LiveIntent ID sub-module sends the defined identifiers to the identity graph, which processes them and creates a stable identifier (LIID). The detailed description of the parameters being sent is described here: https://github.com/liveintent-berlin/live-connect/blob/HEAD/COLLECTOR_PARAMS.md
+
+For the identity resolution the LiveIntent ID sub-module makes a request to the LiveIntent’s identity resolution API, which returns a stable identifier and the audience segment(s) a user belongs to. The identifier and the segment are then exposed by the Prebid User ID Module to Prebid adapters to be sent out in a bid request. An SSP can then make the impression opportunity available to any buyers targeting the segment via a deal.
-To leverage the LiveIntent ID, you need to first set up a first-party cookie sync with LiveIntent. Please reach out to peoplebased@liveintent.com for more information.
+The first-party cookie generation and identity resolution functionality is provided by the LiveConnect JS library, included within the LiveIntent ID sub-module. LiveIntent has created a shared library that is open source, available at https://www.npmjs.com/package/live-connect-js.
-The LiveIntent privacy policy is at [https://www.liveintent.com/services-privacy-policy/](https://www.liveintent.com/services-privacy-policy/).
+The LiveIntent ID sub-module follows the standard Prebid.js initialization based on the GDPR consumer opt-out choices. With regard to CCPA, the LiveConnect JS receives a us_privacy string from the Prebid US Privacy Consent Management Module and respects opt-outs.
+
+#### LiveIntent ID Registration
+
+You are not required to register with LiveIntent to start using the LiveIntent ID sub-module. However, we do recommend reaching out to us at peoplebased@liveintent.com so that we can guide you through the optimal setup and the ways you can benefit from LiveIntent identity solutions:
+1. Providing buyers a stable identifier, which can solve cross-browser and cross-channel frequency capping challenges.
+2. Leveraging your first-party audiences to increase the value of your inventory.
#### LiveIntent ID configuration
@@ -406,10 +423,17 @@ The LiveIntent privacy policy is at [https://www.liveintent.com/services-privacy
|---|:---:|:---:|---:|---:|
|`name`|Required | `String`|The name of this module.|`'liveIntentId'`|
|`params`| Required|`Object`|Container of all module params.||
-|`params.publisherId`| Required|`String`| The unique identifier for each publisher.|`'12432415'`|
+|`params.publisherId`|Required|`String`| The unique identifier for each publisher.|`'12432415'`|
+|`params.ajaxTimeout`|Optional|`Number`|This configuration parameter defines the maximum duration of a call to the IdentityResolution endpoint. By default, 1000 milliseconds.|`1000`|
|`params.partner`| Optional|`String`|The name of the partner whose data will be returned in the response.|`'prebid'`|
|`params.identifiersToResolve`|Optional|`Array[String]`|Used to send additional identifiers in the request for LiveIntent to resolve against the LiveIntent ID.|`['my-id']`|
-|`params.url`| Optional|`String`|Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`'//idx.my-domain.com'`|
+|`params.url`| Optional|`String`|Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`'https://idx.my-domain.com'`|
+|`params.providedIdentifierName`| Optional|`String`|This parameter should be used whenever a customer is able to provide the most stable identifier possible, e.g. a cookie which is set via HttpHeaders on the first party domain.|`'my-best-id'`|
+|`params.liCollectConfig`|Optional|`Object`|Container of all collector params.||
+|`params.liCollectConfig.fpiStorageStrategy`|Optional|`String`|This parameter defines whether the first party identifiers that LiveConnect creates and updates are stored in a cookie jar, or in local storage. If nothing is set, default behaviour would be `cookie`. Allowed values: [`cookie`, `ls`, `none`]|`'cookie'`|
+|`params.liCollectConfig.fpiExpirationDays`|Optional|`Number`|The expiration time of an identifier created and updated by LiveConnect.By default, 730 days.|`729`|
+|`params.liCollectConfig.collectorUrl`|Optional|`String`|The parameter defines where the signal pixels are pointing to. The params and paths will be defined subsequently. If the parameter is not set, LiveConnect will by default emit the signal towards `https://rp.liadm.com`.|`'https://rp.liadm.com'`|
+|`params.liCollectConfig.appId`|Optional|`String`|LiveIntent's media business entity application id.|`'a-0012'`|
#### LiveIntent ID examples
@@ -442,6 +466,34 @@ pbjs.setConfig({
})
```
+3. If lll the supported configuration params are passed, then the setup looks like this.
+```
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "liveIntentId",
+ params: {
+ publisherId: "9896876",
+ identifiersToResolve: ["my-own-cookie"],
+ providedIdentifierName: "my-best-cookie",
+ url: "https://publisher.liveintent.com/idex",
+ partner: "prebid",
+ ajaxTimeout: 1000,
+ storage: {
+ expires: 3
+ },
+ liCollectConfig: {
+ fpiStorageStrategy: "cookie",
+ fpiExpirationDays: 730,
+ collectorUrl: "https://rp.liadm.com",
+ appId: "a-0012"
+ }
+ }
+ }]
+ }
+})
+```
+
### Parrable ID
The Parrable ID is a Full Device Identifier that can be used to identify a device across different browsers and webviews on a single device including browsers that have third party cookie restrictions.
@@ -654,7 +706,7 @@ The EnID is a non-profit organization which is open to any contributing party on
{% highlight javascript %}
pbjs.setConfig({
- usersync: {
+ userSync: {
userIds: [{
name: "netId",
value: {
diff --git a/dev-docs/publisher-api-reference.md b/dev-docs/publisher-api-reference.md
index 6b95474c97..d60981602c 100644
--- a/dev-docs/publisher-api-reference.md
+++ b/dev-docs/publisher-api-reference.md
@@ -1248,6 +1248,10 @@ If you define an alias and are using `pbjs.sendAllBids`, you must also set up ad
+ `hb_size_newalias`
+ `hb_deal_newalias`
+{: .alert.alert-info :}
+Creating an alias for a Prebid Server adapter is done differently. See 'extPrebid'
+config in the [`s2sConfig`](#setConfig-Server-to-Server) object.
+
@@ -1650,7 +1654,7 @@ Example config for [server-to-server]({{site.baseurl}}/dev-docs/get-started-with
pbjs.setConfig({
s2sConfig: {
accountId: '1',
- bidders: ['appnexus', 'pubmatic'],
+ bidders: ['appnexus', 'openx', 'tripleliftVideo'],
defaultVendor: 'appnexus',
timeout: 1000,
adapterOptions: {
@@ -1661,9 +1665,13 @@ pbjs.setConfig({
'openx': function(type, url, bidder) {
const publisherId = '00000123231231'
url += `&ri=${publisherId}`;
-
return url
}
+ },
+ extPrebid: {
+ aliases: {
+ tripleliftVideo: tripleLift
+ }
}
}
})
@@ -1684,7 +1692,7 @@ Additional information of `s2sConfig` properties:
| `syncEndpoint` | Required | URL | Defines the cookie_sync endpoint for the Prebid Server cluster |
| `userSyncLimit` | Optional | Integer | Max number of userSync URLs that can be executed by Prebid Server cookie_sync per request. If not defined, PBS will execute all userSync URLs included in the request. |
| `adapterOptions` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in every impression object at request.imp[].ext.BIDDER. See the example above. |
-| `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See video-related example below. |
+| `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. |
| `syncUrlModifier` | Optional | Object | Function to modify a bidder's sync url before the actual call to the sync endpoint. Bidder must be enabled for s2sConfig. |
**Notes on s2sConfig properties**
@@ -1725,7 +1733,17 @@ pbjs.setConfig({
Additional options for `s2sConfig` may be enabled by including the [Server-to-Server testing module]({{site.baseurl}}/dev-docs/modules/s2sTesting.html).
-**ExtPrebid Convention**
+**Server-Side Aliases**
+
+You may want to run a particular bidder on the client for banner, but that same bidder on the
+server for video. You would do this by setting a **server-side** alias. The
+[example](#setConfig-Server-to-Server) at the start of this section provides an example. Here's how it works:
+
+1. Video ad units are coded with the dynamic alias. e.g. tripleliftVideo
+1. The s2sConfig.bidders array contains 'tripleliftVideo' telling Prebid.js to direct bids for that code to the server
+1. Finally, the extPrebid.aliases line tells Prebid Server to route the 'tripleliftVideo' biddercode to the 'triplelift' server-side adapter.
+
+**Passing the Referrer to Server Side Adapters**
* Setting `extPrebid.origreferrer` will be recognized by some server-side adapters as the referring URL for the current page.
@@ -1783,6 +1801,7 @@ For descriptions of all the properties that control user syncs, see the table be
| `syncDelay` | Integer | Delay in milliseconds for user syncing (both bid adapter user sync pixels and [userId module]({{site.baseurl}}/dev-docs/modules/userId.html) ID providers) after the auction ends. Default: `3000`. Ignored if auctionDelay > 0. |
| `auctionDelay` | Integer | Delay in milliseconds of the auction to retrieve user ids via the [userId module]({{site.baseurl}}/dev-docs/modules/userId.html) before the auction starts. Continues auction once all IDs are retrieved or delay times out. Does not apply to bid adapter user sync pixels. Default: `0`. |
| `enableOverride` | Boolean | Enable/disable publisher to trigger user syncs by calling `pbjs.triggerUserSyncs()`. Default: `false`. |
+| `aliasSyncEnabled` | Boolean | Enable/disable registered syncs for aliased adapters. Default: `false`. |
diff --git a/download.md b/download.md
index 104001eb4c..3b1afa19e5 100644
--- a/download.md
+++ b/download.md
@@ -313,6 +313,14 @@ Note: If you receive an error during download you most likely selected a configu
+