diff --git a/_data/sidebar.yml b/_data/sidebar.yml
index 14813a6bc3..8da383a65c 100644
--- a/_data/sidebar.yml
+++ b/_data/sidebar.yml
@@ -490,6 +490,14 @@
sectionTitle:
subgroup: 5
+- sbSecId: 1
+ title: User ID Modules
+ link: /dev-docs/modules/index.html#user-id-modules
+ isHeader: 0
+ isSectionHeader: 0
+ sectionTitle:
+ subgroup: 5
+
- sbSecId: 1
title: External Interfaces
link:
diff --git a/_includes/dev-docs/fingerprinting.md b/_includes/dev-docs/fingerprinting.md
new file mode 100644
index 0000000000..0c230d30ec
--- /dev/null
+++ b/_includes/dev-docs/fingerprinting.md
@@ -0,0 +1,2 @@
+{: .alert.alert-warning :}
+This adapter uses JavaScript APIs commonly used in fingerprinting and may get your Prebid build flagged as a fingerprinting script.
\ No newline at end of file
diff --git a/_includes/disqus_addon.html b/_includes/disqus_addon.html
deleted file mode 100644
index 0a6d69eaab..0000000000
--- a/_includes/disqus_addon.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/_layouts/api_prebidjs.html b/_layouts/api_prebidjs.html
index 1fe9a1afe8..487551fe54 100644
--- a/_layouts/api_prebidjs.html
+++ b/_layouts/api_prebidjs.html
@@ -39,10 +39,6 @@ {{ page.title }}
Back to Publisher API Reference
-
- {% if page.show_disqus %}
- {% include disqus_addon.html %}
- {% endif %}
diff --git a/_layouts/bidder.html b/_layouts/bidder.html
index 54c7c37499..62a52c9e95 100644
--- a/_layouts/bidder.html
+++ b/_layouts/bidder.html
@@ -86,10 +86,6 @@ "Send All Bids" Ad Server Keys
Back to Bidders
-
- {% if page.show_disqus %}
- {% include disqus_addon.html %}
- {% endif %}
diff --git a/_layouts/internal_api_prebidjs.html b/_layouts/internal_api_prebidjs.html
index 4098fa3c1e..1047377310 100644
--- a/_layouts/internal_api_prebidjs.html
+++ b/_layouts/internal_api_prebidjs.html
@@ -39,10 +39,6 @@ {{ page.title }}
Back to Internal API Reference
-
- {% if page.show_disqus %}
- {% include disqus_addon.html %}
- {% endif %}
diff --git a/_layouts/test.html b/_layouts/test.html
index 945088e888..fe14d47a2b 100644
--- a/_layouts/test.html
+++ b/_layouts/test.html
@@ -49,9 +49,6 @@ Send All Bids Ad Server Keys
- {% if page.show_disqus %}
- {% include disqus_addon.html %}
- {% endif %}
diff --git a/_layouts/userid.html b/_layouts/userid.html
index aff73773ec..deb991406f 100644
--- a/_layouts/userid.html
+++ b/_layouts/userid.html
@@ -30,6 +30,24 @@
Back to User ID Module
{{ page.title }}
+
+
+ Module |
+ {{ page.useridmodule }} |
+
+
+ EID Source |
+ {{ page.eidsource }} |
+
+
+ bidRequest.userId |
+ {{ page.bidRequestUserId }} |
+
+
+ Example |
+ {{ page.example }} |
+
+
{{content}}
diff --git a/assets/images/prebid-server/module-example.png b/assets/images/prebid-server/module-example.png
index ea864b1c15..3c3d22e468 100644
Binary files a/assets/images/prebid-server/module-example.png and b/assets/images/prebid-server/module-example.png differ
diff --git a/dev-docs/analytics/yandex.md b/dev-docs/analytics/yandex.md
index a1d380e372..5626374e5b 100644
--- a/dev-docs/analytics/yandex.md
+++ b/dev-docs/analytics/yandex.md
@@ -20,7 +20,7 @@ Disclosure: The adapter utilizes the Metrica Tag build based on [github.com/yand
2. **Insert Counter Initialization Code:**
- Retrieve the counter initialization code from the Yandex Metrica settings page at `https://metrica.yandex.com/settings?id={counterId}`, where `{counterId}` is your counter ID, and embed it into your website's HTML.
+ Retrieve the counter initialization code from the Yandex Metrica settings page at [metrica.yandex.com/r/settings](https://metrica.yandex.com/r/settings), and embed it into your website's HTML.
3. **Initialize the Adapter in Prebid.js:**
@@ -43,4 +43,4 @@ Disclosure: The adapter utilizes the Metrica Tag build based on [github.com/yand
## Accessing Analytics Data
-You can view the collected analytics data in the Yandex Metrica dashboard. Navigate to [metrika.yandex.com/dashboard](https://metrika.yandex.com/dashboard) and look for the Prebid Analytics section to analyze your data.
+You can view the collected analytics data in the Yandex Metrica dashboard. Navigate to [metrika.yandex.com/r/stat/prebid_events](https://metrika.yandex.com/r/stat/prebid_events) to analyze your data.
diff --git a/dev-docs/bidders/adgrid.md b/dev-docs/bidders/adgrid.md
index db31ea8a24..014b75d921 100644
--- a/dev-docs/bidders/adgrid.md
+++ b/dev-docs/bidders/adgrid.md
@@ -1,9 +1,9 @@
---
layout: bidder
title: AdGrid
-description: Prebid AdGrid Bidder Adaptor
+description: Prebid AdGrid Bidder Adapter
biddercode: adgrid
-media_types: banner
+media_types: banner, video
pbjs: true
tcfeu_supported: false
dsa_supported: false
@@ -67,6 +67,24 @@ var adUnits = [
domainId: 67890
}
}]
+ },
+ // Video adUnit
+ {
+ code: 'test-video-div',
+ mediaTypes: {
+ video: {
+ playerSize: [
+ [640, 480]
+ ],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'adgrid',
+ params: {
+ domainId: 12345
+ }
+ }]
}
];
```
diff --git a/dev-docs/bidders/bidtheatre.md b/dev-docs/bidders/bidtheatre.md
new file mode 100644
index 0000000000..65266bc0f6
--- /dev/null
+++ b/dev-docs/bidders/bidtheatre.md
@@ -0,0 +1,52 @@
+---
+layout: bidder
+title: Bidtheatre
+description: Bidtheatre Prebid Bidder Adapter
+biddercode: bidtheatre
+gvl_id: 30
+tcfeu_supported: true
+media_types: banner, video
+safeframes_ok: true
+deals_supported: true
+floors_supported: true
+fpd_supported: true
+ortb_blocking_supported: partial
+multiformat_supported: will-bid-on-any
+privacy_sandbox: topics
+pbjs: true
+sidebarType: 1
+pbs: false
+pbs_app_supported: false
+---
+
+### Registration
+
+The Bidtheatre bidding adapter requires manual set up before use. Please contact us at [operations@bidtheatre.com](mailto:operations@bidtheatre.com) if you would like to access Bidtheatre's demand.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `publisherId` | required | Manually set up publisher ID | `'73b20b3a-12a0-4869-b54e-8d42b55786ee'` | `string` |
+
+In addition to the required bid param above, Bidtheatre will also enforce the following requirements
+
+- All ad slots on a page must belong to the same publisher ID
+- The publisher must provide either a client IP and/or explicit geo data in the request
+
+### First Party Data
+
+Publishers should use the `ortb2` method of setting First Party Data. All standard OpenRTB 2.5 properties are supported, including but not limited to
+
+- ortb2.site.*
+- ortb2.user.*
+
+### ORTB Blocking
+
+`bcat`, `badv` and `battr` are all supported.
+
+### Media Types
+
+All standard OpenRTB 2.5 properties are supported for both banner and video. Bidtheatre Bidding adapter will always return VAST 2.0 or lower for video requests.
diff --git a/dev-docs/bidders/copper6ssp.md b/dev-docs/bidders/copper6ssp.md
index a11dc64104..ee0131c1ac 100644
--- a/dev-docs/bidders/copper6ssp.md
+++ b/dev-docs/bidders/copper6ssp.md
@@ -4,7 +4,8 @@ title: Copper6SSP
description: Prebid Copper6SSP Bidder Adapter
biddercode: copper6ssp
gpp_sids: usstate_all
-tcfeu_supported: false
+gvl_id: 1356
+tcfeu_supported: true
usp_supported: true
coppa_supported: true
schain_supported: true
diff --git a/dev-docs/bidders/equativ.md b/dev-docs/bidders/equativ.md
index ffa7dfb630..4ddca56f68 100644
--- a/dev-docs/bidders/equativ.md
+++ b/dev-docs/bidders/equativ.md
@@ -35,20 +35,19 @@ The Equativ bidder adapter requires setup and approval from the Equativ service
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|------|-------|-------------|---------|------|
-| `networkId` | required | The network identifier you have been provided with. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` |
-| `siteId` | required | The placement site ID. _See **Bid Parameter Usage** notes below for more information_. |`1234` | `integer` |
-| `pageId` | required | The placement page ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` |
-| `formatId` | required | The placement format ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` |
+| `networkId` | required | The network identifier you have been provided with. Normally required, but there are certain conditions under which this may be omitted. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` |
+| `siteId` | optional | The placement site ID. _See **Bid Parameter Usage** notes below for more information_. |`1234` | `integer` |
+| `pageId` | optional | The placement page ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` |
+| `formatId` | optional | The placement format ID. _See **Bid Parameter Usage** notes below for more information_. | `1234` | `integer` |
#### Bid Parameter Usage
Different combinations of parameters are required depending upon which ones you choose to use.
-There are three options for passing bidder parameters:
+There are two options for passing parameters:
-- **Option 1**. Specify `networkId` by itself (_without_ `siteId`, `pageId` and `formatId`), or
-- **Option 2**. Specify `siteId` _and_ `pageId` _and_ `formatId` (all together) _without_ `networkId`, or
-- **Option 3**. Specify _none_ of the above parameters, and instead use either `ortb2.site.publisher.id`, `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id`
+- **Option 1**. Specify `networkId` by itself (_and optionally providing_ `siteId`, `pageId` and `formatId`), or
+- **Option 2**. Specify either `ortb2.site.publisher.id`, `ortb2.app.publisher.id` or `ortb2.dooh.publisher.id`
See **Sample Banner Setup** for examples of these parameter options.
@@ -93,9 +92,9 @@ pbjs.bidderSettings = {
#### Sample Banner Setup
-As mentioned in the **Bid Parameter Usage** section, when including `'equativ'` as one of your available bidders your adunit setup, there are three general approaches to how you can specify parameters. Below are examples that illustrate them.
+As mentioned in the **Bid Parameter Usage** section, when including `'equativ'` as one of your available bidders your adunit setup, there are two approaches to how you can specify parameters. Below are examples that illustrate them.
-#### Option 1 -- Using networkId as the only bid param
+#### Option 1 -- Using networkId as a parameter
```html
```
-#### Option 2 - Using siteId, pageId and formatId as bid params
-
-```html
-
-```
-
-#### Option 3 - Using ortb2 for parameter info
+#### Option 2 - Using ortb2 for parameter info
You can also, as an alternative to using bidder params, specify a value for `publisher.id` that may be nested under an `app`, `site` or `dooh` object. The Equativ adapter will, in turn, look for these property paths under the `ortb2` property of the request:
diff --git a/dev-docs/bidders/inmobi.md b/dev-docs/bidders/inmobi.md
index 456433b46b..b8fd3e9323 100644
--- a/dev-docs/bidders/inmobi.md
+++ b/dev-docs/bidders/inmobi.md
@@ -4,7 +4,7 @@ title: InMobi
description: InMobi Bidder Adapter
biddercode: inmobi
tcfeu_supported: true
-usp_supported: false
+usp_supported: true
gvl_id: 333
coppa_supported: true
schain_supported: true
@@ -12,6 +12,7 @@ media_types: banner, video, native
pbs: true
pbs_app_supported: true
sidebarType: 1
+pbjs: true
---
### Note
@@ -30,6 +31,97 @@ To opt out of InMobi ads on web inventory the user needs to visit the Opt-out pa
### Bid Params
{: .table .table-bordered .table-striped }
+
| Name | Scope | Description | Example | Type |
|---------------|----------|-----------------------|-----------|-----------|
| `plc` | required | Placement ID | `'1234'` | `string` |
+
+### First Party Data
+
+Inmobi supports both `ortb2` and `ortb2Imp` methods to set [First Party Data](https://docs.prebid.org/features/firstPartyData.html).
+
+The standard Open RTB properties supported from `ortb2` / `ortb2Imp` are described in the following table.
+
+{: .table .table-bordered .table-striped }
+
+| Name | Scope | Description | Example | Type |
+|-------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------|
+| `ortb2Imp.instl` | optional | Details on interstitial/full-screen, 1 indicates that the ad is interstitial or full-screen, while 0 means it is not. | `1` | `integer` |
+| `ortb2Imp.rwdd` | optional | Specifies if the user receives a reward for viewing the ad: 0 for no, and 1 for yes. | `1` | `integer` |
+| `ortb2.user` | optional | Information about the advertising device's human user, provided through an OpenRTB User object. | N/A | `object` |
+| `ortb2.site` | optional | Information about the publisher's website provided through an OpenRTB Site object. | N/A | `object` |
+| `ortb2.device` | optional | Information about the user's device provided through an OpenRTB device object. | N/A | `object` |
+| `ortb2.bcat` | optional | Blocked advertiser categories using the IAB content categories. | `[ "IAB25" ]` | `string array` |
+| `ortb2.badv` | optional | Block list of advertisers by their domains | `[ "ford.com" ]` | `string array` |
+| `ortb2.regs` | optional | Regulatory conditions in effect for all impressions in this bid request. | N/A | `object` |
+
+Besides these standard properties, `ext` field can be used to send any publisher specific data which may have been discussed with a Inmobi partner manager.
+
+### Example Ad-Units
+
+## Banner
+
+```javascript
+ var adUnits = [{
+ code: 'div-gpt-ad-1460505748561-0',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ }
+ },
+ bids: [{
+ bidder: 'inmobi',
+ params: {
+ plc: '1719108420057' // Mandatory
+ }
+ }]
+ }];
+```
+
+## Video
+
+```javaScript
+ var adUnits = [{
+ code: 'div-gpt-ad-1460505748561-0',
+ mediaTypes: {
+ video: {
+ playerSize : [300,250],
+ mimes : ["video/x-ms-wmv", "video/mp4"],
+ minduration : 0,
+ maxduration: 30,
+ protocols : [1,2],
+ api: [1, 2, 4, 6],
+ protocols: [3, 4, 7, 8, 10],
+ placement: 1,
+ plcmt: 1
+ }
+ },
+ // Replace this object to test a new Adapter!
+ bids: [{
+ bidder: 'inmobi',
+ params: {
+ plc: '1443164204446401' //Mandatory
+ }
+ }]
+ }];
+```
+
+## Native
+
+```javascript
+ var adUnits = [{
+ code: 'div-gpt-ad-1460505748561-0',
+ mediaTypes: {
+ native: {
+ type: 'image'
+ }
+ },
+ bids: [{
+ bidder: 'inmobi',
+ params: {
+ plc: '10000033152',
+ bidfloor: 0.9
+ }
+ }]
+ }];
+```
diff --git a/dev-docs/bidders/kuantyx.md b/dev-docs/bidders/kuantyx.md
new file mode 100644
index 0000000000..cf13210888
--- /dev/null
+++ b/dev-docs/bidders/kuantyx.md
@@ -0,0 +1,44 @@
+---
+layout: bidder
+title: Kuantyx
+description: Kuantyx Bid Adapter
+biddercode: kuantyx
+tcfeu_supported: false
+usp_supported: true
+media_types: video, native
+safeframes_ok: true
+pbjs: true
+pbs: true
+pbs_app_supported: true
+floors_supported: true
+schain_supported: true
+fpd_supported: true
+ortb_blocking_supported: true
+multiformat_supported: will-bid-on-one
+userIds: all
+sidebarType: 1
+aliasCode: aso
+---
+### Note
+
+The Kuantyx adapter requires approval and setup. Please reach out to or visit us at [kuantyx.com](https://kuantyx.com) for more details.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|------------------|-----------------------------|-----------|
+| `server` | required | Server endpoint | `https://srv.kuantyx.com` | `String` |
+| `zone` | required | Zone ID | `73815` | `Integer` |
+
+#### Video Caching
+
+Note that the Kuantyx adapter expects a client-side Prebid Cache to be enabled for video bidding.
+
+```js
+pbjs.setConfig({
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ }
+});
+```
diff --git a/dev-docs/bidders/oppamedia.md b/dev-docs/bidders/oppamedia.md
new file mode 100644
index 0000000000..6314959b81
--- /dev/null
+++ b/dev-docs/bidders/oppamedia.md
@@ -0,0 +1,36 @@
+---
+layout: bidder
+title: OppaMedia
+description: OppaMedia Bidder Adaptor
+biddercode: oppamedia
+pbjs: true
+pbs: false
+media_types: banner, native, video
+gvl_id: 14 (adkernel)
+tcfeu_supported: true
+usp_supported: true
+coppa_supported: true
+gpp_supported: true
+pbs_app_supported: true
+schain_supported: true
+userIds: all
+fpd_supported: true
+prebid_member: false
+ortb_blocking_supported: true
+multiformat_supported: will-bid-on-one
+floors_supported: true
+aliasCode: adkernel
+sidebarType: 1
+---
+
+### Note
+
+The OppaMedia bidding adapter requires setup and approval before implementation. Please reach out to for more details.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------------------|---------------------------|----------|
+| `host` | required | Host | `'cpm.oppa.media'` | `string` |
+| `zoneId` | required | Zone Id | `30164` | `integer` |
diff --git a/dev-docs/bidders/pgamssp.md b/dev-docs/bidders/pgamssp.md
index e132d8edb1..3db48e851d 100644
--- a/dev-docs/bidders/pgamssp.md
+++ b/dev-docs/bidders/pgamssp.md
@@ -4,11 +4,12 @@ title: PGAMSSP
description: Prebid PGAMSSP Bidder Adapter
biddercode: pgamssp
usp_supported: true
-tcfeu_supported: false
+gvl_id: 1353
+tcfeu_supported: true
coppa_supported: true
schain_supported: true
floors_supported: true
-gpp_supported: true
+gpp_sids: tcfeu, usstate_all, usp
media_types: banner, video, native
pbjs: true
pbs: true
@@ -23,4 +24,9 @@ safeframes_ok: true
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|---------------|----------|-----------------------|-----------|-----------|
-| `placementId` | required | Placement Id | `'0'` | `'string'` |
+| `placementId` | optional | Placement Id | `'0'` | `'string'` |
+| `endpointId` | optional | Endpoint Id | `'0'` | `'string'` |
+
+### Note
+
+For the prebid server and prebid.js you only need to use one parameter: either placementId or endpointId
diff --git a/dev-docs/bidders/revbid.md b/dev-docs/bidders/revbid.md
new file mode 100644
index 0000000000..615709768b
--- /dev/null
+++ b/dev-docs/bidders/revbid.md
@@ -0,0 +1,36 @@
+---
+layout: bidder
+title: RevBid
+description: RevBid Adaptor
+biddercode: revbid
+pbjs: true
+pbs: false
+media_types: banner, native, video
+gvl_id: 14 (adkernel)
+tcfeu_supported: true
+gpp_sids: tcfeu, usp
+usp_supported: true
+coppa_supported: true
+pbs_app_supported: false
+schain_supported: true
+userIds: all
+fpd_supported: true
+prebid_member: false
+ortb_blocking_supported: true
+multiformat_supported: will-bid-on-one
+floors_supported: true
+aliasCode: adkernel
+sidebarType: 1
+---
+
+### Note
+
+The RevBid bidding adapter requires setup and approval before implementation. Please reach out to for more details.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------------------|---------------------------|----------|
+| `host` | required | RTB host | `'cpm.revbid.net'` | `string` |
+| `zoneId` | required | Zone Id | 30164 | `integer` |
diff --git a/dev-docs/bidders/smilewanted.md b/dev-docs/bidders/smilewanted.md
index 4cedc9c33c..0bac421c76 100644
--- a/dev-docs/bidders/smilewanted.md
+++ b/dev-docs/bidders/smilewanted.md
@@ -3,7 +3,7 @@ layout: bidder
title: Smile Wanted
description: SmileWanted Bidder Adapter
biddercode: smilewanted
-tcfeu_supported: false
+tcfeu_supported: true
gvl_id: 639
usp_supported: true
coppa_supported: true
diff --git a/dev-docs/bidders/spinx.md b/dev-docs/bidders/spinx.md
new file mode 100644
index 0000000000..60ca37b1b3
--- /dev/null
+++ b/dev-docs/bidders/spinx.md
@@ -0,0 +1,36 @@
+---
+layout: bidder
+title: SpinX
+description: SpinX Adaptor
+biddercode: spinx
+pbjs: true
+pbs: false
+media_types: banner, native, video
+gvl_id: 1308
+tcfeu_supported: true
+gpp_sids: tcfeu, usp
+usp_supported: true
+coppa_supported: true
+pbs_app_supported: false
+schain_supported: true
+userIds: all
+fpd_supported: true
+prebid_member: false
+ortb_blocking_supported: true
+multiformat_supported: will-bid-on-one
+floors_supported: true
+aliasCode: adkernel
+sidebarType: 1
+---
+
+### Note
+
+The SpinX bidding adapter requires setup and approval before implementation. Please reach out to for more details.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------------------|---------------------------|----------|
+| `host` | required | RTB host | `'cpm.rtads.bid'` | `string` |
+| `zoneId` | required | Zone Id | 30164 | `integer` |
diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md
index 52b57d77d0..dac0e35448 100644
--- a/dev-docs/bidders/teads.md
+++ b/dev-docs/bidders/teads.md
@@ -25,6 +25,10 @@ fpd_supported: false
sidebarType: 1
---
+### Disclosure
+
+{% include dev-docs/fingerprinting.md %}
+
### Notes
1. The Teads Bidding adapter requires setup before beginning. Please contact us on
diff --git a/dev-docs/bidders/ttd.md b/dev-docs/bidders/ttd.md
index 7768c16df0..5c29b31048 100644
--- a/dev-docs/bidders/ttd.md
+++ b/dev-docs/bidders/ttd.md
@@ -92,7 +92,7 @@ var bannerAdUnit = {
#### `mediaTypes.video` Parameters
The TTD adapter for video requires certain parameters in the AdUnit's
-[mediaTypes.video](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit.mediaTypes.video) definition. Specifically, `maxduration`, `api`, `mimes`, `placement`, and `protocols` are all required for video ad units. `playerSize`, `startdelay`, `playbackmethod`, and `pos` are recommended. `minduration`, `minbitrate`, `maxbitrate`, `skip`, `skipmin`, and `skipafter` are optional.
+[mediaTypes.video](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit.mediaTypes.video) definition. Specifically, `maxduration`, `api`, `mimes`, `plcmt`, and `protocols` are all required for video ad units. `playerSize`, `startdelay`, `playbackmethod`, and `pos` are recommended. `minduration`, `minbitrate`, `maxbitrate`, `skip`, `skipmin`, and `skipafter` are optional.
Note: TTD does not currently support `adpod` video contexts.
@@ -108,7 +108,7 @@ var videoAdUnit = {
playerSize: [640, 480],
api: [1, 3],
mimes: ['video/mp4'],
- placement: 3,
+ plcmt: 3,
protocols: [2, 3, 5, 6],
startdelay: -1,
playbackmethod: [1],
diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md
index be27ef75a7..51358c93d2 100644
--- a/dev-docs/modules/currency.md
+++ b/dev-docs/modules/currency.md
@@ -30,6 +30,7 @@ currency conversion file while the bids are taking place. Alternately, the conve
be provided in the page.
1. At runtime, bids are converted to the ad server currency as needed.
1. Default rates can be provided in case the file cannot be loaded.
+1. When `requestBids` is called, the Currency Module will delay the auction up to the supplied amount of time in `currency.auctionDelay` or as soon as the dynamic endpoint returns data, whichever is first.
## Currency Architecture
@@ -195,6 +196,8 @@ pbjs.setConfig({
"conversionRateFile": "URL_TO_RATE_FILE",
// optionally provide a default rate in case the file can't be read
"defaultRates": { "USD": { "GPB": 0.75 }}
+ // optionally sets the auction defer time if the file has not been loaded yet
+ "auctionDelay": 1000
}
});
```
diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md
index 20abc03706..995c9cd850 100644
--- a/dev-docs/modules/floors.md
+++ b/dev-docs/modules/floors.md
@@ -559,11 +559,11 @@ e.g.
let deviceType = getDeviceTypeFromUserAgent(navigator.userAgent);
- if(deviceType = 'mobile')
+ if(deviceType === 'mobile')
return 'mobile'
- else if (deviceType = 'tablet')
+ else if (deviceType === 'tablet')
return 'tablet'
- else if (deviceType = 'desktop')
+ else if (deviceType === 'desktop')
return 'desktop'
}
diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md
index f30dfa34ef..730cfde505 100644
--- a/dev-docs/modules/idLibrary.md
+++ b/dev-docs/modules/idLibrary.md
@@ -26,8 +26,9 @@ The module attempts to extract a persistant identifier in the following ways:
To get started, add the module to your Prebid.js wrapper. From the command line:
-{: .alert.alert-info :}
+```bash
gulp build --modules=idImportLibrary
+```
## Application Flow
@@ -45,6 +46,7 @@ In the idLibrary module, the persistant id is fetched from the page and synced w
## Configuration
{: .table .table-bordered .table-striped }
+
| Param | Required | Description |
| --- | --- | --- |
| url | yes | The url endpoint is used to post the MD5 hasheds|
diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md
index 7102b79b82..41788113b3 100644
--- a/dev-docs/modules/index.md
+++ b/dev-docs/modules/index.md
@@ -89,6 +89,32 @@ These modules may require accounts with a service provider.
+## User ID Modules
+
+UserID modules conform to a consistent set of publisher controls. The publisher can choose to run multiple user id modules, define an overall amount of time they're willing to wait for
+results. See [the userSync setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ConfigureUserSyncing-UserSyncProperties) reference and the [User ID Module](/dev-docs/modules/userId) for more details.
+
+{% assign userid_module_pages = site.pages | where: "layout", "userid" %}
+
+
+
+
+ Module |
+ Description |
+ EID Source |
+
+
+
+{% for page in userid_module_pages %}
+
+ {{page.title}} |
+ {{page.description}} |
+ {{page.eidsource}} |
+
+{% endfor %}
+
+
+
## Further Reading
- [Source code of all modules](https://github.com/prebid/Prebid.js/tree/master/modules)
diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md
index 2cc57d1712..33d2e1b68d 100644
--- a/dev-docs/modules/userId.md
+++ b/dev-docs/modules/userId.md
@@ -71,6 +71,7 @@ Publishers using Google AdManager may want to sync one of the identifiers as the
The PPID in GAM (which is unrelated to the PPID UserId Submodule) has strict rules; refer to [Google AdManager documentation](https://support.google.com/admanager/answer/2880055?hl=en) for them. Please note, Prebid uses a [GPT command](https://developers.google.com/publisher-tag/reference#googletag.PubAdsService) to sync identifiers for publisher convenience. It doesn't currently work for instream video requests, as Prebid typically interacts with the player, which in turn may interact with IMA. IMA does has a [similar method](https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.ImaSdkSettings#setPpid) as GPT, but IMA does not gather this ID from GPT.
{: .table .table-bordered .table-striped }
+
| Param under userSync | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| ppid | Optional | String | Must be a source from the [pbjs.getUserIdsAsEids()](#getUserIdsAsEids) array | `"pubcid.org"` |
@@ -83,6 +84,7 @@ The table below has the options that are common across ID systems. See the secti
{% assign count = 0 %}
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | May be any of the following values: {% for page in userid_pages -%}`"{{ page.useridmodule -}}"`{% if forloop.last == false -%}, {% endif -%}{% endfor -%} | `"unifiedId"` |
@@ -202,9 +204,22 @@ The corresponding user id object and the eids array will look like this:
{% assign userid_pages = site.pages | where: "layout", "userid" | sort_natural: "title" %}
+
+
+ ID System Name |
+ Prebid.js Attr: bidRequest.userId |
+ EID Source |
+ Example |
+
{% for page in userid_pages %}
-{{page.title}}
+
+ {{page.title}} |
+ {{page.bidRequestUserId}} |
+ {{page.eidsource}} |
+ {{page.example}} |
+
{% endfor %}
+
## Bidder Adapter Implementation
@@ -216,53 +231,6 @@ To add a custom data type for the response of `pbjs.getUserIdsAsEids()`, see oth
Bidders that want to support the User ID module in Prebid.js need to update their bidder adapter to read the indicated bidRequest attributes and pass them to their endpoint.
-{: .table .table-bordered .table-striped }
-| ID System Name | ID System Host | Prebid.js Attr: bidRequest.userId. | EID Source | Example Value |
-| --- | --- | --- | --- | --- | --- |
-| 33Across ID | 33Across | 33acrossId | 33across.com | "1111" |
-| Admixer ID | Admixer | admixerId | admixer.net | "1111" |
-| adQuery QiD | adQuery | qid | adquery.io | "p9v2dpnuckkzhuc..." |
-| Adriver ID | Adriver | adriverId | adriver.ru | "1111" |
-| Adtelligent ID | Adtelligent | adtelligentId | adtelligent.com | `"1111"` |
-| AMX ID | AMX | amxId | amxdt.net | "3ca11058-..." |
-| BritePool ID | BritePool | britepoolid | britepool.com | "1111" |
-| AudienceOne ID | DAC | dacId | dac.co.jp | {"id": "1111"} |
-| DeepIntent ID | Deep Intent | deepintentId | deepintent.com | "1111" |
-| DMD ID | DMD | dmdId | hcn.health | "1111" |
-| ceeId | ceeId | ceeId | ceeid.eu | "111111" |
-| Czech Ad ID | czechAdId | czechAdId | czechadid.cz | "1111" |
-| CriteoID | Criteo | criteoId | criteo.com | "1111" |
-| Fabrick ID | Neustar | fabrickId | neustar.biz | "1111" |
-| FLoC ID | n/a | flocId | | |
-| GrowthCode ID | GrowthCode | growthCodeId | growthcode.io | "1111" |
-| Hadron ID | Audigent | hadronId | audigent.com | {"hadronId":"user-hadron-id", "auSeg":["segment1", "segment2"]} |
-| ID+ | Zeotap | IDP | zeotap.com | "1111" |
-| ID5 ID | ID5 | id5id | id5-sync.com | {uid: "1111", ext: { linkType: 2, abTestingControlGroup: false } } |
-| IdentityLink | LiveRamp | idl_env | liveramp.com | "1111" |
-| Intent IQ ID | Intent IQ | intentiqid | intentiq.com | "1111" |
-| Kinesso ID | Kinesso | kpuid | kpuid.com | "1111" |
-| LiveIntent ID | Live Intent | lipb.lipbid | liveintent.com | "1111" |
-| Lotame Panorama ID | Lotame | lotamePanoramaId | crwdcntrl.net | "e4b9..." |
-| MediaWallah OpenLink ID | MediaWallah | mwOpenLinkId | mediawallahscript.com | "1111" |
-| merkleID | Merkle | merkleId | merkleinc.com | "1111" |
-| naveggId | Navegg | naveggId | navegg.com | "1111" |
-| netID | netID | netId | netid.de | "fH5A..." |
-| Novatiq ID | Novatiq | novatiqId | novatiq.com | "1111" |
-| Parrable ID | Parrable | parrableId | parrable.com | {"eid":"01.15946..."} |
-| Publisher Link ID | n/a | publinkId | epsilon.com | |
-| PubProvided ID | n/a | pubProvidedId | publisher domain | "1111" |
-| Quantcast ID | n/a | quantcastId | quantcast.com | "1111" |
-| Rewarded Interest ID | Rewarded Interest | rewardedInterestId | rewardedinterest.com | "1111" |
-| Tapad ID | Tapad | tapadId | tapad.com | "1111" |
-| Teads ID | Teads | teadsId | teads.com | "1111" |
-| SharedID (PBJS 5.x) | n/a | pubcid | pubcid.org | "1111" |
-| SharedID (PBJS 4.x)| Prebid | sharedid | sharedid.org | {"id":"01EAJWWN...", "third":"01EAJ..."} |
-| Unified ID | Trade Desk | tdid | adserver.org | "1111" |
-| ConnectID | Yahoo | connectId | yahoo.com | {"connectId": "72d04af6..."} |
-| FreePass ID | FreePass | freepassId | | "1111" |
-| UtiqMtp ID | Utiq | utiqMtpId | utiq-mtp.com | "1111" |
-| Yandex ID | Yandex | yandexId | yandex.com | "11111111111111111" |
-
For example, the adapter code might do something like:
```javascript
@@ -353,8 +321,6 @@ If you're an ID provider that wants to get on this page:
* Add a new row to `/dev-docs/modules/userId.md#prebidjs-adapters`
* Submit a documentation Pull Request
-
-
## ESP Configurations
Google now supports Encrypted Signals for Publishers(ESP), a program that allows publishers can explicitly share encrypted signals on bid requests with third-party bidders. User ID modules now support code which will register the signal sources and encrypted signals are created and are sent to GAM request in a3p parameter. 'encryptedSignal' configuration under userSync Module will help to configure signal sources.
@@ -364,6 +330,7 @@ Please find more details [Share encrypted signals with bidders (Beta)](https://s
Alternatively, GAM can now pull IDs from Prebid for UserId submodules that [register with GAM](https://services.google.com/fb/forms/encryptedsignalsforpublishers-signalcollectorform/) For those registered submodules, publishers can [select Prebid UserID module (Beta) under "Signal collection deployment."](https://support.google.com/admanager/answer/10488752?hl=en). Publishers selecting this option should not also select those identifiers in the `encryptedSignalSources.sources.source` array.
{: .table .table-bordered .table-striped }
+
| Param under userSync | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| encryptedSignalSources | Optional | Object | Publisher can specify the ESP config by adding encryptedSignal Object under userSync Object | |
diff --git a/dev-docs/modules/userid-submodules/33across.md b/dev-docs/modules/userid-submodules/33across.md
index d63c246e10..0ec7bd2237 100644
--- a/dev-docs/modules/userid-submodules/33across.md
+++ b/dev-docs/modules/userid-submodules/33across.md
@@ -3,6 +3,9 @@ layout: userid
title: 33Across ID
description: 33Across ID User ID sub-module
useridmodule: 33acrossIdSystem
+bidRequestUserId: 33acrossId
+eidsource: 33across.com
+example: '"1111"'
---
@@ -21,6 +24,7 @@ gulp build --modules=33acrossIdSystem,userId
The following configuration parameters are available:
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this sub-module | `"33acrossId"` |
diff --git a/dev-docs/modules/userid-submodules/admixer.md b/dev-docs/modules/userid-submodules/admixer.md
index 1ceb62cafb..4a56a0f0d3 100644
--- a/dev-docs/modules/userid-submodules/admixer.md
+++ b/dev-docs/modules/userid-submodules/admixer.md
@@ -3,6 +3,9 @@ layout: userid
title: AdmixerID
description: AdmixerID User ID sub-module
useridmodule: admixerIdSystem
+bidRequestUserId: admixerId
+eidsource: admixer.net
+example: '"1111"'
---
@@ -12,12 +15,14 @@ The Admixer privacy policy is at
Add Admixer ID module to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=admixerIdSystem
+```
## AdmixerID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"admixerId"` | `"admixerId"` |
diff --git a/dev-docs/modules/userid-submodules/adquery.md b/dev-docs/modules/userid-submodules/adquery.md
index df509d54ea..7b24a99d9b 100644
--- a/dev-docs/modules/userid-submodules/adquery.md
+++ b/dev-docs/modules/userid-submodules/adquery.md
@@ -3,6 +3,9 @@ layout: userid
title: adQuery QiD
description: adQuery QiD User ID sub-module
useridmodule: adqueryIdSystem
+bidRequestUserId: qid
+eidsource: adquery.io
+example: '"p9v2dpnuckkzhuc"'
---
diff --git a/dev-docs/modules/userid-submodules/adriver.md b/dev-docs/modules/userid-submodules/adriver.md
index e1f6b48b7f..a4d57747aa 100644
--- a/dev-docs/modules/userid-submodules/adriver.md
+++ b/dev-docs/modules/userid-submodules/adriver.md
@@ -3,11 +3,15 @@ layout: userid
title: Adriver ID
description: Adriver ID User ID sub-module
useridmodule: adriverId
+bidRequestUserId: adriverId
+eidsource: adriver.ru
+example: '"1111"'
---
## Adriver ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module: `"adriverId"` | `"adriverId"` |
diff --git a/dev-docs/modules/userid-submodules/adtelligent.md b/dev-docs/modules/userid-submodules/adtelligent.md
index ac210e75fd..f10adc76b6 100644
--- a/dev-docs/modules/userid-submodules/adtelligent.md
+++ b/dev-docs/modules/userid-submodules/adtelligent.md
@@ -3,6 +3,9 @@ layout: userid
title: Adtelligent
description: Adtelligent User ID sub-module
useridmodule: adtelligentIdSystem
+bidRequestUserId: adtelligentId
+eidsource: adtelligent.com
+example: '"1111"'
---
@@ -10,8 +13,9 @@ The [Adtelligent](https://adtelligent.com) ID system is a unique per-session use
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=userId,adtelligentIdSystem
+```
## Adtelligent Configuration
diff --git a/dev-docs/modules/userid-submodules/amxrtb.md b/dev-docs/modules/userid-submodules/amxrtb.md
index 8ab6d0eef4..b03199e172 100644
--- a/dev-docs/modules/userid-submodules/amxrtb.md
+++ b/dev-docs/modules/userid-submodules/amxrtb.md
@@ -3,6 +3,9 @@ layout: userid
title: AMX ID
description: AMX ID User ID sub-module
useridmodule: amxIdSystem
+bidRequestUserId: amxId
+eidsource: amxdt.net
+example: '"3ca11058-..."'
---
diff --git a/dev-docs/modules/userid-submodules/audienceone.md b/dev-docs/modules/userid-submodules/audienceone.md
index 74d8d5bfee..158640c893 100644
--- a/dev-docs/modules/userid-submodules/audienceone.md
+++ b/dev-docs/modules/userid-submodules/audienceone.md
@@ -3,6 +3,9 @@ layout: userid
title: AudienceOne ID by DAC
description: AudienceOne ID by DAC User ID sub-module
useridmodule: dacIdSystem
+bidRequestUserId: dacId
+eidsource: dac.co.jp
+example: {"id": "1111"}
---
@@ -11,12 +14,14 @@ Please visit [solutions.dac.co.jp/audienceone](https://solutions.dac.co.jp/audie
Add the AudienceOne ID to your Prebid.js Package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=dacIdSystem
+```
## AudienceOne ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module | `"dacId"` |
diff --git a/dev-docs/modules/userid-submodules/britepool.md b/dev-docs/modules/userid-submodules/britepool.md
index 9e24d92391..d96c00a0d5 100644
--- a/dev-docs/modules/userid-submodules/britepool.md
+++ b/dev-docs/modules/userid-submodules/britepool.md
@@ -4,6 +4,9 @@ title: BritePool
description: BritePool User ID sub-module
useridmodule: britepoolIdSystem
enable_download: false
+bidRequestUserId: britepoolid
+eidsource: britepool.com
+example: '"1111"'
---
{: .alert.alert-warning :}
@@ -14,8 +17,9 @@ integration partners (such as PubMatic), are able to maximize revenues without c
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=britepoolIdSystem
+```
## BritePool Registration
@@ -24,6 +28,7 @@ Please reach out to [prebid@britepool.com](mailto:prebid@britepool.com) and requ
## BritePool Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"britepoolId"` | `"britepoolId"` |
diff --git a/dev-docs/modules/userid-submodules/ceeIdSystem.md b/dev-docs/modules/userid-submodules/ceeIdSystem.md
index 59194e1150..3ab6277289 100644
--- a/dev-docs/modules/userid-submodules/ceeIdSystem.md
+++ b/dev-docs/modules/userid-submodules/ceeIdSystem.md
@@ -3,6 +3,9 @@ layout: userid
title: CEEIdSystem
description: CEEID User ID sub-module
useridmodule: ceeIdSystem
+bidRequestUserId: ceeId
+eidsource: ceeid.eu
+example: '"1111"'
---
## Prebid Configuration
@@ -16,6 +19,7 @@ gulp build --modules=ceeIdSystem
## CEEID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of CEEID user ID module. | `"ceeId"` |
diff --git a/dev-docs/modules/userid-submodules/cpexid.md b/dev-docs/modules/userid-submodules/cpexid.md
index ee9a48fa42..f1c543c6c0 100644
--- a/dev-docs/modules/userid-submodules/cpexid.md
+++ b/dev-docs/modules/userid-submodules/cpexid.md
@@ -3,16 +3,21 @@ layout: userid
title: Czech Ad ID (czechAdId)
description: Czech Ad ID (czechAdId) User ID sub-module
useridmodule: czechAdIdSystem
+bidRequestUserId: czechAdId
+eidsource: czechadid.cz
+example: '"1111"'
---
Czech Ad ID is a joint project of publishers of the [CPEx alliance](https://www.cpex.cz/) and [Seznam.cz](https://www.seznam.cz). It is a deterministic user ID that offers cross-domain and cross-device identification. For more information see [czechadid.cz](https://www.czechadid.cz)).
-{: .alert.alert-info :}
+```bash
gulp build --modules=czechAdIdSystem
+```
## czechAdId Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module | `"czechAdId"` |
diff --git a/dev-docs/modules/userid-submodules/criteo.md b/dev-docs/modules/userid-submodules/criteo.md
index 8e48b94ce2..27d43641bd 100644
--- a/dev-docs/modules/userid-submodules/criteo.md
+++ b/dev-docs/modules/userid-submodules/criteo.md
@@ -3,6 +3,9 @@ layout: userid
title: Criteo ID for Exchanges
description: Criteo ID for Exchanges User ID sub-module
useridmodule: criteoIdSystem
+bidRequestUserId: criteoId
+eidsource: criteo.com
+example: '"1111"'
---
@@ -13,8 +16,9 @@ The Criteo privacy policy is at [www.criteo.com/privacy/](https://www.criteo.com
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=criteoIdSystem
+```
## Criteo ID Configuration
diff --git a/dev-docs/modules/userid-submodules/deepintent.md b/dev-docs/modules/userid-submodules/deepintent.md
index 4640088296..171b2c0b4d 100644
--- a/dev-docs/modules/userid-submodules/deepintent.md
+++ b/dev-docs/modules/userid-submodules/deepintent.md
@@ -3,6 +3,9 @@ layout: userid
title: Deepintent
description: Deepintent User ID sub-module
useridmodule: deepintentDpesIdSystem
+bidRequestUserId: deepintentId
+eidsource: deepintent.com
+example: '"1111"'
---
@@ -17,6 +20,7 @@ DPES ID is free to use and requires a simple registration with DeepIntent. Pleas
## Deepintent DPES ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module: `"deepintentId"` | `"deepintentId"` |
diff --git a/dev-docs/modules/userid-submodules/dmd.md b/dev-docs/modules/userid-submodules/dmd.md
index 7e932dc0c0..95b86aea3f 100644
--- a/dev-docs/modules/userid-submodules/dmd.md
+++ b/dev-docs/modules/userid-submodules/dmd.md
@@ -3,6 +3,9 @@ layout: userid
title: DMD ID by DMD Marketing Corp
description: DMD ID by DMD Marketing Corp User ID sub-module
useridmodule: dmdIdSystem
+bidRequestUserId: dmdId
+eidsource: hcn.health
+example: '"1111"'
---
@@ -12,8 +15,9 @@ For assistance setting up your module, please contact us at ` | `` | `` | `` | `` |
@@ -23,8 +27,9 @@ Kinesso will then attach these users to deals ids that they will target in the O
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=kinessoIdSystem
+```
## Kinesso ID Registration
@@ -33,6 +38,7 @@ You can set up Kinesso ID sub adapter by contacting Kinesso at
+{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module. | `'mwOpenLinkId'` |
@@ -27,8 +32,6 @@ MediaWallah requires the creation of an accountId a partnerId in order to take a
| params.accountId | Required | String | The MediaWallah assigned Account Id | `1000` |
| params.partnerId | Required | String | The MediaWallah assign partner Id |`'1001'`|
| params.uid | Optional | String | Your unique Id for the user or browser. Used for matching. | `'u-123xyz'` |
-{: .table .table-bordered .table-striped }
-
## MediaWallah OpenLinkID Examples
diff --git a/dev-docs/modules/userid-submodules/merkle.md b/dev-docs/modules/userid-submodules/merkle.md
index 71f583c6a9..9dd890e0f7 100644
--- a/dev-docs/modules/userid-submodules/merkle.md
+++ b/dev-docs/modules/userid-submodules/merkle.md
@@ -3,6 +3,9 @@ layout: userid
title: Merkle ID
description: Merkle IDUser ID sub-module
useridmodule: merkleIdSystem
+bidRequestUserId:merkleId
+eidsource: merkleinc.com
+example: '"1111"'
---
diff --git a/dev-docs/modules/userid-submodules/netid.md b/dev-docs/modules/userid-submodules/netid.md
index 67c2ff79a2..d02020a2bc 100644
--- a/dev-docs/modules/userid-submodules/netid.md
+++ b/dev-docs/modules/userid-submodules/netid.md
@@ -3,6 +3,9 @@ layout: userid
title: netID
description: netID User ID sub-module
useridmodule: netIdSystem
+bidRequestUserId: netId
+eidsource: netid.de
+example: '"fH5A..."'
---
diff --git a/dev-docs/modules/userid-submodules/novatiq.md b/dev-docs/modules/userid-submodules/novatiq.md
index cf86db5854..c409e68f16 100644
--- a/dev-docs/modules/userid-submodules/novatiq.md
+++ b/dev-docs/modules/userid-submodules/novatiq.md
@@ -3,6 +3,9 @@ layout: userid
title: Novatiq Hyper ID
description: Novatiq Hyper ID User ID sub-module
useridmodule: novatiqIdSystem
+bidRequestUserId: novatiqId
+eidsource: novatiq.com
+example: '"1111"'
---
@@ -12,8 +15,9 @@ The [Novatiq](https://www.novatiq.com) proprietary dynamic Hyper ID is a unique,
Enable by adding the Novatiq submodule to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=novatiqIdSystem,userId
+```
Module activation and configuration:
@@ -39,7 +43,8 @@ pbjs.setConfig({
## Parameters for the Novatiq Module
-
+{: .table .table-bordered .table-striped }
+
| Param | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | Module identification: `"novatiq"` | `"novatiq"` |
@@ -53,8 +58,6 @@ pbjs.setConfig({
| params.urlParams.useStandardUuid | Optional | Boolean | Use a standard UUID format, or the Novatiq UUID format | `false` |
| params.urlParams.useSspId | Optional | Boolean | Send the sspid (sourceid) along with the sync request
Makes the params.sourceid optional if set | `false` |
| params.urlParams.useSspHost | Optional | Boolean | Send the ssphost along with the sync request | `false` |
-{: .table .table-bordered .table-striped }
-
## Novatiq Hyper ID with Prebid SharedID Support
@@ -62,8 +65,9 @@ You can make use of the Prebid.js SharedId module as follows.
Enable by adding the Novatiq and SharedId submodule to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=novatiqIdSystem,userId
+```
Module activation and configuration:
diff --git a/dev-docs/modules/userid-submodules/onekey.md b/dev-docs/modules/userid-submodules/onekey.md
index 9b4d937868..f371228764 100644
--- a/dev-docs/modules/userid-submodules/onekey.md
+++ b/dev-docs/modules/userid-submodules/onekey.md
@@ -19,8 +19,9 @@ Background information:
It can be added to you Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build –modules=userId,oneKeyIdSystem
+```
⚠️ This module works with a RTD module. Both must be configured. See the [OneKey RTD Module](/dev-docs/modules/oneKeyRtdProvider.html).
@@ -32,6 +33,7 @@ Go to [onekey.community](https://onekey.community/) for more details.
## OneKey Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module | `"oneKeyData"` |
diff --git a/dev-docs/modules/userid-submodules/pair.md b/dev-docs/modules/userid-submodules/pair.md
index db98f896af..883c19d65b 100644
--- a/dev-docs/modules/userid-submodules/pair.md
+++ b/dev-docs/modules/userid-submodules/pair.md
@@ -11,12 +11,14 @@ reliance on third-party cookies. PAIR can help advertisers and publishers mainta
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=pairIdSystem
+```
## PAIR ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of PAIR ID user ID module. | `"pairId"` |
diff --git a/dev-docs/modules/userid-submodules/parrable.md b/dev-docs/modules/userid-submodules/parrable.md
index d8aa3be3ea..99bdf612ec 100644
--- a/dev-docs/modules/userid-submodules/parrable.md
+++ b/dev-docs/modules/userid-submodules/parrable.md
@@ -4,6 +4,9 @@ title: Parrable ID
description: Parrable ID User ID sub-module
pbjs_version_notes: removed in 9.0
useridmodule: parrableIdSystem
+bidRequestUserId: parrableId
+eidsource: parrable.com
+example: '{"eid":"01.15946..."}'
---
@@ -11,8 +14,9 @@ The Parrable ID is a Full Device Identifier that can be used to identify a devic
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=parrableIdSystem
+```
## Parrable ID Registration
@@ -25,6 +29,7 @@ The Parrable privacy policy as at [www.parrable.com/privacy-policy/](https://www
In addition to the parameters documented above in the Basic Configuration section the following Parrable specific configuration is required:
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| params | Required | Object | Details for the Parrable ID. | |
diff --git a/dev-docs/modules/userid-submodules/publisherlink.md b/dev-docs/modules/userid-submodules/publisherlink.md
index 2f6f44e965..6cbace8f08 100644
--- a/dev-docs/modules/userid-submodules/publisherlink.md
+++ b/dev-docs/modules/userid-submodules/publisherlink.md
@@ -3,6 +3,9 @@ layout: userid
title: Publisher Link
description: Publisher Link User ID sub-module
useridmodule: publinkIdSystem
+bidRequestUserId: publinkId
+eidsource: epsilon.com
+example:
---
@@ -24,13 +27,14 @@ The Publisher Link opt-out is included [here](https://www.epsilon.com/privacy/dm
In addition to the parameters documented above in the Basic Configuration section the following Publisher Link specific configuration is available:
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module. | `'publinkId'` |
| params | Required | Object | Customized parameters. | |
| params.e | Required | String | Hashed email address of the user. Supports MD5 and SHA256. | `'7D320454942620664D96EF78ED4E3A2A'` |
| params.site_id | Required | String | Site ID provided by Epsilon. | `'123456'` |
-| params.api_key | Required | String | API key provided by Epsilon. | `'00000000-0000-0000-0000-00000000000'`
+| params.api_key | Required | String | API key provided by Epsilon. | `'00000000-0000-0000-0000-00000000000'` |
## Publisher Link Examples
diff --git a/dev-docs/modules/userid-submodules/pubprovided.md b/dev-docs/modules/userid-submodules/pubprovided.md
index ba15abfe25..e533bd8c15 100644
--- a/dev-docs/modules/userid-submodules/pubprovided.md
+++ b/dev-docs/modules/userid-submodules/pubprovided.md
@@ -3,6 +3,9 @@ layout: userid
title: PubProvided ID
description: PubProvided ID User ID sub-module
useridmodule: pubProvidedIdSystem
+bidRequestUserId: pubProvidedId
+eidsource: publisher domain
+example: '"1111"'
---
@@ -57,37 +60,37 @@ The PubProvided ID module allows publishers to set and pass a first-party user i
});
```
-If multiple parties are writing to this object in an undetermined order, a setup that feels quite awkward, they should each do something of this nature:
-
-```javascript
-pbjs.mergeConfig({
- userSync: {
- userIds: (() => {
- const uidCfgs = pbjs.getConfig('userSync.userIds') || [];
- let ppid = uidCfgs.find(cfg => cfg.name === 'pubProvidedId');
- if (!ppid) {
- ppid = {name: 'pubProvidedId', params: {eids: []}};
- uidCfgs.push(ppid);
- }
- ppid.params.eids.push({
- source: "example.com",
- uids: [{
- id: "example",
- atype: 1,
- ext: {
- stype: "ppuid"
- }
-
- }]
- })
- return uidCfgs;
- })()
- }
-})
-pbjs.refreshUserIds({submoduleNames: ['pubProvidedId']})
-```
+ If multiple parties are writing to this object in an undetermined order, a setup that feels quite awkward, they should each do something of this nature:
+
+ ```javascript
+ pbjs.mergeConfig({
+ userSync: {
+ userIds: (() => {
+ const uidCfgs = pbjs.getConfig('userSync.userIds') || [];
+ let ppid = uidCfgs.find(cfg => cfg.name === 'pubProvidedId');
+ if (!ppid) {
+ ppid = {name: 'pubProvidedId', params: {eids: []}};
+ uidCfgs.push(ppid);
+ }
+ ppid.params.eids.push({
+ source: "example.com",
+ uids: [{
+ id: "example",
+ atype: 1,
+ ext: {
+ stype: "ppuid"
+ }
-In each case, bid adapters will receive the eid values after consent is validated. The above examples, if calling `setConfig` instead of `mergeConfig`, will overwrite existing known IDs. If there is any possibility other id submodules have already been initiated or multiple scripts on the page are setting these fields, be sure to prefer `mergeConfig`.
+ }]
+ })
+ return uidCfgs;
+ })()
+ }
+ })
+ pbjs.refreshUserIds({submoduleNames: ['pubProvidedId']})
+ ```
+
+ In each case, bid adapters will receive the eid values after consent is validated. The above examples, if calling `setConfig` instead of `mergeConfig`, will overwrite existing known IDs. If there is any possibility other id submodules have already been initiated or multiple scripts on the page are setting these fields, be sure to prefer `mergeConfig`.
2. This design allows for the setting of any number of uuids in the eids object. Publishers may work with multiple ID providers and nest their own ID within the same eids object. The opportunity to link a 1st party uuid and a 3rd party generated UUID presents publishers with a unique ability to address their users in a way demand sources will understand.
@@ -105,12 +108,14 @@ This module is distinct from the Google Ad Manager PPID; which we enable setting
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=pubProvidedIdSystem
+```
## PubProvided Configuration
{: .table .table-bordered .table-striped }
+
| Params under usersync.userIds[]| Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | ID value for the ID module | `"PubProvided"` |
diff --git a/dev-docs/modules/userid-submodules/quantcast.md b/dev-docs/modules/userid-submodules/quantcast.md
index 14ded4e370..0b4b145dff 100644
--- a/dev-docs/modules/userid-submodules/quantcast.md
+++ b/dev-docs/modules/userid-submodules/quantcast.md
@@ -3,14 +3,18 @@ layout: userid
title: Quantcast ID
description: Quantcast ID User ID sub-module
useridmodule: quantcastIdSystem
+bidRequestUserId: quantcastId
+eidsource: quantcast.com
+example: '"1111"'
---
The Prebid Quantcast ID module stores a Quantcast ID in a first party cookie. The ID is then made available in the bid request. The ID from the cookie added in the bidstream allows Quantcast to more accurately bid on publisher inventories without third party cookies, which can result in better monetization across publisher sites from Quantcast. And, it’s free to use! For easier integration, you can work with one of our SSP partners, like PubMatic, who can facilitate the legal process as well as the software integration for you.
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=userId,quantcastIdSystem
+```
Quantcast’s privacy policies for the services rendered can be found at
@@ -26,6 +30,7 @@ The Quantcast ID module will only perform any action and return an ID in situati
## Quantcast ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"quantcastId"` | `"quantcastId"` |
diff --git a/dev-docs/modules/userid-submodules/ramp.md b/dev-docs/modules/userid-submodules/ramp.md
index bde1b08d33..84f8f7e6d6 100644
--- a/dev-docs/modules/userid-submodules/ramp.md
+++ b/dev-docs/modules/userid-submodules/ramp.md
@@ -3,6 +3,9 @@ layout: userid
title: LiveRamp RampID
description: LiveRamp RampID User ID sub-module
useridmodule: identityLinkIdSystem
+bidRequestUserId: idl_env
+eidsource: liveramp.com
+example: '"1111"'
---
@@ -10,8 +13,9 @@ RampID, formerly known as IdentityLink, provided by [LiveRamp](https://liveramp.
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=identityLinkIdSystem
+```
## RampID Registration
@@ -22,17 +26,18 @@ The RampID privacy policy is at [liveramp.com/privacy/service-privacy-policy/](h
## RampID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of LiveRamp's user ID module. | `"identityLink"` |
| params | Required | Object | Container of all module params. | |
| params.pid | Required | String | This is the Placement ID, a unique identifier that is used to identify each publisher, obtained from registering with LiveRamp. | `"999"` |
| params.notUse3P | Not required | Boolean | Property for choosing if a cookieable RampID envelope (RTIS) should be set and stored until the user authenticates which then will be replaced by an authenticated RampID envelope (ATS) (either `true` or `false`). | `false` |
-| storage | Required | Object | This object defines where and for how long the results of the call to get a RampID envelope will be stored. |
+| storage | Required | Object | This object defines where and for how long the results of the call to get a RampID envelope will be stored. | |
| storage.type | Required | String | This parameter defines where the resolved RampID envelope will be stored (either `"cookie"` or `"html5"` localStorage). | `"cookie"` |
| storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved RampID envelope will be stored. LiveRamp requires `"idl_env"`. | `"idl_env"` |
| storage.expires | Required | Integer | How long (in days) the RampID envelope information will be stored. To be GDPR and CCPA compliant, we strongly advise to set a 15-day TTL ("Time to Live" / expiration time). If you are not planning to obtain RampID envelopes for EU/EEA or U.S. users, we advise you to change the expiration time to 30 days. | `15` |
-| storage.refreshInSeconds | Required | Integer | The amount of time (in seconds) the RampID envelope should be cached in storage before calling LiveRamp again to retrieve a potentially updated value for the RampID envelope. | `1800`
+| storage.refreshInSeconds | Required | Integer | The amount of time (in seconds) the RampID envelope should be cached in storage before calling LiveRamp again to retrieve a potentially updated value for the RampID envelope. | `1800` |
{: .alert.alert-info :}
**NOTE:** The RampID envelope that is delivered to Prebid will be encrypted by LiveRamp with a rotating key to avoid unauthorized usage and to enforce privacy requirements. Therefore, we strongly recommend setting `storage.refreshInSeconds` to 30 minutes (1800 seconds) to ensure all demand partners receive an ID that has been encrypted with the latest key, has up-to-date privacy signals, and allows them to transact against it.
diff --git a/dev-docs/modules/userid-submodules/sharedid.md b/dev-docs/modules/userid-submodules/sharedid.md
index 4c2c224b6a..f68470e6ca 100644
--- a/dev-docs/modules/userid-submodules/sharedid.md
+++ b/dev-docs/modules/userid-submodules/sharedid.md
@@ -3,6 +3,9 @@ layout: userid
title: SharedID
description: SharedID User ID sub-module
useridmodule: sharedIdSystem
+bidRequestUserId: sharedid
+eidsource: sharedid.org
+example: '{"id":"01EAJWWN...", "third":"01EAJ..."}'
---
@@ -13,25 +16,27 @@ SharedID into account. Prebid recommends implementing a method where users can
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=sharedIdSystem
+```
## SharedID ID Configuration
In addition to the parameters documented above in the Basic Configuration section the following SharedID specific configuration is available:
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module. | `'sharedId'` |
| params | Optional | Object | Customized parameters | |
| params.create | Optional | Boolean | For publisher server support only. If true, the publisher's server will create the (pubcid) cookie. Default is true. | `true` |
-| params.pixelUrl | Optional | String | For publisher server support only. Where to call out to for a server cookie -- see [Prebid Identity](/identity/sharedid.html) for more information. | `/wp-json/pubcid/v1/extend/`
+| params.pixelUrl | Optional | String | For publisher server support only. Where to call out to for a server cookie -- see [Prebid Identity](/identity/sharedid.html) for more information. | `/wp-json/pubcid/v1/extend/` |
| params.extend | Optional | Boolean | If true, the expiration time of the stored IDs will be refreshed during each page load. Default is false. | `false` |
-| storage | Required | Object | The publisher must specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. |
+| storage | Required | Object | The publisher must specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage.| |
| storage.expires | Integer | Required | How long the user ID information will be stored. | `365` |
-| storage.name | String | Required | The name of the cookie or html5 local storage where the user ID will be stored. | `_pubcid`
-| storage.type | String | Required | This is where the results of the user ID will be stored. Must be either: Must be either: "cookie" or "html5". For server side implementations, which have the best identifier life and revenue impact, this must be a cookie. | `cookie`
+| storage.name | String | Required | The name of the cookie or html5 local storage where the user ID will be stored. | `_pubcid` |
+| storage.type | String | Required | This is where the results of the user ID will be stored. Must be either: Must be either: "cookie" or "html5". For server side implementations, which have the best identifier life and revenue impact, this must be a cookie. | `cookie` |
## SharedID Examples
diff --git a/dev-docs/modules/userid-submodules/tapad.md b/dev-docs/modules/userid-submodules/tapad.md
index 7fdd8cfaa0..937ade5078 100644
--- a/dev-docs/modules/userid-submodules/tapad.md
+++ b/dev-docs/modules/userid-submodules/tapad.md
@@ -3,6 +3,9 @@ layout: userid
title: Tapad ID
description: Tapad ID User ID sub-module
useridmodule: tapadIdSystem
+bidRequestUserId: tapadId
+eidsource: tapad.com
+example: '"1111"'
---
@@ -15,12 +18,14 @@ Tapad’s Privacy landing page containing links to region-specific Privacy Notic
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=userId,tapadIdSystem
+```
## Tapad ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"tapadId"` | `"tapadId"` |
diff --git a/dev-docs/modules/userid-submodules/teads.md b/dev-docs/modules/userid-submodules/teads.md
index dd8f7fffcb..cf29808432 100644
--- a/dev-docs/modules/userid-submodules/teads.md
+++ b/dev-docs/modules/userid-submodules/teads.md
@@ -4,6 +4,9 @@ title: Teads ID
description: Teads ID User ID sub-module
useridmodule: teadsIdSystem
pbjs_version_notes: please avoid using v7.20.0 and v7.21.0
+bidRequestUserId: teadsId
+eidsource: teads.com
+example: '"1111"'
---
@@ -20,6 +23,7 @@ gulp build --modules=userId,teadsIdSystem
Then configure the teadsId in your `userSync` configuration.
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"teadsId"` | `"teadsId"` |
diff --git a/dev-docs/modules/userid-submodules/tncIdSystem.md b/dev-docs/modules/userid-submodules/tncIdSystem.md
index d0c499e719..27d005b70e 100644
--- a/dev-docs/modules/userid-submodules/tncIdSystem.md
+++ b/dev-docs/modules/userid-submodules/tncIdSystem.md
@@ -21,7 +21,7 @@ gulp build --modules=tncIdSystem,userId
## TNCIdSystem module Configuration
-Disclosure: This module loads external script unreviewed by the prebid.js community
+{% include dev-docs/loads-external-javascript.md %}
You can configure this submodule in your `userSync.userIds[]` configuration:
@@ -49,6 +49,7 @@ pbjs.setConfig({
The following configuration parameters are available:
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this sub-module | `"tncId"` |
diff --git a/dev-docs/modules/userid-submodules/trustpid.md b/dev-docs/modules/userid-submodules/trustpid.md
index ab4ec4d7ac..ea4c4b8032 100644
--- a/dev-docs/modules/userid-submodules/trustpid.md
+++ b/dev-docs/modules/userid-submodules/trustpid.md
@@ -4,6 +4,9 @@ title: Trustpid
description: Trustpid User ID sub-module
pbjs_version_notes: not in 8.x
useridmodule: trustpidSystem
+bidRequestUserId:
+eidsource:
+example:
---
{: .alert.alert-info :}
@@ -16,9 +19,10 @@ Trustpid is also the brand name of the service, which is provided by Vodafone Sa
## Trustpid configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | The name of the module | `"trustpid"`
+| name | Required | String | The name of the module | `"trustpid"` |
| params | Required | Object | Object with configuration parameters for trustpid User Id submodule | - |
| params.maxDelayTime | Required | Integer | Max amount of time (in seconds) before looking into storage for data | 2500 |
| bidders | Required | Array of Strings | An array of bidder codes to which this user ID may be sent. Currently required and supporting AdformOpenRTB | `['adf']` |
diff --git a/dev-docs/modules/userid-submodules/unified.md b/dev-docs/modules/userid-submodules/unified.md
index 5c9fc0856b..4a94c76a02 100644
--- a/dev-docs/modules/userid-submodules/unified.md
+++ b/dev-docs/modules/userid-submodules/unified.md
@@ -3,6 +3,9 @@ layout: userid
title: Unified ID
description: Unified ID User ID sub-module
useridmodule: unifiedIdSystem
+bidRequestUserId: tdid
+eidsource: adserver.org
+example: '"1111"'
---
@@ -10,8 +13,9 @@ The Unified ID solution is provided by adsrvr.org and the Trade Desk.
Add it to your Prebid.js package with:
-{: .alert.alert-info :}
+```bash
gulp build --modules=unifiedIdSystem
+```
## Unified ID Registration
@@ -25,6 +29,7 @@ The Unified ID privacy is covered under the [TradeDesk Services Privacy Policy](
## Unified ID Configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | `"unifiedId"` | `"unifiedId"` |
diff --git a/dev-docs/modules/userid-submodules/unified2.md b/dev-docs/modules/userid-submodules/unified2.md
index 5a6f105f0d..74593d37df 100644
--- a/dev-docs/modules/userid-submodules/unified2.md
+++ b/dev-docs/modules/userid-submodules/unified2.md
@@ -11,8 +11,9 @@ UID2 relies on user consent before an ID can be added to the bid stream. Consent
To add UID2 to your Prebid.js package, run the following:
-{: .alert.alert-info :}
+```bash
gulp build --modules=uid2IdSystem
+```
## Unified ID 2.0 Registration
@@ -71,6 +72,7 @@ Prebid.js supports fully client side integration for UID2. See the [official UI
The following parameters apply only to the Unified ID 2.0 module integration.
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | ID value for the Unified ID 2.0 module - `"uid2"` | `"uid2"` |
diff --git a/dev-docs/modules/userid-submodules/utiq.md b/dev-docs/modules/userid-submodules/utiq.md
index 116f4eaa66..0e7b92791f 100644
--- a/dev-docs/modules/userid-submodules/utiq.md
+++ b/dev-docs/modules/userid-submodules/utiq.md
@@ -3,6 +3,9 @@ layout: userid
title: Utiq ID
description: Utiq User ID sub-module
useridmodule: utiqIdSystem
+bidRequestUserId: utiId
+eidsource: utiq.com
+example: '"1111"'
---
Utiq generates unique tokens, enabling improved efficiency in programmatic advertising while safeguarding transparency and control for end customers via `consenthub.utiq.com`. A website visitor’s Utiq is generated based on network identifiers provided by network operators and requires explicit user consent.
@@ -12,6 +15,7 @@ Utiq is also the brand name of the service, which is provided by Utiq SA/NV.
## Utiq ID configuration
{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of the module | `"utiqId"` |
diff --git a/dev-docs/modules/userid-submodules/utiqMtp.md b/dev-docs/modules/userid-submodules/utiqMtp.md
index 854042d27e..94cbc2323c 100644
--- a/dev-docs/modules/userid-submodules/utiqMtp.md
+++ b/dev-docs/modules/userid-submodules/utiqMtp.md
@@ -3,6 +3,9 @@ layout: userid
title: UtiqMtp ID
description: UtiqMtp User ID sub-module
useridmodule: utiqMtpIdSystem
+bidRequestUserId: utiqMtpId
+eidsource: utiq-mtp.com
+example: '"1111"'
---
Utiq generates unique tokens, enabling improved efficiency in programmatic advertising while safeguarding transparency and control for end customers via `consenthub.utiq.com`. A website visitor’s Utiq ID is generated based on network identifiers provided by network operators and requires explicit user consent.
@@ -21,6 +24,7 @@ If you are interested in using Utiq on your website, please contact Utiq on
+{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module. | `"connectId"` |
| params | Required | Object | Container of all module params. ||
-| params.pixelId | Required | Number |
-The Yahoo-supplied publisher-specific pixel ID. | `"0000"` |
+| params.pixelId | Required | Number | The Yahoo-supplied publisher-specific pixel ID. | `"0000"` |
| params.he | Optional | String | The SHA-256 hashed user email address which has been lowercased prior to hashing. |`"ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"`|
| params.puid | Optional | String | A domain-specific user identifier such as a first-party cookie. If not passed, a puid value will be auto-generated and stored in local and / or cookie storage. | `"ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c5880dba3baf9c1da"` |
-{: .table .table-bordered .table-striped }
-
## Yahoo ConnectID Examples
@@ -107,12 +109,11 @@ Finally, ConnectID follows all global privacy laws (such as the CCPA) and indust
Please note that the storage related parameters are optional. We recommend that you omit them, since ConnectID module is pre-configured with the most optimal storage parameters already.
-
+{: .table .table-bordered .table-striped }
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| storage | Optional | Object | Defines where and for how long the results of the call to get a user ID will be stored. | |
| storage.type | Optional | String | Defines where the resolved user ID will be stored (either 'cookie' or 'html5' local storage). | `'cookie'` |
| storage.name | Optional | String | The name of the cookie or html5 local storage where the resolved user ID will be stored. | `'connectId'` |
| storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `15` |
-{: .table .table-bordered .table-striped }
-
diff --git a/dev-docs/modules/userid-submodules/yandex.md b/dev-docs/modules/userid-submodules/yandex.md
index 1b0f8bbbbc..7ff4e9ce0a 100644
--- a/dev-docs/modules/userid-submodules/yandex.md
+++ b/dev-docs/modules/userid-submodules/yandex.md
@@ -3,6 +3,9 @@ layout: userid
title: Yandex ID
description: Yandex User ID sub-module
useridmodule: yandexIdSystem
+bidRequestUserId: yandexId
+eidsource: yandex.com
+example: '"1111"'
---
Yandex ID module is designed to improve the personalization of ads for publishers' users. This documentation provides information about the Yandex User ID module, and instructions to install it.
@@ -11,8 +14,9 @@ Yandex ID module is designed to improve the personalization of ads for publisher
Add the module to your Prebid.js package:
-{: .alert.alert-info :}
+```bash
gulp build --modules=yandexIdSystem
+```
## Step 2. Enable Yandex ID
diff --git a/dev-docs/modules/wurflRtdProvider.md b/dev-docs/modules/wurflRtdProvider.md
index 9ecd4cae12..a146b3efdb 100644
--- a/dev-docs/modules/wurflRtdProvider.md
+++ b/dev-docs/modules/wurflRtdProvider.md
@@ -22,7 +22,7 @@ This module loads a dynamically generated JavaScript from prebid.wurflcloud.com
## Description
-The WURFL RTD module enriches the Prebid.js bid request's OpenRTB 2.0 device data with [WURFL device data](https://www.scientiamobile.com/wurfl-js-business-edition-at-the-intersection-of-javascript-and-enterprise/). The module populates the `device.ext.wurfl` with WURFL device capabilities, ensuring that all bidder adapters have access to enriched device data. At a minimum, three WURFL capabilities are made available to all adapters: `is_mobile`, `complete_device_name` and `form_factor`.
+The WURFL RTD module enriches the Prebid.js bid request's OpenRTB 2.0 device data with [WURFL device data](https://www.scientiamobile.com/wurfl-js-business-edition-at-the-intersection-of-javascript-and-enterprise/). The module populates the `device` and `device.ext.wurfl` with WURFL device capabilities, ensuring that all bidder adapters have access to enriched device data. At a minimum, three WURFL capabilities are made available to all adapters: `is_mobile`, `complete_device_name` and `form_factor`.
SSPs and other demand partners subscribed to this service with ScientiaMobile will also receive an expanded set of device properties, including more detailed detection for iOS devices (e.g., specific iPhone and iPad model information). For a comprehensive list of available device capabilities, please refer to the [WURFL device capabilities](https://www.scientiamobile.com/capabilities/?products%5B%5D=wurfl-js) documentation.
@@ -42,8 +42,8 @@ The following scenarios are possible:
| | SSP Adapter | SSP Server Side End-Point |
| :------------------------ | :------------ | :--------------------------------------------------------------- |
| SSP adapter is already passing the ORTB2 device to the server (auction endpoint). | No changes required. | Update backend logic to utilize the device data. |
-| SSP adapter is not currently passing the data to server. | Update adapter to read `device.ext.wurfl` data and pass it to the endpoint. | Update backend logic to utilize the device data. |
-| SSP doesn't have a Bidder Adapter. | Implement PreBid.js adapter and read `device.ext.wurfl` data and pass it to the endpoint. | Update end-point to read and utilize the data. |
+| SSP adapter is not currently passing the data to server. | Update adapter to read `device` and/or `device.ext.wurfl` data and pass it to the endpoint. | Update backend logic to utilize the device data. |
+| SSP doesn't have a Bidder Adapter. | Implement PreBid.js adapter and read `device` and/or `device.ext.wurfl` data and pass it to the endpoint. | Update end-point to read and utilize the data. |
## Usage
diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md
index fef8e66c1e..43957cffb6 100644
--- a/dev-docs/publisher-api-reference/setConfig.md
+++ b/dev-docs/publisher-api-reference/setConfig.md
@@ -1175,7 +1175,8 @@ The `auctionOptions` object controls aspects related to auctions.
| Field | Scope | Type | Description |
|----------+---------+--------+---------------------------------------------------------------------------------------|
| `secondaryBidders` | Optional | Array of Strings | Specifies bidders that the Prebid auction will no longer wait for before determining the auction has completed. This may be helpful if you find there are a number of low performing and/or high timeout bidders in your page's rotation. |
-| `suppressStaleRender` | Optional | Boolean | When true, prevents `banner` bids from being rendered more than once. It should only be enabled after auto-refreshing is implemented correctly. Default is false.
+| `suppressStaleRender` | Optional | Boolean | When true, prevents `banner` bids from being rendered more than once. It should only be enabled after auto-refreshing is implemented correctly. Default is false. |
+| `suppressExpiredRender` | Optional | Boolean | When true, prevent bids from being rendered if TTL is reached. Default is false.
#### Examples
{: .no_toc}
@@ -1212,6 +1213,28 @@ PBJS performs following actions when stale rendering is detected.
Stale winning bids will continue to be rendered unless `suppressStaleRender` is set to true. Events including `STALE_RENDER` and `BID_WON` are unaffected by this option.
+Render only non-expired bids.
+
+```javascript
+pbjs.setConfig({
+ 'auctionOptions': {
+ 'suppressExpiredRender': true
+ }
+});
+```
+
+#### More on Expired Rendering
+{: .no_toc}
+
+We are validating the `ttl` property before rendering an ad. If the ad has exceeded its ttl value and the `suppressExpiredRender` property is enabled, the system will suppress the rendering of the expired ad.
+
+PBJS performs the following actions when expired rendering is detected.
+
+* Log a warning in the browser console if pbjs_debug=true.
+* Emit a `EXPIRED_RENDER` event before `BID_WON` event.
+
+Expired winning bids will continue to be rendered unless `suppressExpiredRender` is set to true. Events including `STALE_RENDER` and `BID_WON` are unaffected by this option.
+
### maxNestedIframes
diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md
index 90aaa31aa7..72b43f3b14 100644
--- a/prebid-server/developers/add-a-module-java.md
+++ b/prebid-server/developers/add-a-module-java.md
@@ -123,6 +123,7 @@ These are the available hooks that can be implemented in a module:
- org.prebid.server.hooks.v1.bidder.RawBidderResponseHook
- org.prebid.server.hooks.v1.bidder.AllProcessedBidResponsesHook
- org.prebid.server.hooks.v1.auction.AuctionResponseHook
+- org.prebid.server.hooks.v1.exitpoint.ExitpointHook
In a module it is not necessary to implement all mentioned interfaces but only one (or several) required by your functionality.
@@ -131,6 +132,17 @@ Each hook interface internally extends org.prebid.server.hooks.v1.Hook basic int
- `code()` - returns module code.
- `call(...)` - returns result of hook invocation.
+### Difference between AuctionResponseHook and ExitpointHook
+In a nutshell, both hooks allow the modification of the OpenRTB Bid Response but in different ways.
+The `AuctionResponseHook` provides a last chance to work with the Java objects that modify the auction response.
+The `ExitpointHook` allows you to build a completely different response based on the received auction context. i.e. something that's not OpenRTB JSON - something like VAST. These hooks could modify the auction/amp/video response that PBS has built, or it could build another one and modify response headers accordingly.
+
+Important Notes:
+
+- The ExitpointHook is a powerful tool that allows rewriting the auction results, so make sure important data won't be lost for the client.
+- Since the response body is not modified after calling the ExitpointHook, debug and traces won't be added by PBS-core. The exitpoint hook is responsible for adding its own tracing to the generated output.
+- Analytics adapters doesn't have access to the response built by the ExitpointHook, but they receive the up-to-date auction context with the ExitpointHook execution status and analytics tags.
+
### Examples
1. To **update** the request in the `RawAuctionRequestHook` you would return:
diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md
index 74059d93a3..0edbbd3cb7 100644
--- a/prebid-server/developers/add-a-module.md
+++ b/prebid-server/developers/add-a-module.md
@@ -70,7 +70,8 @@ Here's a description of the Stages of a PBS request that modules can tap into fo
| Bidder Request | The request has been customized for a particular bidder in the auction. Note that the module will be called in parallel for each bidder in the auction. | auction, amp, video | Bidder-specific bcat/badv, Bidder-specific deals |
| Raw Bidder Response | Hook functions can get access to the unprocessed bidder response. Note that the module will be called in parallel for each bidder in the auction. | auction, amp, video | Response validations |
| All Processed Bid Responses | All bids are back and PBS-core bid validations are done. | auction, amp, video | Creative validation, advanced bid validations. |
-| Auction Response | Last step before the response goes back to the client | auction, amp, video | Inject ad server targeting, alternate auction winner logic |
+| Auction Response | Last chance to modify the bid auction response | auction, amp, video | Inject ad server targeting, alternate auction winner logic |
+| Exitpoint | (PBS-Java 3.16+) Last step before the response goes back to the client. Specify the response headers and body | auction, amp, video | Create a VAST response instead of OpenRTB. |
### 3. Figure Out Which Stages You're Going to Hook Into
diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md
index 02f3eb8ae0..b18d63acdb 100644
--- a/prebid-server/developers/add-new-bidder-go.md
+++ b/prebid-server/developers/add-new-bidder-go.md
@@ -8,16 +8,16 @@ title: Prebid Server | Developers | Building a Bid Adapter (Go)
# Prebid Server - New Bid Adapter (Go)
{: .no_toc}
-Thank you for your valuable contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We truly appreciate your support in making this ecosystem thrive!
+- TOC
+{:toc }
+
+Thank you for your contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We appreciate your support in making this ecosystem thrive!
This document guides you through the process of developing a new bid adapter for your bidding server. We encourage you to look at [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance. You can ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new).
{: .alert.alert-info :}
There are two implementations of Prebid Server: [PBS-Go](https://github.com/prebid/prebid-server) and [PBS-Java](https://github.com/prebid/prebid-server-java). We recommend you build new adapters for PBS-Go and allow us to port it to PBS-Java within a couple of months. If you'd like to build both yourself, please also follow these [instructions for building an adapter in PBS-Java](/prebid-server/developers/add-new-bidder-java.html).
-* TOC
-{:toc }
-
## Overview
Bid adapters are responsible for translating a 'Prebid-flavored' OpenRTB Bid Request to your bidding server's protocol and mapping your server's response to a Prebid-flavored response.
@@ -71,15 +71,15 @@ We are proud to run the Prebid Server project as a transparent and trustworthy h
**Please take the time to read the rules in full.** Below is a summary of some of the rules which apply to your Prebid Server bid adapter:
-* Adapters must include maintainer information with a group email address for Prebid.org to contact for ongoing support and maintenance.
-* Your bidder's endpoint domain name cannot be fully variable. We will accept endpoint domains that include account IDs, but we do not like them, and Prebid Server host companies may disable adapters using this approach if there are technical issues with it. We will not accept hostnames that have a required dynamic element for the purpose of sending traffic to different geographic regions.
-* If you have a client-side adapter, all parameters (including biddercodes and aliases) must be consistent between your client- and server-side adapters. This allows publishers to utilize the PBJS [s2sTesting module](/dev-docs/modules/s2sTesting.html).
-* Adapters must not modify bids from demand partners, except to either change the bid from gross to net or from one currency to another.
-* Adapters must use the functions provided by the core framework for all external communication. Initiation of any form of network connection outside of what is provided by the core framework is strictly prohibited. No exceptions will be made for this rule.
-* Adapters must support the creation of multiple concurrent instances. This means adapters may not mutate global or package scoped variables.
-* Bidding server endpoints should prefer secure HTTPS to protect user privacy and should allow keep alive connections (preferably with HTTP/2 support) to increase host performance.
-* Adapters must annotate the bid response with the proper media type, ideally based on the response from the bidding server.
-* Bid adapters must not create their own transaction IDs or overwrite the tids supplied by Prebid.
+- Adapters must include maintainer information with a group email address for Prebid.org to contact for ongoing support and maintenance.
+- Your bidder's endpoint domain name cannot be fully variable. We will accept endpoint domains that include account IDs, but we do not like them, and Prebid Server host companies may disable adapters using this approach if there are technical issues with it. We will not accept hostnames that have a required dynamic element for the purpose of sending traffic to different geographic regions.
+- If you have a client-side adapter, all parameters (including biddercodes and aliases) must be consistent between your client- and server-side adapters. This allows publishers to utilize the PBJS [s2sTesting module](/dev-docs/modules/s2sTesting.html).
+- Adapters must not modify bids from demand partners, except to either change the bid from gross to net or from one currency to another.
+- Adapters must use the functions provided by the core framework for all external communication. Initiation of any form of network connection outside of what is provided by the core framework is strictly prohibited. No exceptions will be made for this rule.
+- Adapters must support the creation of multiple concurrent instances. This means adapters may not mutate global or package scoped variables.
+- Bidding server endpoints should prefer secure HTTPS to protect user privacy and should allow keep alive connections (preferably with HTTP/2 support) to increase host performance.
+- Adapters must annotate the bid response with the proper media type, ideally based on the response from the bidding server.
+- Bid adapters must not create their own transaction IDs or overwrite the tids supplied by Prebid.
{: .alert.alert-warning :}
Failure to follow the rules will lead to delays in approving your adapter. If you'd like to discuss an exception to a rule, please make your request by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new).
@@ -150,20 +150,20 @@ userSync:
Modify this template for your bid adapter:
-* The endpoint can be static if you only have one data center or use a Global Load Balancer as described in 'Planning Your Adapter' above.
-* Remove the `endpointCompression` value if your bidding server does not accept gzip compressed bid requests. Setting this value to `gzip` will save on network bandwidth at the expense of slightly increased cpu and memory usage for the host.
-* The `geoscope` parameter is not currently read programmatically. Instead, it's intended to be used by PBS host companies to disable your adapter in geographic regions where you don't do business. However, we may make a module for this someday, so we ask that you follow this syntax for `geoscope`:
- * YAML array
- * Values can be either a 3-letter country code, "EEA", or "global". (EEA means European Economic Area)
- * Values can be negated. e.g. "!EEA"
-* Change the maintainer email address to a group distribution list on your ad server's domain. A distribution list is preferred over an individual mailbox to allow for robustness, as roles and team members naturally change.
-* Change the `gvlVendorID` from the sample value of `42` to the id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/tcf-for-vendors/), or remove this line entirely if your bidding server is not registered with IAB Europe.
-* Remove the `openrtb.version` parameter if your adapter cannot receive the OpenRTB 2.6 data model. In this case, Prebid Server will downgrade values back to their 2.5 ext locations. New OpenRTB 2.6 fields are still passed to adapters.
-* If absolutely necessary, change the `modifyingVastXmlAllowed` value to `false` to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015). However, please note that Prebid Server host companies depend on this feature being enabled to track video analytics. This feature has been live for many years with no known problems.
-* Remove the `capabilities` (app/site/dooh) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. (Note: 'dooh' is [Digital Out Of Home](/prebid-server/use-cases/pbs-dooh.html))
-* Add an `extra_info` field if you'd like to pass additional values that your adapter may need. See below for an example.
-* Add the `disabled` flag and set it to true if you would like to unregister adapter from the core. It's enabled by default.
-* Follow the [User Sync Configuration](#user-sync-configuration) documentation below to configure the endpoints for your bid adapter, or remove the `userSync` section if not supported.
+- The endpoint can be static if you only have one data center or use a Global Load Balancer as described in 'Planning Your Adapter' above.
+- Remove the `endpointCompression` value if your bidding server does not accept gzip compressed bid requests. Setting this value to `gzip` will save on network bandwidth at the expense of slightly increased cpu and memory usage for the host.
+- The `geoscope` parameter is not currently read programmatically. Instead, it's intended to be used by PBS host companies to disable your adapter in geographic regions where you don't do business. However, we may make a module for this someday, so we ask that you follow this syntax for `geoscope`:
+ - YAML array
+ - Values can be either a 3-letter country code, "EEA", or "global". (EEA means European Economic Area)
+ - Values can be negated. e.g. "!EEA"
+- Change the maintainer email address to a group distribution list on your ad server's domain. A distribution list is preferred over an individual mailbox to allow for robustness, as roles and team members naturally change.
+- Change the `gvlVendorID` from the sample value of `42` to the id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/tcf-for-vendors/), or remove this line entirely if your bidding server is not registered with IAB Europe.
+- Remove the `openrtb.version` parameter if your adapter cannot receive the OpenRTB 2.6 data model. In this case, Prebid Server will downgrade values back to their 2.5 ext locations. New OpenRTB 2.6 fields are still passed to adapters.
+- If absolutely necessary, change the `modifyingVastXmlAllowed` value to `false` to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015). However, please note that Prebid Server host companies depend on this feature being enabled to track video analytics. This feature has been live for many years with no known problems.
+- Remove the `capabilities` (app/site/dooh) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. (Note: 'dooh' is [Digital Out Of Home](/prebid-server/use-cases/pbs-dooh.html))
+- Add an `extra_info` field if you'd like to pass additional values that your adapter may need. See below for an example.
+- Add the `disabled` flag and set it to true if you would like to unregister adapter from the core. It's enabled by default.
+- Follow the [User Sync Configuration](#user-sync-configuration) documentation below to configure the endpoints for your bid adapter, or remove the `userSync` section if not supported.
#### Additional Bidder Info Examples
@@ -355,7 +355,7 @@ Publishers will provide extra information using an OpenRTB 2.x Bid Request Exten
We request you do not duplicate information already present in the [OpenRTB 2.x Bid Request specification](https://github.com/InteractiveAdvertisingBureau/openrtb2.x) or already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.x Bid Request standard of `request.imp[].video`.
{: .alert.alert-warning :}
-You may not try so set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain.
+You may not try to set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain.
Create a file with the path `static/bidder-params/{bidder}.json` and use [JSON Schema](https://json-schema.org/understanding-json-schema/) to define your bidder parameters. Prebid Server requires this file for every adapter, even if yours doesn't require bidder parameters (see the 'no parameters' example at the end of this section).
@@ -545,8 +545,8 @@ Each adapter has its own directory (a 'package' in Go parlance) for all code and
Create a file with the path `adapters/{bidder}/{bidder}.go`. Your bid adapter code will need to implement and export:
-* The `adapters.Builder` method to create a new instance of the adapter based on the host configuration.
-* The `adapters.Bidder` interface consisting of the `MakeRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses.
+- The `adapters.Builder` method to create a new instance of the adapter based on the host configuration.
+- The `adapters.Bidder` interface consisting of the `MakeRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses.
{: .alert.alert-info :}
**ACCESS MODIFIERS:** Go has only two kinds of access modifiers, exported and private, which are scoped at the package level. The access modifier is encoded into the name of the type or method. Names starting with an upper case letter are exported whereas names starting with a lower case letter are private. Please only export the three required methods and keep everything else private.
@@ -667,8 +667,8 @@ The first argument, `bidderName`, is the name of the bidder being built. This ma
The second argument, `config`, is all the configuration values set for your adapter. However, not all of this information is intended for use by the `Builder` method. The only two fields relevant here are `config.Endpoint` and `config.ExtraAdapterInfo`:
-* `config.Endpoint` is the base url of your bidding server and may be interpreted as either a literal address or as a templated macro to support dynamic paths.
-* `config.ExtraAdapterInfo` is an optional setting may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice.
+- `config.Endpoint` is the base url of your bidding server and may be interpreted as either a literal address or as a templated macro to support dynamic paths.
+- `config.ExtraAdapterInfo` is an optional setting may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice.
The third argument, `server`, is a set of host configs. It can be passed in two different ways. One way is to pass this info in the auction request itself at the path `ext.prebid.server` (i.e. `ext.prebid.server.datacenter`). The second way is to pass this info as a configuration data structure.
@@ -770,9 +770,9 @@ if request.Imp[i].W == nil && request.Imp[i].H == nil && len(request.Imp[i].Form
The second argument, `requestInfo`, is for extra information and helper methods provided by the core framework. This includes:
-* `requestInfo.PbsEntryPoint` to access the entry point of the bid request, commonly used to determine if the request is for AMP or for a [Long Form Video Ad Pod](/dev-docs/modules/adpod.html).
-* `requestInfo.GlobalPrivacyControlHeader` to read the value of the `Sec-GPC` Global Privacy Control (GPC) header of the bid request.
-* `requestInfo.ConvertCurrency` a method to perform currency conversions.
+- `requestInfo.PbsEntryPoint` to access the entry point of the bid request, commonly used to determine if the request is for AMP or for a [Long Form Video Ad Pod](/dev-docs/modules/adpod.html).
+- `requestInfo.GlobalPrivacyControlHeader` to read the value of the `Sec-GPC` Global Privacy Control (GPC) header of the bid request.
+- `requestInfo.ConvertCurrency` a method to perform currency conversions.
The `MakeRequests` method is expected to return a slice (similar to a C# `List` or a Java `ArrayList`) of `adapters.RequestData` objects representing the HTTP calls to be sent to your bidding server and a slice of type `error` for any issues encountered creating them. If there are no HTTP calls or if there are no errors, please return `nil` for both return values. Please do not add `nil` items in the slices.
@@ -1076,8 +1076,8 @@ aliasOf: "appnexus"
Notes:
-* The alias name must be unique for the first 6 chars as noted above for biddercodes.
-* This process will be simplified someday.
+- The alias name must be unique for the first 6 chars as noted above for biddercodes.
+- This process will be simplified someday.
{: .alert.alert-info :}
Note on aliases and TCF Global Vendor List IDs: if an alias entry does not have its own GVLID but wishes to claim GDPR support,
@@ -1128,8 +1128,8 @@ You should use an obviously fake endpoint for your tests. There's no reason to u
Each test case should be written in its own JSON file with a succinct, yet descriptive, name of what's being tested. The files should be located in either:
-* `adapters/{bidder}/{bidder}test/exemplary/` for straight forward "happy path" tests. We expect to see tests here for each supported media type.
-* `adapters/{bidder}/{bidder}test/supplemental` for tests which produce errors or cover more complicated scenarios.
+- `adapters/{bidder}/{bidder}test/exemplary/` for straight forward "happy path" tests. We expect to see tests here for each supported media type.
+- `adapters/{bidder}/{bidder}test/supplemental` for tests which produce errors or cover more complicated scenarios.
The format of a JSON test is as follows:
@@ -1382,41 +1382,41 @@ The Example Bidding adapter requires setup before beginning. Please contact us a
Notes on the metadata fields:
-* Add `pbs: true`. If you also have a [Prebid.js bid adapter](/dev-docs/bidder-adaptor.html), add `pbjs: true`. Default is false for both.
-* If you're on the IAB's Global Vendor List, place your ID in `gvl_id`. No default.
-* If you support the IAB's TCF protocol and have a GVL ID, you may add `tcfeu_supported: true`. Default is false.
-* If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false.
-* If you support one or more userId modules, add `userId: (list of supported vendors)`. Default is none.
-* If you support video, native, or audio mediaTypes add `media_types: video, native, audio`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults.
-* If you support COPPA, add `coppa_supported: true`. Default is false.
-* If you support sections within the IAB's GPP consent string, add `gpp_sids:' and then which sections you support: tcfeu, tcfca, usnat, usstate_all, usp
-* If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false.
-* If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false.
-* If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default.
-* If your bidder supports mobile apps, set `pbs_app_supported: true`. No default value.
-* If your bidder supports deals, set `deals_supported: true`. No default value.
-* If your bidder supports floors, set `floors_supported: true`. No default value.
-* If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value.
-* If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to ‘true’,’partial’, or ‘false’. No default value. In order to set ‘true’, you must support: bcat, badv, battr, and bapp.
-* Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid
-* If you're a member of Prebid.org, add `prebid_member: true`. Default is false.
+- Add `pbs: true`. If you also have a [Prebid.js bid adapter](/dev-docs/bidder-adaptor.html), add `pbjs: true`. Default is false for both.
+- If you're on the IAB's Global Vendor List, place your ID in `gvl_id`. No default.
+- If you support the IAB's TCF protocol and have a GVL ID, you may add `tcfeu_supported: true`. Default is false.
+- If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false.
+- If you support one or more userId modules, add `userId: (list of supported vendors)`. Default is none.
+- If you support video, native, or audio mediaTypes add `media_types: video, native, audio`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults.
+- If you support COPPA, add `coppa_supported: true`. Default is false.
+- If you support sections within the IAB's GPP consent string, add `gpp_sids:' and then which sections you support: tcfeu, tcfca, usnat, usstate_all, usp
+- If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false.
+- If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false.
+- If your bidder doesn't work well with safeframed creatives, add `safeframes_ok: false`. This will alert publishers to not use safeframed creatives when creating the ad server entries for your bidder. No default.
+- If your bidder supports mobile apps, set `pbs_app_supported: true`. No default value.
+- If your bidder supports deals, set `deals_supported: true`. No default value.
+- If your bidder supports floors, set `floors_supported: true`. No default value.
+- If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value.
+- If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to ‘true’,’partial’, or ‘false’. No default value. In order to set ‘true’, you must support: bcat, badv, battr, and bapp.
+- Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid
+- If you're a member of Prebid.org, add `prebid_member: true`. Default is false.
## File Checklist
-* Bidder Info
- * `static/bidder-info/{bidder}.yaml`
-* Bidder Parameters
- * `static/bidder-params/{bidder}.json`
- * `openrtb_ext/imp_{bidder}.go`
- * `adapters/{bidder}/params_test.go`
-* Adapter Code
- * `adapters/{bidder}/{bidder}.go`
- * `adapters/{bidder}/{bidder}_test.go`
- * `adapters/{bidder}/{bidder}test/exemplary/*.json`
- * `adapters/{bidder}/{bidder}test/supplemental/*.json`
-* Register With The Core
- * `openrtb_ext/bidders.go`
- * `exchange/adapter_builders.go`
+- Bidder Info
+ - `static/bidder-info/{bidder}.yaml`
+- Bidder Parameters
+ - `static/bidder-params/{bidder}.json`
+ - `openrtb_ext/imp_{bidder}.go`
+ - `adapters/{bidder}/params_test.go`
+- Adapter Code
+ - `adapters/{bidder}/{bidder}.go`
+ - `adapters/{bidder}/{bidder}_test.go`
+ - `adapters/{bidder}/{bidder}test/exemplary/*.json`
+ - `adapters/{bidder}/{bidder}test/supplemental/*.json`
+- Register With The Core
+ - `openrtb_ext/bidders.go`
+ - `exchange/adapter_builders.go`
## Contribute
diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md
index 18b20e2b0b..f0aa1b5f3c 100644
--- a/prebid-server/developers/add-new-bidder-java.md
+++ b/prebid-server/developers/add-new-bidder-java.md
@@ -11,7 +11,7 @@ title: Prebid Server | Developers | Adding a New Bidder
- TOC
{:toc }
-Thank you for your valuable contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We truly appreciate your support in making this ecosystem thrive!
+Thank you for your contribution of a bid adapter to the open source Prebid Server project. Each new adapter expands the monetization possibilities for publishers and provides greater options to maximize their inventory's potential. We appreciate your support in making this ecosystem thrive!
This document guides you through the process of developing a new bid adapter for your bidding server. We encourage you to look at [existing bid adapters](https://github.com/prebid/prebid-server-java/tree/master/src/main/java/org/prebid/server/bidder) for working examples and practical guidance. You can ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server-java/issues/new).
@@ -267,7 +267,7 @@ Publishers will provide extra information using an OpenRTB 2.x Bid Request Exten
We request that you do not duplicate information that is already present in the [OpenRTB 2.x request](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md) or is already part of an established Prebid convention. For example, your bidder parameters should not include first party data, bid floors, schain, video parameters, referrer information, or privacy consent including COPPA, CCPA, and GDPR TCF. For video parameters in particular, you must prefer the OpenRTB 2.x Bid Request standard of `request.imp[].video`.
{: .alert.alert-warning :}
-**ENDPOINT NOTE:** You may not try so set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain.
+You may not try to set the full endpoint domain from a publisher-specified bidder parameter. Prebid Server is not an open proxy. If absolutely necessary, you may specify a *portion* of the domain as a parameter to support geo regions or account specific servers. However, this is discouraged and may degrade the performance of your adapter since the server needs to maintain more outgoing connections. Host companies may choose to disable your adapter if it uses a dynamically configured domain.
Create a file with the path `static/bidder-params/{bidder}.json` using [JSON Schema](https://json-schema.org/understanding-json-schema/) to define your bidder parameters. Prebid Server requires this file for every adapter, even if yours doesn't require bidder parameters (see the 'no parameters' example at the end of this section).
@@ -428,11 +428,11 @@ Please follow [Java standard naming convention](https://www.oracle.com/java/tech
Now it's time to write your bid adapter code.
-Each adapter has its own directory (a 'package' in java parlance) for all code and tests associated with translating an OpenRTB 2.x Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.x Bid Response. The use of separate packages provide each adapter with its own naming scope to avoid conflicts and gives the freedom to organize files as you best see fit (although we make suggestions in this guide).
+Each adapter has its own directory (a 'package' in java parlance) for all code and tests associated with translating an OpenRTB 2.x Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.x Bid Response. The use of separate packages provides each adapter with its own naming scope to avoid conflicts and gives the freedom to organize files as you best see fit (although we make suggestions in this guide).
Create a file with the path `org.prebid.server.bidder.{bidder}/{bidder}Bidder.java`. Your bid adapter code will need to implement Bidder interface where `T` is a model which will represent HttpRequest body.
-- The `Bidder` interface consisting of the `MakeHttpRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses.
+- The `Bidder` interface consists of the `MakeHttpRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses.
Here is a reference implementation for a bidding server which uses the OpenRTB 2.x protocol:
diff --git a/prebid-server/pbs-modules/greenbids-real-time-data.md b/prebid-server/pbs-modules/greenbids-real-time-data.md
new file mode 100644
index 0000000000..5c6a25c4fa
--- /dev/null
+++ b/prebid-server/pbs-modules/greenbids-real-time-data.md
@@ -0,0 +1,175 @@
+---
+layout: page_v2
+page_type: pbs-module
+title: Prebid Server Greenbids Real Time Data Module
+display_name : Greenbids Real Time Data Module
+sidebarType : 5
+---
+
+# Greenbids Real Time Data Module
+
+## Overview
+
+Greenbids Real Time Data module filters bidders SSPs listed in the `imp[].ext.prebid.bidder` of the bid request.
+To perform the filtering the module uses AI to predict the bidding probability of bid per SSP for each `imp` for the given bid request.
+This bidding probability is used to choose to send the bid request or not, according to the performance constraints applied by the partner publisher.
+
+The RTD module uses 2 artefacts that are fetched from the Greenbids Google Cloud Storage bucket
+
+- ML predictor in `.onnx` format: used to predict the bidding probability
+- Probability thresholds in `.json` format: used to convert the bidding probability to a binary choice
+
+## Configuration
+
+### Execution Plan
+
+This module supports running at:
+
+- processed-auction-request: this is where PBS bid request enrichments
+are done before customizing it to a particular bidder in the auction.
+
+### Account-Level Config
+
+Here's an example of the account config used in PBS-Java:
+
+```yaml
+hooks:
+ greenbids-real-time-data:
+ enabled: true
+ host-execution-plan: >
+ {
+ "endpoints": {
+ "/openrtb2/auction": {
+ "stages": {
+ "processed-auction-request": {
+ "groups": [
+ {
+ "timeout": 100,
+ "hook-sequence": [
+ {
+ "module-code": "greenbids-real-time-data",
+ "hook-impl-code": "greenbids-real-time-data-processed-auction-request-hook"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+```
+
+### List of module configuration options
+
+- `google-cloud-greenbids-project`: Google Cloud project associated with Greenbids
+- `gcs-bucket-name`: Google Cloud Storage (GCS) bucket used to fetch the artefacts ([ONNX](https://onnx.ai/) model and thresholds `.json`) necessary for prediction
+- `cache-expiration-minutes`: The duration (in minutes) after which cached model and thresholds should be considered expired and refreshed
+- `geo-lite-country-path`: URL to the geo-ip database
+- `onnx-model-cache-key-prefix`: prefix necessary for getting cached ONNX model
+- `thresholds-cache-key-prefix`: prefix necessary for getting cached throttling thresholds
+
+```yaml
+greenbids-real-time-data:
+ google-cloud-greenbids-project: "greenbids-357713"
+ gcs-bucket-name: "greenbids-europe-west1-prebid-server-staging"
+ cache-expiration-minutes: 15
+ geo-lite-country-path: "https://git.io/GeoLite2-Country.mmdb"
+ onnx-model-cache-key-prefix: "onnxModelRunner_"
+ thresholds-cache-key-prefix: "throttlingThresholds_"
+```
+
+### Publisher bid request settings
+
+The activated partner publishers add their configs direclty into `bid-request.json`
+where they indicate the activation of our module
+in bid request extenstion `bid-request.ext.prebid.analytics.greenbids`
+for [Analytics Reporter](https://docs.prebid.org/prebid-server/pbs-modules/greenbids-analytics-reporter.html) and
+`bid-request.ext.prebid.analytics.greenbids-rtd` for Greenbids RTD Module.
+
+The list of the parameters necessary for RTD module activation is as follows:
+
+| Parameter | Scope | Description | Example | Type |
+|-----------------|-------------------|-----------------------------------------------------------------------------------------------------|-----------------------|--------------|
+| pbuid | required | The Greenbids Publisher ID | greenbids-publisher-1 | string |
+| targetTpr | required | Expected retained opportunities ratio [0-1] | 0.9 | float |
+| explorationRate | required | Ratio of traffic without filtering used for training ML model [0-1] (a value of 0.1 will filter 90% of the traffic) | 0.1 | float |
+
+Here's an example of how a PBS partner publisher setup using both Greenbids RTD Module and Greenbids AnalyticsReporter should look like:
+
+```json
+"ext": {
+ "prebid": {
+ "analytics": {
+ // extension for Greenbids Analytics Reporter
+ "greenbids": {
+ "pbuid": "PBUID_FROM_GREENBIDS",
+ "greenbidsSampling": 0.01
+ },
+ // extension for Greenbids Real Time Data Module
+ "greenbids-rtd": {
+ "pbuid": "PBUID_FROM_GREENBIDS",
+ "targetTpr": 0.95,
+ "explorationRate": 0.001
+ }
+ }
+ }
+ }
+```
+
+### Enable for Spring Boot
+
+In order to allow the module to be picked up by PBS-Java, a Spring Boot configuration property `hooks.greenbids-real-time-data.enabled` must be set to `true`.
+
+Here's an example of how your PBS configuration YAML should look like:
+
+```YAML
+hooks:
+ greenbids-real-time-data:
+ enabled: true
+```
+
+## Analytics Tags
+
+The RTD module also communicates the filtering results with the `GreenbidsAnalyticsReporter` via [AnalyticsTags](https://docs.prebid.org/prebid-server/developers/module-atags.html).
+Here we populate analytics result of analytics tags for each `imp` the with:
+
+- `fingerprint`: greenbidsId
+- `isKeptInAuction`: map of booleans for each bidder whether we keep them in auction or not for the given imp
+- `isExploration`: flag that is necessary to isolate the training data
+
+The analytics tag is then parsed by the AnalyticsReporter from `HookExecutionContext`
+and its content added to the analytics payload sent to Greenbids server. The exploration part of traffic is split randomly with the ratio defined for each partner publisher
+per bid requests and is not filtered by the RTD module.
+
+Here's an example analytics tag that might be produced for use in an analytics adapter:
+
+```json
+[{
+ "pub_banniere_haute": {
+ "greenbids": {
+ "fingerprint": "ad63524e-b13f-4359-a975-dba9b5dc08f4",
+ "keptInAuction": {
+ "improvedigital": false,
+ "appnexus": true,
+ "pubmatic": false,
+ "rubicon": true,
+ "teads": false
+ },
+ "isExploration": false
+ },
+ "tid": "2c445309-06b2-47b2-a724-4aeef15faeb8"
+ }
+}]
+```
+
+## Maintainer contacts
+
+For any questions and suggestions please reach out to our team for more information [greenbids.ai](https://greenbids.ai).
+
+Or just open new [issue](https://github.com/prebid/prebid-server-java/issues/new) or [pull request](https://github.com/prebid/prebid-server-java/pulls) in this repository.
+
+## Further Reading
+
+- [Prebid Server Module List](/prebid-server/pbs-modules/index.html)
+- [Building a Prebid Server Module](/prebid-server/developers/add-a-module.html)
diff --git a/prebid-server/pbs-modules/index.md b/prebid-server/pbs-modules/index.md
index d0b88cd008..c07d1de507 100644
--- a/prebid-server/pbs-modules/index.md
+++ b/prebid-server/pbs-modules/index.md
@@ -12,7 +12,7 @@ The core of Prebid Server contains the foundational code needed for header biddi
If you're looking for bidder adapter parameters, see [Bidders' Params](/dev-docs/pbs-bidders.html).
-* TOC
+- TOC
{:toc}
## The Modules
@@ -33,6 +33,7 @@ The full list of modules:
| [**US Custom Logic Privacy**](/prebid-server/features/pbs-uscustomlogic.html) | Similar to the `US Gen Privacy` module, but publishers define their own interpretation of the GPP string. | privacy | | |
| [**Richmedia Filter**](/prebid-server/pbs-modules/richmedia.html) | Can filter MRAID creatives from the bid stream. | validation | | |
| [**51Degrees Device Detection**](/prebid-server/pbs-modules/51degrees-device-detection.html) | Enriches an incoming OpenRTB request with [51Degrees Device Data](https://51degrees.com/documentation/_device_detection__overview.html) | general | | |
+| [**Greenbids Real Time Data**](/prebid-server/pbs-modules/greenbids-real-time-data.html) | Filters out bidders that are not expected to bid on this request, saving money and carbon. | general | | |
| [**Request Correction**](/prebid-server/pbs-modules/request-correction.html) | Apply optional corrections to bid requests. | general | | |
| [**Response Correction**](/prebid-server/pbs-modules/response-correction.html) | Apply optional corrections to bid responses. | general | | |
@@ -53,10 +54,10 @@ mvn clean package --file extra/pom.xml
The execution plan details:
-* which modules are used in your server
-* what order they're invoked in
-* how long modules have to run before timeout
-* whether any modules depend on each other
+- which modules are used in your server
+- what order they're invoked in
+- how long modules have to run before timeout
+- whether any modules depend on each other
If you want the module to run on every request regardless of account, this is a
host-level config you should place in `application.yaml`. If the module should
@@ -64,9 +65,9 @@ be active only for certain accounts, you'll need to place the plan in the accoun
To define a plan, you'll need to know the following module details, which should be available in the module documentation:
-* urls: which PBS 'entry points' are relevant. e.g. /openrtb2/auction, /openrtb2/amp
-* stages: one or more of the 7 workflow stages where the module should be called: entrypoint, raw-auction-request, processed-auction-request, bidder-request, raw-bidder-response, processed-bidder-response, and/or auction-response.
-* hooks: for each stage where a module runs, its documentation will provide the hook function name.
+- urls: which PBS 'entry points' are relevant. e.g. /openrtb2/auction, /openrtb2/amp
+- stages: one or more of the 7 workflow stages where the module should be called: entrypoint, raw-auction-request, processed-auction-request, bidder-request, raw-bidder-response, processed-bidder-response, and/or auction-response.
+- hooks: for each stage where a module runs, its documentation will provide the hook function name.
Here's an example application.yaml entry:
@@ -131,13 +132,131 @@ hooks:
}
```
+{: .alert.alert-info :
+Execution plans can be placed in account configuration, but depending on how modules are enabled in your environment, it can be inconvenient to provide instructions to place the highly technical execution plan into the account config. Some organizations have
+chosen to keep all execution plans in host-level config, then enabling the `require-config-to-invoke` option as described in the next section.
+
### 3. Supply the module with configuration
Modules may require configuration at startup or during the request:
-* If the module requires config at initialization, its documentation will
+- If the module requires config at initialization, its documentation will
describe where the config file lives and what format it should take.
-* If the module requires runtime config, it should be passed via the account-conig mechanism.
+- If the module requires runtime config, it should be passed via the account-config mechanism.
+
+### 3.1 Module Execution Configuration
+
+PBS-Java 3.16 introduced new configurations that give the host company flexible control over which modules run for which accounts
+while still allowing all execution plans to be defined at the host-level.
+
+- `hooks.admin.module-execution` is a key-value map, where a key is a module name and a value is a boolean. It defines whether a module's hooks should be executed.
+This property can be configured on the host level at initialization as well as via account-config mechanism (a runtime config).
+- `settings.modules.require-config-to-invoke` is a host-level boolean property. When set to `true`, it requires a runtime config to exist for a module in order to actually run the execution plan.
+
+Here's how these work together:
+
+1. If `hooks.admin.module-execution` is defined at the host-level (application.yaml), it overrides all account config. No account can turn off a module flagged as true, and likewise they can’t turn on a module flagged as false.
+1. Essentially, setting false at the host level has the same effect as removing the module’s execution plan.
+1. If `hooks.admin.module-execution` is not defined at the host level, then normal precedence rules are in effect: any value in account config overrides what’s in default account config.
+1. If nothing is found for the module in the merged `hooks.admin.module-execution` and `require-config-to-invoke` is true, then account-level config is required.
+
+Example:
+
+```yaml
+# host-level config
+settings:
+ modules:
+ require-config-to-invoke: true
+hooks:
+ admin:
+ host-execution-plan: >
+ {"endpoints":{... define execution plans for module1, module3, and module4 here ...}}
+ module-execution:
+ module1: true // don't allow accounts to turn off this module. Also don't worry about requiring config. Always run this one.
+ module2: false // don't allow accounts to utilize this module at all, even if they define a plan in account config.
+```
+
+```json
+// account-level config
+// the end result is that module1, module3, and module5 are run.
+// module2 is not run even though a plan is defined in this account config because the host company has forbidden it above
+// module4 is not run because there's no config and require-config-to-invoke is true
+{
+ "hooks": {
+ "admin": {
+ "module-execution": {
+ "module1": false // does nothing, since module1 is always on at the host level
+ }
+ },
+ "modules": {
+ "module3": { ... module 3 config ... },
+ "module5": { ... module 5 config ... },
+ },
+ "execution-plan": {
+ ... define an execution plan for module2 and module5 here ...
+ }
+ }
+}
+```
+
+### 3.2 A/B Testing Modules
+
+Host companies and accounts might want to try enabling a module on a small percentage of traffic before turning it on all the way.
+
+PBS-Java 3.16 introduced a new A/B testing framework that applies to any module.
+
+```json5
+{
+ "hooks": {
+ "execution-plan": {
+ "abtests": [{
+ "accounts": [ 123, 456 ], // these are ignored if in account-level config
+ "module-code": "module1",
+ "enabled": true, // defaults to false
+ "percent-active": 5, // defaults to 100
+ "log-analytics-tag": true // defaults to true
+ },{
+ ... abtest config for other modules ...
+ }],
+ "endpoints": {
+ "/openrtb2/auction": {
+ ...
+ }
+ }
+ ]
+ ]
+]
+```
+
+These are the parameters accepted within the `abtests` object:
+
+{: .table .table-bordered .table-striped }
+| Parameter | Scope | Description | Type | Default |
+|-----------+-------+-------------+------+---------|
+| module-code | required | Which module is being tested. | string | none |
+| percent-active | required | What percent of the time the module will run. | integer | none |
+| accounts | optional | Defines which accounts this abtest block applies to. This is useful when the execution plan is defined at the host level and is ignored when the plan is at the account level. | array of int | none |
+| enabled | optional | Allows the abtest to be disabled without removing it. | boolean | true |
+| log-analytics-tag | optional | Directs PBS-core to log an analytics tag for reporting. | boolean | false |
+
+To get reporting on the test results, analytics adapters will need to read the [analytics tag](/prebid-server/developers/module-atags.html) created by the A/B test, which looks like this:
+
+```json5
+{
+ activities: [{
+ name: "core-module-abtests",
+ status: "success",
+ results: [{ // one results object for each module in the abtests object
+ "status": STATUS, // "run" or "skipped"
+ "values": {
+ "module": "module1"
+ }
+ }]
+ },
+ ... the status of other abtest decisions ...
+ }]
+}
+```
## Installing a PBS Privacy Module
@@ -146,6 +265,6 @@ relevant 'Activity' using the `privacyreg` directive as described in the [Activi
## Further Reading
-* [Developing a Prebid Server General Module](/prebid-server/developers/add-a-module.html)
-* [Developing a Prebid Server Privacy Module](/prebid-server/developers/add-a-privacy-module.html)
-* [Prebid Server Features](/prebid-server/features/pbs-feature-idx.html)
+- [Developing a Prebid Server General Module](/prebid-server/developers/add-a-module.html)
+- [Developing a Prebid Server Privacy Module](/prebid-server/developers/add-a-privacy-module.html)
+- [Prebid Server Features](/prebid-server/features/pbs-feature-idx.html)