When setting up video creatives, it's important to understand where the VAST XML is stored for each of your bidders. The most common place to store VAST XML is AppNexus' cache, but some bidders (such as RubiconProject and SpotX) use their own cache services. To support such
-bidders, you will need to choose one of the following approaches:
-
-
Create a separate line item for each bidder.
-
Include a creative for each cache service utilized by your implementation.
-If you only use bidders that provide full VAST responses, no special setup is needed. Otherwise, do the following:
+If you only use bidders that provide full VAST responses, do the following:
1. For each line item you create, click on the Creatives tab, click the ADD CREATIVE button, and choose the size you're entering.
@@ -75,12 +70,15 @@
Single Cache Location
URL failed. This is expected, since the creative URL above points
to a server-side asset cache hosted by Prebid Server.
-
4. Set the Duration to 1.
+
4. Set the Duration to the max length of video ads you serve. If you don't know what the max length is, set it to 30.
+
+
In the past Prebid used to recommend setting duration to 0 or 1, but GAM now requires that this field reflect the actual video ad length. Since ads flowing through header bidding are going to differ in length, choose a value that matches a common ad length like 15 or 30.
The resulting creative should look something like the following:
{% endfor %}
diff --git a/dev-docs/bidders/1ad4good.md b/dev-docs/bidders/1ad4good.md
index eb05910d97..ce869099b1 100644
--- a/dev-docs/bidders/1ad4good.md
+++ b/dev-docs/bidders/1ad4good.md
@@ -4,7 +4,8 @@ title: 1ad4good
description: Prebid One Ad for Good(1ad4good.org) Bidder Adaptor
pbjs: true
biddercode: 1ad4good
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Note:
diff --git a/dev-docs/bidders/33across.md b/dev-docs/bidders/33across.md
index 17d07de9f0..ceed5753a3 100644
--- a/dev-docs/bidders/33across.md
+++ b/dev-docs/bidders/33across.md
@@ -7,7 +7,7 @@ pbs: true
biddercode: 33across
media_types: banner, video
gdpr_supported: true
-getFloor: true
+floors_supported: true
schain_supported: true
usp_supported: true
userIds: all
@@ -156,4 +156,15 @@ var adUnits = [
...
}
```
-
+### SRA Mode
+We recommend using SRA mode to optimize the bidding process as this allows our adapter to group together bid requests for Ad Units pertaining to the same product and site ID thereby minimizing the number of http requests made to our endpoint. To enable SRA set the following bidder specific config under 33Across
+```
+pbjs.setBidderConfig({
+ bidders: ['33across'],
+ config: {
+ ttxSettings: {
+ enableSRAMode: true
+ }
+ }
+});
+```
\ No newline at end of file
diff --git a/dev-docs/bidders/7xbid.md b/dev-docs/bidders/7xbid.md
index 64e6abf1f4..75b539fdd3 100644
--- a/dev-docs/bidders/7xbid.md
+++ b/dev-docs/bidders/7xbid.md
@@ -5,7 +5,8 @@ description: Prebid 7xbid Bidder Adaptor
pbjs: true
biddercode: 7xbid
media_types: banner, native
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/aardvark.md b/dev-docs/bidders/aardvark.md
index 685014b350..a435711ff4 100644
--- a/dev-docs/bidders/aardvark.md
+++ b/dev-docs/bidders/aardvark.md
@@ -9,7 +9,8 @@ usp_supported: true
schain_supported: true
userIds: unifiedId
gvl_id: 52
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/aax.md b/dev-docs/bidders/aax.md
new file mode 100644
index 0000000000..909101d40e
--- /dev/null
+++ b/dev-docs/bidders/aax.md
@@ -0,0 +1,123 @@
+---
+layout: bidder
+title: AAX
+description: Prebid Aax Bidder Adaptor
+biddercode: aax
+gdpr_supported: true
+media_types: banner,native,video
+usp_supported: true
+userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
+prebid_member: false
+pbjs: false
+gvl_id: 720
+schain_supported: true
+floors_supported: true
+fpd_supported: true
+pbs: true
+safeframes_ok: true
+multiformat_supported: will-not-bid
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|------------|----------|----------------------------------------|---------------|----------|
+| `cid` | required | The customer id provided by Aax. | `'aax_test_customer'` | `string` |
+| `crid` | required | The placement id provided by Aax. | `'aax_crid'` | `string` |
+| `video` | required for video Ad units | Object containing video targeting parameters. See [Video Object](#aax-video-object) for details.|`video: { maxduration: 60 }` | `object` |
+
+
+
+#### Video Object
+
+{: .table .table-bordered .table-striped }
+| Name | Type | Description | Example|
+|------------|----------|--------------|--------|
+|mimes|array of strings|(Recommended) Specifies the video content MIME types supported; for example, video/x-ms-wmv and video/x-flv.|["video/x-ms-wmv","video/x-flv"]|
+|minduration|integer|(Recommended) Specifies the minimum video ad duration, in seconds.|10|
+|maxduration|integer|(Recommended) Specifies the maximum video ad duration, in seconds.|60|
+|w|integer|(Recommended) Specifies the width of the video player, in pixels. Required if playerSize not present in `mediaTypes.video`|640|
+|h|integer|(Recommended) Specifies the height of the video player, in pixels. Required if playerSize not present in `mediaTypes.video`|480|
+|startdelay |integer | (Recommended) Specifies the start delay of the video ad|0|
+|battr| array of integers|Specifies the video creative attributes to block. Refer to section 5.3 of the IAB specification for a list of attributes.| [ 13, 14 ]|
+playbackmethod| array of integers| Specifies the allowed playback methods. If not specified, all are assumed to be allowed. Currently supported values are: `1: Autoplay, sound on`; `2: Autoplay, sound off`; `3: Click to play`; `4: Mouse over to play`|[1, 3]|
+|api| array of integers| Specifies the supported API frameworks for this impression. If an API is not explicitly listed, it is assumed not to be supported. Currently supported values are: `1: VPAID 1.0`; `2: VPAID 2.0`; `3: MRAID-1`; `4: ORMMA`; `5: MRAID-2`|[1, 2]|
+|protocols |array of integers| Array of supported video protocols. Currently supported values are: `1: VAST 1.0`; `2: VAST 2.0`; `3: VAST 3.0`; `4: VAST 1.0 Wrapper`; `5: VAST 2.0 Wrapper`; `6: VAST 3.0 Wrapper`; `7: VAST 4.0`|[1, 2]|
+|placement |integer|Placement type for the impression. Possible options: `1: In-Stream`; `2: In-banner`; `3: Outstream/In-article`; `4: In-feed`; `5: Interstitial/Slider/Floating`; `6: Long-Form`;|1|
+
+Besides the above-mentioned parameters, we support all other OpenRTB 2.x video objects as optional parameters.
+
+In addition to `bids[].params.video`, Aax adapter consumes parameters specified in the `mediaTypes.video`.
+
+#### Example of Instream Video Ad-unit
+```
+var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ context: "instream",
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ placement: 1
+ }
+ },
+ bids: [{
+ bidder: 'aax',
+ params: {
+ cid: 'aax_test_customer',
+ crid: 'aax_crid',
+ }
+ }]
+};
+```
+
+#### Example of Native Ad-unit
+```
+var adUnits = [{
+ code: 'div-gpt-ad-6874091242345-0',
+ mediaTypes: {
+ native: {
+ image: {
+ required: true,
+ sizes: [300, 250],
+ wmin: 50,
+ },
+ title: {
+ required: true,
+ len: 80
+ }
+ }
+ },
+ bids: [{
+ bidder: 'aax',
+ params: {
+ cid: 'aax_test_customer',
+ crid: 'aax_crid'
+ }
+ }]
+}];
+```
+
+#### Example of Banner Ad-unit
+```
+var adUnits = [{
+ code: 'div-gpt-ad-6874091242345-0',
+ mediaTypes: {
+ banner: {
+ sizes: [
+ [728, 90],
+ [300, 600],
+ [300, 250]
+ ],
+ }
+ },
+ bids: [{
+ bidder: 'aax',
+ params: {
+ cid: 'aax_test_customer',
+ crid: 'aax_crid'
+ }
+ }]
+}];
+```
diff --git a/dev-docs/bidders/aceex.md b/dev-docs/bidders/aceex.md
new file mode 100644
index 0000000000..e380d3aa54
--- /dev/null
+++ b/dev-docs/bidders/aceex.md
@@ -0,0 +1,27 @@
+---
+layout: bidder
+title: Aceex
+description: Prebid Aceex Bidder Adaptor
+biddercode: aceex
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+schain_supported: true
+userId: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
+media_types: banner, video, native
+safeframes_ok: true
+deals_supported: true
+pbjs: false
+pbs: true
+---
+
+### Note:
+
+The Example Bidding adapter requires setup before beginning. Please contact us at tech@aceex.com
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `accountid` | required | Endpoint id | `'hash'` | `string` |
diff --git a/dev-docs/bidders/acuityads.md b/dev-docs/bidders/acuityads.md
index a6f10c6e20..95d4784821 100644
--- a/dev-docs/bidders/acuityads.md
+++ b/dev-docs/bidders/acuityads.md
@@ -10,7 +10,7 @@ schain_supported: true
userId: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
media_types: banner, video, native
safeframes_ok: true
-bidder_supports_deals: true
+deals_supported: true
pbjs: false
pbs: true
---
diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md
index d658da1cbe..220d544cf7 100644
--- a/dev-docs/bidders/adagio.md
+++ b/dev-docs/bidders/adagio.md
@@ -6,13 +6,14 @@ pbjs: true
biddercode: adagio
media_types: banner, native, video
userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, pubProvidedId, sharedId, unifiedId
-getFloor: true
+floors_supported: true
gdpr_supported: true
usp_supported: true
coppa_supported: true
schain_supported: true
gvl_id: 617
-prebid_member: true,
+prebid_member: true
+fpd_supported: false
---
### Note
@@ -21,7 +22,7 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea
### Bid Params
-**Important**: Adagio needs to collect attention data about the ads displayed on a page and must listen to some specifics ad-server events. Please refer to the [Adagio user guide](https://adagio-team.atlassian.net/wiki/spaces/AH/pages/67272705/EN+Adagio+Prebid.js+installation+guide+for+publishers) for details.
+**Important**: Adagio needs to collect attention data about the ads displayed on a page and must listen to some specifics ad-server events. Please refer to the [Adagio user guide](https://adagioio.notion.site/Adagio-Account-Setup-Guide-fbcd940649224cdfa10393d2f008792e) for details.
{: .table .table-bordered .table-striped }
@@ -35,7 +36,6 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea
| `environment`* | recommended | Environment where the page is displayed. - max length: 30 - max distinctives values: 10 | `'desktop'` | `string` |
| `category`* | recommended | Category of the content displayed in the page. - max length: 30 - max distinctives values: 50 | `'sport'` | `string` |
| `subcategory`* | optional | Subcategory of the content displayed in the page. - max length: 30 - max distinctives values: 50 | `'handball'` | `string` |
-| `postBid` | optional | Used in Post-Bid context only. | `true` | `boolean` |
| `video` | optional | OpenRTB 2.5 video options object. All options will override ones defined in mediaTypes.video | `{skip: 1, playbackmethod: [6]}` | `object` |
| `native` | optional | Partial OpenRTB Native 1.2 request object. Supported fields are: - context -plcmttype | `{context: 1, plcmttype: 2}` | `object` |
@@ -47,3 +47,7 @@ The Adagio bidder adaptor requires setup and approval from the Adagio team. Plea
| Name | description |
|--------------|-------------------------------------|
| `adagio_bvw` | Url to handle Measure beacon |
+
+### First Party Data
+
+Adagio does not support FPD for now. It will be added soon.
diff --git a/dev-docs/bidders/adbite.md b/dev-docs/bidders/adbite.md
index fde3a6e8af..07b2aa749f 100644
--- a/dev-docs/bidders/adbite.md
+++ b/dev-docs/bidders/adbite.md
@@ -3,7 +3,7 @@ layout: bidder
title: Adbite
description: Adbite LLC
pbjs: true
-pbs: true
+pbs: false
biddercode: adbite
media_types: banner, native, video
gdpr_supported: true
diff --git a/dev-docs/bidders/adblender.md b/dev-docs/bidders/adblender.md
index 94830f05fe..6f3edddf6a 100644
--- a/dev-docs/bidders/adblender.md
+++ b/dev-docs/bidders/adblender.md
@@ -13,6 +13,7 @@ usp_supported: true
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|--------|----------|-------------|---------|----------|
-| `zone` | required | | | `string` |
+| Name | Scope | Description | Example | Type |
+|---------------|----------|------------------------------------------------------------------------------------------------------------------|----------------------------------------|----------|
+| `zone` | required | The unique identifier of the ad placement. Could be obtained from the AdBlender UI or from your account manager. | "e5ff8e48-4bd0-4a2c-9236-55530ab8981d" | `string` |
+| `kvTargeting` | optional | Key/Value - a pair of the unique values that will be used for the custom targeting option. | {key1: value2, key2: value2} | `object` |
diff --git a/dev-docs/bidders/adbutler.md b/dev-docs/bidders/adbutler.md
index 2eab4bbadd..478bcc4db1 100644
--- a/dev-docs/bidders/adbutler.md
+++ b/dev-docs/bidders/adbutler.md
@@ -4,7 +4,8 @@ title: AdButler
description: Prebid AdButler Bidder Adaptor
pbjs: true
biddercode: adbutler
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/adf.md b/dev-docs/bidders/adf.md
index 34f70931ed..4695771cf6 100644
--- a/dev-docs/bidders/adf.md
+++ b/dev-docs/bidders/adf.md
@@ -4,26 +4,32 @@ title: AdformOpenRTB
description: Prebid Adform Bidder Adaptor
biddercode: adf
media_types: banner, native, video
+coppa_supported: true
gdpr_supported: true
usp_supported: true
prebid_member: true
pbjs: true
pbs: true
-userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, sharedId, unifiedId
+schain_supported: true
+userIds: all
gvl_id: 50
prevBiddercode: adformOpenRTB
+floors_supported: true
+multiformat_supported: will-bid-on-one
---
### Bid params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|-------------|----------|----------------------|--------------------|-----------|
-| `mid` | required | | `12345` | `integer` |
-| `adxDomain` | optional | The Adform domain | `'adx.adform.net'` | `string` |
-| `priceType` | optional | Price type | `'gross'` | `string` |
+| Name | Scope | Description | Example | Type |
+|-------------|----------------------------|----------------------|--------------------|-----------|
+| `mid` | required, if `inv` and `nmane` not set | Placement ID | `12345` | `integer` |
+| `inv` | required, if `mid` not set | Inventory source ID | `1234` | `integer` |
+| `mname` | required, if `mid` not set | Placement name | `"Leaderboard"` | `string` |
+| `adxDomain` | optional, Prebid.js only | The Adform domain | `"adx.adform.net"` | `string` |
+| `priceType` | optional | Price type | `"gross"` | `string` |
-Note: prebid-server adapter supports only `mid` parameter - other params could be set by adjusting prebid-server openRTB request.
+Note: Bid placement should be defined using the `mid` parameter or `inv` and `mname` parameters (dynamic master tag) but not both.
### OpenRTB request config
@@ -38,7 +44,3 @@ pbjs.setConfig({
}
});
```
-
-### Multi-format ads
-
-Adform bid adapter does not support multi-format ad unit setup. Please use [twin ad unit codes]({{site.baseurl}}/dev-docs/adunit-reference.html#twin-adunit-codes) to enable multi-format auctions.
diff --git a/dev-docs/bidders/adfinity.md b/dev-docs/bidders/adfinity.md
index 4d80018fb9..ce9b16a758 100644
--- a/dev-docs/bidders/adfinity.md
+++ b/dev-docs/bidders/adfinity.md
@@ -6,7 +6,8 @@ pbjs: true
biddercode: adfinity
media_types: banner, video, native
gdpr_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/adform.md b/dev-docs/bidders/adform.md
index 1f796f0876..3676871ca8 100644
--- a/dev-docs/bidders/adform.md
+++ b/dev-docs/bidders/adform.md
@@ -9,9 +9,10 @@ usp_supported: true
prebid_member: true
pbjs: true
pbs: true
-userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, sharedId, unifiedId
+userIds: all
gvl_id: 50
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
**Adform bid adapter is deprecated since Prebid 5.0. Please refer to [AdformOpenRTB adapter](#adf) documentation to fetch bids from Adform demand sources.**
diff --git a/dev-docs/bidders/adgeneration.md b/dev-docs/bidders/adgeneration.md
index 812cfbecd7..b7493c7257 100644
--- a/dev-docs/bidders/adgeneration.md
+++ b/dev-docs/bidders/adgeneration.md
@@ -5,8 +5,8 @@ description: Prebid Ad Generation Bidder Adaptor
pbjs: true
pbs: true
biddercode: adgeneration
+userIds: novatiq, criteo, id5Id
media_types: native
-pbjs_version_notes: not in 5.x
---
diff --git a/dev-docs/bidders/adglare.md b/dev-docs/bidders/adglare.md
index b938a28ca3..7e8f6db2d7 100644
--- a/dev-docs/bidders/adglare.md
+++ b/dev-docs/bidders/adglare.md
@@ -5,7 +5,8 @@ description: Prebid Adapter for AdGlare Ad Server
pbjs: true
biddercode: adglare
media_types: banner
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/adhash.md b/dev-docs/bidders/adhash.md
index 191bbec27c..f341d3e6de 100644
--- a/dev-docs/bidders/adhash.md
+++ b/dev-docs/bidders/adhash.md
@@ -5,7 +5,7 @@ description: Prebid AdHash Bidder Adapter
pbjs: true
biddercode: adhash
safeframes_ok: false
-pbjs_version_notes: not in 5.x
+gdpr_supported: true
---
### Note
@@ -27,4 +27,4 @@ Please note that a number of AdHash functionalities are not supported in the Pre
| Name | Scope | Description | Example | Type |
|---------------|----------|--------------|------------------------------------------------|----------|
| `publisherId` | required | Publisher ID | `'0x1234567890123456789012345678901234567890'` | `string` |
-| `platformURL` | required | Platform URL | `'https://adhash.org/p/struma/'` | `string` |
+| `platformURL` | required | Platform URL | `'https://adhash.org/p/example/'` | `string` |
diff --git a/dev-docs/bidders/adhese.md b/dev-docs/bidders/adhese.md
index 07e592417d..d0bcaea03c 100644
--- a/dev-docs/bidders/adhese.md
+++ b/dev-docs/bidders/adhese.md
@@ -10,7 +10,6 @@ gdpr_supported: true
userIds: id5Id
gvl_id: 553
pbs_app_supported: true
-pbjs_version_notes: not in 5.x
---
### Registration
diff --git a/dev-docs/bidders/adlive.md b/dev-docs/bidders/adlive.md
deleted file mode 100644
index d67f6791b0..0000000000
--- a/dev-docs/bidders/adlive.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: bidder
-title: Adlive
-description: adlive bid adapter
-pbjs: true
-biddercode: adlive
-pbjs_version_notes: not in 5.x
----
-
-### Bid Params
-
-{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|------------+----------+-------------------------------------------+----------------------------------------------|------|
-| `hashes` | required | Array of hashes, provided by adlive | ['1e100887dd614b0909bf6c49ba7f69fdd1360437'] | Array of strings |
diff --git a/dev-docs/bidders/adlivetech.md b/dev-docs/bidders/adlivetech.md
new file mode 100644
index 0000000000..74398ac2e0
--- /dev/null
+++ b/dev-docs/bidders/adlivetech.md
@@ -0,0 +1,70 @@
+---
+layout: bidder
+title: Adlivetech
+description: Prebid Adlivetech Bidder Adapter
+pbjs: true
+biddercode: adlivetech
+aliasCode: grid
+media_types: banner, video
+gdpr_supported: true
+usp_supported: true
+schain_supported: true
+floors_supported: true
+userIds: all
+tcf2_supported: true
+coppa_supported: true
+fpd_supported: true
+---
+
+### Table of Contents
+
+- [Bid Params](#adlivetech-bid-params)
+- [Bidder Config](#adlivetech-bidder-config)
+- [First Party Data](#adlivetech-first-party)
+
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------------|----------|--------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------|
+| `uid` | required | Represents the Adlivetech bidder system Ad Slot ID associated with the respective div id from the site page. | `1` | `integer` |
+| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Values can be empty. | `keywords: { topic: ['stress', 'fear'] }` | `object` |
+| `bidFloor` | optional | Floor of the impression opportunity. If present in the request overrides XML info. | `0.8` | `float` |
+
+
+
+### Bidder Config
+
+You can allow writing in localStorage `pbjs.setBidderConfig` for the bidder `adlivetech`
+```
+pbjs.setBidderConfig({
+ bidders: ["adlivetech"],
+ config: {
+ localStorageWriteAllowed: true
+ }
+})
+```
+If it will be "true" this allow Adlivetech Bid Adapter to write userId in first party localStorage
+
+
+
+### First Party Data
+
+Publishers should use the `ortb2` method of setting [First Party Data](https://docs.prebid.org/features/firstPartyData.html).
+
+Global site or user data using `setConfig()`, or Bidder-specific using `setBidderConfig()` supports following fields:
+
+- `ortb2.user.data[]`: Standard IAB segment taxonomy user data
+- `ortb2.user.ext.device`: Non standard arbitrary user device
+- `ortb2.user.keywords`: Standard IAB OpenRTB 2.5 user.keywords field. It will be included in ext.keywords.user.ortb2
+- `ortb2.site.keywords`: Standard IAB OpenRTB 2.5 site.keywords field. It will be included in ext.keywords.site.ortb2
+- `ortb2.site.cat[]`: Standard IAB OpenRTB 2.5 site.cat field. It will be sent as part of site.cat array
+- `ortb2.site.pagecat[]`: Standard IAB OpenRTB 2.5 site.pagecat field. It will be sent as part of site.cat array
+- `ortb2.site.content.genre`: Standard IAB OpenRTB 2.5 site.content.genre field
+
+AdUnit-specific data using `AdUnit.ortb2Imp` supports following fields:
+
+- `ortb2.imp[].ext.data.*`
+- `ortb2.imp[].instl`
diff --git a/dev-docs/bidders/adman.md b/dev-docs/bidders/adman.md
index 821ed67f9d..b4b6b41ec9 100644
--- a/dev-docs/bidders/adman.md
+++ b/dev-docs/bidders/adman.md
@@ -7,8 +7,8 @@ pbs: true
biddercode: adman
gdpr_supported: true
usp_supported: true
-media_types: banner, video
-pbjs_version_notes: not in 5.x
+media_types: banner, video, native
+userIds: uid2, lotamePanoramaId, idx
---
### Note:
diff --git a/dev-docs/bidders/admaru.md b/dev-docs/bidders/admaru.md
new file mode 100644
index 0000000000..b86621a700
--- /dev/null
+++ b/dev-docs/bidders/admaru.md
@@ -0,0 +1,43 @@
+---
+layout: bidder
+title: Admaru
+description: Admaru Bidder Adapter
+pbjs: true
+biddercode: admaru
+media_types: banner
+gdpr_supported: false
+schain_supported: false
+usp_supported: false
+---
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|------------------|----------|------------------|------------------------------|----------|
+| `pub_id` | required | Publisher id | `'ap4m2b6m8'` | `string` |
+| `adspace_id` | required | Adspace id | `'a3j5n6b1'` | `string` |
+
+### Test Parameters
+```
+var adUnits = [
+ {
+ code: 'test-div',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]], // a display size
+ }
+ },
+ bids: [
+ {
+ bidder: "admaru",
+ params: {
+ pub_id: '1234', // string - required
+ adspace_id: '1234' // string - required
+ }
+ }
+ ]
+ }
+];
+```
\ No newline at end of file
diff --git a/dev-docs/bidders/admedia.md b/dev-docs/bidders/admedia.md
index 2253e4eed2..d9530b2d31 100644
--- a/dev-docs/bidders/admedia.md
+++ b/dev-docs/bidders/admedia.md
@@ -6,7 +6,8 @@ pbjs: true
biddercode: admedia
media_types: banner
gdpr_supported: false
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/admixer.md b/dev-docs/bidders/admixer.md
index d2fa0061e5..42beb6e5a2 100644
--- a/dev-docs/bidders/admixer.md
+++ b/dev-docs/bidders/admixer.md
@@ -5,16 +5,19 @@ description: Prebid AdMixer Bidder Adaptor
pbjs: true
pbs: true
biddercode: admixer
-media_types: video
+media_types: banner, video, native
gdpr_supported: true
usp_supported: true
schain_supported: true
gvl_id: 511
+userIds: AdmixerID
+prebid_member: true
---
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|--------|----------|-------------|---------|----------|
-| `zone` | required | | | `string` |
+| Name | Scope | Description | Example | Type |
+|---------------|----------|----------------------------------------------------------------------------------------------------------------|----------------------------------------|----------|
+| `zone` | required | The unique identifier of the ad placement. Could be obtained from the Admixer UI or from your account manager. | "e5ff8e48-4bd0-4a2c-9236-55530ab8981d" | `string` |
+| `kvTargeting` | optional | Key/Value - a pair of the unique values that will be used for the custom targeting option. | {key1: value2, key2: value2} | `object` |
diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md
index cdb2766ccd..50a308ff3c 100644
--- a/dev-docs/bidders/adnuntius.md
+++ b/dev-docs/bidders/adnuntius.md
@@ -3,9 +3,12 @@ layout: bidder
title: Adnuntius
description: Prebid Adnuntius Bidder Adaptor
pbjs: true
+pbs: true
biddercode: adnuntius
-media_types: banner
+media_types: banner, video
gdpr_supported: true
+fpd_supported: true
+gvl_id: 855
---
### Bid Params
@@ -53,23 +56,96 @@ Here's an example of sending targeting information about categories to adnuntius
There's an option to send segment id in the bidder config that will be picked up and sent to the ad server. Below is an example on how to do this:
```
+pbjs.setBidderConfig({
+ bidders: ['adnuntius', 'bidderB'],
+ config: {
+ ortb2: {
+ user: {
+ data: [{
+ name: "adnuntius",
+ segment: [
+ { id: "1" },
+ { id: "2" }
+ ]
+ }]
+ }
+ }
+ }
+});
+```
+
+### Disable cookies for adnuntius
+
+You have the option to tell adnuntius not to set cookies in your browser. This does not mean that third party ads being served through the ad server will not set cookies. Just that Adnuintius will not set it for internal ads.
+
+```
+
+pbjs.setBidderConfig({
+ bidders: ['adnuntius'],
+ config: {
+ useCookie: false
+ }
+});
+```
+
+Use cookie will always be set to true by default. Changing it to false will disable cookies.
+
+### Prebid Server Test Request
+
+The following test parameters can be used to verify that Prebid Server is working properly with the server-side Adnuntius adapter. the `auId` below will not return a creative. Please substitute it with your own.
- pbjs.setBidderConfig({
- bidders: ['adnuntius', 'bidderB'],
- config: {
- ortb2: {
- user: {
- data: [{
- name: "adnuntius",
- segment: [
- { id: "1" },
- { id: "2" }
- ]
- }]
- }
- }
- }
- });
-
-ÂŽÂŽÂŽ
```
+"imp": [{
+ "id": "impression-id",
+ "banner": {
+ "format": [{
+ "w": 980,
+ "h": 240
+ }, {
+ "w": 980,
+ "h": 360
+ }]
+ },
+ "ext": {
+ "adnuntius": {
+ "auId": "abc123"
+ }
+ }
+}]
+```
+
+### First Party Data
+
+publishers can use the `ortb2` configuration parameter to provide First Party Data. We accept all standard OpenRTB fields for both:
+
+- `ortb2.site`
+- `ortb2.user`
+
+These fields are optional and only needed for user identification and contextual targeting. How to use it can be read here: [Prebid ortb2](https://docs.prebid.org/features/firstPartyData.html). Currently we only support this for our prebid server bidder, but will add it to the client bidder in the future.
+
+### Video requests
+Currently we only support client requests and instream context. An example request would look like this:
+
+```
+{
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'adnuntius',
+ params: {
+ auId: '00000000001cd429', //put your placement id here
+
+ video: {
+ skippable: true,
+ playback_method: ['auto_play_sound_off']
+ }
+ }
+ }]
+};
+```
+
diff --git a/dev-docs/bidders/adot.md b/dev-docs/bidders/adot.md
index a7aa51a606..4f280a5c5f 100644
--- a/dev-docs/bidders/adot.md
+++ b/dev-docs/bidders/adot.md
@@ -4,10 +4,13 @@ title: Adot
description: Prebid Adot Bidder Adapter
biddercode: adot
media_types: banner, video, native
+userIds: pubProvidedId
gdpr_supported: true
gvl_id: 272
pbjs: true
pbs: true
+floors_supported: true
+schain_supported: true
---
### Prebid JS
@@ -18,20 +21,14 @@ pbs: true
| Name | Scope | Description | Example | Type |
|---------------------|-----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------|
| `placementId` | optional | The placement ID from Adot. | `'adot_placement_224521'` | `string` |
-| `position` | optional | Specify the position of the ad as a relative measure of visibility or prominence. Allowed values: Unknown: `0` (default); Above the fold: `1` ; Below the fold: `3`. | `0` | `integer-` |
-| `video` | required if the adUnit is a video | Object containing video targeting parameters. See [Video Object](#adot-video-object) for details. | `video: { mimes: ['video/mp4'] }` | `object` |
+| `video` | optional | Object containing video targeting parameters. See [Video Object](#adot-video-object) for details. | | `object` |
#### Video Object
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Type |
|-------------------|-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|
-| `mimes` | required | Array of strings listing the content MIME types supported, e.g., `['video/mp4']`. | `Array` |
-| `minduration` | optional | Integer that defines the minimum video ad duration in seconds. | `integer` |
-| `maxduration` | optional | Integer that defines the maximum video ad duration in seconds. | `integer` |
-| `protocols` | required | Array of supported video protocols, e.g., `[2, 3]` | `Array` |
| `container` | optional | Selector used for finding the element in which the video player will be displayed, e.g., `#div-1`. The `ad unit code` will be used if no `container` is provided. | `string` |
-| `instreamContext` | required if `video.context` is `instream` | String used to define the type of instream video. Allowed values: Pre-roll: `pre-roll`; Mid-roll: `mid-roll` ; Post-roll: `post-roll`. | `string` |
#### Bid Config
#### PublisherId
@@ -79,6 +76,7 @@ pbjs.setBidderConfig({
|---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------|
| `placementId` | optional | An ID which identifies this placement of the impression. | `'adot_placement_224521'` | `string` |
| `parallax` | optional (only for prebid-server) | Specify if the wanted advertising's creative is a parallax. | `true/false` | `boolean` |
+| `publisherPath` | optional | Specific to each integration. Do not use until asked by someone from adot. | `/hubvisor` | `string` |
#### Testing Bid Request
diff --git a/dev-docs/bidders/adpartner.md b/dev-docs/bidders/adpartner.md
index caddd1ad55..ead43860ca 100644
--- a/dev-docs/bidders/adpartner.md
+++ b/dev-docs/bidders/adpartner.md
@@ -5,12 +5,11 @@ description: Prebid AdPartner Bidder Adaptor
pbjs: true
biddercode: adpartner
media_types: banner
-pbjs_version_notes: not in 5.x
---
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|----------|----------|-------------|----------------------|-----------|
-| `unitId` | required | Unit ID. | `5809` | `integer` |
+| Name | Scope | Description | Example | Type |
+|-------------|----------|-------------|----------------------|-----------|
+| `partnerId` | required | Partner ID. | `5809` | `integer` |
diff --git a/dev-docs/bidders/adplus.md b/dev-docs/bidders/adplus.md
new file mode 100644
index 0000000000..ea31c7621f
--- /dev/null
+++ b/dev-docs/bidders/adplus.md
@@ -0,0 +1,19 @@
+---
+layout: bidder
+title: AdPlus
+description: Prebid AdPlus Bidder Adapter
+biddercode: adplus
+media_types: banner
+pbjs: true
+---
+### Note:
+
+The AdPlus Bidding adapter requires setup before beginning. Please contact us at .
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|---------------|-------------------------------------------|-----------|
+| `adUnitId` | required | Ad Unit ID | `'-3'` | `string` |
+| `inventoryId` | required | Inventory ID | `'-1'` | `string` |
\ No newline at end of file
diff --git a/dev-docs/bidders/adpone.md b/dev-docs/bidders/adpone.md
index 608b228ff1..c2da708ebd 100644
--- a/dev-docs/bidders/adpone.md
+++ b/dev-docs/bidders/adpone.md
@@ -5,7 +5,7 @@ description: Prebid Adpone Bidder Adaptor
pbjs: true
pbs: true
biddercode: adpone
-bidder_supports_deals: false
+deals_supported: false
media_types: banner
gvl_id: 799
---
diff --git a/dev-docs/bidders/adprime.md b/dev-docs/bidders/adprime.md
index 11bd34ba16..4452ddfc97 100644
--- a/dev-docs/bidders/adprime.md
+++ b/dev-docs/bidders/adprime.md
@@ -5,11 +5,11 @@ description: Prebid Adprime Bidder Adapter
biddercode: adprime
gdpr_supported: true
usp_supported: true
-media_types: banner, video
+media_types: banner, video, native
+tcf2_supported: true
pbjs: true
pbs: true
pbs_app_supported: true
-pbjs_version_notes: not in 5.x
---
### Note:
@@ -23,4 +23,5 @@ The Adprime Bidding adapter requires setup before beginning. Please contact us a
|---------------|----------|-----------------------|-----------|-----------|
| `placementId` | required | Adprime placement id | `'1234asdf'` | `string` |
| `keywords` | optional | page context keywords | ['car','sport'] | `array` |
+| `audiences` | optional | publisher audiences | ['aud1','aud2'] | `array` |
diff --git a/dev-docs/bidders/adquery.md b/dev-docs/bidders/adquery.md
new file mode 100644
index 0000000000..fd1419c80c
--- /dev/null
+++ b/dev-docs/bidders/adquery.md
@@ -0,0 +1,20 @@
+---
+layout: bidder
+title: Adquery
+description: Prebid Adquery Bidder Adaptor
+pbjs: true
+biddercode: adquery
+gdpr_supported: true
+usp_supported: true
+schain_supported: true
+gvl_id: 902
+userIds: adQuery QiD
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|---------------|-------------------------------------------|-----------|
+| `placementId` | required | Placement ID | `6d93f2a0e5f0fe2cc3a6e9e3ade964b43b07f897`| `string` |
+| `type` | required | Ad Type | `banner300x250` | `string` |
diff --git a/dev-docs/bidders/adrelevantis.md b/dev-docs/bidders/adrelevantis.md
index 97ceab7c8a..734f6462f4 100644
--- a/dev-docs/bidders/adrelevantis.md
+++ b/dev-docs/bidders/adrelevantis.md
@@ -4,6 +4,7 @@ title: Adrelevantis
description: Prebid Adrelevantis (adrelevantis.xyz) Bidder Adaptor
biddercode: adrelevantis
media_types: banner, video, native
+fpd_supported: true
pbjs: true
---
@@ -26,9 +27,13 @@ pbjs.setBidderConfig({
bidders: ['adrelevantis'],
config: {
ortb2: {
- context: {
+ site: {
keywords: keywords,
- category: categories
+ ext: {
+ data: {
+ category: categories
+ }
+ }
}
}
}
diff --git a/dev-docs/bidders/adrino.md b/dev-docs/bidders/adrino.md
new file mode 100644
index 0000000000..864b2507c9
--- /dev/null
+++ b/dev-docs/bidders/adrino.md
@@ -0,0 +1,56 @@
+---
+layout: bidder
+title: Adrino
+description: Prebid Adrino Bidder Adapter
+pbjs: true
+pbs: false
+biddercode: adrino
+media_types: no-display, native
+gdpr_supported: true
+gvl_id: 1072
+---
+
+### Note
+
+The Adrino bidder adapter requires setup and approval from the Adrino team. Please reach out to [wydawcy@adrino.pl](mailto:wydawcy@adrino.pl) for more information.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|--------|----------|--------------------------------------|------------------|----------|
+| `hash` | required | Identifier for specific ad placement | `'abcdef123456'` | `string` |
+
+### Native example
+
+```
+var adUnits = [
+ code: '/12345678/prebid_native_example_1',
+ mediaTypes: {
+ native: {
+ image: {
+ required: true,
+ sizes: [[300, 210],[300,150],[140,100]]
+ },
+ title: {
+ required: true
+ },
+ sponsoredBy: {
+ required: false
+ },
+ body: {
+ required: false
+ },
+ icon: {
+ required: false
+ }
+ }
+ },
+ bids: [{
+ bidder: 'adrino',
+ params: {
+ hash: 'abcdef123456'
+ }
+ }]
+];
+```
diff --git a/dev-docs/bidders/adriver.md b/dev-docs/bidders/adriver.md
index 3461aceb2c..3d5907c9fb 100644
--- a/dev-docs/bidders/adriver.md
+++ b/dev-docs/bidders/adriver.md
@@ -4,9 +4,9 @@ title: adriver
description: Adriver adapter
biddercode: adriver
pbjs: true
-bidder_supports_deals: true
-userIds: sharedId, id5Id, uid2Id
-getFloor: true
+deals_supported: true
+userIds: sharedId, id5Id, uid2Id, adriverId
+floors_supported: true
---
diff --git a/dev-docs/bidders/adsolut.md b/dev-docs/bidders/adsolut.md
index 95fc34dd89..96b36dd835 100644
--- a/dev-docs/bidders/adsolut.md
+++ b/dev-docs/bidders/adsolut.md
@@ -3,6 +3,9 @@ layout: bidder
title: adsolut
description: Prebid adsolut Bidder Adaptor
pbjs: true
+media_types: banner, native, video
+gdpr_supported: true
+usp_supported: true
biddercode: adsolut
aliasCode: adkernel
---
diff --git a/dev-docs/bidders/adspend.md b/dev-docs/bidders/adspend.md
index b238b57606..bc836ffd91 100644
--- a/dev-docs/bidders/adspend.md
+++ b/dev-docs/bidders/adspend.md
@@ -6,7 +6,8 @@ pbjs: true
biddercode: adspend
media_types: banner
gdpr_supported: false
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/adsyield.md b/dev-docs/bidders/adsyield.md
new file mode 100644
index 0000000000..f8e7b1b758
--- /dev/null
+++ b/dev-docs/bidders/adsyield.md
@@ -0,0 +1,18 @@
+---
+layout: bidder
+title: AdsYield
+description: Prebid AdsYield Bidder Adaptor
+pbjs: true
+biddercode: adsyield
+aliasCode: admixer
+media_types: video
+gdpr_supported: true
+usp_supported: true
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|------------------------------------------------------------------------------------------------------------------|----------------------------------------|----------|
+| `zone` | required | The unique identifier of the ad placement. Could be obtained from the AdsYield UI or from your account manager. | "e5ff8e48-4bd0-4a2c-9236-55530ab8981d" | `string` |
diff --git a/dev-docs/bidders/adtargetme.md b/dev-docs/bidders/adtargetme.md
new file mode 100644
index 0000000000..3073dbd201
--- /dev/null
+++ b/dev-docs/bidders/adtargetme.md
@@ -0,0 +1,25 @@
+---
+layout: bidder
+title: Adtargetme
+description: Prebid Adtargetme Bidder Adapter
+biddercode: adtargetme
+gdpr_supported: false
+usp_supported: false
+coppa_supported: false
+schain_supported: false
+dchain_supported: false
+media_types: banner
+safeframes_ok: true
+deals_supported: false
+floors_supported: false
+fpd_supported: true
+pbjs: true
+pbs: true
+pbs_app_supported: true
+prebid_member: false
+multiformat_supported: will-bid-on-one
+---
+
+### Note:
+
+The Adtargetme Bidding adapter requires setup before beginning. Please contact us at info@adtarget.me
diff --git a/dev-docs/bidders/aduptech.md b/dev-docs/bidders/aduptech.md
index 2e1a092b21..9189dab0a3 100644
--- a/dev-docs/bidders/aduptech.md
+++ b/dev-docs/bidders/aduptech.md
@@ -4,6 +4,7 @@ title: AdUp Technology
description: Prebid Bidder Adapter for AdUp Technology
biddercode: aduptech
gdpr_supported: true
+floors_supported: true
gvl_id: 647
media_types: banner, native
pbjs: true
diff --git a/dev-docs/bidders/advangelists.md b/dev-docs/bidders/advangelists.md
index 0d5f47a56d..79fdaca310 100644
--- a/dev-docs/bidders/advangelists.md
+++ b/dev-docs/bidders/advangelists.md
@@ -5,7 +5,6 @@ description: Prebid Advangelists Bidder Adapter
pbjs: true
pbs: true
biddercode: advangelists
-pbjs_version_notes: not in 5.x
---
### Note:
diff --git a/dev-docs/bidders/advenue.md b/dev-docs/bidders/advenue.md
index f2760d45b9..7e4559328c 100644
--- a/dev-docs/bidders/advenue.md
+++ b/dev-docs/bidders/advenue.md
@@ -4,7 +4,8 @@ title: Advenue
description: Prebid Advenue Bidder Adaptor
pbjs: true
biddercode: advenue
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/advertly.md b/dev-docs/bidders/advertly.md
index 2b3fc7d339..016a67b285 100644
--- a/dev-docs/bidders/advertly.md
+++ b/dev-docs/bidders/advertly.md
@@ -4,7 +4,8 @@ title: advertly
description: Prebid ADVERTLY Bidder Adapter
pbjs: true
biddercode: advertly
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/adview.md b/dev-docs/bidders/adview.md
new file mode 100644
index 0000000000..a69b21ce4b
--- /dev/null
+++ b/dev-docs/bidders/adview.md
@@ -0,0 +1,34 @@
+---
+layout: bidder
+title: AdView
+description: Prebid AdView Bidder Adapter
+biddercode: AdView
+gdpr_supported: true
+gvl_id: 1022
+usp_supported: true
+coppa_supported: true
+schain_supported: true
+dchain_supported: false
+userId:
+media_types: banner, video, native
+safeframes_ok: true
+bidder_supports_deals: true
+pbjs: false
+pbs: true
+pbs_app_supported: true
+prebid_member: false
+---
+
+### Note:
+
+Currently adapter doesnât support multi impression and can not perform impression splitting, so only the first impression will be delivered.
+
+The Example Bidding adapter requires setup before beginning. Please contact us at partner@adview.com
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|--------------|-----------|----------|
+| `placementId` | required | Placement ID | `'posid00001'` | `string` |
+| `accountId` | required | Account ID | `'accountid01'` | `string` |
\ No newline at end of file
diff --git a/dev-docs/bidders/adxcg.md b/dev-docs/bidders/adxcg.md
index 9f85e7170e..f7803f0ac5 100644
--- a/dev-docs/bidders/adxcg.md
+++ b/dev-docs/bidders/adxcg.md
@@ -2,7 +2,7 @@
layout: bidder
title: adxcg
description: Prebid adxcg bidder adaptor
-bidder_supports_deals: true
+deals_supported: true
pbjs: true
pbs: true
pbs_app_supported: true
diff --git a/dev-docs/bidders/adyoulike.md b/dev-docs/bidders/adyoulike.md
index cdfc18ccca..05b2f78297 100644
--- a/dev-docs/bidders/adyoulike.md
+++ b/dev-docs/bidders/adyoulike.md
@@ -6,19 +6,23 @@ pbjs: true
pbs: true
media_types: banner, video, native
biddercode: adyoulike
+userIds: criteo, sharedId
gdpr_supported: true
+gvl_id: 259
usp_supported: true
+floors_supported: true
+schain_supported: true
---
### Note:
+
The Adyoulike Header Bidding adaptor requires setup and approval from the Adyoulike team. Please reach out to your account manager or prebid@adyoulike.com for more information.
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
+| Name | Scope | Description | Example | Type |
|-------------|----------|----------------------------------|--------------------------------------|----------|
| `placement` | required | The placement ID from Adyoulike. | `'194f787b85c829fb8822cdaf1ae64435'` | `string` |
-
Same 'placement' parameter can be used from either prebid JS or prebid server.
diff --git a/dev-docs/bidders/afp.md b/dev-docs/bidders/afp.md
new file mode 100644
index 0000000000..07e3d197ea
--- /dev/null
+++ b/dev-docs/bidders/afp.md
@@ -0,0 +1,201 @@
+---
+layout: bidder
+title: AFP
+description: Prebid AFP Bidder Adapter
+pbjs: true
+media_types: banner, video
+biddercode: afp
+safeframes_ok: false
+---
+
+### Note
+
+You can use this adapter to get a bid from AFP.
+Please reach out to your AFP account team before using this plugin to get placeId.
+The code below returns a demo ad.
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------------|---------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
+| `placeId` | required | Place id. | '5af45ad34d506ee7acad0c26' | `string` |
+| `placeType` | required | Place type. | 'In-image', 'In-image Max', 'In-content Banner', 'In-content Video', 'Out-content Video', 'In-content Stories', 'Action Scroller', 'Action Scroller Light', 'Just Banner' | `string` |
+| `placeContainer` | required (if the frame is not safe) | The container of the place where the ad will be displayed. The css selector is specified as the value. | '#container' | `string` |
+| `imageUrl` | required (for 'In-image', 'In-image Max' placeType) | URL of the image on which the banner will be displayed. | 'https://creative.astraone.io/files/default_image-1-600x400.jpg' | `string` |
+| `imageWidth` | required (for 'In-image', 'In-image Max' placeType) | Image width. | 600 | `integer` |
+| `imageHeight` | required (for 'In-image', 'In-image Max' placeType) | Image height. | 400 | `integer` |
+
+
+### InImage Example page
+
+
+```html
+
+
+
+
+ Prebid.js In-image Example
+
+
+
+
+
In-image
+
+
+
+
+
+
+
+
Just Banner
+
+
+
+
+
+
+```
+### InImage Example page with GPT
+
+```html
+
+
+
+
+ Prebid.js In-image Example
+
+
+
+
+
+
In-image
+
+
+
+
+
+
+
+
+
+
+```
diff --git a/dev-docs/bidders/aja.md b/dev-docs/bidders/aja.md
index 334ece6150..11233433ec 100644
--- a/dev-docs/bidders/aja.md
+++ b/dev-docs/bidders/aja.md
@@ -2,23 +2,23 @@
layout: bidder
title: AJA
description: Prebid AJA Bidder Adaptor
+userIds: criteo, unifiedId, imuid
pbjs: true
pbs: true
biddercode: aja
media_types: video, native
-pbjs_version_notes: not in 5.x
---
-### Note:
+### Note
The AJA Bidding adaptor requires setup and approval before beginning. Please reach out to for more details
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
+| Name | Scope | Description | Example | Type |
|-------|----------|---------------------|------------|----------|
-| `asi` | required | ad spot hash code | `'123abc'` | `string` |
+| `asi` | required | ad spot hash code | `'123abc'` | `string` |
### Configuration
@@ -31,11 +31,11 @@ pbjs.setConfig({
userSync: {
filterSettings: {
iframe: {
- bidders: '*', // '*' represents all bidders
- filter: 'include'
- }
- }
- }
+ bidders: "*", // '*' represents all bidders
+ filter: "include",
+ },
+ },
+ },
});
```
@@ -45,8 +45,7 @@ For Prebid.js v1.14.0 and before:
pbjs.setConfig({
userSync: {
iframeEnabled: true,
- enabledBidders: ['aja']
- }
+ enabledBidders: ["aja"],
+ },
});
```
-
diff --git a/dev-docs/bidders/algorix.md b/dev-docs/bidders/algorix.md
index d6b6c0a363..1ac9335c56 100644
--- a/dev-docs/bidders/algorix.md
+++ b/dev-docs/bidders/algorix.md
@@ -5,17 +5,19 @@ description: Prebid AlgoriX Bidder Adapter
biddercode: algorix
gdpr_supported: false
gvl_id:
-usp_supported: false
-coppa_supported: false
+usp_supported: true
+coppa_supported: true
+schain_supported: true
media_types: banner, video, native
pbjs: false
pbs: true
pbs_app_supported: true
+prebid_member: true
---
### Note:
-Algorix adapter requires setup and approval from the Algorix team, even for existing in-app developers and publishers. Please reach out to your account team or email to prebid@algorix.co for more information.
+AlgoriX adapter requires setup and approval from the AlgoriX team, even for existing in-app developers and publishers. Please reach out to your account team or email to prebid@algorix.co for more information.
### Bid Params
@@ -24,5 +26,11 @@ Algorix adapter requires setup and approval from the Algorix team, even for exis
|---------------|----------|---------------|--------------------------------------|----------|
| `sid` | required | Sid | `'30014'` | `string` |
| `token` | required | Token | `'028bca2d3b5c4f0ba155fa34864b0c4d'` | `string` |
+| `placementId` | optional | Placement Id | `'123456'` | `string` |
+| `appId` | optional | App Id | `'asdasdasd'` | `string` |
+| `region` | optional | Server Region | `'APAC' or 'USE'` | `string` |
-Note: Prebid Server adapter only checks for and uses first imp bid params. All other imp bid params are ignored.
+Note:
+* Prebid Server adapter only checks for and uses first imp bid params. All other imp bid params are ignored.
+* placementId and appId will be generated on AlgoriX Platform.
+* region is optional param, which determine the AlgoriX server. APAC for SG endpoint, USE for US endpoint, Other for Global endpoint.
diff --git a/dev-docs/bidders/alkimi.md b/dev-docs/bidders/alkimi.md
new file mode 100644
index 0000000000..c3122166b0
--- /dev/null
+++ b/dev-docs/bidders/alkimi.md
@@ -0,0 +1,27 @@
+---
+layout: bidder
+title: Alkimi
+description: Prebid Alkimi Bidder Adapter
+biddercode: alkimi
+media_types: banner, video
+pbjs: true
+pbs: true
+schain_supported: true
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+userIds: all
+floors_supported: true
+multiformat_supported: will-bid-on-any
+---
+
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------|-----------|
+| `token` | required | The ID issued by Alkimi to the publisher | `'8a80d8e9-0cf9-4329-8486-6f5bbcd8a61a'` | `string` |
+| `bidFloor` | required | Minimum bid for this impression expressed in CPM. | `0` | `float` |
+| `pos` | optional | Specify the position of the ad as a relative measure of visibility or prominence. Allowed values: Above the fold: `1`; Below the fold: `3`; Middle of the fold: `7`; | `0` | `integer` |
diff --git a/dev-docs/bidders/amx.md b/dev-docs/bidders/amx.md
index bddf72a938..f03447d1fe 100644
--- a/dev-docs/bidders/amx.md
+++ b/dev-docs/bidders/amx.md
@@ -10,10 +10,11 @@ coppa_supported: true
userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId, amxId
biddercode: amx
safeframes_ok: true
-media_types: banner, video
+media_types: banner, video, native
pbjs: true
pbs: true
pbs_app_supported: true
+fpd_supported: true
gvl_id: 737
---
@@ -22,8 +23,8 @@ gvl_id: 737
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|-------------|----------|-----------------------------------------------------------------|---------------------------------|----------|
+| `tagId` | required | Tag ID | `'cHJlYmlkLm9yZw'` | `string` |
| `testMode` | optional | Activate 100% fill ads | `true` | `boolean`|
-| `tagId` | optional | Tag ID | `'cHJlYmlkLm9yZw'` | `string` |
| `adUnitId` | optional | Ad Unit ID used in reporting. Will default to `bid.adUnitCode` | `'sticky_banner'` | `string` |
### Test Parameters
@@ -37,4 +38,40 @@ To enable 100% fill test ads, you can use the following `params`:
}
```
-Note that the `tagId` is case-sensitive. This will produce a bid at $10 with a test creative.
+This will produce a bid at $10 with a test creative.
+
+Note that the `tagId` is case-sensitive. Do not use `cHJlYmlkLm9yZw` in production environments: this ID is for testing only.
+
+### First Party Data
+
+From Prebid.js >= 4.30, publishers can use the `ortb2` configuration parameter to provide First Party Data. We accept all standard OpenRTB fields for both:
+
+- `ortb2.site`
+- `ortb2.user`
+
+Note that all fields are optional. For contextual data (e.g. categories), standard IAB taxonomies are supported. We do not support passing first party data via bid parameters.
+
+#### Example - Setting ortb2.site and ortb2.user fields
+
+```javascript
+pbjs.setBidderConfig({
+ bidders: ["amx"],
+ config: {
+ ortb2: {
+ site: {
+ keywords: "kw1,kw2",
+ cat: ["IAB2"],
+ sectioncat: ["IAB2-1"],
+ pagecat: ["IAB2-22"],
+ content: {
+ context: 5
+ }
+ },
+ user: {
+ yob: 1981,
+ keywords: "kw3",
+ }
+ }
+ }
+})
+```
diff --git a/dev-docs/bidders/aniview.md b/dev-docs/bidders/aniview.md
index 4ae7c6ce14..a51cc6f840 100644
--- a/dev-docs/bidders/aniview.md
+++ b/dev-docs/bidders/aniview.md
@@ -1,16 +1,19 @@
---
layout: bidder
title: ANIVIEW
-description: Prebid ANIVIEW Bidder Adaptor
+description: Prebid ANIVIEW Bidder Adapter
pbjs: true
biddercode: aniview
-media_types: video
+media_types: banner, video
gdpr_supported: true
usp_supported: true
+schain_supported: true
+safeframes_ok: true
+gvl_id: 780
---
### Note:
-For more information about [Aniview Ad Server](http://www.aniview.com/), please contact info@aniview.com.
+For more information about [Aniview Ad Server](https://www.aniview.com/), please contact info@aniview.com.
### Bid Params
@@ -19,3 +22,24 @@ For more information about [Aniview Ad Server](http://www.aniview.com/), please
|------------------|----------|------------------|------------------------------|----------|
| `AV_PUBLISHERID` | required | Publisher/Netid | `'55b88d4a181f465b3e8b4567'` | `string` |
| `AV_CHANNELID` | required | Channel id | `'5a5f17a728a06102d14c2718'` | `string` |
+
+### Test Parameters
+```
+videoAdUnit = [
+{
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [[640, 480]],
+ context: 'outstream'
+ },
+ },
+ bids: [{
+ bidder: 'aniview',
+ params: {
+ AV_PUBLISHERID: '55b78633181f4603178b4568',
+ AV_CHANNELID: '5d19dfca4b6236688c0a2fc4'
+ }
+ }]
+}];
+```
diff --git a/dev-docs/bidders/aol.md b/dev-docs/bidders/aol.md
index a7b454b426..6e162546aa 100644
--- a/dev-docs/bidders/aol.md
+++ b/dev-docs/bidders/aol.md
@@ -7,9 +7,22 @@ biddercode: aol
gdpr_supported: true
usp_supported: true
gvl_id: 25
-userIds: verizonMediaId
+userIds: connectId
---
+### IMPORTANT NOTICE!
+**TL;DR**
+1. The `aol` adapter is scheduled to be depreciated.
+2. Our New `yahoossp` is available for early adoption.
+3. Please contact your Account Manager/Executive for migration details.
+
+Dear Publishers & Partners,
+As part of our platform consolidation process to simplify your integrations moving forward
+We invite you to switch from the `oneVideo` Adapter to our NEW `yahoossp` bid adapter for both Display & Video inventory.
+FYI - The oneVideo adapter is scheduled for depreciation in the upcoming months.
+
+Thanks in advance,
+Yahoo SSP
### Note:
This adapter allows use of both ONE by AOL: Display and ONE by AOL: Mobile platforms. In order to differentiate these sources of demand in your ad server and reporting, you may use the optional `onedisplay` and `onemobile` adapter aliases instead.
diff --git a/dev-docs/bidders/apacdex.md b/dev-docs/bidders/apacdex.md
index 3257909e1a..9a29acd80c 100644
--- a/dev-docs/bidders/apacdex.md
+++ b/dev-docs/bidders/apacdex.md
@@ -9,7 +9,9 @@ gdpr_supported: true
schain_supported: true
usp_supported: true
userIds: all
-getFloor: true
+floors_supported: true
+pbs: true
+pbs_app_supported: true
---
### Table of Contents
@@ -26,12 +28,14 @@ getFloor: true
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|--------------|----------|-------------------------------------------------------------------------------------|---------------------------------------------------|----------|
-| `siteId` | required | Publisher site ID from Apacdex | `'apacdex1234'` | `string` |
-| `floorPrice` | optional | CPM bidfloor in USD | `0.03` | `float` |
-| `geo` | optional | GEO data of device. See [Geo Object](#apacdex-geo-object) for details. | `{"lat":17.98928,"lon":99.7741712,"accuracy":20}` | `object` |
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------------------------------------------------------------------------------|---------------------------------------------------|----------|
+| `placementId`*| required | Placement ID provided by Apacdex | `'plc100000'` | `string` |
+| `siteId`* | required | Publisher site ID from Apacdex | `'apacdex1234'` | `string` |
+| `floorPrice` | optional | CPM bidfloor in USD | `0.03` | `float` |
+| `geo` | optional | GEO data of device. See [Geo Object](#apacdex-geo-object) for details. | `{"lat":17.98928,"lon":99.7741712,"accuracy":20}` | `object` |
+(*) Please do not use `placementId` and `siteId` at the same time.
@@ -59,9 +63,9 @@ Publishers declare video inventory by passing the following parameters via media
|----------------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------|
| `context` | required | instream or outstream |`"outstream"` | `string` |
| `playerSize`| required | width, height of the player in pixels | `[640,360]` - will be translated to w and h in bid request | `array` |
-| `mimes` | required | List of content MIME types supported by the player (see openRTB v2.5 for options) | `["video/mp4"]`| `array`|
-| `protocols` | required | Supported video bid response protocol values 1: VAST 1.0 2: VAST 2.0 3: VAST 3.0 4: VAST 1.0 Wrapper 5: VAST 2.0 Wrapper 6: VAST 3.0 Wrapper 7: VAST 4.0 8: VAST 4.0 Wrapper | `[2,3,5,6]` | `array`|
-| `api` | required | Supported API framework values: 1: VPAID 1.0 2: VPAID 2.0 3: MRAID-1 4: ORMMA 5: MRAID-2 | `[2]` | `array` |
+| `mimes` | recommended | List of content MIME types supported by the player (see openRTB v2.5 for options) | `["video/mp4"]`| `array`|
+| `protocols` | recommended | Supported video bid response protocol values 1: VAST 1.0 2: VAST 2.0 3: VAST 3.0 4: VAST 1.0 Wrapper 5: VAST 2.0 Wrapper 6: VAST 3.0 Wrapper 7: VAST 4.0 8: VAST 4.0 Wrapper | `[2,3,5,6]` | `array`|
+| `api` | recommended | Supported API framework values: 1: VPAID 1.0 2: VPAID 2.0 3: MRAID-1 4: ORMMA 5: MRAID-2 | `[2]` | `array` |
| `maxduration` | recommended | Maximum video ad duration in seconds. | `30` | `integer` |
| `minduration` | recommended | Minimum video ad duration in seconds | `6` | `integer` |
| `playbackmethod` | recommended | Playback methods that may be in use. Only one method is typically used in practice. (see openRTB v2.5 section 5.10 for options)| `[2]`| `array` |
@@ -170,4 +174,4 @@ var outstreamAdUnit = {
};
```
mediaTypes.video object reference to section 3.2.7 Object: Video in the OpenRTB 2.5 document
-You must review all video parameters to ensure validity for your player and DSPs
\ No newline at end of file
+You must review all video parameters to ensure validity for your player and DSPs
diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md
index c29e3e4f30..9872ea41f0 100644
--- a/dev-docs/bidders/appnexus.md
+++ b/dev-docs/bidders/appnexus.md
@@ -6,16 +6,21 @@ biddercode: appnexus
media_types: banner, video, native
gdpr_supported: true
prebid_member: true
-userIds: criteo, unifiedId, netId, identityLink, flocId, uid2
+userIds: criteo, flocId, identityLink, netId, pubProvidedId, uid2, unifiedId,
schain_supported: true
coppa_supported: true
usp_supported: true
-getFloor: true
+floors_supported: true
+fpd_supported: true
pbjs: true
pbs: true
gvl_id: 32
---
+### Disclosure:
+
+This adapter is known to use an HTTP 1 endpoint. Header bidding often generates multiple requests to the same host and bidders are encouraged to change to HTTP 2 or above to help improve publisher page performance via multiplexing.
+
### Table of Contents
- [Bid Params](#appnexus-bid-params)
@@ -23,7 +28,9 @@ gvl_id: 32
- [User Object](#appnexus-user-object)
- [App Object](#appnexus-app-object)
- [Custom Targeting keys](#custom-targeting-keys)
+- [Auction Level Keywords](#appnexus-auction-keywords)
- [Passing Keys Without Values](#appnexus-no-value)
+- [First Party Data](#appnexus-fpd)
- [User Sync in AMP](#appnexus-amp)
- [Debug Auction](#appnexus-debug-auction)
@@ -38,26 +45,26 @@ All AppNexus (Xandr) placements included in a single call to `requestBids` must
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------|
-| `placementId` | required | The placement ID from AppNexus. You may identify a placement using the `invCode` and `member` instead of a placement ID. The `placementID` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. Legacy code can retain the `string` value. **Prebid Server requires an integer value.** | `234234` | `integer` |
-| `member` | optional | The member ID from AppNexus. Must be used with `invCode`. | `'12345'` | `string` |
-| `invCode` | optional | The inventory code from AppNexus. Must be used with `member`. | `'abc123'` | `string` |
-| `publisherId` | optional | The publisher ID from AppNexus. It is used by the AppNexus end point to identify the publisher when `placementId` is not provided and `invCode` goes wrong. The `publisherId` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. | `12345` | `integer` |
-| `frameworks` | optional | Array of integers listing API frameworks for Banner supported by the publisher. | `integer` |
-| `user` | optional | Object that specifies information about an external user. See [User Object](#appnexus-user-object) for details. | `user: { age: 25, gender: 0, dnt: true}` | `object` |
-| `allowSmallerSizes` | optional | If `true`, ads smaller than the values in your ad unit's `sizes` array will be allowed to serve. Defaults to `false`. | `true` | `boolean` |
-| `usePaymentRule` (PBJS) or `use_pmt_rule` (PBS) | optional | If `true`, Appnexus will return net price to Prebid.js after publisher payment rules have been applied. | `true` | `boolean` |
-| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Mapped to [buy-side segment targeting](https://monetize.xandr.com/docs/segment-targeting) (login required). Values can be empty. See [Passing Keys Without Values](#appnexus-no-value) below for examples. Note that to use keyword with the Prebid Server adapter, that feature must be enabled for your account by an AppNexus account manager. | `keywords: { genre: ['rock', 'pop'] }` | `object` |
-| `video` | optional | Object containing video targeting parameters. See [Video Object](#appnexus-video-object) for details. | `video: { playback_method: ['auto_play_sound_off'] }` | `object` |
-| `app` | optional | Object containing mobile app parameters. See the [App Object](#appnexus-app-object) for details. | `app : { id: 'app-id'}` | `object` |
-| `reserve` | optional | Sets a floor price for the bid that is returned. If floors have been configured in the AppNexus Console, those settings will override what is configured here. | `0.90` | `float` |
-| `position` | optional | Identify the placement as above or below the fold. Allowed values: Unknown: `unknown`; Above the fold: `above`; Below the fold: `below` | `'above'` | `string` |
-| `trafficSourceCode` | optional | Specifies the third-party source of this impression. | `'my_traffic_source'` | `string` |
-| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` |
-| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` |
-| `pubClick` | optional | Specifies a publisher-supplied URL for third-party click tracking. This is just a placeholder into which the publisher can insert their own click tracker. This parameter should be used for an unencoded tracker. This parameter is expected to be the last parameter in the URL. Please note that the click tracker placed in this parameter will only fire if the creative winning the auction is using AppNexus click tracking properly. | `'http://click.adserver.com/'` | `string` |
-| `extInvCode` | optional | Specifies predefined value passed on the query string that can be used in reporting. The value must be entered into the system before it is logged. | `'10039'` | `string` |
-| `externalImpId` | optional | Specifies the unique identifier of an externally generated auction. | `'bacbab02626452b097f6030b3c89ac05'` | `string` |
-| `generate_ad_pod_id`| optional | Signal to AppNexus to split impressions by ad pod and add unique ad pod id to each request. Specific to long form video endpoint only. Supported by Prebid Server, not Prebid JS. | `true` | `boolean` |
+| `placement_id` (PBS) or `placementId` (PBJS) | required | The placement ID from AppNexus. You may identify a placement using the `invCode` and `member` instead of a placement ID. This parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. Legacy code can retain the `string` value. **Prebid Server requires an integer value.** | `234234` | `integer` |
+| `member` | optional | The member ID from AppNexus. Must be used with `invCode`. | `'12345'` | `string` |
+| `invCode` | optional | The inventory code from AppNexus. Must be used with `member`. | `'abc123'` | `string` |
+| `publisherId` | optional | The publisher ID from AppNexus. It is used by the AppNexus end point to identify the publisher when placement id is not provided and `invCode` goes wrong. The `publisherId` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. | `12345` | `integer` |
+| `frameworks` | optional | Array of integers listing API frameworks for Banner supported by the publisher. | `integer` |
+| `user` | optional | Object that specifies information about an external user. See [User Object](#appnexus-user-object) for details. | `user: { age: 25, gender: 0, dnt: true}` | `object` |
+| `allowSmallerSizes` | optional | If `true`, ads smaller than the values in your ad unit's `sizes` array will be allowed to serve. Defaults to `false`. | `true` | `boolean` |
+| `usePaymentRule` (PBJS) or `use_pmt_rule` (PBS) | optional | If `true`, Appnexus will return net price to Prebid.js after publisher payment rules have been applied. | `true` | `boolean` |
+| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Mapped to [buy-side segment targeting](https://monetize.xandr.com/docs/segment-targeting) (login required). A maximum of 100 key/value pairs can be defined at the page level. Each tag can have up to 100 additional key/value pairs defined. Values can be empty. See [Passing Keys Without Values](#appnexus-no-value) below for examples. If you want to pass keywords for all adUnits, see [Auction Level Keywords](#appnexus-auction-keywords) for an example. Note that to use keyword with the Prebid Server adapter, that feature must be enabled for your account by an AppNexus account manager. | `keywords: { genre: ['rock', 'pop'] }` | `object` |
+| `video` | optional | Object containing video targeting parameters. See [Video Object](#appnexus-video-object) for details. | `video: { playback_method: ['auto_play_sound_off'] }` | `object` |
+| `app` | optional | Object containing mobile app parameters. See the [App Object](#appnexus-app-object) for details. | `app : { id: 'app-id'}` | `object` |
+| `reserve` | optional | Sets a floor price for the bid that is returned. If floors have been configured in the AppNexus Console, those settings will override what is configured here unless 'Reserve Price Override' is checked. See [Xandr docs](https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/create-a-floor-rule.html) | `0.90` | `float` |
+| `position` | optional | Identify the placement as above or below the fold. Allowed values: Unknown: `unknown`; Above the fold: `above`; Below the fold: `below` | `'above'` | `string` |
+| `trafficSourceCode` | optional | Specifies the third-party source of this impression. | `'my_traffic_source'` | `string` |
+| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` |
+| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` |
+| `pubClick` | optional | Specifies a publisher-supplied URL for third-party click tracking. This is just a placeholder into which the publisher can insert their own click tracker. This parameter should be used for an unencoded tracker. This parameter is expected to be the last parameter in the URL. Please note that the click tracker placed in this parameter will only fire if the creative winning the auction is using AppNexus click tracking properly. | `'http://click.adserver.com/'` | `string` |
+| `extInvCode` | optional | Specifies predefined value passed on the query string that can be used in reporting. The value must be entered into the system before it is logged. | `'10039'` | `string` |
+| `externalImpId` | optional | Specifies the unique identifier of an externally generated auction. | `'bacbab02626452b097f6030b3c89ac05'` | `string` |
+| `generate_ad_pod_id` | optional | Signal to AppNexus to split impressions by ad pod and add unique ad pod id to each request. Specific to long form video endpoint only. Supported by Prebid Server, not Prebid JS. | `true` | `boolean` |
@@ -135,6 +142,24 @@ pbjs.bidderSettings = {
}
```
+
+
+#### Auction Level Keywords
+
+It's possible to pass a set of keywords for the whole request, rather than a particular adUnit. Though they would apply to all adUnits (which include the appnexus bidder) in an auction, these keywords can work together with the bidder level keywords (if for example you want to have specific targeting for a particular adUnit).
+
+Below is an example of how to define these auction level keywords for the appnexus bidder:
+```
+pbjs.setConfig({
+ appnexusAuctionKeywords: {
+ genre: ['classical', 'jazz'],
+ instrument: 'piano'
+ }
+});
+```
+
+Like in the bidder.params.keywords, the values here can be empty. Please see the section immediately below for more details.
+
#### Passing Keys Without Values
@@ -160,6 +185,17 @@ keywords: {
}
```
+
+
+#### First Party Data
+
+Publishers should use the `ortb2` method of setting [First Party Data](https://docs.prebid.org/features/firstPartyData.html).
+
+At this time however, the `appnexus` bidder only reads the First Party Data when using the Prebid Server and Prebid Server Premium endpoints. The client-side version of the `appnexus` bidder does not use the values from the First Party Data fields.
+
+PBS/PSP supports all first party data fields: site, user, segments, and imp-level first party data.
+
+
#### User Sync in AMP
@@ -218,7 +254,7 @@ that would match with the test creative.
},
"ext": {
"appnexus": {
- "placementId": 13144370
+ "placement_id": 13144370
}
}
}]
diff --git a/dev-docs/bidders/aseal.md b/dev-docs/bidders/aseal.md
new file mode 100644
index 0000000000..604623a724
--- /dev/null
+++ b/dev-docs/bidders/aseal.md
@@ -0,0 +1,53 @@
+---
+layout: bidder
+title: Aseal
+description: Prebid Aseal Bidder Adapter
+pbjs: true
+biddercode: aseal
+media_types: banner
+---
+
+### BidParams
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-----------------|----------|---------------------------------|------------------------------------------|--------------------|
+| `placeUid` | required | The Place UID from Aotter | `'f4a74f73-9a74-4a87-91c9-545c6316c23d'` | `string` |
+
+# Configuration
+
+Following configuration is required:
+
+```js
+pbjs.setConfig({
+ aseal: {
+ clientId: "YOUR_CLIENT_ID"
+ }
+});
+```
+
+# Ad Unit Example
+
+```js
+var adUnits = [
+ {
+ code: "banner-div",
+ mediaTypes: {
+ banner: {
+ sizes: [
+ [300, 250],
+ [300, 600]
+ ]
+ }
+ },
+ bids: [
+ {
+ bidder: "aseal",
+ params: {
+ placeUid: "f4a74f73-9a74-4a87-91c9-545c6316c23d"
+ }
+ }
+ ]
+ }
+];
+```
diff --git a/dev-docs/bidders/aso.md b/dev-docs/bidders/aso.md
new file mode 100644
index 0000000000..8e4fae6934
--- /dev/null
+++ b/dev-docs/bidders/aso.md
@@ -0,0 +1,58 @@
+---
+layout: bidder
+title: Adserver.Online
+description: Prebid Adserver.Online Bidder Adapter
+biddercode: aso
+gdpr_supported: true
+usp_supported: true
+media_types: video
+safeframes_ok: true
+deals_supported: false
+pbjs: true
+pbs: false
+floors_supported: true
+---
+### Note:
+
+For more information about [Adserver.Online](https://adserver.online), please contact support@adsrv.org.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `zone` | required | Zone ID | `73815` | `integer` |
+
+### Test Parameters
+
+```js
+ var adUnit = {
+ code: 'unit1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [
+ {
+ bidder: 'aso',
+ params: {
+ zone: 73815,
+ }
+ }
+ ]
+}
+```
+
+#### Video Caching
+
+Note that the Adserver.Online adapter expects a client-side Prebid Cache to be enabled for video bidding.
+
+```js
+pbjs.setConfig({
+ usePrebidCache: true,
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ }
+});
+```
diff --git a/dev-docs/bidders/atomx.md b/dev-docs/bidders/atomx.md
index 378c2b37b0..ddca88bbbc 100644
--- a/dev-docs/bidders/atomx.md
+++ b/dev-docs/bidders/atomx.md
@@ -4,7 +4,8 @@ title: Atomx
description: Prebid Atomx Bidder Adaptor
pbjs: true
biddercode: atomx
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/audiencerun.md b/dev-docs/bidders/audiencerun.md
index b7d4a9fbcd..8f61791191 100644
--- a/dev-docs/bidders/audiencerun.md
+++ b/dev-docs/bidders/audiencerun.md
@@ -5,39 +5,45 @@ description: Prebid AudienceRun Bidder Adaptor
pbjs: true
biddercode: audiencerun
media_types: banner
+gvl_id: 944
gdpr_supported: true
+usp_supported: true
+schain_supported: true
+safeframes_ok: false
+prebid_member: false
+userIds: all
+floors_supported: true
---
-### Disclosure
-
-This bidder sets `adId` on the bid response and hasn't responded to the Prebid.js team to confirm uniqueness
-of this value. See [Issue 6381](https://github.com/prebid/Prebid.js/issues/6381).
-
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|---------------|----------|-------------|---------|----------|
-| `zoneId` | required | | | `string` |
-
-### Description
-
-Module that connects to AudienceRun demand sources.
-
-Use `audiencerun` as bidder.
-
-`zoneId` is required and must be 10 alphanumeric characters.
-
-### AdUnits configuration example
-```
- var adUnits = [{
- code: 'test-div',
- sizes: [[300, 600]],
- bids: [{
- bidder: 'audiencerun',
- params: {
- zoneId: 'xtov2mgij0'
- }
- }]
- }];
+| Name | Scope | Description | Example | Type |
+| ---------- | -------- | --------------------------------------------------------------------------- | -------------- | -------- |
+| `zoneId` | required | The zone id provided by AudienceRun | `'xtov2mgij0'` | `string` |
+| `bidfloor` | optional | The bid floor for the zone id provided by AudienceRun in USD (default: 0.0) | `0.5` | `float` |
+
+### Registration
+
+The AudienceRun Header Bidding adaptor requires setup and approval from the AudienceRun team. Please reach out to our team on for more details.
+
+### Example
+
+Use `audiencerun` as bidder. Note that `zoneId` is required and must be 10 alphanumeric characters.
+
+```js
+var adUnits = [
+ {
+ code: "test-div",
+ sizes: [[300, 600]],
+ bids: [
+ {
+ bidder: "audiencerun",
+ params: {
+ zoneId: "xtov2mgij0",
+ },
+ },
+ ],
+ },
+];
```
diff --git a/dev-docs/bidders/automatad.md b/dev-docs/bidders/automatad.md
index cd1c2045b4..3b16d99709 100644
--- a/dev-docs/bidders/automatad.md
+++ b/dev-docs/bidders/automatad.md
@@ -4,14 +4,26 @@ title: Automatad OpenRTB Bid Adapter
description: Automatad OpenRTB Bid Adapter
biddercode: automatad
pbjs: true
+pbs: true
media_types: banner
+fpd_supported: false
---
-#### Bid Params
+#### Prebid.js Bid Params
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|-----------|----------|---------------------------|------------|----------|
| `siteId` | required | The site ID from automatad. | `"12adf45c"` | `string` |
-| `placementId` | required | The placement ID from automatad. | `"a34gh6d"` | `string` |
+| `placementId` | optional | The placement ID from automatad. | `"a34gh6d"` | `string` |
+
+### Prebid-Server Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------|---------|----------|
+| `position` | optional | Position field from automatad | `22390678` | `string` |
+| `placementId` | optional | The placement ID from automatad. | `"a34gh6d"` | `string` |
+
+
diff --git a/dev-docs/bidders/avantisvideo.md b/dev-docs/bidders/avantisvideo.md
index 2f1d2e72ee..bdc5ae4dd9 100644
--- a/dev-docs/bidders/avantisvideo.md
+++ b/dev-docs/bidders/avantisvideo.md
@@ -5,13 +5,15 @@ description: Avantis Video Bidder Adapter
pbjs: true
biddercode: avantisvideo
aliasCode: aniview
-media_types: video
+media_types: banner, video
gdpr_supported: true
usp_supported: true
+schain_supported: true
+safeframes_ok: true
---
### Note:
-For more information about [Avantis Video](https://www.avantisvideo.com/).
+For more information about [Avantis Video](https://www.avantisvideo.com/), please contact contact@avantisvideo.com.
### Bid Params
diff --git a/dev-docs/bidders/axonix.md b/dev-docs/bidders/axonix.md
index 6a7ecae034..84ffe5dcd6 100644
--- a/dev-docs/bidders/axonix.md
+++ b/dev-docs/bidders/axonix.md
@@ -5,6 +5,8 @@ description: Axonix Prebid Adaptor
biddercode: axonix
media_types: banner, video
pbjs: true
+pbs: true
+gvl_id: 678
---
### Prebid Server Note:
diff --git a/dev-docs/bidders/beachfront.md b/dev-docs/bidders/beachfront.md
index 0a12f356e0..80e24b0f08 100644
--- a/dev-docs/bidders/beachfront.md
+++ b/dev-docs/bidders/beachfront.md
@@ -4,10 +4,11 @@ title: Beachfront
description: Prebid Beachfront Bidder Adapter
biddercode: beachfront
media_types: video
-getFloor: true
+floors_supported: true
+fpd_supported: true
gdpr_supported: true
usp_supported: true
-userIds: unifiedId, identityLink, uid2
+userIds: unifiedId, identityLink, uid2, hadronId
schain_supported: true
prebid_member: true
pbjs: true
@@ -26,56 +27,85 @@ For further information, please contact adops@beachfront.com.
### Bid Params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
+| Name | Scope | Description | Example | Type |
|------------|----------|---------------------------------------------------------------------------------------------|------------------------------------------|----------|
-| `appId` | required | Beachfront Exchange ID | `'11bc5dd5-7421-4dd8-c926-40fa653bec76'` | `string` |
-| `bidfloor` | required | Bid floor | `0.01` | `float` |
-| `video` | optional | Object with video parameters. See the [video section below](#beachfront-video) for details. | | `object` |
-| `banner` | optional | Object with banner parameters. See the [banner section below](#beachfront-banner) for details. | | `object` |
-| `player` | optional | Object with outstream player parameters. See the [player section below](#beachfront-player) for details. | | `object` |
+| `appId` | required | Beachfront Exchange ID | `'11bc5dd5-7421-4dd8-c926-40fa653bec76'` | `string` |
+| `bidfloor` | required | Bid floor | `0.01` | `float` |
+| `video` | optional | Object with video parameters. See the [video section below](#beachfront-video) for details. | | `object` |
+| `banner` | optional | Object with banner parameters. See the [banner section below](#beachfront-banner) for details. | | `object` |
+| `player` | optional | Object with outstream player parameters. See the [player section below](#beachfront-player) for details. | | `object` |
-### video params
+#### video params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
+| Name | Scope | Description | Example | Type |
|------------------|----------|------------------------------------------------|-------------------------------------------|-----------------|
-| `appId` | optional | Beachfront Exchange ID for video bids. | `'11bc5dd5-7421-4dd8-c926-40fa653bec76'` | `string` |
-| `bidfloor` | optional | Bid floor for video bids. | `0.01` | `float` |
-| `tagid` | optional | Tag ID | `'placement-name'` | `string` |
-| `responseType` | optional | Video response type. `both`: VAST URL and VAST XML `nurl`: VAST URL only `adm`: VAST XML only | `'both'` | `string` |
-| `mimes` | optional | Array of strings listing supported MIME types. | `["video/mp4", "application/javascript"]` | `Array` |
+| `appId` | optional | Beachfront Exchange ID for video bids. | `'11bc5dd5-7421-4dd8-c926-40fa653bec76'` | `string` |
+| `bidfloor` | optional | Bid floor for video bids. | `0.01` | `float` |
+| `tagid` | optional | Tag ID | `'placement-name'` | `string` |
+| `responseType` | optional | Video response type. `both`: VAST URL and VAST XML `nurl`: VAST URL only `adm`: VAST XML only | `'both'` | `string` |
+| `mimes` | optional | Array of strings listing supported MIME types. | `["video/mp4", "application/javascript"]` | `Array` |
| `playbackmethod` | optional | Playback method supported by the publisher. `1`: Auto-play sound on `2`: Auto-play sound off `3`: Click-to-play `4`: Mouse-over | `1` | `integer` |
-| `maxduration` | optional | Maximum video ad duration in seconds. | `30` | `integer` |
-| `placement` | optional | Placement type for the impression. `1`: In-Stream `2`: In-Banner `3`: In-Article `4`: In-Feed `5`: Interstitial/Slider/Floating | `1` | `integer` |
-| `skip` | optional | Indicates if the player will allow the video to be skipped. | `1` | `integer` |
-| `skipmin` | optional | Videos of total duration greater than this number of seconds can be skippable. | `15` | `integer` |
-| `skipafter` | optional | Number of seconds a video must play before skipping is enabled. | `5` | `integer` |
+| `maxduration` | optional | Maximum video ad duration in seconds. | `30` | `integer` |
+| `placement` | optional | Placement type for the impression. `1`: In-Stream `2`: In-Banner `3`: In-Article `4`: In-Feed `5`: Interstitial/Slider/Floating | `1` | `integer` |
+| `skip` | optional | Indicates if the player will allow the video to be skipped. | `1` | `integer` |
+| `skipmin` | optional | Videos of total duration greater than this number of seconds can be skippable. | `15` | `integer` |
+| `skipafter` | optional | Number of seconds a video must play before skipping is enabled. | `5` | `integer` |
-### banner params
+#### banner params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
+| Name | Scope | Description | Example | Type |
|------------|----------|-----------------------------------------|------------------------------------------|----------|
-| `appId` | optional | Beachfront Exchange ID for banner bids. | `'3b16770b-17af-4d22-daff-9606bdf2c9c3'` | `string` |
+| `appId` | optional | Beachfront Exchange ID for banner bids. | `'3b16770b-17af-4d22-daff-9606bdf2c9c3'` | `string` |
| `bidfloor` | optional | Bid floor for banner bids. | `0.01` | `float` |
-| `tagid` | optional | Tag ID | `'placement-name'` | `string` |
+| `tagid` | optional | Tag ID | `'placement-name'` | `string` |
-### player params
+#### player params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
+| Name | Scope | Description | Example | Type |
|------------|----------|-----------------------------------------|------------------------------------------|----------|
| `progressColor` | optional | The color of the progress bar formatted as a CSS value. | `'#50A8FA'` | `string` |
| `adPosterColor` | optional | The color of the ad poster formatted as a CSS value. | `'#FFFFFF'` | `string` |
| `expandInView` | optional | Defines whether to expand the player when the ad slot is in view. Defaults to `false`. | `false` | `boolean` |
| `collapseOnComplete` | optional | Defines whether to collapse the player when ad playback has completed. Defaults to `true`. | `true` | `boolean` |
+### First Party Data
+
+Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported:
+
+- ortb2.site.\*
+- ortb2.app.\*
+- ortb2.user.\*
+
+Example first party data that's available to all bidders and all adunits:
+
+```
+pbjs.setConfig({
+ ortb2: {
+ site: {
+ keywords: "kw1,kw2",
+ content: {
+ title: "title1",
+ series: "series1"
+ }
+ },
+ user: {
+ keywords: "a,b",
+ gender: "M",
+ yob: 1984
+ }
+ }
+});
+```
+
### Prebid Server
As seen in the JSON response from \{your PBS server\}\/bidder\/params [(example)](https://prebid.adnxs.com/pbs/v1/bidders/params), the beachfront
diff --git a/dev-docs/bidders/beop.md b/dev-docs/bidders/beop.md
new file mode 100644
index 0000000000..f1728716d5
--- /dev/null
+++ b/dev-docs/bidders/beop.md
@@ -0,0 +1,15 @@
+---
+layout: bidder
+title: BeOp
+description: BeOp Bidder Adaptor
+pbjs: true
+biddercode: beop
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------|---------|----------|
+| `accountId` or `networkId` | required | Your BeOp account ID | `'5a8af500c9e77c00017e4cad'` | `string` |
+| `currency` | optional | Your currency | `'EUR'` (default) or `'USD'` | `string` |
diff --git a/dev-docs/bidders/between.md b/dev-docs/bidders/between.md
index 59eac200bd..b37304b1b5 100644
--- a/dev-docs/bidders/between.md
+++ b/dev-docs/bidders/between.md
@@ -8,9 +8,10 @@ biddercode: between
schain_supported: true
gdpr_supported: true
pbs_app_supported: true
-userIds: sharedId
+userIds: all
gvl_id: 724
usp_supported: true
+safeframes_ok: false
---
### Prebid.js Bid Params
@@ -19,8 +20,6 @@ usp_supported: true
| Name | Scope | Description | Example | Type |
|---------------|----------|-------------|---------|----------|
| `s` | required | Section ID from Between SSP control panel | 999999 | `integer` |
-| `w` | required | width of placement(Number) | 240 |
-| `h` | required | height of placement(Number) | 400 |
### Prebid-Server Bid Params
diff --git a/dev-docs/bidders/biddo.md b/dev-docs/bidders/biddo.md
new file mode 100644
index 0000000000..bd6310f5a4
--- /dev/null
+++ b/dev-docs/bidders/biddo.md
@@ -0,0 +1,23 @@
+---
+layout: bidder
+title: Biddo
+description: Prebid Biddo Bidder Adapter
+pbjs: true
+biddercode: biddo
+safeframes_ok: false
+---
+
+### Note
+
+Here is what you need for Prebid integration with Biddo:
+1. Register with Biddo.
+2. Once registered and approved, you will receive a Zone ID.
+3. Use the Zone ID as parameters in params.
+
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|--------------|------------------------------------------------|----------|
+| `zoneId` | required | Zone ID | `379783` | `number` |
diff --git a/dev-docs/bidders/bidfluence.md b/dev-docs/bidders/bidfluence.md
index 5f4a4e1de7..4b90d41086 100644
--- a/dev-docs/bidders/bidfluence.md
+++ b/dev-docs/bidders/bidfluence.md
@@ -5,7 +5,8 @@ description: Bidfluence Adaptor for Prebidjs
pbjs: true
biddercode: bidfluence
gdpr_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/bidlab.md b/dev-docs/bidders/bidlab.md
index 3607f72f38..0dbc539640 100644
--- a/dev-docs/bidders/bidlab.md
+++ b/dev-docs/bidders/bidlab.md
@@ -6,7 +6,8 @@ pbjs: true
biddercode: bidlab
gdpr_supported: true
media_types: banner, video
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Note:
diff --git a/dev-docs/bidders/bidmachine.md b/dev-docs/bidders/bidmachine.md
index c314667874..82f1dd997e 100644
--- a/dev-docs/bidders/bidmachine.md
+++ b/dev-docs/bidders/bidmachine.md
@@ -11,7 +11,7 @@ schain_supported: true
dchain_supported: false
media_types: banner, video
safeframes_ok: true
-bidder_supports_deals: false
+deals_supported: false
pbjs: false
pbs: true
pbs_app_supported: true
diff --git a/dev-docs/bidders/bidmyadz.md b/dev-docs/bidders/bidmyadz.md
new file mode 100644
index 0000000000..52d3c1f66c
--- /dev/null
+++ b/dev-docs/bidders/bidmyadz.md
@@ -0,0 +1,22 @@
+---
+layout: bidder
+title: BidMyAdz
+description: Prebid Bidmyadz Bidder Adapter
+biddercode: bidmyadz
+usp_supported: true
+schain_supported: true
+media_types: banner, video, native
+gdpr_supported: true
+pbjs: false
+pbs: true
+pbs_app_supported: true
+pbjs_version_notes: not in 5.x
+---
+
+### Prebid Server Bid Params
+Currently adapter doesn't support multiimpression, so only the first impression will be delivered
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------------|----------|----------------------------------------------------------|------------|-----------|
+| `placementId` | required | Placement Id will be generated on BidMyAdz Platform. | `'1234'` | `string` |
diff --git a/dev-docs/bidders/bidphysics.md b/dev-docs/bidders/bidphysics.md
index 1e322a3afe..d9dae7f143 100644
--- a/dev-docs/bidders/bidphysics.md
+++ b/dev-docs/bidders/bidphysics.md
@@ -5,7 +5,8 @@ description: Prebid BidPhysics Bidder Adaptor
pbjs: true
biddercode: bidphysics
gdpr_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Note:
diff --git a/dev-docs/bidders/big-richmedia.md b/dev-docs/bidders/big-richmedia.md
new file mode 100644
index 0000000000..8c2d6917df
--- /dev/null
+++ b/dev-docs/bidders/big-richmedia.md
@@ -0,0 +1,55 @@
+---
+layout: bidder
+title: BigRichMedia
+description: Prebid Big Richmedia Bidder Adapter
+biddercode: big-richmedia
+pbjs: true
+media_types: banner, video
+userIds: criteo, unifiedId, netId, identityLink, flocId, uid2
+schain_supported: true
+coppa_supported: true
+usp_supported: true
+floors_supported: true
+fpd_supported: true
+gdpr_supported: true
+gvl_id: 32
+---
+
+#### Global Settings
+
+Set the publisherId for using bigRichemedia
+
+```
+pbjs.que.push(function() {
+ // use the bid server in Taiwan (country code: tw)
+ pbjs.setConfig({
+ bigRichmedia: {
+ 'publisherId': 'A7FN99NZ98F5ZD4G'
+ }
+ });
+});
+```
+
+#### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-----------|----------|---------------------------|------------|----------|
+| `placementId` | required | The placement ID. You may identify a placement using the `invCode` and `member` instead of a placement ID. | `234234` | `integer` |
+| `member` | optional | The member ID from AppNexus. Must be used with `invCode`. | `'12345'` | `string` |
+| `invCode` | optional | The inventory code from AppNexus. Must be used with `member`. | `'abc123'` | `string` |
+| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. | `keywords: { genre: ['rock', 'pop'] }` | `object` |
+
+#### Video Object
+
+Those configuration parameters are read from mediaTypes.video
+
+{: .table .table-bordered .table-striped }
+| Name | Description | Type |
+|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` |
+| `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` |
+|`context` | A string that indicates the type of video ad requested. Allowed values: `"pre_roll"`; `"mid_roll"`; `"post_roll"`; `"outstream"`. | `string` |
+| `skippable` | Boolean which, if `true`, means the user can click a button to skip the video ad. Defaults to `false`. | `boolean` |
+|`skipoffset`| Integer that defines the number of seconds until an ad can be skipped. Assumes `skippable` setting was set to `true`. | `integer` |
+| `frameworks` | Array of integers listing API frameworks supported by the publisher. Allowed values: None: `0`; VPAID 1.0: `1`; VPAID 2.0: `2`; MRAID 1.0: `3`; MRAID 2.0: `4`; ORMMA: `5`; OMID 1.0 `6`. | `Array` |
diff --git a/dev-docs/bidders/bizzclick.md b/dev-docs/bidders/bizzclick.md
index dee853df60..694d56e3b0 100644
--- a/dev-docs/bidders/bizzclick.md
+++ b/dev-docs/bidders/bizzclick.md
@@ -9,14 +9,14 @@ coppa_supported: true
schain_supported: true
media_types: banner, video, native
safeframes_ok: true
-bidder_supports_deals: true
+deals_supported: true
pbjs: true
-pbjs_version_notes: not in 5.x
+pbs: true
---
### Note:
-The Example Bidding adapter requires setup before beginning. Please contact us at support@bizzclick.com
+The Example Bidding adapter requires setup before beginning. Please contact us at support@bizzclick.com .BizzClick will only respond to the first impression and that multiple ad formats of that single impression are not supported.
### Bid Params
diff --git a/dev-docs/bidders/bliink.md b/dev-docs/bidders/bliink.md
new file mode 100644
index 0000000000..7c1a86f932
--- /dev/null
+++ b/dev-docs/bidders/bliink.md
@@ -0,0 +1,22 @@
+---
+layout: bidder
+title: BLIINK
+description: Prebid BLIINK Bidder Adaptor
+pbjs: true
+pbs: true
+media_types: video, banner
+biddercode: bliink
+gdpr_supported: true
+usp_supported: false
+---
+
+### Note:
+The BLIINK Header Bidding adaptor requires setup and approval from the BLIINK team. Please reach out to your account manager for more informations.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------|----------------------------------|--------------------------------------|----------|
+| `tagId` | required | The TagID from BLIINK. | `'32'` | `string` |
+| `imageUrl` | optional | The image url on which the ad is displayed in case of in-image ad. | `'https://image.png'` | `string` |
diff --git a/dev-docs/bidders/bmtm.md b/dev-docs/bidders/bmtm.md
index 8c7f67c8d1..3d99a82779 100644
--- a/dev-docs/bidders/bmtm.md
+++ b/dev-docs/bidders/bmtm.md
@@ -4,10 +4,11 @@ title: Bright Mountain Media
description: Prebid Bright Mountain Media Bidder Adapter
biddercode: bmtm
media_types: banner, video
-getFloor: true
+floors_supported: true
schain_supported: true
pbjs: true
pbs: true
+userIds: id5Id, sharedId
---
### Bid Params
diff --git a/dev-docs/bidders/boldwin.md b/dev-docs/bidders/boldwin.md
index 10e7ed89d5..084e923814 100644
--- a/dev-docs/bidders/boldwin.md
+++ b/dev-docs/bidders/boldwin.md
@@ -5,8 +5,7 @@ description: Prebid Boldwin Bidder Adapter
pbjs: true
biddercode: boldwin
gdpr_supported: true
-media_types: banner, video
-pbjs_version_notes: not in 5.x
+media_types: banner, video, native
---
### Note:
@@ -18,4 +17,4 @@ The Boldwin Bidding adapter requires setup before beginning. Please contact us a
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|---------------|----------|-----------------------|-----------|-----------|
-| `placementId` | required | Adprime placement id | `'1234asdf'` | `'string'` |
+| `placementId` | required | Boldwin placement id | `'1234asdf'` | `'string'` |
diff --git a/dev-docs/bidders/brave.md b/dev-docs/bidders/brave.md
new file mode 100644
index 0000000000..e26f0f7249
--- /dev/null
+++ b/dev-docs/bidders/brave.md
@@ -0,0 +1,26 @@
+---
+layout: bidder
+title: Brave
+description: Prebid Brave Bidder Adapter
+biddercode: brave
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+schain_supported: true
+media_types: banner, video, native
+safeframes_ok: true
+deals_supported: true
+pbjs: true
+pbs: false
+---
+
+### Note:
+
+The Brave Header Bidding adapter requires setup and approval from the Brave team. Please reach out to your account manager or support@thebrave.io for more information
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------------------------|-------------------------------------|-----------|
+| `placementId` | required | Brave's platform placement id | `'to0QI2aPgkbBZq6vgf0oHitouZduz0qw'` | `string` |
diff --git a/dev-docs/bidders/bucksense.md b/dev-docs/bidders/bucksense.md
index e276f7724b..b3fc9dc686 100644
--- a/dev-docs/bidders/bucksense.md
+++ b/dev-docs/bidders/bucksense.md
@@ -4,6 +4,7 @@ title: Bucksense
description: Prebid Bucksense Bidder Adapter
pbjs: true
biddercode: bucksense
+gdpr_supported: true
---
### Bid params
diff --git a/dev-docs/bidders/byplay.md b/dev-docs/bidders/byplay.md
index 3247ebd3b8..0cd4a92035 100644
--- a/dev-docs/bidders/byplay.md
+++ b/dev-docs/bidders/byplay.md
@@ -5,7 +5,8 @@ description: Prebid ByPlay Bidder Adaptor
pbjs: true
biddercode: byplay
media_types: video
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/c1x.md b/dev-docs/bidders/c1x.md
index c24b70318b..af3a99716e 100644
--- a/dev-docs/bidders/c1x.md
+++ b/dev-docs/bidders/c1x.md
@@ -5,7 +5,8 @@ description: Prebid C1X Bidder Adaptor
pbjs: true
biddercode: c1x
gdpr_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Note:
diff --git a/dev-docs/bidders/catapultx.md b/dev-docs/bidders/catapultx.md
new file mode 100644
index 0000000000..abb551bf81
--- /dev/null
+++ b/dev-docs/bidders/catapultx.md
@@ -0,0 +1,23 @@
+---
+layout: bidder
+title: CatapultX
+description: CatapultX Bidder Adaptor
+pbjs: true
+pbs: true
+biddercode: catapultx
+aliasCode : adkernel
+media_types: banner, video
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+pbs_app_supported: true
+schain_supported: true
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------------------|---------------------------|----------|
+| `host` | required | RTB host | `'cpm.catapultx.com'` | `string` |
+| `zoneId` | required | Zone Id | 76156 | `integer`|
diff --git a/dev-docs/bidders/cedato.md b/dev-docs/bidders/cedato.md
index fe25e346a0..2aa6857b46 100644
--- a/dev-docs/bidders/cedato.md
+++ b/dev-docs/bidders/cedato.md
@@ -9,7 +9,8 @@ usp_supported: true
nav_section: reference
pbjs: true
biddercode: cedato
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid params
diff --git a/dev-docs/bidders/clickforce.md b/dev-docs/bidders/clickforce.md
index a617304ee7..2b961b28b7 100644
--- a/dev-docs/bidders/clickforce.md
+++ b/dev-docs/bidders/clickforce.md
@@ -5,7 +5,6 @@ description: Prebid Clickforce Bidder Adaptor
pbjs: true
biddercode: clickforce
media_types: native
-pbjs_version_notes: not in 5.x
---
### Bid Params (display ad)
diff --git a/dev-docs/bidders/clicktripz.md b/dev-docs/bidders/clicktripz.md
index dabc6ef6d0..a7a175df80 100644
--- a/dev-docs/bidders/clicktripz.md
+++ b/dev-docs/bidders/clicktripz.md
@@ -5,7 +5,8 @@ description: Prebid Clicktripz Bidder Adaptor
pbjs: true
biddercode: clicktripz
media_types: banner
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/codefuel.md b/dev-docs/bidders/codefuel.md
new file mode 100644
index 0000000000..f2b9b20833
--- /dev/null
+++ b/dev-docs/bidders/codefuel.md
@@ -0,0 +1,35 @@
+---
+layout: bidder
+title: CodeFuel
+description: CodeFuel Prebid Bidder Adapter
+pbjs: true
+pbs: true
+media_types: banner
+biddercode: CodeFuel
+gdpr_supported: false
+usp_supported: false
+floors_supported: false
+---
+
+### Description
+
+Module that connects to Codefuel bidder to fetch bids.
+Display format is supported but not native format. Using OpenRTB standard.
+
+### Bid Params
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------------------------------|------------------------------------------|----------|
+| `placementId` | required | Placement-Id defined by the caller | `'0111f8ac-2d40-4613-8557-b47dbf622fff'` | `string` |
+
+
+### Configuration
+
+
+```javascript
+ pbjs.setConfig({
+ codefuel: {
+ bidderUrl: 'https://prebidtest.zemanta.com/api/bidder/prebidtest/bid/'
+ }
+});
+```
diff --git a/dev-docs/bidders/coinzilla.md b/dev-docs/bidders/coinzilla.md
index 45bd80bc4c..7e77dee719 100644
--- a/dev-docs/bidders/coinzilla.md
+++ b/dev-docs/bidders/coinzilla.md
@@ -3,6 +3,7 @@ layout: bidder
title: Coinzilla
description: Prebid Coinzilla Bidder Adaptor
pbjs: true
+pbs: true
biddercode: coinzilla
---
diff --git a/dev-docs/bidders/collectcent.md b/dev-docs/bidders/collectcent.md
index d48aefb665..78e42374aa 100644
--- a/dev-docs/bidders/collectcent.md
+++ b/dev-docs/bidders/collectcent.md
@@ -4,6 +4,7 @@ title: Collectcent
description: Prebid Collectcent Bidder Adaptor
pbjs: true
biddercode: collectcent
+enable_download: false
pbjs_version_notes: not in 5.x
---
diff --git a/dev-docs/bidders/colombia.md b/dev-docs/bidders/colombia.md
index 8500c375ee..10ea4fe7ea 100644
--- a/dev-docs/bidders/colombia.md
+++ b/dev-docs/bidders/colombia.md
@@ -4,7 +4,8 @@ title: COLOMBIA
description: Prebid COLOMBIA Bidder Adaptor
pbjs: true
biddercode: colombia
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/colossus.md b/dev-docs/bidders/colossus.md
index a01899d0af..968bf90204 100644
--- a/dev-docs/bidders/colossus.md
+++ b/dev-docs/bidders/colossus.md
@@ -6,18 +6,25 @@ biddercode: colossus
usp_supported: true
schain_supported: true
media_types: banner, video, native
-userIds: britepoolid, identityLink, unifiedId, id5Id
+userIds: britepoolid, identityLink, unifiedId, id5Id, uid2
gdpr: true
pbjs: false
pbs: true
pbs_app_supported: true
---
+### Disclosure:
+
+This adapter is known to use an HTTP 1 endpoint. Header bidding often generates multiple requests to the same host and bidders are encouraged to change to HTTP 2 or above to help improve publisher page performance via multiplexing.
+
### Prebid.Server Bid Params
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|----------------|----------|----------------------------------------------------------|------------|-----------|
-| `TagID` | required | Placement Id will be generated on Colossus SSP Platform. | `'0'` | `string` |
+| `TagID` | optional | Placement Id will be generated on Colossus SSP Platform. | `'0'` | `string` |
+| `groupId` | optional | Group Id will be generated on Colossus SSP Platform. | `'0'` | `string` |
+
+You only need to use one parameter: either TagID or groupId
*For prebidJS parametres, look into colossusssp.md*
diff --git a/dev-docs/bidders/colossusssp.md b/dev-docs/bidders/colossusssp.md
index a571a4f42b..cb188c5d68 100644
--- a/dev-docs/bidders/colossusssp.md
+++ b/dev-docs/bidders/colossusssp.md
@@ -6,11 +6,10 @@ biddercode: colossusssp
usp_supported: true
schain_supported: true
media_types: banner, video, native
-userIds: britepoolid, identityLink, unifiedId, id5Id
+userIds: britepoolid, identityLink, unifiedId, id5Id, uid2
gdpr: true
pbjs: true
pbs: false
-pbjs_version_notes: not in 5.x
---
### Prebid.JS Bid Params
@@ -18,7 +17,8 @@ pbjs_version_notes: not in 5.x
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|----------------|----------|----------------------------------------------------------|------------|-----------|
-| `placement_id` | required | Placement Id will be generated on Colossus SSP Platform. | `0` | `integer` |
+| `placement_id` | optional | Placement Id will be generated on Colossus SSP Platform. Use instead of group_id | `0` | `integer` |
+| `group_id` | optional | Group Id will be generated on Colossus SSP Platform. Use instead of placement_id | `0` | `integer` |
| `traffic` | optional | Type traffic | `'banner'` | `string` |
*For colossus prebid server parametres, look into colossus.md*
diff --git a/dev-docs/bidders/compass.md b/dev-docs/bidders/compass.md
new file mode 100644
index 0000000000..ac2506bc9a
--- /dev/null
+++ b/dev-docs/bidders/compass.md
@@ -0,0 +1,28 @@
+---
+layout: bidder
+title: Compass
+description: Prebid Compass Bidder Adapter
+biddercode: compass
+usp_supported: true
+gdpr_supported: true
+coppa_supported: true
+schain_supported: true
+floors_supported: true
+media_types: banner, video, native
+pbjs: true
+pbs: true
+pbs_app_supported: true
+gvl_id: 883
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `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/connectad.md b/dev-docs/bidders/connectad.md
index 2a8c0e1558..b5f67acab3 100644
--- a/dev-docs/bidders/connectad.md
+++ b/dev-docs/bidders/connectad.md
@@ -11,7 +11,7 @@ schain_supported: true
userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId
prebid_member: true
safeframes_ok: true
-getFloor: true
+floors_supported: true
pbjs: true
pbs: true
gvl_id: 138
diff --git a/dev-docs/bidders/consumable.md b/dev-docs/bidders/consumable.md
index 9f56640166..b0a30a0018 100644
--- a/dev-docs/bidders/consumable.md
+++ b/dev-docs/bidders/consumable.md
@@ -2,11 +2,15 @@
layout: bidder
title: Consumable
description: Prebid Consumable Bidder Adaptor
+userIds: all
+usp_supported: true
pbjs: true
pbs: true
pbs_app_supported: true
biddercode: consumable
gdpr_supported: true
+schain_supported: true
+coppa_supported: true
gvl_id: 591
---
diff --git a/dev-docs/bidders/contentexchange.md b/dev-docs/bidders/contentexchange.md
new file mode 100644
index 0000000000..364ee93d6f
--- /dev/null
+++ b/dev-docs/bidders/contentexchange.md
@@ -0,0 +1,21 @@
+---
+layout: bidder
+title: ContentExchange
+description: Prebid Contentexchange Bidder Adapter
+biddercode: contentexchange
+usp_supported: true
+schain_supported: true
+media_types: banner, video, native
+gdpr_supported: true
+pbjs: true
+pbs: false
+pbs_app_supported: false
+---
+
+### Prebid.JS Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------------|----------|----------------------------------------------------------|------------|-----------|
+| `placementId` | required | Placement Id will be generated on ContentExchange Platform. | `'1234'` | `string` |
+| `adFormat` | required | `[banner, video, native]` | `'banner'` | `string` |
diff --git a/dev-docs/bidders/converge.md b/dev-docs/bidders/converge.md
index e2720237b0..d4a010aad0 100644
--- a/dev-docs/bidders/converge.md
+++ b/dev-docs/bidders/converge.md
@@ -1,21 +1,29 @@
---
layout: bidder
-title: Converge
-description: Prebid Converge Bidder Adaptor
+title: Converge-Digital
+description: Converge-Digital Bidder Adaptor
pbjs: true
+pbs: true
biddercode: converge
-media_types: banner, video
+aliasCode : adkernel
+media_types: banner, native, video
gdpr_supported: true
usp_supported: true
-pbjs_version_notes: not in 5.x
+coppa_supported: true
+pbs_app_supported: true
+gvl_id: 248
+schain_supported: true
+userIds: all
---
+### Note:
+
+The Converge-Digital 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 |
-|-------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------|
-| `uid` | required | Represents the Converge bidder system Ad Slot ID associated with the respective div id from the site page. | `59` | `integer` |
-| `priceType` | optional | Can take the values `gross` or `net`, default value is `net`. Net represents the header bid price with the Converge header bidder margin already extracted. Gross price does contain the Converge bidder margin within. | `'gross'` | `string` |
-| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Values can be empty. | `keywords: { topic: ['stress', 'fear'] }` | `object` |
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------------------|---------------------------|----------|
+| `host` | required | ConvergeDigital RTB host | `'cpm.convergeselect.net'` | `string` |
+| `zoneId` | required | Zone Id | `30164` | `integer` |
diff --git a/dev-docs/bidders/conversant.md b/dev-docs/bidders/conversant.md
index 6991323c74..4298219be0 100644
--- a/dev-docs/bidders/conversant.md
+++ b/dev-docs/bidders/conversant.md
@@ -7,8 +7,9 @@ pbs: true
biddercode: conversant
media_types: video
gdpr_supported: true
-userIds: criteo, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId
+userIds: criteo, id5Id, identityLink, liveIntentId, parrableId, pubCommonId, unifiedId, publinkId
prebid_member: true
+schain_supported: true
gvl_id: 24
---
@@ -20,7 +21,7 @@ gvl_id: 24
| Name | Scope | Description | Example | Type |
|---------------|-----------------------------|---------------------------------------------------------------------------------------------------------------------------|-------------------|------------------|
-| `site_id` | required | The site ID from Conversant. | `'87293'` | `string` |
+| `site_id` | optional | The site ID from Conversant. | `'87293'` | `string` |
| `secure` | required (for secure pages) | If impression requires secure HTTPS URL creative assets and markup. 0 for non-secure, 1 for secure. Default is non-secure | `1` | `integer` |
| `bidfloor` | optional | Bid floor | `0.50` | `float` |
| `tag_id` | optional | Identifies specific ad placement. | `'cnvr-test-tag'` | `string` |
@@ -74,3 +75,57 @@ The following values are defined in the [ORTB 2.5 spec](https://www.iab.com/wp-c
+ `8` : VAST 4.0 Wrapper
+ `9` : DAAST 1.0
+ `10` : DAAST 1.0 Wrapper
+
+### First Party Data
+Publishers should use the `ortb2` method of setting for setting First Party Data.
+Example first party data configuration that is available to all adUnits
+```
+pbjs.setConfig({
+ debug: true,
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ },
+ ortb2: {
+ site: {
+ content: {
+ series: 'MySeries',
+ season: 'My Season',
+ episode: 3,
+ title: 'My Title'
+ }
+ }
+ }
+});
+```
+
+Example AdUnit specific data using the `ortb2Imp` object
+```
+ var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [[640, 480]]
+ }
+ },
+ ortb2Imp: {
+ instl: 1,
+ ext: {
+ data: {
+ adUnitSpecificAttribute: "123"
+ }
+ }
+ },
+ bids: [{
+ bidder: 'conversant',
+ params: {
+ site_id: '108060',
+ mimes: ['video/mp4', 'video/webm']
+ }
+ }]
+ }
+
+ pbjs.que.push(function(){
+ pbjs.addAdUnits(videoAdUnits);
+ }
+```
+
diff --git a/dev-docs/bidders/cosmos.md b/dev-docs/bidders/cosmos.md
index d8d35a9b42..deb8130dbe 100644
--- a/dev-docs/bidders/cosmos.md
+++ b/dev-docs/bidders/cosmos.md
@@ -4,7 +4,8 @@ title: COSMOS
description: Prebid COSMOS Bidder Adapter
pbjs: true
biddercode: cosmos
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Integration Note:
diff --git a/dev-docs/bidders/cpmstar.md b/dev-docs/bidders/cpmstar.md
index f01b0b56f7..3b97562e91 100644
--- a/dev-docs/bidders/cpmstar.md
+++ b/dev-docs/bidders/cpmstar.md
@@ -9,7 +9,6 @@ media_types: banner, video
gdpr_supported: true
usp_supported: true
coppa_supported: true
-pbjs_version_notes: not in 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md
index fe5d109427..1e9954ed64 100644
--- a/dev-docs/bidders/criteo.md
+++ b/dev-docs/bidders/criteo.md
@@ -10,17 +10,18 @@ gdpr_supported: true
usp_supported: true
userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, pubProvidedId, sharedId, unifiedId
prebid_member: true
-getFloor: false*
+floors_supported: false
+fpd_supported: true
+schain_supported: true
gvl_id: 91
---
### Notes
-{: .alert.alert-warning :}
-For Native Ads, in order to avoid further decoding issues of special characters, the assets need to be sent as placeholders.
-That means, `sendId: true` becomes mandatory for all fields receiving URLs, notably: `icon`, `image`, `clickUrl`, `privacyLink`, `privacyIcon`.
-*Criteo currently only supports getFloor if floors are in Euros and if the publisher is enabling the Criteo Publisher Tag external js call.
+{: .alert.alert-warning :}
+This bidder adapter automatically includes the Criteo User ID module and performs iFrame syncs.
-See [Sending Asset Placeholders]({{site.baseurl}}/dev-docs/show-native-ads.html#sending-asset-placeholders).
+{: .alert.alert-warning :}
+Criteo currently only supports getFloor if floors are in USD and if the publisher is enabling the Criteo Publisher Tag external js call. The collected floors will only be used for logging purposes and won't bid taken into account when bidding.
{: .alert.alert-warning :}
Prebid-Server support is on alpha test and is currently a non-finished product. Activation requires setup and approval before beginning. Please reach out to your account manager or publishers@criteo.com for more details.
@@ -39,6 +40,11 @@ of this value. See [Issue 6381](https://github.com/prebid/Prebid.js/issues/6381)
| `networkId` | required | The network ID from Criteo. Please reach out your Criteo representative for more details. | `456456` | `integer` |
| `nativeCallback` | optional | (Prebid.js only) Callback to perform render in native integrations. Please reach out your Criteo representative for more details. | `function(payload) { console.log(payload); }` | `function` |
| `integrationMode` | optional | (Prebid.js only) Integration mode to use for ad render (none or 'AMP'). Please reach out your Criteo representative for more details. | `'AMP'` | `string` |
+| `publisherSubId` | optional | Custom identifier for reporting. Please reach out your Criteo representative for more details. | `'adunit-1'` | `string` |
+
+### First Party Data
+
+Criteo supports both `ortb2` (`site` and `user`) and `ortb2Imp` methods to set [First Party Data](https://docs.prebid.org/features/firstPartyData.html).
### Video Object
@@ -47,7 +53,7 @@ of this value. See [Issue 6381](https://github.com/prebid/Prebid.js/issues/6381)
|-------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------|
| `minduration` | optional | Minimum ad duration in seconds | `5` | `integer` |
| `startdelay` | optional | Duration offset (in second) from the start of the content for showing the video ad before the start of the Video. Pre-roll: `0` (default); Mid-roll: `>0`; Default mid-roll: `-1`; Post-roll: `-2`; | `5` | `integer` |
-| `playbackmethod` | required | Defines how is initiated the video inventory. Page Load with Sound On: `1`; Page Load with Sound Off: `2`; Click with Sound On: `3`; Mouse-Over with Sound On: `4`; Entering Viewport with Sound On: `5`; Entering Viewport with Sound Off by Default: `6`; | `1` | `integer` |
+| `playbackmethod` | required | Defines how the video inventory is initiated. Page Load with Sound On: `1`; Page Load with Sound Off: `2`; Click with Sound On: `3`; Mouse-Over with Sound On: `4`; Entering Viewport with Sound On: `5`; Entering Viewport with Sound Off by Default: `6`; | `[4, 5]` | `Array` |
| `placement` | required | Video placement type. In-Stream: `1`; In-Banner: `2`; In-Article: `3`: In-Feed: `4`; Interstitial: `5`; | `1` | `integer` |
| `skip` | required | Ability from the video player for the user to skip the video. Not skippable: `0`; Skippable: `1`; | `1` | `integer` |
@@ -78,7 +84,7 @@ var adUnits = [
playerSize: [640,480],
protocols: [2, 3],
skip: 0,
- playbackmethod: 1,
+ playbackmethod: [1],
placement: 1
}
},
@@ -90,3 +96,9 @@ var adUnits = [
}]
}];
```
+
+### Additional Config (Optional)
+
+Criteo Bid Adapter supports the collection of the user's hashed email, if available.
+
+Please consider passing it to the adapter, following [these guidelines](https://publisherdocs.criteotilt.com/prebid/#hashed-emails).
\ No newline at end of file
diff --git a/dev-docs/bidders/cwire.md b/dev-docs/bidders/cwire.md
new file mode 100644
index 0000000000..8c45b82d18
--- /dev/null
+++ b/dev-docs/bidders/cwire.md
@@ -0,0 +1,24 @@
+---
+layout: bidder
+title: C-WIRE
+description: C-WIRE Prebid Bidder Adapter
+pbjs: true
+biddercode: cwire
+gdpr_supported: false
+usp_supported: false
+schain_supported: false
+userIds: flocId, uid2Id
+enable_download: true
+media_types: banner, video
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-----------------------|-----------|-----------|
+| `pageId` | required | C-WIRE page id | `2453` | `integer` |
+| `placementId` | required | C-WIRE placement id | `113244` | `integer` |
+| `cwcreative` | required | C-WIRE creative id to force | `42` | `integer` |
+| `refgroups` | required | C-WIRE group name to force | `'test-user'` | `string` |
+| `cwapikey` | required | C-WIRE API key for integration testing | `'xxx-yyy-some-uuid'` | `string` |
diff --git a/dev-docs/bidders/dailyhunt.md b/dev-docs/bidders/dailyhunt.md
index cbb7440034..8054d482d2 100644
--- a/dev-docs/bidders/dailyhunt.md
+++ b/dev-docs/bidders/dailyhunt.md
@@ -6,7 +6,8 @@ pbjs: true
biddercode: dailyhunt
media_types: display, native, video
gdpr_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/decenterads.md b/dev-docs/bidders/decenterads.md
index 1e496566f2..206d453ca3 100644
--- a/dev-docs/bidders/decenterads.md
+++ b/dev-docs/bidders/decenterads.md
@@ -8,7 +8,8 @@ biddercode: decenterads
media_types: banner, video, native
gdpr_supported: true
pbs_app_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Note:
diff --git a/dev-docs/bidders/deepintent.md b/dev-docs/bidders/deepintent.md
index 4c7ce15dcf..762de6591f 100644
--- a/dev-docs/bidders/deepintent.md
+++ b/dev-docs/bidders/deepintent.md
@@ -5,7 +5,7 @@ description: Prebid Deepintent Bidder Adaptor
pbjs: true
pbs: true
biddercode: deepintent
-media_types: banner
+media_types: banner, video
gdpr_supported: true
usp_supported: true
gvl_id: 541
@@ -75,4 +75,58 @@ var adUnits = [
}
];
```
+### video parameters
+Deepintent supports video as of Prebid v1.16.0
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example |
+| :----------------------| :------- | :---------------------------------------------------------- | :------ |
+| `video.mimes` | required | Video MIME types | `['video/mp4','video/x-flv']` |
+| `video.skippable` | optional | If 'true', user can skip ad | `true` |
+| `video.minduration` | optional | Minimum ad duration in seconds | `5` |
+| `video.maxduration` | optional | Maximum ad duration in seconds | `30` |
+| `video.startdelay` | optional | Start delay in seconds for pre-roll, mid-roll, or post-roll ad placements | `5` |
+| `video.playbackmethod` | optional | Defines whether inventory is user-initiated or autoplay sound on/off Values: `1`: Auto-play, sound on `2`: Auto-play, sound off `3`: Click-to-play `4`: mouse-over | `1` |
+| `video.api` | optional | API frameworks supported Values: `1`: VPAID 1.0 `2`: VPAID 2.0 `3`: MRAID-1 `4`: ORMMA `5`: MRAID-2 | `[1, 2]` |
+| `video.protocols` | optional | Supported video bid response protocols Values `1`: VAST 1.0 `2`: VAST 2.0 `3`: VAST 3.0 `4`: VAST 1.0 Wrapper `5`: VAST 2.0 Wrapper `6`: VAST 3.0 Wrapper | `[5, 6]` |
+| `video.battr` | optional | Blocked creative attributes, See [OpenRTB 2.5 specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf), List 5.3 for values | `[3, 9]` |
+| `video.linearity` | optional | Indicates if the impression is linear or nonlinear Values: `1`: Linear/In-Stream `2`: Non-Linear/Overlay. | `1` |
+| `video.placement` | optional | Video placement type. See [OpenRTB 2.5 specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf), List 5.9 for Values | `1` |
+| `video.minbitrate` | optional | Minumim bit rate in Kbps. | 50 |
+| `video.maxbitrate` | optional | Maximum bit rate in Kbps. | 70 |
+
+### AdUnit Format for Video
+```javascript
+var videoAdUnits = [
+{
+ code: 'test-div-video',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'deepintent',
+ params: {
+ publisherId: '32572', // required
+ adSlot: '38519891@300x250' // required
+ video: {
+ mimes: ['video/mp4','video/x-flv'], // required
+ skip: 1, // optional
+ minduration: 5, // optional
+ maxduration: 30, // optional
+ startdelay: 5, // optional
+ playbackmethod: [1,3], // optional
+ api: [ 1, 2 ], // optional
+ protocols: [ 2, 3 ], // optional
+ battr: [ 13, 14 ], // optional
+ linearity: 1, // optional
+ placement: 2, // optional
+ minbitrate: 10, // optional
+ maxbitrate: 10 // optional
+ }
+ }
+ }]
+}]
+```
diff --git a/dev-docs/bidders/deltaprojects.md b/dev-docs/bidders/deltaprojects.md
new file mode 100644
index 0000000000..cafcc93ef8
--- /dev/null
+++ b/dev-docs/bidders/deltaprojects.md
@@ -0,0 +1,54 @@
+---
+layout: bidder
+title: Delta Projects
+description: Prebid Delta Projects Bidder Adapter
+biddercode: deltaprojects
+gdpr_supported: true
+gvl_id: 209
+media_types: banner
+safeframes_ok: false
+floors_supported: true
+pbjs: true
+---
+
+### Note
+Contact publishers@deltaprojects.com to get a publisher id and to agree on a currency. Delta Projects
+will always bid and log values in the agreed upon currency, utilizing the currency module if necessary and available.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------------|----------|--------------------------------------------------------------------------|-----------------|----------|
+| `publisherId` | required | Publisher ID from Delta Projects. Contact publishers@deltaprojects.com | `'4'` | `string` |
+| `currency` | optional | The bid currency agreed with Delta Projects. | `'SEK'` | `string` |
+| `siteId` | optional | Site ID from Delta Projects. | `'example.com'` | `string` |
+| `tagId` | optional | Identifier for specific ad placement or ad tag. | `'1234'` | `string` |
+| `test` | optional | Indicate test model. Don't set anything if it is not in test mode. | `'true'` | `string` |
+
+### Example
+#### Banner
+```
+var adUnits = [
+ {
+ code: 'adunit-code',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [
+ {
+ bidder: 'deltaprojects',
+ params: {
+ publisherId: '4', // publisherId from Delta Projects.
+ currency: 'SEK', // the currency agreed with Delta Projects.
+ siteId: 'example.com', // siteId from Delta Projects.
+ tagId: 'tagId123', // id for ad placement or ad tag.
+ test: 'true', // disable test mode by remove this parameter.
+ }
+ }
+ ]
+ }
+];
+```
diff --git a/dev-docs/denakop.md b/dev-docs/bidders/denakop.md
similarity index 90%
rename from dev-docs/denakop.md
rename to dev-docs/bidders/denakop.md
index 2d984f8474..0b390e05e4 100644
--- a/dev-docs/denakop.md
+++ b/dev-docs/bidders/denakop.md
@@ -1,6 +1,6 @@
---
layout: bidder
-title: denakop
+title: Denakop
description: Denakop Bidder Adaptor
pbjs: true
pbs: true
@@ -16,7 +16,7 @@ aliasCode : adkernel
### Note:
-The Denakop bidding adapter requires setup and approval before implementation. Please reach out to for more details.
+The Denakop bidding adapter requires setup and approval before implementation. Please reach out to for more details.
### Bid Params
diff --git a/dev-docs/bidders/dgads.md b/dev-docs/bidders/dgads.md
index 73bd6f02ca..4575da5bc6 100644
--- a/dev-docs/bidders/dgads.md
+++ b/dev-docs/bidders/dgads.md
@@ -5,7 +5,8 @@ description: Prebid dgads Bidder Adapter
pbjs: true
biddercode: dgads
media_types: native
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/dianomi.md b/dev-docs/bidders/dianomi.md
new file mode 100644
index 0000000000..66ef7ddf74
--- /dev/null
+++ b/dev-docs/bidders/dianomi.md
@@ -0,0 +1,95 @@
+---
+layout: bidder
+title: Dianomi
+description: Prebid Dianomi Bidder Adaptor
+biddercode: dianomi
+media_types: banner, native
+coppa_supported: false
+gdpr_supported: true
+usp_supported: true
+prebid_member: true
+pbjs: true
+pbs: false
+schain_supported: true
+userIds: all
+gvl_id: 885
+floors_supported: true
+fpd_supported: true
+multiformat_supported: will-bid-on-one
+---
+
+### Note
+- Supports `display` and `banner` formats.
+- Uses `OpenRTB` standard.
+
+### Registration
+
+The Dianomi Adapter requires setup before beginning. Please contact us at eng@dianomi.com.
+
+### Bid params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------------------------|----------------------|--------------------|-----------|
+| `smartadId` | required | Placement ID | `12345` | `integer` |
+| `endpoint` | optional | for testing only | `www-prebid.dianomi.com` | `string` |
+
+
+Note: smartadId is a pre agreed ID between the publisher and Dianomi.
+
+#### Native example
+
+```js
+var adUnits = [
+ code: 'your-native-container-id',
+ mediaTypes: {
+ native: {
+ image: {
+ required: false,
+ sizes: [100, 50]
+ },
+ title: {
+ required: false,
+ len: 140
+ },
+ sponsoredBy: {
+ required: false
+ },
+ clickUrl: {
+ required: false
+ },
+ body: {
+ required: false
+ },
+ icon: {
+ required: false,
+ sizes: [50, 50]
+ }
+ }
+ },
+ bids: [{
+ bidder: 'dianomi',
+ params: {
+ smartadId: 9607
+ }
+ }]
+];
+```
+
+#### Banner example
+```js
+var adUnits = [
+ code: 'your-banner-container-id',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [{
+ bidder: 'dianomi',
+ params: {
+ smartadId: 9607
+ }
+ }]
+];
+```
\ No newline at end of file
diff --git a/dev-docs/bidders/didnavideo.md b/dev-docs/bidders/didnavideo.md
new file mode 100644
index 0000000000..c73e778d06
--- /dev/null
+++ b/dev-docs/bidders/didnavideo.md
@@ -0,0 +1,45 @@
+---
+layout: bidder
+title: diDNA Video
+description: Prebid diDNA Video Bidder Adapter
+pbjs: true
+biddercode: didnavideo
+aliasCode: aniview
+media_types: banner, video
+gdpr_supported: true
+usp_supported: true
+schain_supported: true
+safeframes_ok: true
+---
+
+### Note:
+For more information about [diDNA](http://didna.io/).
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|------------------|----------|------------------|------------------------------|----------|
+| `AV_PUBLISHERID` | required | Publisher/Netid | `'55b88d4a181f465b3e8b4567'` | `string` |
+| `AV_CHANNELID` | required | Channel id | `'5a5f17a728a06102d14c2718'` | `string` |
+
+### Test Parameters
+```
+videoAdUnit = [
+{
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [[640, 480]],
+ context: 'outstream'
+ },
+ },
+ bids: [{
+ bidder: 'didnavideo',
+ params: {
+ AV_PUBLISHERID: '55b78633181f4603178b4568',
+ AV_CHANNELID: '5d19dfca4b6236688c0a2fc4'
+ }
+ }]
+}];
+```
diff --git a/dev-docs/bidders/displayio.md b/dev-docs/bidders/displayio.md
new file mode 100644
index 0000000000..d7bbe95424
--- /dev/null
+++ b/dev-docs/bidders/displayio.md
@@ -0,0 +1,37 @@
+---
+layout: bidder
+title: Displayio
+description: Prebid Displayio Bidder Adapter
+biddercode: displayio
+media_types: banner, video
+gdpr_supported: true
+usp_supported: true
+safeframes_ok: true
+pbjs: true
+pbs: false
+prebid_member: false
+gvl_id: none
+---
+
+### Note:
+
+Before configuring the display.io adapter you must reach out your account manager from display.io team (or send a request to contact@display.io) for approval and setup steps.
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+
+| Name | Scope | Type | Description | Example |
+|----------------| ----- | ---- |----------------------------------------|-------------------------------|
+| `siteId` | required | Number | SiteId and PlacementID are your inventory IDs on the display.io platform (please ask your Account Manager for your site and placement IDs). | 7753 |
+| `placementId` | required | Number | SiteId and PlacementID are your inventory IDs on the display.io platform (please ask your Account Manager for your site and placement IDs). | 5375 |
+| `adsSrvDomain` | required | String | | "appsrv.display.io" |
+| `cdnDomain` | required | String | | "cdn.display.io" |
+| `pageCategory` | optional | String | Comma-separated list of IAB content categories that describe the current page or view of the site, list of available values. | "pageCategory1, pageCategory2" |
+| `keywords` | optional | String | Comma-separated list of keywords describing the content. | "keyword1, keyword2, keyword3" |
+| `custom` | optional | Object | User-defined targeting key-value pairs. custom applies to a specific unit. | `{headerTextColor: "red", fixedHeaderSelector: '.site-header'}` |
+| `custom.headerText`| optional | String | Ad container header text. By default, text is "Scroll to continue with content". Limited to 50 characters. | "Our awesome advertisement"|
+| `custom.headerTextColor`| optional | String | Ad container header text color, "white" by default | "#2196f3"|
+| `custom.headerBackgroundColor`| optional | String | Ad container header background color, "black" by default | "#fff" |
+| `custom.adContainerBackgroundColor`| optional | String | Ad container body background color, "transparent" by default | "#000"|
+| `custom.fixedHeaderSelector`| optional | String | In case your webpage has a fixed header â the header Id attribute or header class attribute should be defined as a value for parameter fixedHeaderSelector. | ".site-header"|
diff --git a/dev-docs/bidders/districtm.md b/dev-docs/bidders/districtm.md
index aa75acb5f7..17e35d4242 100644
--- a/dev-docs/bidders/districtm.md
+++ b/dev-docs/bidders/districtm.md
@@ -10,6 +10,7 @@ aliasCode : appnexus
sidebarType: 1
isBidder: true
gvl_id: 144
+pbjs_version_notes: not supported in 7.0+
---
### Bid Params
diff --git a/dev-docs/bidders/districtmdmx.md b/dev-docs/bidders/districtmdmx.md
index 6af35635eb..7eb0b76894 100644
--- a/dev-docs/bidders/districtmdmx.md
+++ b/dev-docs/bidders/districtmdmx.md
@@ -6,10 +6,11 @@ pbjs: true
biddercode: districtmDMX
gdpr_supported: true
schain_supported: true
-getFloor: true
+floors_supported: true
usp_supported: true
coppa_supported: true
userIds: britepoolId, criteo, id5Id, identityLink, intentiq, liveIntentId, netId, parrableId, pubCommonId, unifiedId
+pbjs_version_notes: not supported in 7.0+
---
@@ -33,4 +34,3 @@ userIds: britepoolId, criteo, id5Id, identityLink, intentiq, liveIntentId, netId
| `floor` | optional | Bid floor price | `"1.00"` | `string` |
| `revShare` | optional | Publisher Revenue Share | `"0.85"` | `string` |
| `currency` | optional | Currency code | `"usd"` | `string` |
-
diff --git a/dev-docs/bidders/distroscale.md b/dev-docs/bidders/distroscale.md
new file mode 100644
index 0000000000..9ae2f745c9
--- /dev/null
+++ b/dev-docs/bidders/distroscale.md
@@ -0,0 +1,50 @@
+---
+layout: bidder
+title: DistroScale
+description: Prebid DistroScale Bidder Adaptor
+biddercode: distroscale
+media_types: banner
+pbjs: true
+pbs: false
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+schain_supported: true
+fpd_supported: true
+userIds: all
+floors_supported: true
+safeframes_ok: false
+prebid_member: true
+gvl_id: 754
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|--------------------|-----------------|----------|
+| `pubid` | required | Publisher ID | `'12345'` | `string` |
+| `zoneid` | optional | Zone ID | `'67890'` | `string` |
+
+
+### Prebid Test Request
+
+```
+var adUnits = [{
+ code: 'banner-1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ }
+ },
+ bids: [{
+ bidder: 'distroscale',
+ params: {
+ pubid: '12345' // required, must be a string
+ ,zoneid: '67890' // optional, must be a string
+ }
+ }]
+}];
+```
+
+These test parameters can be used to verify that the DistroScale adapter is working properly. This example includes a DistroScale test publisher ID, an optional zone ID and sizes that would match with the test creative.
diff --git a/dev-docs/bidders/djax.md b/dev-docs/bidders/djax.md
index 6c9c8200ed..477d34f1ec 100644
--- a/dev-docs/bidders/djax.md
+++ b/dev-docs/bidders/djax.md
@@ -4,7 +4,8 @@ title: DJAX
description: Prebid djax Bidder Adapter
pbjs: true
biddercode: djax
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/dmx.md b/dev-docs/bidders/dmx.md
index 7c34908359..9b6e2968d9 100644
--- a/dev-docs/bidders/dmx.md
+++ b/dev-docs/bidders/dmx.md
@@ -6,6 +6,7 @@ media_types: banner, video
biddercode: dmx
gvl_id: 144
gdpr_supported: true
+pbjs_version_notes: not supported in 7.0+
---
### Bid Params
diff --git a/dev-docs/bidders/doceree.md b/dev-docs/bidders/doceree.md
index 92075772c6..f40812868c 100644
--- a/dev-docs/bidders/doceree.md
+++ b/dev-docs/bidders/doceree.md
@@ -5,6 +5,8 @@ description: Prebid DivReach Bidder Adapter
pbjs: true
biddercode: doceree
media_types: banner
+tcf2_supported: true
+gdpr_supported: true
---
### Bid Params
@@ -14,3 +16,5 @@ media_types: banner
|-------------------|----------|----------------|---------------------------|----------|
| `placementId` | required | Placement Id | `'DOC_7jm9j5eqkl0xvc5w'` | `string` |
| `publisherUrl` | optional | Current url | `https://doceree.com` | `string` |
+| `gdpr` | optional | Flag to check if gdpr applies | `1` | `string` |
+| `gdprConsent` | optional | URL-safe base64-encoded Transparency & Consent string | `CPQfU1jPQfU1jG0AAAENAwCAAAAAAAAAAAAAAAAAAAAA.IGLtV_T9fb2vj-_Z99_tkeYwf95y3p-wzhheMs-8NyZeH_B4Wv2MyvBX4JiQKGRgksjLBAQdtHGlcTQgBwIlViTLMYk2MjzNKJrJEilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g` | `string` |
diff --git a/dev-docs/bidders/duration.md b/dev-docs/bidders/duration.md
new file mode 100644
index 0000000000..2c2e61cb9a
--- /dev/null
+++ b/dev-docs/bidders/duration.md
@@ -0,0 +1,86 @@
+---
+layout: bidder
+title: Duration Media
+description: Prebid Duration Media Bidder Adapter
+biddercode: duration
+aliasCode: nobid
+pbjs: true
+pbs: true
+media_types: banner, video
+gdpr_supported: true
+gvl_id: 816
+usp_supported: true
+schain_supported: true
+coppa_supported: true
+userId: criteo, unifiedId, id5Id
+safeframes_ok: true
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------|---------|----------|
+| `siteId` | required | siteId is provided by your Duration Media account manager(s) | | `integer` |
+| `placementId` | optional | placementId is provided by your Duration Media account manager(s). This parameter allows to report on a specific ad unit | | `integer` |
+| `video`| optional | Object containing video targeting parameters. Note that this parameter is not used in Prebid Server. See [Video Object](#duration-video-object) for details. | `video: { playback_method: ['auto_play_sound_off'] }` | `object`|
+
+
+### Note
+If you are using Google Ad Manager (GAM), it is highly recommended to make sure the âServe in Safeframeâ box in creative settings is unchecked.
+If you absolutely want to run Duration Media in a Saferame creative, please contact your Duration Media repsentative to coordinate this setup.
+
+
+# Test Parameters
+```
+ var adUnits = [
+ {
+ code: 'test-div1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]], // a display size
+ }
+ },
+ bids: [
+ {
+ bidder: "duration",
+ params: {
+ siteId: 2,
+ placementId: 3
+ }
+ }
+ ]
+ },{
+ code: 'test-div2',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 50]], // a mobile size
+ }
+ },
+ bids: [
+ {
+ bidder: "duration",
+ params: {
+ siteId: 2
+ }
+ }
+ ]
+ }
+ ];
+```
+
+
+
+#### Video Object
+
+{: .table .table-bordered .table-striped }
+| Name | Description | Type |
+|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| `skippable` | Boolean which, if `true`, means the user can click a button to skip the video ad. Defaults to `false`. | `boolean` |
+| `playback_method` | Array of strings listing playback methods supported by the publisher. Allowed values: `"auto_play_sound_on"`; `"auto_play_sound_off"`; `"click_to_play"`; `"mouseover"`; `"auto_play_sound_unknown"`; `"viewport_sound_on"`, `"viewport_sound_off"`. | `Array` |
+| `position` | Array of strings listing video player position supported by the publisher. Allowed values: `"na"`, `"atf"`, `"btf"`, `"head"`, `"foot"`, `"sidebar"`, `"full"`. | `Array` |
+| `mimes` | Array of strings listing the content MIME types supported, e.g., `["video/x-flv", "video/x-ms-wmv"]`. | `Array` |
+| `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` |
+| `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` |
+| `frameworks` | Array of integers listing API frameworks supported by the publisher. Allowed values: None: `0`; VPAID 1.0: `1`; VPAID 2.0: `2`; MRAID 1.0: `3`; ORMMA: `4`; MRAID 2.0: `5`. | `Array` |
+
diff --git a/dev-docs/bidders/e_volution.md b/dev-docs/bidders/e_volution.md
index 867093350f..0a0da06563 100644
--- a/dev-docs/bidders/e_volution.md
+++ b/dev-docs/bidders/e_volution.md
@@ -11,7 +11,8 @@ pbs: true
pbs_app_supported: true
usp_supported: true
schain_supported: true
-pbjs_version_notes: not in 5.x
+pbjs_version_notes: in 6.8+
+userIds: id5Id
---
### Note:
diff --git a/dev-docs/bidders/ebdr.md b/dev-docs/bidders/ebdr.md
index 2218f1ca60..56036ed355 100644
--- a/dev-docs/bidders/ebdr.md
+++ b/dev-docs/bidders/ebdr.md
@@ -5,7 +5,6 @@ description: Prebid EngageBDR Bidder Adaptor
biddercode: ebdr
pbjs: true
media_types: video
-pbjs_version_notes: not in 5.x
---
### Bid params
diff --git a/dev-docs/bidders/edgequeryx.md b/dev-docs/bidders/edgequeryx.md
index 5731ce33d1..11451f6332 100644
--- a/dev-docs/bidders/edgequeryx.md
+++ b/dev-docs/bidders/edgequeryx.md
@@ -8,7 +8,8 @@ media_types: display
gdpr_supported: true
schain_supported: true
usp_supported: true
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Note:
diff --git a/dev-docs/bidders/emoteev.md b/dev-docs/bidders/emoteev.md
index 553a9b236c..d9731d89ba 100644
--- a/dev-docs/bidders/emoteev.md
+++ b/dev-docs/bidders/emoteev.md
@@ -6,7 +6,8 @@ pbjs: true
biddercode: emoteev
gdpr_supported: true
userIds: pubCommonId
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/emx_digital.md b/dev-docs/bidders/emx_digital.md
index f87facc38e..00acc8c306 100644
--- a/dev-docs/bidders/emx_digital.md
+++ b/dev-docs/bidders/emx_digital.md
@@ -10,6 +10,7 @@ gdpr_supported: true
gvl_id: 183
usp_supported: true
schain_supported: true
+userIds: identityLink, uid2
---
### Registration
diff --git a/dev-docs/bidders/engageya.md b/dev-docs/bidders/engageya.md
index 1e8066d8c4..a085c9bd45 100644
--- a/dev-docs/bidders/engageya.md
+++ b/dev-docs/bidders/engageya.md
@@ -6,7 +6,6 @@ media_type: banner, native
biddercode: engageya
pbjs: true
gdpr_supported: true
-pbjs_version_notes: not in 5.x
---
### Bid params
diff --git a/dev-docs/bidders/envivo.md b/dev-docs/bidders/envivo.md
index b5e2771e3f..b19dd59148 100644
--- a/dev-docs/bidders/envivo.md
+++ b/dev-docs/bidders/envivo.md
@@ -4,7 +4,8 @@ title: envivo
description: Prebid envivo Bidder Adapter
pbjs: true
biddercode: envivo
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
diff --git a/dev-docs/bidders/epom.md b/dev-docs/bidders/epom.md
index 228670bceb..d1d5897a28 100644
--- a/dev-docs/bidders/epom.md
+++ b/dev-docs/bidders/epom.md
@@ -10,7 +10,7 @@ coppa_supported: true
schain_supported: false
media_types: banner, video, native
safeframes_ok: true
-bidder_supports_deals: true
+deals_supported: true
pbjs: false
pbs: true
pbs_app_supported: true
diff --git a/dev-docs/bidders/ergadx.md b/dev-docs/bidders/ergadx.md
new file mode 100644
index 0000000000..2aedf405a1
--- /dev/null
+++ b/dev-docs/bidders/ergadx.md
@@ -0,0 +1,27 @@
+---
+layout: bidder
+title: eRGADX
+description: eRGADX Bidder Adaptor
+pbjs: true
+pbs: true
+biddercode: ergadx
+aliasCode : adkernel
+media_types: banner, native, video
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+pbs_app_supported: true
+schain_supported: true
+---
+
+### Note:
+
+The eRGADX 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.ergadx.com'` | `string` |
+| `zoneId` | required | Zone Id | 30164 | `integer` |
diff --git a/dev-docs/bidders/etarget.md b/dev-docs/bidders/etarget.md
index 251697a776..d68eeb522f 100644
--- a/dev-docs/bidders/etarget.md
+++ b/dev-docs/bidders/etarget.md
@@ -2,18 +2,81 @@
layout: bidder
title: Etarget
description: Prebid Etarget Bidder Adaptor
-pbjs: true
biddercode: etarget
media_types: banner, video
gdpr_supported: true
+usp_supported: true
+pbjs: true
+fpd_supported: true
+gvl_id: 29
---
-
### Bid Params
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example |
| :--- | :---- | :---------- | :------ |
-| `refid` | required | | `12345` |
+| `refid` | required | Placement ID | `12345` |
| `country` | required | Country domain | `1` |
+| `options` | optional | Additional data | `{site:'example.com'}` |
+
+#### First Party Data
+
+In release 5.0 and later, publishers should use the `ortb2` method of setting First Party Data. The following fields are supported:
+- ortb2.site.ext.data.*
+- ortb2.site.keywords
+- ortb2.site.content.data[]
+- ortb2.user.ext.data.*
+- ortb2.user.data[]
+
+The ETARGET exchange supports the IAB standard Audience Taxonomy v1.1 and Content Taxonomy v2.2.
+
+Example first party data that's available to all bidders and all adunits:
+```
+pbjs.setConfig({
+ ortb2: {
+ site: {
+ keywords: "kw1,kw2",
+ ext: {
+ data: {
+ prodtype: ["tech","mobile"]
+ }
+ }
+ },
+ user: {
+ ext: {
+ data: {
+ ucat:["new"]
+ }
+ }
+ }
+ }
+};
+```
+
+Example of first party data available only to the ETARGET bidder. Applies across all ad units.
+```
+pbjs.setBidderConfig({
+ bidders: ["etarget"],
+ config: {
+ ortb2: {
+ site: {
+ keywords: "kw1,kw2",
+ ext: {
+ data: {
+ prodtype: ["tech","mobile"]
+ }
+ }
+ },
+ user: {
+ ext: {
+ data: {
+ ucat:["new"]
+ }
+ }
+ }
+ }
+ }
+};
+```
diff --git a/dev-docs/bidders/feedad.md b/dev-docs/bidders/feedad.md
index 14bb43c6a8..bfcf75ec66 100644
--- a/dev-docs/bidders/feedad.md
+++ b/dev-docs/bidders/feedad.md
@@ -16,3 +16,4 @@ gvl_id: 781
|---------------|----------|----------------------------------------------------------|----------------------------------------------------------|----------|
| `clientToken` | required | Your FeedAd client token. Check your FeedAd admin panel. | `'EiRjZDFiYzI2ZC03OTA2LTQyOTEtOGFmMC0xYzMyZmMwNTFkMDU='` | `string` |
| `placementId` | required | A FeedAd placement ID of your choice | `'prebid-test'` | `string` |
+| `decoration` | optional | A decoration to apply to the ad slot. See our [documentation](https://docs.feedad.com/web/feed_ad/#decorations) | `'sticky bottom height=200px'` | `string` |
diff --git a/dev-docs/bidders/felixads.md b/dev-docs/bidders/felixads.md
new file mode 100644
index 0000000000..9bc6ed33c7
--- /dev/null
+++ b/dev-docs/bidders/felixads.md
@@ -0,0 +1,28 @@
+---
+layout: bidder
+title: felixads
+description: Prebid felixads Bidder Adaptor
+pbjs: true
+pbs: false
+biddercode: felixads
+aliascode: adkernel
+media_types: banner, native, video
+gdpr_supported: true
+usp_supported: true
+coppa_supported: true
+pbs_app_supported: true
+schain_supported: true
+userIds: all
+---
+
+### Note:
+
+The felixads Bidding adaptor requires setup and approval before beginning. Please reach out to for more details
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------------------|---------------------------|----------|
+| `host` | required | felixads's RTB host | `'cpm.felixads.com'` | `string` |
+| `zoneId` | required | RTB zone id | `'30164'` | `integer` |
diff --git a/dev-docs/bidders/fidelity.md b/dev-docs/bidders/fidelity.md
index 2ccca5fb16..f18a36bf0b 100644
--- a/dev-docs/bidders/fidelity.md
+++ b/dev-docs/bidders/fidelity.md
@@ -9,7 +9,8 @@ media_types: banner
gdpr_supported: true
usp_supported: true
gvl_id: 408
-pbjs_version_notes: not in 5.x
+enable_download: false
+pbjs_version_notes: not ported to 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/finative.md b/dev-docs/bidders/finative.md
new file mode 100644
index 0000000000..9dff5844c5
--- /dev/null
+++ b/dev-docs/bidders/finative.md
@@ -0,0 +1,17 @@
+---
+layout: bidder
+title: Finative
+description: Prebid Finative Bidder Adaptor
+pbjs: true
+biddercode: finative
+media_types: native
+gdpr_supported: true
+---
+
+### Bid params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|-------------|----------|----------------------|--------------------|-----------|
+| `adUnitId` | required | ID of the Ad Unit | `8ao` | `string` |
+| `url` | optional | URL from the Page | `example.tld` | `string` |
diff --git a/dev-docs/bidders/fluct.md b/dev-docs/bidders/fluct.md
index 9360ed72d2..5403970b0d 100644
--- a/dev-docs/bidders/fluct.md
+++ b/dev-docs/bidders/fluct.md
@@ -9,7 +9,6 @@ coppa_supported: false
usp_supported: false
schain_supported: true
pbjs: true
-pbjs_version_notes: not in 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/futureads.md b/dev-docs/bidders/futureads.md
new file mode 100644
index 0000000000..016a8fa997
--- /dev/null
+++ b/dev-docs/bidders/futureads.md
@@ -0,0 +1,24 @@
+---
+layout: bidder
+title: FutureAds
+description: Prebid FutureAds Bidder Adaptor
+pbjs: true
+pbs: true
+biddercode: futureads
+aliasCode: admixer
+media_types: banner, video, native
+gdpr_supported: true
+usp_supported: true
+schain_supported: true
+gvl_id: 511
+userIds: AdmixerID
+prebid_member: true
+---
+
+### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------|----------|----------------------------------------------------------------------------------------------------------------|----------------------------------------|----------|
+| `zone` | required | The unique identifier of the ad placement. Could be obtained from the FutureAds UI or from your account manager. | "e5ff8e48-4bd0-4a2c-9236-55530ab8981d" | `string` |
+| `kvTargeting` | optional | Key/Value - a pair of the unique values that will be used for the custom targeting option. | {key1: value2, key2: value2} | `object` |
diff --git a/dev-docs/bidders/gamma.md b/dev-docs/bidders/gamma.md
index c514b25192..3935c66e0e 100644
--- a/dev-docs/bidders/gamma.md
+++ b/dev-docs/bidders/gamma.md
@@ -6,7 +6,6 @@ pbjs: true
pbs: true
biddercode: gamma
media_types: video
-pbjs_version_notes: not in 5.x
---
### Bid Params
diff --git a/dev-docs/bidders/getintent.md b/dev-docs/bidders/getintent.md
index 6e0f519249..671ec6fe1f 100644
--- a/dev-docs/bidders/getintent.md
+++ b/dev-docs/bidders/getintent.md
@@ -4,8 +4,8 @@ title: GetIntent
description: Prebid GetIntent Bidder Adaptor
pbjs: true
biddercode: getintent
-media_types: video
-pbjs_version_notes: not in 5.x
+media_types: video, banner
+floors_supported: true
---
@@ -24,6 +24,22 @@ pbjs_version_notes: not in 5.x
#### video
+Adapter supports the following mediaTypes.video parameters:
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|--------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|------------------|
+| `protocols` | optional | The list of the restricted VAST protocol versions. Possible values: `1` â VAST 1.0, `2` â VAST 2.0, `3` â VAST 3.0, `4` â VAST 1.0 Wrapper, `5` â VAST 2.0 Wrapper, `6` â VAST 3.0 Wrapper. | `[4,5,6]` | `Array` |
+| `mimes` | optional | Array of Mime Type strings. | `['application/javascript']` | `Array` |
+| `minduration`| optional | Minimal video duration. | `30` | `integer` |
+| `maxduration`| optional | Maximal video duration. | `30` | `integer` |
+| `minbitrate` | optional | Minimal Video bitrate. | `256` | `integer` |
+| `maxbitrate` | optional | Maximal Video bitrate. | `512` | `integer` |
+| `api` | optional | API of the inventory. Possible values: `1` - VPAID 1.0, `2` - VPAID 2.0, `3` - MRAID-1, `4` - ORMMA, `5` - MRAID-2. | `[3,4]` | `Array` |
+| `skip` | optional | Skippability of the inventory. Possible values (case insensitive): `1` - skippable inventory is allowed, `0` - skippable inventory is not allowed. | `0` | `integer` |
+
+List of custom parameters available at bidder params level
+
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|-------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|------------------|
diff --git a/dev-docs/bidders/glimpse.md b/dev-docs/bidders/glimpse.md
index a505282776..ae5a245ee7 100644
--- a/dev-docs/bidders/glimpse.md
+++ b/dev-docs/bidders/glimpse.md
@@ -1,95 +1,126 @@
---
layout: bidder
title: Glimpse Protocol
-description: Glimpse Protocol Bidder Adapter
+description: Glimpse Protocol Bid Adapter
biddercode: glimpse
pbjs: true
gdpr_supported: true
+usp_supported: true
+deals_supported: true
media_types: banner
+gvl_id: 1012
---
## Overview
```
-Module Name: Glimpse Protocol Adaptor
+Module Name: Glimpse Protocol Bid Adapter
Module Type: Bidder Adapter
-Maintainer: tim@glimpseprotocol.io
+Maintainer: support@glimpseportal.io
```
## Description
-This module connects publishers to Glimpse Protocol's demand sources via Prebid.js. Our
-innovative marketplace protects consumer privacy while allowing precise targeting. It is
-compliant with GDPR, DPA and CCPA.
+Glimpse protects consumer privacy while allowing precise targeting. This module connects publishers
+to Glimpse Protocol's demand sources via Prebid.js.
-This module was built and tested against prebid 3.21.0 and so compatibility against
-version 2 and earlier is unknown.
+## Supported Media Types
-## Media Types
+{: .table .table-bordered .table-striped }
+| Type | Sizes |
+| -------- | ----------------------------------------- |
+| `Banner` | 300x250, 300x600, 320x50, 728x90, 970x250 |
-| Type | Support |
-| -------- | ------------------------------------------------------------------ |
-| `Banner` | Fully supported for 320x50, 300x250, 300x600, 728x90, and 970x250. |
+## Setup
-## Bid Parameters
+### Prerequisites
-The only parameter is `placementId` and it is required.
+Before you start, you will need to build a `prebid.js` file with the Glimpse module included, and include both `gpt.js` and `prebid.js` in the `head` of each page with supply. An example of a typical pair of script tags might be:
-### Banner
+```html
+
-| Name | Scope | Description | Example | Type |
-| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------- | ------ |
-| `placementId` | Required | An identifier associated unique to a publisher and ad unit. Values can be obtained through our publisher portal. | 'glimpse-demo-300x250' | String |
-
-## Setup Guide
-
-Follow these steps to configure and add the glimpse module to your Prebid.js integration.
+
+```
-### 0. Preconditions
+## Configuration
-- A built prebid module with the glimpse adaptor included
-- You've included the built prebid adaptor and GPT script in your websites html code
-- You've setup GAM mappings
+### Bid Requests
-### 1. Create an account and setup your domain via the Publisher Portal
+Our adapter expects the following values in the `params` block of each bid request:
-Coming soon.
+{: .table .table-bordered .table-striped }
+| Name | Scope | Type | Description | Example |
+| ----- | -------- | ------ | --------------------------------------------------------------------------------------------------- | ---------------------- |
+| `pid` | Required | string | A unique identifier representing an ad unit. It is provided by Glimpse when registering an ad unit. | 'glimpse-placement-id' |
-### 2. Enable Glimpse as a bidder on your ad units
+#### Example
```javascript
-const adUnits = {
- code: 'your-ad-unit-div-id',
- mediaTypes: {
- banner: {
- sizes: [[300, 250]],
+const units = [
+ {
+ code: "ad-unit-0",
+ mediaTypes: {
+ banner: { sizes: [[300, 250]] },
},
- },
- bids: [
- {
- bidder: 'glimpse',
- params: {
- placementId: 'placementId-from-publisher-portal',
+ bids: [
+ {
+ bidder: "glimpse",
+ params: {
+ pid: "glimpse-placement-id",
+ },
},
- },
- ...
- ],
- ...
-}
+ ],
+ },
+]
```
-## FAQs
+### First Party Data
-### Can I test my setup without a Publisher Portal Account?
+Our adapter works with first party data providers as described [here](https://docs.prebid.org/features/firstPartyData.html). In this example we add Permutive data to our bidder request using [setBidderConfig](https://docs.prebid.org/features/firstPartyData.html#supplying-bidder-specific-data).
-Yep. Use a demo placementId:
+#### Example
-- glimpse-demo-320x50
-- glimpse-demo-300x250
-- glimpse-demo-300x600
-- glimpse-demo-728x90
-- glimpse-demo-970x250
+```javascript
+pbjs.que.push(() => {
+ pbjs.setBidderConfig({
+ bidders: ["glimpse"],
+ config: {
+ ortb2: {
+ site: {
+ keywords: "business,finance,crypto",
+ ext: {
+ data: {
+ permutive: {
+ pvc: JSON.parse(localStorage.getItem("permutive-pvc")) ?? {},
+ },
+ },
+ },
+ },
+ user: {
+ ext: {
+ data: {
+ permutive: {
+ keywords: JSON.parse(localStorage.getItem("_psegs")) ?? [],
+ enrichers:
+ JSON.parse(
+ localStorage.getItem("permutive-data-enrichers")
+ ) ?? {},
+ },
+ },
+ },
+ },
+ },
+ },
+ })
+})
+```
+
+## FAQs
-### How do I get more help?
+### Can you provide additional support?
-Reach out to us at [hello@glimpseprotocol.io](mailto:hello@glimpseprotocol.io)
+Of course! You can check the Glimpse Prebid Adapter documentation [here](https://docs.glimpseportal.io/en/latest/) or reach out to us at [support@glimpseportal.io](mailto:support@glimpseportal.io).
diff --git a/dev-docs/bidders/gmossp.md b/dev-docs/bidders/gmossp.md
index 98b20a2ee2..06d4f21a3c 100644
--- a/dev-docs/bidders/gmossp.md
+++ b/dev-docs/bidders/gmossp.md
@@ -4,6 +4,7 @@ title: GMOSSP
description: Prebid GMOSSP Bidder Adaptor
pbjs: true
biddercode: gmossp
+userIds: imuid, sharedId, identityLink
media_types: banner
---
diff --git a/dev-docs/bidders/gnet.md b/dev-docs/bidders/gnet.md
index 8cd6b3af53..70af8f195d 100644
--- a/dev-docs/bidders/gnet.md
+++ b/dev-docs/bidders/gnet.md
@@ -1,10 +1,9 @@
---
layout: bidder
-title: gnet
+title: Gnet
description: Prebid Gnet Bidder Adaptor
pbjs: true
biddercode: gnet
-pbjs_version_notes: not in 5.x
---
### Bid Params
@@ -12,6 +11,6 @@ pbjs_version_notes: not in 5.x
{: .table .table-bordered .table-striped }
| Name | Scope | Description | Example | Type |
|---------------|----------|--------------------------------------------|-------------------------------------|----------|
-| `websiteId` | required | The Gnet website ID | `'4'` | `string` |
-| `externalId` | required | The Gnet external ID | `'4d52cccf30309282256012cf30309282'` | `string` |
+| `websiteId` | required | The Gnet website ID | `'1'` | `string` |
+| `adunitId` | required | The Gnet adunit ID | `'1'` | `string` |
diff --git a/dev-docs/bidders/go2net.md b/dev-docs/bidders/go2net.md
index 7210f822de..f1ce1099d6 100644
--- a/dev-docs/bidders/go2net.md
+++ b/dev-docs/bidders/go2net.md
@@ -11,6 +11,7 @@ media_types: video
### bid params
{: .table .table-bordered .table-striped }
-| Name | Scope | Description | Example | Type |
-|--------|----------|-------------|---------|----------|
-| `zone` | required | | | `string` |
+| Name | Scope | Description | Example | Type |
+|---------------|----------|----------------------------------------------------------------------------------------------------------------|----------------------------------------|----------|
+| `zone` | required | The unique identifier of the ad placement. Could be obtained from the Go2Net UI or from your account manager. | "e5ff8e48-4bd0-4a2c-9236-55530ab8981d" | `string` |
+| `kvTargeting` | optional | Key/Value - a pair of the unique values that will be used for the custom targeting option. | {key1: value2, key2: value2} | `object` |
diff --git a/dev-docs/bidders/goldbach.md b/dev-docs/bidders/goldbach.md
new file mode 100644
index 0000000000..6f9b4f7fc5
--- /dev/null
+++ b/dev-docs/bidders/goldbach.md
@@ -0,0 +1,199 @@
+---
+layout: bidder
+title: Goldbach
+description: Prebid Goldbach Bidder Adaptor
+biddercode: goldbach
+media_types: banner, video, native
+gdpr_supported: true
+prebid_member: true
+userIds: criteo, unifiedId, netId, identityLink, flocId, uid2
+schain_supported: true
+coppa_supported: true
+usp_supported: true
+getFloor: true
+pbjs: true
+pbs: true
+---
+
+### Table of Contents
+
+- [Bid Params](#godlbach-bid-params)
+- [Video Object](#godlbach-video-object)
+- [User Object](#godlbach-user-object)
+- [App Object](#godlbach-app-object)
+- [Custom Targeting keys](#custom-targeting-keys)
+- [Passing Keys Without Values](#godlbach-no-value)
+- [User Sync in AMP](#godlbach-amp)
+- [Debug Auction](#godlbach-debug-auction)
+
+
+
+{: .alert.alert-danger :}
+All Goldbach (Xandr) placements included in a single call to `requestBids` must belong to the same parent Publisher. If placements from two different publishers are included in the call, the Goldbach bidder will not return any demand for those placements.
+*Note: This requirement does not apply to adapters that are [aliasing](/dev-docs/publisher-api-reference/aliasBidder.html) the Goldbach adapter.*
+
+#### Bid Params
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|---------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------|------------------|
+| `placementId` | required | The placement ID from Goldbach. You may identify a placement using the `invCode` and `member` instead of a placement ID. The `placementID` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. Legacy code can retain the `string` value. **Prebid Server requires an integer value.** | `234234` | `integer` |
+| `member` | optional | The member ID from Goldbach. Must be used with `invCode`. | `'12345'` | `string` |
+| `invCode` | optional | The inventory code from Goldbach. Must be used with `member`. | `'abc123'` | `string` |
+| `publisherId` | optional | The publisher ID from Goldbach. It is used by the Goldbach end point to identify the publisher when `placementId` is not provided and `invCode` goes wrong. The `publisherId` parameter can be either a `string` or `integer` for Prebid.js, however `integer` is preferred. | `12345` | `integer` |
+| `frameworks` | optional | Array of integers listing API frameworks for Banner supported by the publisher. | `integer` |
+| `user` | optional | Object that specifies information about an external user. See [User Object](#godlbach-user-object) for details. | `user: { age: 25, gender: 0, dnt: true}` | `object` |
+| `allowSmallerSizes` | optional | If `true`, ads smaller than the values in your ad unit's `sizes` array will be allowed to serve. Defaults to `false`. | `true` | `boolean` |
+| `usePaymentRule` (PBJS) or `use_pmt_rule` (PBS) | optional | If `true`, Xandr will return net price to Prebid.js after publisher payment rules have been applied. | `true` | `boolean` |
+| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Mapped to [buy-side segment targeting](https://monetize.xandr.com/docs/segment-targeting) (login required). Values can be empty. See [Passing Keys Without Values](#godlbach-no-value) below for examples. Note that to use keyword with the Prebid Server adapter, that feature must be enabled for your account by an Goldbach account manager. | `keywords: { genre: ['rock', 'pop'] }` | `object` |
+| `video` | optional | Object containing video targeting parameters. See [Video Object](#godlbach-video-object) for details. | `video: { playback_method: ['auto_play_sound_off'] }` | `object` |
+| `app` | optional | Object containing mobile app parameters. See the [App Object](#godlbach-app-object) for details. | `app : { id: 'app-id'}` | `object` |
+| `reserve` | optional | Sets a floor price for the bid that is returned. If floors have been configured in the Goldbach Console, those settings will override what is configured here unless 'Reserve Price Override' is checked. See [Xandr docs](https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/create-a-floor-rule.html) | `0.90` | `float` |
+| `position` | optional | Identify the placement as above or below the fold. Allowed values: Unknown: `unknown`; Above the fold: `above`; Below the fold: `below` | `'above'` | `string` |
+| `trafficSourceCode` | optional | Specifies the third-party source of this impression. | `'my_traffic_source'` | `string` |
+| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` |
+| `supplyType` | optional | Indicates the type of supply for this placement. Possible values are `web`, `mobile_web`, `mobile_app` | `'web'` | `string` |
+| `pubClick` | optional | Specifies a publisher-supplied URL for third-party click tracking. This is just a placeholder into which the publisher can insert their own click tracker. This parameter should be used for an unencoded tracker. This parameter is expected to be the last parameter in the URL. Please note that the click tracker placed in this parameter will only fire if the creative winning the auction is using Goldbach click tracking properly. | `'http://click.adserver.com/'` | `string` |
+| `extInvCode` | optional | Specifies predefined value passed on the query string that can be used in reporting. The value must be entered into the system before it is logged. | `'10039'` | `string` |
+| `externalImpId` | optional | Specifies the unique identifier of an externally generated auction. | `'bacbab02626452b097f6030b3c89ac05'` | `string` |
+| `generate_ad_pod_id`| optional | Signal to Goldbach to split impressions by ad pod and add unique ad pod id to each request. Specific to long form video endpoint only. Supported by Prebid Server, not Prebid JS. | `true` | `boolean` |
+
+
+
+#### Video Object
+
+{: .table .table-bordered .table-striped }
+| Name | Description | Type |
+|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| `minduration` | Integer that defines the minimum video ad duration in seconds. | `integer` |
+| `maxduration` | Integer that defines the maximum video ad duration in seconds. | `integer` |
+|`context` | A string that indicates the type of video ad requested. Allowed values: `"pre_roll"`; `"mid_roll"`; `"post_roll"`; `"outstream"`. | `string` |
+| `skippable` | Boolean which, if `true`, means the user can click a button to skip the video ad. Defaults to `false`. | `boolean` |
+|`skipoffset`| Integer that defines the number of seconds until an ad can be skipped. Assumes `skippable` setting was set to `true`. | `integer` |
+| `playback_method` | A string that sets the playback method supported by the publisher. Allowed values: `"auto_play_sound_on"`; `"auto_play_sound_off"`; `"click_to_play"`; `"mouse_over"`; `"auto_play_sound_unknown"`. | `string` |
+| `frameworks` | Array of integers listing API frameworks supported by the publisher. Allowed values: None: `0`; VPAID 1.0: `1`; VPAID 2.0: `2`; MRAID 1.0: `3`; MRAID 2.0: `4`; ORMMA: `5`; OMID 1.0 `6`. | `Array` |
+
+
+
+
+#### User Object
+
+{: .table .table-bordered .table-striped }
+| Name | Description | Example | Type |
+|-------------------|---------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|------------------|
+| `age` | The age of the user. | `35` | `integer` |
+| `externalUid` | Specifies a string that corresponds to an external user ID for this user. | `'1234567890abcdefg'` | `string` |
+| `segments` | Specifies the segments to which the user belongs. | `[1, 2]` | `Array` |
+| `gender` | Specifies the gender of the user. Allowed values: Unknown: `0`; Male: `1`; Female: `2` | `1` | `integer` |
+| `dnt` | Do not track flag. Indicates if tracking cookies should be disabled for this auction | `true` | `boolean` |
+| `language` | Two-letter ANSI code for this user's language. | `EN` | `string` |
+
+
+
+
+#### App Object
+
+Goldbach supports using prebid within a mobile app's webview. If you are interested in using an SDK, please see [Prebid Mobile]({{site.baseurl}}/prebid-mobile/prebid-mobile.html) instead.
+
+{: .table .table-bordered .table-striped }
+| Name | Description | Example | Type |
+|-------------------|---------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|------------------|
+| `id` | The App ID. | `'B1O2W3M4AN.com.prebid.webview'` | `string` |
+| `device_id` | Object that contains the advertising identifiers of the user (`idfa`, `aaid`, `md5udid`, `sha1udid`, or `windowsadid`). | `{ aaid: "38400000-8cf0-11bd-b23e-10b96e40000d" }` | `object` |
+| `geo` | Object that contains the latitude (`lat`) and longitude (`lng`) of the user. | `{ lat: 40.0964439, lng: -75.3009142 }` | `object` |
+
+
+
+#### Custom Targeting keys
+
+Goldbach returns custom keys that can be sent to the adserver through bidderSettings: buyerMemberId, dealPriority, and dealCode. The following snippet demonstrates how to add these custom keys as key-value pairs.
+
+```
+pbjs.bidderSettings = {
+ godlbach: {
+ adserverTargeting: [
+ {
+ key: "apn_buyer_memberid", // Use key configured in your adserver
+ val: function(bidResponse) {
+ return bidResponse.appnexus.buyerMemberId;
+ }
+ },
+ {
+ key: "apn_prio", // Use key configured in your adserver
+ val: function(bidResponse) {
+ return bidResponse.appnexus.dealPriority;
+ }
+ }, {
+ key: "apn_dealcode", // Use key configured in your adserver
+ val: function(bidResponse) {
+ return bidResponse.appnexus.dealCode;
+ }
+ }
+ ]
+ }
+}
+```
+
+
+
+#### Passing Keys Without Values
+
+It's possible to use the `keywords` parameter to define keys that do not have any associated values. Keys with empty values can be created in Prebid.js and can also be sent through Prebid Server to Goldbach. The following are examples of sending keys with empty values:
+
+
+```
+keywords: {
+ myKeyword: '',
+ myOtherKeyword: ['']
+}
+```
+
+The preceding example passes the key `myKeyword` with an empty value. The key `myOtherKeyword` contains an empty value array.
+
+You can define keys with values and without values in the same `keywords` definition. In this next example, we've defined the key `color` with an array of values: `red`, `blue`, and `green`. We've followed that with the key `otherKeyword` with an empty value array.
+
+```
+keywords: {
+ color: ['red', 'blue', 'green'],
+ otherKeyword: ['']
+}
+```
+
+
+
+#### User Sync in AMP
+
+If you are syncing user id's with Prebid Server and are using Goldbach's managed service, see [AMP Implementation Guide cookie-sync instructions](/dev-docs/show-prebid-ads-on-amp-pages.html#user-sync) for details.
+
+
+
+#### Mobile App Display Manager Version
+
+The Goldbach endpoint expects `imp.displaymanagerver` to be populated for mobile app sources
+requests, however not all SDKs will populate this field. If the `imp.displaymanagerver` field
+is not supplied for an `imp`, but `request.app.ext.prebid.source`
+and `request.app.ext.prebid.version` are supplied, the adapter will fill in a value for
+`diplaymanagerver`. It will concatenate the two `app` fields as `
### Next Steps
1. Set up your ad server using the [corresponding Ad Ops setup instructions]({{site.baseurl}}/adops/send-all-bids-adops.html)
2. Once you're comfortable with the basic setup, check out [the examples showing other use cases]({{site.baseurl}}/dev-docs/examples/basic-example.html)
-
-
diff --git a/dev-docs/integrate-with-the-prebid-analytics-api.md b/dev-docs/integrate-with-the-prebid-analytics-api.md
index 15aec64b6b..9a5e6514e3 100644
--- a/dev-docs/integrate-with-the-prebid-analytics-api.md
+++ b/dev-docs/integrate-with-the-prebid-analytics-api.md
@@ -135,6 +135,9 @@ The callback will receive an object with the following attributes:
}
```
+Note that analytics adapters can read the TCF string directly from the auction object -- look for the gdprConsent object, which contains three attributes:
+gdprApplies, consentString, and apiVersion
+
#### Listening for errors
There are two error events analytics modules may wish to listen for: auctionDebug and adRenderFailed. The former is any error that would be normally logged to console and there can be a great many. The latter may happen for the following reasons: (PREVENT_WRITING_ON_MAIN_DOCUMENT, NO_AD, CANNOT_FIND_AD, EXCEPTION, MISSING_DOC_OR_ADID)
diff --git a/dev-docs/modules/1plusXRtdProvider.md b/dev-docs/modules/1plusXRtdProvider.md
new file mode 100644
index 0000000000..bea7a183e3
--- /dev/null
+++ b/dev-docs/modules/1plusXRtdProvider.md
@@ -0,0 +1,67 @@
+---
+layout: page_v2
+title: 1plusX RTD Module
+display_name: 1plusX RTD Module
+description: 1plusX Real Time Data Module
+page_type: module
+module_type: rtd
+module_code : 1plusXRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# 1plusX RTD Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Description
+
+The 1plusX RTD module appends User and Contextual segments to the bidding object.
+
+## Integration
+
+1) Compile the 1plusX RTD Module along with your bid adapter and other modules into your Prebid build:
+
+
+```
+gulp build --modules="rtdModule,1plusXRtdProvider,appnexusBidAdapter,..."
+```
+
+2) Use `setConfig` to instruct Prebid.js to initilize the 1plusX RTD module, as specified below.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders`
+
+```javascript
+var TIMEOUT = 1000;
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: TIMEOUT,
+ dataProviders: [{
+ name: '1plusX',
+ waitForIt: true,
+ params: {
+ customerId: 'acme',
+ bidders: ['appnexus', 'rubicon'],
+ timeout: TIMEOUT
+ }
+ }]
+ }
+});
+```
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+| Name | Type | Description | Default |
+| :---------------- | :------------ | :--------------------------------------------------------------- |:----------------- |
+| name | String | Real time data module name | Always '1plusX' |
+| waitForIt | Boolean | Should be `true` if there's an `auctionDelay` defined (optional) | `false` |
+| params | Object | | |
+| params.customerId | String | Your 1plusX customer id | |
+| params.bidders | Array | List of bidders for which you would like data to be set | |
+| params.timeout | Integer | timeout (ms) | 1000ms |
diff --git a/dev-docs/modules/adnuntiusRtdProvider.md b/dev-docs/modules/adnuntiusRtdProvider.md
new file mode 100644
index 0000000000..db4b5b757e
--- /dev/null
+++ b/dev-docs/modules/adnuntiusRtdProvider.md
@@ -0,0 +1,65 @@
+---
+layout: page_v2
+title: Adnuntius Data Segment Module
+display_name: Adnuntius Data Segments
+description: Adnuntius Data Segments
+page_type: module
+module_type: rtd
+module_code: adnuntiusRtdProvider
+enable_download: true
+vendor_specific: true
+sidebarType: 1
+---
+
+# Adnuntius Data Segment Module
+
+## Integration
+
+1. Compile the Adnuntius RTD Module and Adnuntius Bid Adapter into your Prebid build:
+
+```
+gulp build --modules="adnuntiusRtdProvider,adnuntiusBidAdapter,..."
+```
+
+2. Use `setConfig` to instruct Prebid.js to initilize the adnuntius module, as specified below.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders`
+
+```javascript
+var pbjs = pbjs || { que: [] }
+pbjs.que.push(function () {
+ pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 300,
+ dataProviders: [
+ {
+ name: 'adnuntius',
+ waitForIt: true,
+ params: {
+ bidders: ['adnuntius'],
+ providers: [
+ {
+ siteId: 'site123',
+ userId: 'user123',
+ },
+ ],
+ },
+ },
+ ],
+ },
+ })
+})
+```
+
+Syntax details:
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | String | Real time data module name | Always 'adnuntius' |
+| waitForIt | Boolean | Should be `true` if there's an `auctionDelay` defined (optional) | `false` |
+| params | Object | | |
+| params.bidders | Array | A list of bidders that the module should affect | |
+| params.bidders | Array | An array of users users and site ID that to send to Adnuntius data | |
diff --git a/dev-docs/modules/adpod.md b/dev-docs/modules/adpod.md
index 519b1a1a87..0519cd9db6 100644
--- a/dev-docs/modules/adpod.md
+++ b/dev-docs/modules/adpod.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Adpod
-description: Adds functions to validate, cache, and modify long-form video bids.
+description: Enables developers to add support for a new adserver that handles ad pod (long-form) videos.
module_code : adpod
display_name : Adpod
enable_download : true
diff --git a/dev-docs/modules/airgridRtdProvider.md b/dev-docs/modules/airgridRtdProvider.md
new file mode 100644
index 0000000000..6251c63fce
--- /dev/null
+++ b/dev-docs/modules/airgridRtdProvider.md
@@ -0,0 +1,102 @@
+---
+layout: page_v2
+title: AirGrid RTD Provider
+display_name: AirGrid RTD Provider
+description: Client-side, cookieless and privacy-first audiences.
+page_type: module
+module_type: rtd
+module_code : airgridRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# AirGrid RTD Provider
+
+AirGrid is a privacy-first, cookie-less audience platform. Designed to help publishers increase inventory yield,
+whilst providing audience signal to buyers in the bid request, without exposing raw user level data to any party.
+
+This real-time data module provides quality first-party data, contextual data, site-level data and more that is
+injected into bid request objects destined for different bidders in order to optimize targeting.
+
+{:.no_toc}
+* TOC
+{:toc}
+
+## Usage
+
+Compile the AirGrid RTD module (`airgridRtdProvider`) into your Prebid build, along with the parent RTD Module (`rtdModule`):
+
+`gulp build --modules=rtdModule,airgridRtdProvider,appnexusBidAdapter`
+
+Next we configure the module, via `pbjs.setConfig`. See the **Parameter Descriptions** below for more detailed information of the configuration parameters.
+
+```js
+pbjs.setConfig(
+ ...
+ realTimeData: {
+ auctionDelay: 1000,
+ dataProviders: [
+ {
+ name: 'airgrid',
+ waitForIt: true,
+ params: {
+ // These are unique values for each account.
+ apiKey: 'apiKey',
+ accountId: 'accountId',
+ publisherId: 'publisherId',
+ bidders: ['appnexus', 'pubmatic']
+ }
+ }
+ ]
+ }
+ ...
+}
+```
+
+### Parameter Descriptions
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | `String` | RTD sub module name | Always 'airgrid' |
+| waitForIt | `Boolean` | Wether to delay auction for module response | Optional. Defaults to false |
+| params.apiKey | `Boolean` | Publisher partner specific API key | Required |
+| params.accountId | `String` | Publisher partner specific account ID | Required |
+| params.publisherId | `String` | Publisher partner specific publisher ID | Required |
+| params.bidders | `Array` | Bidders with which to share segment information | Optional |
+
+_Note: Although the module supports passing segment data to any bidder using the ORTB2 spec, there is no way for this to be currently monetised. Please reach out to support, to discuss using bidders other than Xandr/AppNexus._
+
+If you do not have your own `apiKey`, `accountId` & `publisherId` please reach out to [support@airgrid.io](mailto:support@airgrid.io) or you can sign up via the [AirGrid platform](https://app.airgrid.io).
+
+## Testing
+
+To view an example of the on page setup required:
+
+```bash
+gulp serve-fast --modules=rtdModule,airgridRtdProvider,appnexusBidAdapter
+```
+
+Then in your browser access:
+
+```
+http://localhost:9999/integrationExamples/gpt/airgridRtdProvider_example.html
+```
+
+Run the unit tests, just on the AirGrid RTD module test file:
+
+```bash
+gulp test --file "test/spec/modules/airgridRtdProvider_spec.js"
+```
+
+## Support
+
+If you require further assistance or are interested in discussing the module functionality please reach out to:
+- [hello@airgrid.io](mailto:hello@airgrid.io) for general questions.
+- [support@airgrid.io](mailto:support@airgrid.io) for technical questions.
+
+You are also able to find more examples and other integration routes on the [AirGrid docs site](https://docs.airgrid.io), or learn more on our [site](https://airgrid.io)!
+
+Happy Coding! đ
+The AirGrid Team.
diff --git a/dev-docs/modules/akamaiDapRtdProvider.md b/dev-docs/modules/akamaiDapRtdProvider.md
new file mode 100644
index 0000000000..e78df14957
--- /dev/null
+++ b/dev-docs/modules/akamaiDapRtdProvider.md
@@ -0,0 +1,82 @@
+---
+layout: page_v2
+title: Akamai DAP Real Time Data Provider Module
+display_name: Akamai DAP Real Time Data Provider Module
+description: Akamai DAP Real Time Data Provider Module
+page_type: module
+module_type: rtd
+module_code : akamaiDapRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Akamai DAP Real Time Data Provider Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+The Akamai Data Activation Platform (DAP) is a privacy-first system that protects end-user privacy by only allowing them to be targeted as part of a larger cohort. Akamai DAP Real time data Provider automatically invokes the DAP APIs and submit audience segments and the Secure Ad ID(SAID) to the bid-stream. SAID is a JWT/JWE which carries with it the cohorts and only a side-car or trusted server in the demand-side platform is allowed to see its contents.
+
+
+## Publisher Usage
+
+1) Build the akamaiDapRTD module into the Prebid.js package with:
+
+```
+gulp build --modules=akamaiDapRtdProvider,...
+```
+
+2) Use `setConfig` to instruct Prebid.js to initilaize the akamaiDapRtdProvider module, as specified below.
+
+### Configuration
+
+```
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 2000,
+ dataProviders: [
+ {
+ name: "dap",
+ waitForIt: true,
+ params: {
+ apiHostname: '',
+ apiVersion: "x1",
+ domain: 'your-domain.com',
+ identityType: 'email' | 'mobile' | ... | 'dap-signature:1.3.0',
+ segtax: 504,
+ dapEntropyUrl: 'https://dap-dist.akamaized.net/dapentropy.js',
+ dapEntropyTimeout: 1500
+ }
+ }
+ ]
+ }
+});
+```
+
+Please reach out to your Akamai account representative(Prebid@akamai.com) to get provisioned on the DAP platform.
+
+
+**Config Syntax details:**
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | String | Akamai Dap Rtd module name | 'dap' always|
+| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
+| apiHostname | String | Hostname provided by Akamai | Please reach out to your Akamai account representative(Prebid@akamai.com) for this value|
+| apiVersion | String | This holds the API version | It should be "x1" always |
+| domain | String | The domain name of your webpage | |
+| identityType | String | Something like this 'email', 'mobile', ... 'dap-signature:1.3.0' | |
+| segtax | Integer | The taxonomy for Akamai | The value should be 504 |
+| dapEntropyUrl | String | URL to dap entropy script | Optional if the script is directly included on the webpage. Contact your Akamai account rep for more details |
+| dapEntropyTimeout | Integer | Maximum time allotted for the entropy calculation to happen | |
+
+### Testing
+To view an example of available segments returned by dap:
+```
+âgulp serve --modules=rtdModule,akamaiDapRtdProvider,appnexusBidAdapter,sovrnBidAdapterâ
+```
+and then point your browser at:
+"http://localhost:9999/integrationExamples/gpt/akamaidap_segments_example.html"
diff --git a/dev-docs/modules/bidViewable.md b/dev-docs/modules/bidViewable.md
index b76fb8bf98..a9da963a12 100644
--- a/dev-docs/modules/bidViewable.md
+++ b/dev-docs/modules/bidViewable.md
@@ -1,15 +1,16 @@
---
layout: page_v2
page_type: module
-title: Module - Bid Viewable Event
-description: Triggers BID_VIEWABLE event when a rendered PBJS-Bid is viewable according to [Active View criteria](https://support.google.com/admanager/answer/4524488)
+title: Module - Bid Viewability - GAM
+description: Triggers a BID_VIEWABLE event when a rendered bid is viewable according to Active View criteria
module_code : bidViewability
-display_name : Bid Viewable Event
+display_name : Bid Viewability - GAM
enable_download : true
+vendor_specific: true
sidebarType : 1
---
-# Bid Viewable Event
+# Bid Viewability - GAM
{:.no_toc}
* TOC
@@ -19,33 +20,37 @@ sidebarType : 1
This optional module will trigger a BID_VIEWABLE event which can be consumed by Analytics adapters. In addition, the winning bidder can implement an `onBidViewable` method to capture this event.
-
Notes:
-- The module does not work with adservers other than GAM and only with GPT integration.
-- The GPT API is used to find when a bid is viewable, See https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent .
+- The module does not work with adservers other than GAM and only with GPT integration. See the [other Bid Viewable Event](/dev-docs/modules/bidViewableIO.html) module for an ad server independent version.
+- The GPT API is used to find when a bid is viewable. See [GPT documentation](https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent) for more details.
- This event is fired when an impression becomes viewable, according to [Active View criteria](https://support.google.com/admanager/answer/4524488).
-- Logic used to find a matching Prebid.js bid for a GPT slot is ` (slot.getAdUnitPath() === bid.adUnitCode || slot.getSlotElementId() === bid.adUnitCode) ` this logic can be changed by using param ` customMatchFunction `
- When a rendered PBJS bid is viewable the module will trigger BID_VIEWABLE event, which can be consumed by the winning bidder and analytics adapters
- The module works with Banner, Outsteam and Native creatives
-Instead of listening for events, bidders may supply a ` bid.vurls ` array and this module may fire those pixels when the viewability signal is received. Publishers can control this with module config ` firePixels: true `. Please note that GDPR and USP related parameters will be added to the given URLs.
+Instead of listening for events, bidders may supply a `bid.vurls` array and this module may fire those pixels when the viewability signal is received. Publishers can control this with module config ` firePixels: true `. Please note that GDPR and USP related parameters will be added to the given URLs.
{: .alert.alert-warning :}
-This feature doesn't seem to work with [Instream Video](/dev-docs/examples/instream-banner-mix.html), as GPT's impressionViewable event is not triggered for instream-video-creative
+This feature doesn't work with [Instream Video](/dev-docs/examples/instream-banner-mix.html), as GPT's impressionViewable event is not triggered for instream-video-creative
+
+The default logic used to find a matching Prebid.js bid for a GPT slot is
+```
+(bid, slot) => (slot.getAdUnitPath() === bid.adUnitCode ||
+ slot.getSlotElementId() === bid.adUnitCode)
+```
## Configuration
{: .table .table-bordered .table-striped }
-| Field | Scope | Type | Description |
-|----------+---------+--------+---------------------------------------------------------------------------------------|
-| `bidViewability` | Required | Object | Configuration object for instream tracking |
+| Field | Scope | Type | Description |
+|----------+---------+--------+-----------------------------------------|
+| `bidViewability` | Required | Object | Configuration object |
| `bidViewability.enabled` | Required | Boolean | when set to true, the module will emit BID_VIEWABLE when applicable. Default: `false` |
| `bidViewability.firePixels` | Optional | Boolean | when set to true, will fire the urls mentioned in `bid.vurls` which should be array of URLs. Default: `false` |
-| `bidViewability.customMatchFunction` | Optional | function(bid, slot) | when passed this function will be used to `find` the matching winning bid for the GPT slot. Default value is ` (bid, slot) => (slot.getAdUnitPath() === bid.adUnitCode || slot.getSlotElementId() === bid.adUnitCode) ` |
+| `bidViewability.customMatchFunction` | Optional | function(bid, slot) | this function will be used to find the matching winning bid for the GPT slot. See above for the default. |
## Example of setting module config
{% highlight js %}
- pbjs.setConfig({
+ pbjs.setConfig({
bidViewability: {
enabled: true,
firePixels: true,
diff --git a/dev-docs/modules/bidViewableIO.md b/dev-docs/modules/bidViewableIO.md
new file mode 100644
index 0000000000..b483bc5b80
--- /dev/null
+++ b/dev-docs/modules/bidViewableIO.md
@@ -0,0 +1,66 @@
+---
+layout: page_v2
+page_type: module
+title: Module - Bid Viewability - Ad Server Independent
+description: Triggers a BID_VIEWABLE event when a rendered bid is viewable according to an approximation of IAB viewability criteria
+module_code : bidViewabilityIO
+display_name : Bid Viewability - Ad Server Independent
+enable_download : true
+sidebarType : 1
+---
+
+# Bid Viewability - Ad Server Independent
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+
+This optional module will trigger a BID_VIEWABLE event which can be consumed by Analytics adapters. In addition, the winning bidder can implement an `onBidViewable` method to capture this event.
+
+Notes:
+- The module works with any adserver, or with no ad server at all.
+- Publishers using GAM/GPT might consider using the [Bid Viewable Event - GAM](/dev-docs/modules/bidViewable.html) module
+- Requires the site to polyfill the [IntersectionObserver API](https://github.com/w3c/IntersectionObserver/tree/main/polyfill) (v1) to find when a bid is viewable. This implementation assumes that the publisher and the bidder are acting in good faith, and does not attempt to detect any bad behavior from either party. We assume that the ad is rendered into the element it has been told to render into, and is not hidden or obfuscated at any time.
+- This event is fired when an impression becomes viewable, according to IAB's viewability guidelines
+- When a rendered PBJS bid is determined to be viewable this module will trigger a BID_VIEWABLE event, which can be consumed by the winning bidder and analytics adapters
+- The module works with Banner creatives, with additional support to come.
+
+## Known Issues
+
+{: .alert.alert-warning :}
+This feature is not intended to be a perfect measure of viewability. It is however intended to be a reasonable approximation of a bids viewability for creative types that are supported.
+
+1. Only supports Banner creatives
+2. Only works on browsers that support or on sites that have [polyfilled the IntersectionObserver API](https://github.com/w3c/IntersectionObserver/tree/main/polyfill)
+3. Results can only be trusted if both the publisher and winning bidder are assumed to be acting in good faith.
+
+## Configuration
+
+{: .table .table-bordered .table-striped }
+| Field | Scope | Type | Description |
+|----------+---------+--------+---------------------------------------------------------------------------------------|
+| `bidViewabilityIO` | Required | Object | Configuration object for viewability tracking for supported media types (IO stands for IntersectionObserver) |
+| `bidViewabilityIO.enabled` | Required | Boolean | when set to true, the module will emit BID_VIEWABLE when applicable. Default: `false` |
+
+## Example of setting module config
+{% highlight js %}
+ pbjs.setConfig({
+ bidViewabilityIO: {
+ enabled: true,
+ }
+ });
+{% endhighlight %}
+
+## Example of consuming BID_VIEWABLE event
+{% highlight js %}
+ pbjs.onEvent('bidViewable', function(bid){
+ console.log('got bid details in bidViewable event', bid);
+ });
+{% endhighlight %}
+
+## Related Reading
+
+- [Building a PBJS analytics adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html)
+- [Building a PBJS bidder adapter](/dev-docs/bidder-adaptor.html)
diff --git a/dev-docs/modules/blueconicRtdProvider.md b/dev-docs/modules/blueconicRtdProvider.md
new file mode 100644
index 0000000000..c715c5e19f
--- /dev/null
+++ b/dev-docs/modules/blueconicRtdProvider.md
@@ -0,0 +1,85 @@
+---
+layout: page_v2
+title: BlueConic Real Time Data Provider
+display_name: BlueConic Real-time Module
+description: BlueConic Real-time Data Module
+page_type: module
+module_type: rtd
+module_code : blueconicRtdProvider
+enable_download : true
+coppa_supported: true
+vendor_specific: true
+sidebarType : 1
+---
+
+# BlueConic Real-time Data Submodule
+{:.no_toc}
+
+* TOC
+{:toc}
+
+BlueConic's Real-time Data Provider automatically obtains segmentation data and other user level data from the BlueConic script (via `localStorage`) and passes them to the bid-stream. Please reach out to BlueConic team(info@blueconic.com) or visit our [website](https://support.blueconic.com/hc/en-us) if you have any questions or need further help to integrate Prebid or blueconicRtdProvider.
+
+## Publisher Usage
+
+Compile the BlueConic RTD module into your Prebid build:
+
+`gulp build --modules=rtdModule,blueconicRtdProvider,appnexusBidAdapter`
+
+Add the BlueConic RTD provider to your Prebid config. In this example we will configure
+publisher 1234 to retrieve segments, profile data from BlueConic. See the
+"Parameter Descriptions" below for more detailed information of the
+configuration parameters. Please work with your BlueConic Prebid support team
+(info@blueconic.com) on which version of Prebid.js supports different bidder
+and segment configurations.
+
+```
+pbjs.setConfig(
+ ...
+ realTimeData: {
+ auctionDelay: 1000,
+ dataProviders: [
+ {
+ name: "blueconic",
+ waitForIt: true,
+ params: {
+ requestParams: {
+ publisherId: 1234
+ }
+ }
+ }
+ ]
+ }
+ ...
+}
+```
+
+## BlueConic Configuration Parameters
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | String | Real time data module name | Always 'blueconic' |
+| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
+| params | Object | | |
+| params.requestParams | Object | Publisher partner specific configuration options, such as optional publisher id and other segment query related metadata | Optional |
+
+
+Please see the examples available in the blueconicRtdProvider_spec.js
+tests.
+
+## Testing
+
+To run test suite for blueconic:
+
+`gulp test --modules=rtdModule,blueconicRtdProvider,appnexusBidAdapter`
+
+## Example
+
+To view an example of available segments & profile data:
+
+`gulp serve --modules=rtdModule,blueconicRtdProvider,appnexusBidAdapter`
+
+and then point your browser at:
+
+`http://localhost:9999/integrationExamples/gpt/blueconicRtdProvider_example.html`
\ No newline at end of file
diff --git a/dev-docs/modules/brandmetricsRtdProvider.md b/dev-docs/modules/brandmetricsRtdProvider.md
new file mode 100644
index 0000000000..ef2595d6e6
--- /dev/null
+++ b/dev-docs/modules/brandmetricsRtdProvider.md
@@ -0,0 +1,76 @@
+---
+layout: page_v2
+title: brandmetrics Real Time Data Provider Module
+display_name: brandmetrics Real Time Data Provider Module
+description: brandmetricsReal Time Data Provider Module
+page_type: module
+module_type: rtd
+module_code : brandmetricsRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# brandmetrics Real Time Data Provider Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+This module is intended to be used by brandmetrics (https://brandmetrics.com) partners and sets targeting keywords to bids if the browser is eligeble to see a brandmetrics survey.
+The module hooks in to brandmetrics events and requires a brandmetrics script to be running. The module can optionally load and initialize brandmetrics by providing the 'scriptId'- parameter.
+
+
+## Publisher Usage
+
+1) Build the brandmetricsRtd module into the Prebid.js package with:
+
+```
+gulp build --modules=brandmetricsRtdProvider,...
+```
+
+2) Use `setConfig` to instruct Prebid.js to initilaize the brandmetricsRtdProvider module, as specified below.
+
+### Configuration
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: 500,
+ dataProviders: [
+ {
+ name: "brandmetrics",
+ waitForIt: true,
+ params: {
+ scriptId: '00000000-0000-0000-0000-000000000000',
+ bidders: ['ozone']
+ }
+ }
+ ]
+ }
+});
+```
+
+The scriptId- parameter is provided by brandmetrics or a brandmetrics partner.
+
+
+## Supported bidders
+
+The module currently supports the following bidders:
+
+{: .table .table-bordered .table-striped }
+| Bidder | Id |
+| :----- | :---- |
+| Ozone | ozone |
+
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+| Name | Type | Description | Default |
+| :---------------- | :------------------- | :----------------- | :------------- |
+| name | String | This should always be `brandmetrics` | - |
+| waitForIt | Boolean | Should be `true` if there's an `auctionDelay` defined (recommended) | `false` |
+| params | Object | | - |
+| params.bidders | String[] | An array of bidders the module operates on. | `[]` |
+| params.scriptId | String | A script- id GUID if the brandmetrics- script should be initialized. | `undefined` |
diff --git a/dev-docs/modules/browsiRtdProvider.md b/dev-docs/modules/browsiRtdProvider.md
index 6d269adf3a..062f47f45f 100644
--- a/dev-docs/modules/browsiRtdProvider.md
+++ b/dev-docs/modules/browsiRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : browsiRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/categoryTranslation.md b/dev-docs/modules/categoryTranslation.md
index 4102eb82c6..cb1bd0f987 100644
--- a/dev-docs/modules/categoryTranslation.md
+++ b/dev-docs/modules/categoryTranslation.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Category Translation
-description: Converts IAB sub category to ad server group.
+description: Converts IAB category to ad server category for long-form videos.
module_code : categoryTranslation
display_name : CategoryTranslation
enable_download : true
diff --git a/dev-docs/modules/cleanioRtdProvider.md b/dev-docs/modules/cleanioRtdProvider.md
new file mode 100644
index 0000000000..5f7cf7923b
--- /dev/null
+++ b/dev-docs/modules/cleanioRtdProvider.md
@@ -0,0 +1,67 @@
+---
+layout: page_v2
+title: clean.io Real Time Data Provider
+display_name: clean.io Real-time Anti-Malvertising Module
+description: clean.io Real-time Anti-Malvertising Module
+page_type: module
+module_type: rtd
+module_code : cleanioRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# clean.io Real-time Anti-Malvertising Module
+
+## Overview
+
+The clean.io Realtime module provides effective anti-malvertising solution for publishers, including, but not limited to,
+blocking unwanted 0- and 1-click redirects, deceptive ads or those with malicious landing pages, and various types of affiliate fraud.
+
+Using this module requires prior agreement with [clean.io](https://clean.io) to obtain the necessary distribution key.
+
+## Integration
+
+clean.io Realtime module can be built just like any other prebid module:
+
+```
+gulp build --modules=cleanioRtdProvider,...
+```
+
+
+## Configuration
+
+When built into prebid.js, this module can be configured through the following `pbjs.setConfig` call:
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'clean.io',
+ params: {
+ cdnUrl: 'https://abc1234567890.cloudfront.net/script.js', ///< Contact clean.io to get your own CDN URL
+ protectionMode: 'full', ///< Supported modes are 'full', 'bids' and 'bids-nowait', see below.
+ }
+ }]
+ }
+});
+```
+
+
+### Configuration parameters
+
+{: .table .table-bordered .table-striped }
+| Name | Type | Scope | Description |
+| :------------ | :------------ | :------------ |:------------ |
+| ``cdnUrl`` | ``string`` | Required | CDN URL of the script, which is to be used for protection. |
+| ``protectionMode`` | ``'full' or 'bids' or 'bids-nowait'`` | Required | Integration mode. Please refer to the "Integration modes" section for details. |
+
+
+## Integration modes
+
+{: .table .table-bordered .table-striped }
+| Integration Mode | Parameter Value | Description |
+| :------------ | :------------ | :------------ |
+| Full page protection | ``'full'`` | Preferred mode. The module will add the protector agent script directly to the page, and it will protect all placements. This mode will make the most out of various behavioral detection mechanisms, and will also prevent typical malicious behaviors. Please note that in this mode, depending on Prebid library naming, Chrome may mistakenly tag non-ad-related content as ads: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/ad_tagging.md. |
+| Bids-only protection | ``'bids'`` | The module will protect specific bid responses, more specifically, the HTML representing ad payload, by wrapping it into the agent script. Please note that in this mode, ads delivered directly, outside of Prebid integration, will not be protected, since the module can only access the ads coming through Prebid. |
+| Bids-only protection with no delay on bid rendering | ``'bids-nowait'`` | Same as above, but in this mode, the script will also *not* wrap those bid responses, which arrived prior to successful preloading of agent script. |
diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md
index a1dc9b9794..d0d4ea46f5 100644
--- a/dev-docs/modules/consentManagement.md
+++ b/dev-docs/modules/consentManagement.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: Consent Management - GDPR
-description: Module to consume and distribute GDPR consent information to bidder adapters
+description: If you have users in Europe, this module works with your Consent Management Platform to pass consent info to bidders and help align with EU regulations. See also the GDPR Enforcement module.
module_code : consentManagement
display_name : Consent Management - GDPR
enable_download : true
+recommended: true
sidebarType : 1
---
@@ -21,9 +22,6 @@ sidebarType : 1
{% include /alerts/alert_important.html content=legalNotice %}
-{: .alert.alert-warning :}
-Prebid.org is working on updates that will enable support for reading and parsing TCF 2.0 consent strings. See the [blog post](https://prebid.org/blog/tcf2) for timelines.
-
## Overview
This consent management module is designed to support the EU General Data Protection Regulation ([GDPR](https://www.iab.com/topics/consumer-privacy/gdpr/))
@@ -56,7 +54,7 @@ If the timeout period expires or an error from the CMP is thrown, one of these a
Please start by understanding the IAB's [TCF Implementation Guide](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md).
-To utilize this module, a Consent Management Platform (CMP) compatible with the [IAB TCF v1.1 spec](https://iabeurope.eu/all-news/the-iab-europe-transparency-consent-framework-tcf-steering-group-votes-to-extend-technical-support-for-tcf-v1-1/) or [IAB TCF v2.0 spec](https://iabeurope.eu/tcf-2-0/) needs to be implemented on the site to interact with the user and obtain their consent choices. It's important to understand the details of how the CMP works before integrating it with Prebid.js
+To utilize this module, a Consent Management Platform (CMP) compatible with the [IAB TCF v2.0 spec](https://iabeurope.eu/tcf-2-0/) needs to be implemented on the site to interact with the user and obtain their consent choices. It's important to understand the details of how the CMP works before integrating it with Prebid.js
In general, implementation details for CMPs are not covered by Prebid.org, but we do recommend to that you place the CMP code before the Prebid.js code in the head of the page in order to ensure the CMP's framework is loaded before the Prebid code executes. In addition, the community is collecting a set of [CMP best practices](/dev-docs/cmp-best-practices.html).
@@ -75,22 +73,14 @@ but we recommend migrating to the new config structure as soon as possible.
| gdpr.cmpApi | `string` | The CMP interface that is in use. Supported values are **'iab'** or **'static'**. Static allows integrations where IAB-formatted consent strings are provided in a non-standard way. Default is `'iab'`. | `'iab'` |
| gdpr.timeout | `integer` | Length of time (in milliseconds) to allow the CMP to obtain the GDPR consent string. Default is `10000`. | `10000` |
| gdpr.defaultGdprScope | `boolean` | Defines what the `gdprApplies` flag should be when the CMP doesn't respond in time or the static data doesn't supply. Defaults to `false`. | `true` |
-| gdpr.allowAuctionWithoutConsent | `boolean` | (TCF v1.1 only) Determines what will happen if obtaining consent information from the CMP fails; either allow the auction to proceed (`true`) or cancel the auction (`false`). Default is `true` | `true` |
| gdpr.consentData | `Object` | An object representing the GDPR consent data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | |
-| gdpr.consentData.getTCData.tcString | `string` | (TCF v2.0 only) Base64url-encoded TCF v2.0 string with segments. | |
-| gdpr.consentData.getTCData.addtlConsent | `string` | (TCF v2.0 only) Additional consent string if available from the cmp TCData object | |
-| gdpr.consentData.getTCData.gdprApplies | `boolean` | (TCF v2.0 only) Defines whether or not this pageview is in GDPR scope. | |
-| gdpr.consentData.getTCData.purpose.consents | `Object` | (TCF v2.0 only) An object representing the user's consent status for specific purpose IDs. | |
-| gdpr.consentData.getTCData.purpose.legitimateInterests | `Object` | (TCF v2.0 only) An object representing the user's legitimate interest status for specific purpose IDs. | |
-| gdpr.consentData.getTCData.vendor.consents | `Object` | (TCF v2.0 only) An object representing the user's consent status for specific vendor IDs. | |
-| gdpr.consentData.getTCData.vendor.legitimateInterests | `Object` | (TCF v2.0 only) An object representing the user's legitimate interest status for specific vendors IDs. | |
-| gdpr.consentData.getConsentData.gdprApplies | `boolean` | (TCF v1.1 only) Defines whether or not this pageview is in GDPR scope. | |
-| gdpr.consentData.getConsentData.hasGlobalScope | `boolean` | (TCF v1.1 only) True if consent data is global, false if it's publisher specific. | |
-| gdpr.consentData.getConsentData.consentData | `string` | (TCF v1.1 only) Encoded TCF v1.1 string. | |
-| gdpr.consentData.getVendorConsents.metadata | `string` | (TCF v1.1 only) Encoded TCF v1.1 string. | |
-
-{: .alert.alert-info :}
-NOTE: The `allowAuctionWithoutConsent` parameter supported for TCF v1.1 refers to the entire consent string, not to any individual consent option. Prebid.js does not parse the GDPR consent string, so it doesn't know if the user has consented to any particular action.
+| gdpr.consentData.getTCData.tcString | `string` | Base64url-encoded TCF v2.0 string with segments. | |
+| gdpr.consentData.getTCData.addtlConsent | `string` | Additional consent string if available from the cmp TCData object | |
+| gdpr.consentData.getTCData.gdprApplies | `boolean` | Defines whether or not this pageview is in GDPR scope. | |
+| gdpr.consentData.getTCData.purpose.consents | `Object` | An object representing the user's consent status for specific purpose IDs. | |
+| gdpr.consentData.getTCData.purpose.legitimateInterests | `Object` | An object representing the user's legitimate interest status for specific purpose IDs. | |
+| gdpr.consentData.getTCData.vendor.consents | `Object` | An object representing the user's consent status for specific vendor IDs. | |
+| gdpr.consentData.getTCData.vendor.legitimateInterests | `Object` | An object representing the user's legitimate interest status for specific vendors IDs. | |
{: .alert.alert-info :}
NOTE: The `purpose` and `vendor` objects are required if you are using the `gdprEnforcement` module. If the data is not included, your bid adpaters, analytics adapters, and/or userId systems will likely be excluded from the auction as Prebid will assume the user has not given consent for these entities.
@@ -165,54 +155,6 @@ Example 2: Static CMP using custom data passing.
});
{% endhighlight %}
-### TCF v1.1 Examples
-
-Example 1: IAB CMP using custom timeout and cancel-auction options.
-
-{% highlight js %}
- var pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
- pbjs.que.push(function() {
- pbjs.setConfig({
- consentManagement: {
- gdpr: {
- cmpApi: 'iab',
- timeout: 8000,
- allowAuctionWithoutConsent: false
- }
- }
- });
- });
-{% endhighlight %}
-
-Example 2: Static CMP using custom data passing.
-
-{% highlight js %}
- var pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
- pbjs.que.push(function() {
- pbjs.setConfig({
- consentManagement: {
- gdpr: {
- cmpApi: 'static',
- allowAuctionWithoutConsent: false,
- consentData: {
- getConsentData: {
- 'gdprApplies': true,
- 'hasGlobalScope': false,
- 'consentData': 'BOOgjO9OOgjO9APABAENAi-AAAAWd7_______9____7_9uz_Gv_r_ff_3nW0739P1A_r_Oz_rm_-zzV44_lpQQRCEA'
- },
- getVendorConsents: {
- 'metadata': 'BOOgjO9OOgjO9APABAENAi-AAAAWd7_______9____7_9uz_Gv_r_ff_3nW0739P1A_r_Oz_rm_-zzV44_lpQQRCEA',
- ...
- }
- }
- }
- }
- });
- });
-{% endhighlight %}
-
## Build the Package
Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). To include the consent management module, an additional option must be added to the **gulp build** command:
@@ -226,9 +168,8 @@ You can also use the [Prebid.js Download](/download.html) page.
## Adapter Integration
{: .alert.alert-info :}
-Prebid.js adapters don't need to change to support TCF v2.0 if they already support TCF 1.1 -- the consent string is passed through the same bidrequest location. The bidder's endpoint, however, will need to change to support TCF v2.0. Once the endpoint supports TCF2, you can update the documentation.md file as described below above the table showing the list of TCF2-compliant bidders.
-If you are submitting changes to an adapter to support this approach, please also submit a PR to the [docs repo](https://github.com/prebid/prebid.github.io) to add the `gdpr_supported: true` variable to your respective page in the [bidders directory](https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders). **This will ensure that your adapter's name will automatically appear on the list of adapters supporting GDPR.**
+If you are submitting changes to an adapter to support TCF v2.0, please also submit a PR to the [docs repo](https://github.com/prebid/prebid.github.io) to add the `gdpr_supported: true` variable to your respective page in the [bidders directory](https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders). **This will ensure that your adapter's name will automatically appear on the list of adapters supporting GDPR.**
### Bidder Adapter GDPR Integration
@@ -254,7 +195,7 @@ Here is a sample of how the data is structured in the `bidderRequest` object:
**_consentString_**
-This field contains the user's choices on consent, represented as an encoded string value. In certain scenarios, this field might come to you with an `undefined` value; normally this happens when there was an error during the CMP interaction and the publisher had the config option `allowAuctionWithoutConsent` set to `true`. If you don't want to pass `undefined` to your system, you can check for this value and replace it with a valid consent string. See the *consent_required* code in the example below (under "gdprApplies") for a possible approach to checking and replacing values.
+This field contains the user's choices on consent, represented as an encoded string value. In certain scenarios, this field might come to you with an `undefined` value; normally this happens when there was an error (or timeout) during the CMP interaction and the publisher turned off GDPR enforcement. If you don't want to pass `undefined` to your system, you can check for this value and replace it with a valid consent string. See the *consent_required* code in the example below (under "gdprApplies") for a possible approach to checking and replacing values.
**_addtlConsent_**
@@ -330,7 +271,7 @@ Here are some things that publishers can do to control various activities:
Prebid.js and much of the ad industry rely on the IAB CMP standard for GDPR support, but there might be some publishers who have implemented a different approach to meeting the privacy rules. Those publishers can utilize Prebid.js and the whole header bidding ecosystem by building a translation layer between their consent method and the IAB method.
At a high level, this could be done as follows:
-1. Build a `window.__cmp()` function, which will be seen by Prebid.
+1. Build a `window.__tcfapi()` function, which will be seen by Prebid.
2. If SafeFrames are in use, build a message receiver function.
3. Format consent data in a string according to the [IAB standard](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework).
@@ -339,17 +280,15 @@ Below is sample code for implementing the stub functions. Sample code for format
{% highlight js %}
var iabConsentData; // build the IAB consent string
var gdprApplies; // true if gdpr applies to the user, else false
-var hasGlobalScope; // true if consent data was retrieved globally
var responseCode; // false if there was an error, else true
-var cmpLoaded; // true if iabConsentData was loaded and processed
(function(window, document) {
function addFrame() {
- if (window.frames['__cmpLocator'])
+ if (window.frames['____tcfapiLocator'])
return;
if ( document.body ) {
var body = document.body,
iframe = document.createElement('iframe');
- iframe.name = '__cmpLocator';
+ iframe.name = '____tcfapiLocator';
iframe.style.display = 'none';
body.appendChild(iframe);
} else {
@@ -364,11 +303,11 @@ var cmpLoaded; // true if iabConsentData was loaded and processed
if ( msgIsString ) {
json = JSON.parse(json);
}
- var call = json.__cmpCall;
+ var call = json.__tcfapiCall;
if (call) {
- window.__cmp(call.command, call.parameter, function(retValue, success) {
+ window.__tcfapi(call.command, call.parameter, function(retValue, success) {
var returnMsg = {
- __cmpReturn: {
+ __tcfapiReturn: {
returnValue: retValue, success: success, callId: call.callId
}
};
@@ -378,19 +317,15 @@ var cmpLoaded; // true if iabConsentData was loaded and processed
} catch (e) {} // do nothing
}
var cmpFunc = function(command, version, callback) {
- if (command === 'ping') {
- callback({gdprAppliesGlobally: gdprApplies, cmpLoaded: cmpLoaded}, responseCode);
- } else if (command === 'getConsentData') {
- callback({consentData: iabConsentData, gdprApplies: gdprApplies, hasGlobalScope: hasGlobalScope}, responseCode);
- } else if (command === 'getVendorConsents') {
- callback({metadata: iabConsentData, gdprApplies: gdprApplies, hasGlobalScope: hasGlobalScope}, responseCode);
+ if (command === 'addEventListener') {
+ callback({eventStatus: 'tcloaded', tcString: iabConsentData, gdprApplies}, responseCode)
} else {
- callback(undefined, false);
+ callback(undefined, false);
}
};
- if ( typeof (__cmp) !== 'function' ) {
- window.__cmp = cmpFunc;
- window.__cmp.msgHandler = cmpMsgHandler;
+ if ( typeof (__tcfapi) !== 'function' ) {
+ window.__tcfapi = cmpFunc;
+ window.__tcfapi.msgHandler = cmpMsgHandler;
if ( window.addEventListener ) {
window.addEventListener('message', cmpMsgHandler, false);
} else {
@@ -403,7 +338,7 @@ var cmpLoaded; // true if iabConsentData was loaded and processed
#### Explanation of Parameters
**_iabConsentData_**
-For instructions on how to generate the IAB consent string see the [IAB CMP 1.1 Spec](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework) and [IAB Consent String SDK](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/tree/master/Consent%20String%20SDK).
+For instructions on how to generate the IAB consent string see the [IAB CMP 2 Spec](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework) and [IAB Consent String SDK](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/tree/master/Consent%20String%20SDK).
**_gdprApplies_**
Use the following values in the _gdprApplies_ field:
@@ -411,15 +346,9 @@ Use the following values in the _gdprApplies_ field:
- False: It's known that the user is outside the EEA.
- Leave the attribute unspecified if user's location is unknown.
-**_hasGlobalScope_**
-This should be set to true if consent data was retrieved from global "euconsent" cookie, or it was publisher-specific. For general purpose, set this to false.
-
**_responseCode_**
This should be false if there was some error in the consent data; otherwise set to true. False is the same as calling the callback with no parameters.
-**_cmpLoaded_**
-This should be be set to true once the parameters listed above are processed.
-
## Adapters Supporting GDPR
Bidders on this list have self-declared their GDPR support in their https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders md file by adding "gdpr_supported: true".
diff --git a/dev-docs/modules/consentManagementUsp.md b/dev-docs/modules/consentManagementUsp.md
index c365dd0ce5..b1f7c26fe1 100644
--- a/dev-docs/modules/consentManagementUsp.md
+++ b/dev-docs/modules/consentManagementUsp.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: Consent Management - US Privacy
-description: Module to consume and distribute US Privacy information to bidder adapters
+description: If you have users in California, this module works with your Consent Management Platform to pass CCPA/US-Privacy data to bidders.
module_code : consentManagementUsp
display_name : Consent Management - US Privacy
enable_download : true
+recommended: true
sidebarType : 1
---
@@ -26,7 +27,7 @@ sidebarType : 1
This consent management module is designed to support the California Consumer Privacy Act ([CCPA](https://www.iab.com/guidelines/ccpa-framework/)). The IAB has generalized these guidelines to cover future regulations, referring to the feature as "US Privacy."
-This module works with an IAB-compatible US Privacy API (USP-API) to fetch an encoded string representing the user's notice and opt-out choices and make it available for adapters to consume and process.
+This module works with an IAB-compatible US Privacy API (USP-API) to fetch an encoded string representing the user's notice and opt-out choices and make it available for adapters to consume and process. In Prebid 7+; the module defaults to working with an IAB-compatible US Privacy API; in prior versions, the module had to be configured to be in effect.
{: .alert.alert-info :}
See also the [Prebid Consent Management - GDPR Module](/dev-docs/modules/consentManagement.html) for supporting the EU General Data Protection Regulation (GDPR)
@@ -37,20 +38,28 @@ Here's a summary of the interaction process:
2. Incorporate this data into the auction objects for adapters to collect.
3. Proceed with the auction.
-In the the case of a new user, the USP-API will generally respond only after there is notice and opt-out status information available (i.e., the user has made their choices).
-Making these selections can take some time for the average user, so the module provides timeout settings.
+The IAB USP-API will respond immediately if it is available. The module timeout settings are not related to user selection, but only to API availability.
+If the timeout period expires or an error from the USP-API is thrown, the auction proceeds without a US Privacy string attached.
-If the timeout period expires or an error from the USP-API is thrown, the auction proceeds without the user's notice and opt-out status information.
+ The string has four characters:
+
+{: .table .table-bordered .table-striped }
+| String Component | Values |
+| --- | --- |
+| 1) Specification Version| 1|
+| 2) Explicit Notice/Opportunity to Opt Out| (N = No,Y = Yes,â = Not Applicable)|
+| 3) Has user opted-out of the sale of his or her personal information?| (N = No,Y = Yes,â = Not Applicable)|
+| 4) Publisher is a signatory to the IAB Limited Service Provider Agreement| (N = No,Y = Yes,â = Not Applicable)|
## Page Integration
To utilize this module, software that provides the [USP-API](https://github.com/InteractiveAdvertisingBureau/USPrivacy/blob/master/CCPA/USP%20API.md) must to be implemented on the site to interact with the user and obtain their notice and opt-out status.
-Though implementation details for the USP-API are not covered by Prebid.org, we do recommend to that you place the code before the Prebid.js code in the head of the page in order to ensure the framework is loaded before the Prebid code executes.
+Though implementation details for the USP-API are not covered by Prebid.org, we do recommend to that you place the code before the Prebid.js code in the head of the page in order to ensure the framework is loaded before the Prebid code executes. Many publishers who ensure the prior availability of the `__uspapi` set the timeout parameter to zero.
-Once the USP-API is implemented, simply include this module into your build and add a `consentManagement` object in the `setConfig()` call. Adapters that support this feature will then be able to retrieve the notice and opt-out status information and incorporate it in their requests.
+Once the USP-API is implemented, simply include this module into your build and add a `consentManagement` object in the `setConfig()` call. Without configuration, Prebid will throw a warning that the module is unconfigured, and will proceed with the default configuration parameter `cmpApi` as 'iab'. Adapters that support this feature will then be able to retrieve the notice and opt-out status information and incorporate it in their requests.
Here are the parameters supported in the `consentManagement` object:
@@ -59,13 +68,16 @@ Here are the parameters supported in the `consentManagement` object:
| --- | --- | --- | --- |
| usp | `Object` | | |
| usp.cmpApi | `string` | The USP-API interface that is in use. Supported values are **'iab'** or **'static'**. Static allows integrations where IAB-formatted strings are provided in a non-standard way. Default is `'iab'`. | `'iab'` |
-| usp.timeout | `integer` | Length of time (in milliseconds) to allow the USP-API to obtain the CCPA string. Default is `10000`. | `10000` |
+| usp.timeout | `integer` | Length of time (in milliseconds) to allow the USP-API to obtain the CCPA string. Default is `50`. | `50` |
| usp.consentData | `Object` | An object representing the CCPA notice and opt-out status data being passed directly; only used when cmpApi is 'static'. Default is `undefined`. | |
{: .alert.alert-info :}
Note that the term 'CMP' (Consent Management Platform) was chosen in Prebid to keep the interface similar
to the GDPR implementation, though US-Privacy doesn't specifically use that term.
+
+
+
### Examples
Example 1: Support both US Privacy and GDPR
@@ -89,7 +101,7 @@ Example 1: Support both US Privacy and GDPR
});
{% endhighlight %}
-Example 2: Support US Privacy
+Example 2: Support US Privacy; timeout the api availability at zero because it is always available if it applies
{% highlight js %}
var pbjs = pbjs || {};
@@ -99,14 +111,14 @@ Example 2: Support US Privacy
consentManagement: {
usp: {
cmpApi: 'iab',
- timeout: 100 // US Privacy timeout 100ms
+ timeout: 0 // US Privacy timeout 100ms
}
}
});
});
{% endhighlight %}
-Example 3: Static CMP using custom data passing.
+Example 3: Static CMP using custom data passing. Placing this config call in the command queue before loading Prebid is important to ensure the string is available before Prebid begins making external calls.
{% highlight js %}
var pbjs = pbjs || {};
@@ -127,6 +139,26 @@ Example 3: Static CMP using custom data passing.
});
{% endhighlight %}
+Example 4: Static CMP with USP string set to does not apply for all fields, which may be useful to prevent excessive interaction with the `__uspapi` outside of the geographic scope. Placing this config call in the command queue before loading Prebid is important to ensure it is available early.
+
+{% highlight js %}
+ var pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+ pbjs.que.push(function() {
+ pbjs.setConfig({
+ consentManagement: {
+ usp: {
+ cmpApi: 'static',
+ consentData: {
+ getUSPData: {
+ uspString: '1---'
+ }
+ }
+ }
+ }
+ });
+ });
+{% endhighlight %}
## Build the Package
Follow the basic build instructions in the GitHub Prebid.js repo's main [README](https://github.com/prebid/Prebid.js/blob/master/README.md). To include the consent management module, an additional option must be added to the the **gulp build** command:
diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md
index 5f51829cf8..bc8dd3562d 100644
--- a/dev-docs/modules/currency.md
+++ b/dev-docs/modules/currency.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Currency
-description: Converts bids to the ad server currency
+description: Converts bid currency into ad server currency based on data in a supplied exchange rate file.
module_code : currency
display_name : Currency
enable_download : true
diff --git a/dev-docs/modules/dchain.md b/dev-docs/modules/dchain.md
new file mode 100644
index 0000000000..2106862079
--- /dev/null
+++ b/dev-docs/modules/dchain.md
@@ -0,0 +1,89 @@
+---
+layout: page_v2
+page_type: module
+title: Module - Demand Chain Object
+description: Validates the Demand Chain object, provided by bidders, stored in the Prebid bid object.
+module_code : dchain
+display_name : Demand Chain Object
+enable_download : true
+sidebarType : 1
+---
+
+# Demand Chain Object Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+Publishers that interact with bidders that support the [IAB Buyers.json and DemandChain Object Specification](https://iabtechlab.com/buyers-json-demand-chain/) may ensure the incoming dchain object complies to the IAB specification, as well as automatically representing the Prebid bidder in the buying process. Including this dchain module can address these concerns and perform the needed tasks automatically for any DChain compliant bidder.
+
+## How to Use the Module
+
+First, build the dchain module into your Prebid.js package:
+```
+gulp build --modules=dchain,...
+```
+
+The module will then automatically perform validations on the dchain data, provided by compliant bidders, stored in the Prebid bid object. Assuming the object is present and valid, the module will also include a final node to the dchain object to represent the Prebid.js bidder in its part of the process.
+
+## DChain Config Syntax
+
+{: .table .table-bordered .table-striped }
+| DChain Param | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| validation | optional | string | `'strict'`: In this mode, dchain object will not be accepted by Prebid.js if it is invalid. Errors are thrown for invalid dchain object. `'relaxed'`: Errors are thrown for an invalid dchain object but the invalid dchain object is still accpeted. `'off'`: No validations are performed and dchain object is accepted as-is. The default value is `'strict'`. | 'strict' |
+
+For example:
+```
+pbjs.setConfig({
+ "dchain": {
+ "validation": "strict"
+ }
+});
+```
+
+## Adapter Information
+
+Adapters who choose to support DChain should assign their ad server's IAB compliant dchain config object to the `bid.meta.dchain` field when creating their Prebid.js bidresponse object. When the module is enabled, this dchain object will be evaluated per the publisher's config settings.
+
+```
+bid.meta.dchain: {
+ "complete": 0,
+ "ver": "1.0",
+ "ext": {...},
+ "nodes": [
+ ...,
+ {
+ "asi": "domain.com",
+ "bsid": "123",
+ "name": "companyname",
+ ...
+ },
+ ...]
+}
+```
+
+## Adapters Supporting the dchain Module
+
+{% assign bidder_pages = site.pages | where: "layout", "bidder" %}
+
+
+{% for page in bidder_pages %}
+
+ {{ page.title }}
+
+{% endfor %}
+
+
+
+
+
+
+## Further Reading
+
+- [IAB Buyers.json and DemandChain Object Specification](https://iabtechlab.com/buyers-json-demand-chain/)
diff --git a/dev-docs/modules/debugging.md b/dev-docs/modules/debugging.md
new file mode 100644
index 0000000000..23538a64ff
--- /dev/null
+++ b/dev-docs/modules/debugging.md
@@ -0,0 +1,153 @@
+---
+layout: page_v2
+page_type: module
+title: Module - Debugging
+description: Debugging tools to intercept bid requests and mock their response
+module_code : debugging
+display_name : Debugging
+enable_download : true
+sidebarType : 1
+---
+
+# Debugging module
+
+This module allows to "intercept" bids and replace their contents with arbitrary data for the purposes of testing and development.
+
+Bids intercepted in this way are never seen by bid adapters or their backend SSPs, but they are nonetheless injected into the auction as if they originated from them.
+
+{: .pb-alert .pb-alert-warning :}
+For convenience, `debugging` configuration is persisted to the browser's session storage, so that you may type `pbjs.setConfig({debugging: ...})` in the console and reload the page to immediately see the effects. This means that you need to remember to **deactivate debuggging (or clear session storage) when you are done**.
+
+
+### Usage example
+
+The following will intercept all bids for the ad unit with code "test-div", and replace them with mocks that have `cpm: 10`:
+
+```javascript
+pbjs.setConfig({
+ debugging: {
+ enabled: true,
+ intercept: [
+ {
+ when: {
+ // intercept all bids that have adUnitCode === 'test-div'
+ adUnitCode: 'test-div',
+ },
+ then: {
+ // mock their response with sane defaults and `cpm: 10`
+ cpm: 10
+ }
+ },
+ ]
+ }
+});
+```
+
+## Intercept rules
+
+`intercept` is a list of objects each containing the following:
+
+{: .table .table-bordered .table-striped }
+|Property |Type |Required? |Description|
+|---------+------------------+----------+----------------------------------------------------------------------------------------------|
+|`when` |Function or Object|yes |[Match rule](#match) - decides which bids should be intercepted by this rule |
+|`then` |Function or Object|no |[Replace rule](#replace) - decides the contents of the bids that are intercepted by this rule |
+|`options`|Object |no |[Rule options](#options) |
+
+Rules are evaluated on each bid in the order they are provided: the first one that has a matching `when` definition takes the bid out of the normal auction flow and replaces it according to its `then` definition.
+
+
+### Match rules
+
+The match rule can be provided as a function that takes the bid request as its only argument and returns `true` if the bid should be intercepted, `false` otherwise. The [example above](#example) could be written as:
+
+```javascript
+pbjs.setConfig({
+ debugging: {
+ enabled: true,
+ intercept: [
+ {
+ when: (bidRequest) => bidRequest.adUnitCode === 'test-div',
+ then: {
+ cpm: 10
+ }
+ }
+ ]
+ }
+})
+```
+
+Alternatively, the rule can be expressed as an object, and it matches if for each `key`-`value` pair:
+
+ - `bidRequest[key] === value`, or
+ - `value` is a function and `value(bidRequest[key])` is `true`, or
+ - `value` is a regular expression and it matches `bidRequest[key]`.
+
+To illustrate, these definitions are equivalent:
+
+```javascript
+{
+ when: {
+ adUnitCode: 'test-div'
+ }
+};
+{
+ when: {
+ adUnitCode: (code) => code === 'test-div'
+ }
+};
+{
+ when: {
+ adUnitCode: /^test-div$/
+ }
+};
+```
+
+
+### Replace rules
+
+The replace rule can be provided as a function that takes the bid request as its only argument and returns an object with the desired response properties. The [first example above](#example) could be written as:
+
+```javascript
+pbjs.setConfig({
+ debugging: {
+ enabled: true,
+ intercept: [
+ {
+ when: {
+ adUnitCode: 'test-div',
+ },
+ then: (bidRequest) => ({cpm: 10})
+ },
+ ]
+ }
+});
+```
+
+Alternatively, the rule can be expressed as an object, and its `key`-`value` pairs will appear in the response as follows:
+
+- if `value` is a function, then `bidResponse[key]` will be set to `value(bidRequest)`;
+- otherwise, `bidResponse[key]` will be set to `value`.
+
+To illustrate, the following definitions are equivalent:
+
+```javascript
+{
+ then: {
+ cpm: 10
+ }
+};
+{
+ then: {
+ cpm: (bidRequest) => 10
+ }
+}
+```
+
+
+### Rule options
+
+{: .table .table-bordered .table-striped }
+|Property |Type |Default value |Description |
+|---------+------------------+--------------+------------------------------------------------------------------------------------------------------------------------|
+|`delay` |Number |0 |Delay (in milliseconds) before intercepted bids are injected into the auction. Can be used to simulate network latency. |
diff --git a/dev-docs/modules/dfp_express.md b/dev-docs/modules/dfp_express.md
index 598fb1c126..fef264c9db 100644
--- a/dev-docs/modules/dfp_express.md
+++ b/dev-docs/modules/dfp_express.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: Module - Google Ad Manager Express
-description: Simplified installation mechanism for publishers that have Google Ad Manager in their pages
+description: A simplified installation mechanism for publishers that have Google Publisher Tag (GPT) ad calls in their pages.
module_code : express
display_name : Google Ad Manager Express
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/dfp_video.md b/dev-docs/modules/dfp_video.md
index 57a3ff9bc2..e9219ac3b6 100644
--- a/dev-docs/modules/dfp_video.md
+++ b/dev-docs/modules/dfp_video.md
@@ -2,26 +2,27 @@
layout: page_v2
page_type: module
title: Module - Google Ad Manager Video
-description: Addition of DFP Video to the Prebid package
+description: Required for serving instream video through Google Ad Manager.
module_code : dfpAdServerVideo
-display_name : DFP Video
+display_name : Google Ad Manager Video Support
enable_download : true
+vendor_specific: true
sidebarType : 1
---
-# DFP Video
+# Google Ad Manager Video
{:.no_toc}
-This module is required to use the Prebid Instream video examples with DFP Adserver. For instructions showing how to add this module to Prebid.js, see below.
+This module is required to use the Prebid Instream video examples with Google Ad Manager. For instructions showing how to add this module to Prebid.js, see below.
### Step 1: Prepare the base Prebid file as usual
The standard options:
- Build from a locally-cloned git repo
-- Receive the email package from the Prebid [Download]({{site.baseurl}}/download.html) page
+- Receive the email package from the Prebid [Download](/download.html) page
### Step 2: Integrate into your prebid.js configuration
@@ -29,4 +30,4 @@ The method exposes the [`pbjs.adServers.dfp.buildVideoUrl`]({{site.baseurl}}/dev
## Further Reading
-+ [Show Video Ads with DFP]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html)
++ [Show Video Ads with GAM](/dev-docs/show-video-with-a-dfp-video-tag.html)
diff --git a/dev-docs/modules/dgkeywordRtdProvider.md b/dev-docs/modules/dgkeywordRtdProvider.md
index 2153cddc64..217971cc31 100644
--- a/dev-docs/modules/dgkeywordRtdProvider.md
+++ b/dev-docs/modules/dgkeywordRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : dgkeywordRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md
index 833b8c88e7..3a8d60a0c1 100644
--- a/dev-docs/modules/enrichmentFpdModule.md
+++ b/dev-docs/modules/enrichmentFpdModule.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: Module - First Party Data Enrichment
-description: Enriches First Party Data
+description: Injects additional data into the auction stream, including: domain, keywords, and page url.
module_code : enrichmentFpdModule
display_name : First Party Data Enrichment
enable_download : true
+recommended: true
sidebarType : 1
---
@@ -31,22 +32,17 @@ pbjs.setConfig({
## How it works
-When the first auction on the page is run, this module merges a number of values into the `ortb2` object. Specific details below.
-
-If the publisher needs to refresh the enriched FPD after the first auction, this can be done using a function provided by this module:
-
-```
-pbjs.refreshFpd();
-```
+At the beginning of each auction, this module merges a number of values into the `ortb2` [requestBids parameter](/dev-docs/publisher-api-reference/requestBids.html). Specific details below.
## Enrichments
{: .table .table-bordered .table-striped }
| Page Source | ortb2 field | Notes |
|---+---+---|
-| page URL | site.page | Uses pbjs getRefererInfo().canonicalUrl |
-| referer URL | site.ref | Uses pbjs getRefererInfo().referer |
-| domain | site.domain | Pulled from the getRefererInfo().canonicalUrl, the host domain is used, with www dropped. |
+| page URL | site.page | Uses pbjs getRefererInfo().page |
+| referer URL | site.ref | Uses pbjs getRefererInfo().ref |
+| host domain | site.domain | Pulled from the getRefererInfo().page the host domain is used with the www component dropped. |
+| aggregated domain | site.publisher.domain | The highest level domain in which cookies can be set. |
| viewport width | device.w | Hunts for window.innerWidth, window.document.documentElement.clientWidth, window.document.body.clientWidth |
| viewport height | device.w | Hunts for window.innerHeight, window.document.documentElement.clientHeight, window.document.body.clientHeight |
| meta keywords | site.keywords | Looks for a meta tag. e.g. |
diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md
index 054907fa5f..11246f2e6c 100644
--- a/dev-docs/modules/floors.md
+++ b/dev-docs/modules/floors.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Price Floors
-description: Determine and enforce auction price floors
+description: Configure and enforce minimum bids.
module_code : priceFloors
display_name : Price Floors
enable_download : true
@@ -17,12 +17,11 @@ sidebarType : 1
## Overview
-The Floors module provides an open source framework in Prebid for Publishers to configure Prebid price floors on their own or to work with a vendor who can provide floors.
+The Price Floors Module provides an open source framework in Prebid for Publishers to configure Prebid price floors on their own or to work with a vendor who can provide floors.
A âfloorâ is defined as the lowest CPM price a bid will need to meet for each Prebid auction. Itâs a way for publishers to signal to bidders the price to beat, thereby protecting the value of their inventory.
-The module provides several ways for Prebid floors to be defined, that are used by bidder adapters to read floors and enforced on bid responses in any supported currency. The floors utilized by the Prebid.js floors module are defined by one or more set of rules containing any or all of the following dimensions:
-
+The module provides several ways for Prebid floors to be defined, that are used by bidder adapters to read floors and enforced on bid responses in any supported currency. The floors utilized by the Price Floors Module are defined by one or more set of rules containing any or all of the following dimensions:
- AdUnit
- GPT Slot Name
@@ -32,31 +31,34 @@ The module provides several ways for Prebid floors to be defined, that are used
- "custom dimensions"
{: .alert.alert-warning :}
-When using GPT Slot name, the gpt library is required to load first. Failing to do so may yield unexpected results and could impact revenue performance.
+When using GPT Slot name, the GPT library is required to load first. Failing to do so may yield unexpected results and could impact revenue performance.
-The entire set of Prebid floors selected by the Floors Module for a given auction is called a âRule Locationâ. A Rule Location can be any one of:
+The entire set of floors selected by the Price Floors Module for a given auction is called a "Rule Location". A Rule Location can be any one of:
1. Within the AdUnit (AdUnit)
2. Within setConfig (Package)
3. Retrieved from a real-time data service (Dynamic)
-
{: .alert.alert-info :}
-Even though floors are defined with five pre-configured dimensions, itâs possible to extend the list of dimensions to attributes of the page, user, auction or other data by supplying a dimension matching function. For example, a publisher can provide a matching function that returns the device type to allow the price floor module to use device type as an attribute within a prebid floor rules file.
+Even though floors are defined with five pre-configured dimensions, itâs possible to extend the list of dimensions to attributes of the page, user, auction or other data by supplying a dimension matching function. For example, a publisher can provide a matching function that returns the device type to allow the Floor module to use device type as an attribute within a prebid floor rules file.
+Note that Prebid Server also supports a [floors feature](/prebid-server/features/pbs-floors.html) that is very similar to the Prebid.js module. They both share Schema 2, and there are PBS-specific notes below.
+The expectation with the Prebid Server floors feature is that
+Publishers will use it mainly for mobile app and AMP scenarios.
+Web sites running Prebid.js will utilize this client-side module.
## How it Works
-There are several places where the Floor module changes the behavior of the Prebid.js auction process. Below is a diagram describing the general flow of the Floors Module:
+There are several places where the Floor module changes the behavior of the Prebid.js auction process. Below is a diagram describing the general flow of the Price Floors Module:
![Floors Module Flow](/assets/images/floors/floors_flow.png)
-1. When building the Prebid.js package, the Floors module (and any analytics adapters) needs to be included with 'gulp build --modules=priceFloors,...'
-2. As soon as the setConfig({floors}) call is initiated, the Floors Module will build an internal hash table for each auction derived from a Rule Location (one of Dynamic, setConfig or adUnit)
- - a. If an endpoint URL (a Dynamic Floor) is defined, the Floors Module will attempt to fetch floor data from the Floor Provider's endpoint. When requestBids is called, the Floors Module will delay the auction up to the supplied amount of time in floors.auctionDelay or as soon as the dynamic endpoint returns data, whichever is first.
-3. Bid Adapters are responsible for utilizing the getFloors() from the bidRequest object for each ad slot media type, size combination. The Floors Module will perform currency conversion if the bid adapter requests floors in a different currency from the defined floor data currency.
+1. When building the Prebid.js package, the Price Floors Module (and any analytics adapters) needs to be included with 'gulp build --modules=priceFloors,...'
+2. As soon as the setConfig({floors}) call is initiated, the Price Floors Module will build an internal hash table for each auction derived from a Rule Location (one of Dynamic, setConfig or adUnit)
+ - a. If an endpoint URL (a Dynamic Floor) is defined, the Price Floors Module will attempt to fetch floor data from the Floor Provider's endpoint. When requestBids is called, the Price Floors Module will delay the auction up to the supplied amount of time in floors.auctionDelay or as soon as the dynamic endpoint returns data, whichever is first.
+3. Bid Adapters are responsible for utilizing the getFloor() from the bidRequest object for each ad slot media type, size combination. The Price Floors Module will perform currency conversion if the bid adapter requests floors in a different currency from the defined floor data currency.
4. Bid Adapters will pass the floor values to their bidding endpoints, to request bids, responding with any bids that meet or exceed the provided floor
-5. Bid adapters will submit bids to back to Prebid core, where the Floors Module will perform enforcement on each bid
-6. The Floors Module will mark all bids below the floor as bids rejected. Prebid core will submit all eligible bids to the publisher ad server
- - a. The Floors module emits floor event / bid data to Analytics adapters to allow Floor Providers a feedback loop on floor performance for model training
+5. Bid adapters will submit bids to back to Prebid core, where the Price Floors Module will perform enforcement on each bid
+6. The Price Floors Module will mark all bids below the floor as bids rejected. Prebid core will submit all eligible bids to the publisher ad server
+ - a. The Price Floors Module emits floor event / bid data to Analytics adapters to allow Floor Providers a feedback loop on floor performance for model training
## Defining Floors
@@ -107,7 +109,7 @@ Below are some basic principles of ad unit floor definitions:
{% endhighlight %}
{: .alert.alert-info :}
-When defining floors at the adUnit level, the Floors Module requires the floors object to be defined in setConfig, even if the definition is an empty object as shown below: {% highlight js %}pbjs.setConfig({ floors: {} });{% endhighlight %}
+When defining floors at the adUnit level, the Price Floors Module requires the floors object to be defined in setConfig, even if the definition is an empty object as shown below: {% highlight js %}pbjs.setConfig({ floors: {} });{% endhighlight %}
Floor definitions are set in the âvaluesâ object containing one or more rules, where the rule is the criteria that needs to be met for that given ad unit, with an associated CPM floor. In the above example, the floors are enforced when the bid from a bidder matches the âmediaTypeâ and âsizeâ combination. Since many bid adapters are not able to ingest floors per size, a simpler setup can be:
@@ -126,7 +128,7 @@ floors: {
}
{% endhighlight %}
-For more advanced publisher setups, values can accept a â\*â to denote a catch all when a bid comes back that the floors module does not have an exact match and for bid adapters who are not able to use a floor per size, the bid adapter will automatically receive the â\*â ruleâs floor if available. Example setup can be:
+For more advanced publisher setups, values can accept a â\*â to denote a catch-all when a bid comes back that the Price Floors Module does not have an exact match and for bid adapters who are not able to use a floor per size, the bid adapter will automatically receive the â\*â ruleâs floor if available. Example setup can be:
{% highlight js %}
floors: {
@@ -191,7 +193,7 @@ pbjs.setConfig({
});
{% endhighlight %}
-By defining floor data with setConfig, the Floors module will map GPT ad slots to AdUnits as needed. It does this in the same way as the setTargetingForGPTAsync() function â first looking for an AdUnit.code that matches the slot name, then looking for an AdUnit.code that matches the div id of the named GPT slot.
+By defining floor data with setConfig, the Price Floors Module will map GPT ad slots to AdUnits as needed. It does this in the same way as the setTargetingForGPTAsync() function â first looking for an AdUnit.code that matches the slot name, then looking for an AdUnit.code that matches the div id of the named GPT slot.
Hereâs another example that includes more fields:
@@ -206,10 +208,10 @@ pbjs.setConfig({
fields: [ 'domain', 'gptSlot', 'mediaType', 'size']
},
values: {
- 'www.plublisher.com|/1111/homepage/top-rect|banner|300x250': 0.80,
- 'www.publisher.com|/1111/homepage/top-rect|video|300x250': 2.20,
- 'www.plublisher.com|/1111/homepage/left-nav|banner|300x250': 1.77,
- 'www.publisher.com|/1111/homepage/left-nav|video|300x250': 2.88
+ 'www.examplepub.com|/1111/homepage/top-rect|banner|300x250': 0.80,
+ 'www.examplepub.com|/1111/homepage/top-rect|video|300x250': 2.20,
+ 'www.examplepub.com|/1111/homepage/left-nav|banner|300x250': 1.77,
+ 'www.examplepub.com|/1111/homepage/left-nav|video|300x250': 2.88
...
}
}
@@ -240,7 +242,7 @@ pbjs.setConfig({
});
{% endhighlight %}
-The floors module is flexible to handle floors set in multiple locations. Like in the below example a publisher can configure Dynamic floors in addition to Package floors (in setConfig). While the floors module is only able to use one set of rules (either Package, adUnit or Dynamic) defined as a Floor Location, setting floors in the Package will be utilized when the Dynamic floors fail to return data or another error condition occurs with the Dynamic fetch.
+The Price Floors Module is flexible to handle floors set in multiple locations. Like in the below example a publisher can configure Dynamic floors in addition to Package floors (in setConfig). While the Price Floors Module is only able to use one set of rules (either Package, adUnit or Dynamic) defined as a Floor Location, setting floors in the Package will be utilized when the Dynamic floors fail to return data or another error condition occurs with the Dynamic fetch.
{% highlight js %}
pbjs.setConfig({
@@ -272,36 +274,40 @@ pbjs.setConfig({
## Floors Syntax
-The examples above covered several different scenarios where floors can be applied. Below we will cover the syntax and definition of the floors data schema. As of Prebid.js version 3.24, the Floors module supports a second data schema with the ability to add new schemas to future-proof the needs of additional design changes while keeping backwards compatibility.
+The examples above covered several different scenarios where floors can be applied. Below we will cover the syntax and definition of the floors data schema. As of Prebid.js version 3.24, the Price Floors Module supports a second data schema with the ability to add new schemas to future-proof the needs of additional design changes while keeping backwards compatibility.
### Schema 1
Schema 1 restricts floors providers or publishers to applying only one data group. To test more than one floor group, floor providers or publishers are required to reset the data set with new rules after each request bids.
+{: .alert.alert-info :}
+Note: if you're a dynamic floor provider service, your response must be
+a subset that will be merged under the 'data' object.
+
{: .table .table-bordered .table-striped }
| Param | Type | Description | Default |
|---+---+---+---+---|
-| floorMin | float | The mimimum CPM floor used by the Floors Module (as of 4.13). The Floors Module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | - |
+| floorMin | float | The mimimum CPM floor used by the Price Floors Module (as of 4.13). The Price Floors Module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | - |
| floorProvider | string | Optional atribute (as of prebid version 4.1) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - |
-| enforcement | object | Controls the enforcement behavior within the Floors Module.| - |
-| skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
-| enforcement.enforceJS | boolean | If set to true, the floors module will provide floors to bid adapters for bid request matched rules and suppress any bids not exceeding a matching floor. If set to false, the prebid floors module will still provide floors for bid adapters, there will be no floor enforcement.| true |
-| enforcement.enforcePBS | boolean | If set to true, the Prebid.js floors module will signal to Prebid Server to pass floors to itâs bid adapters and enforce floors. If set to false, the pbjs should still pass matched bid request floor data to PBS, however no enforcement will take place. | false |
+| enforcement | object | Controls the enforcement behavior within the Price Floors Module.| - |
+| skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Price Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
+| enforcement.enforceJS | boolean | If set to true, the Price Floors Module will provide floors to bid adapters for bid request matched rules and suppress any bids not exceeding a matching floor. If set to false, the Price Floors Module will still provide floors for bid adapters, there will be no floor enforcement.| true |
+| enforcement.enforcePBS | boolean | If set to true, the Price Floors Module will signal to Prebid Server to pass floors to itâs bid adapters and enforce floors. If set to false, the pbjs should still pass matched bid request floor data to PBS, however no enforcement will take place. | false |
| enforcement.floorDeals | boolean | Enforce floors for deal bid requests. | false |
-| enforcement.bidAdjustment | boolean | If true, the Floors Module will use the bidAdjustment function to adjust the floor per bidder. If false (or no bidAdjustment function is provided), floors will not be adjusted. Note: Setting this parameter to false may have unexpected results, such as signaling a gross floor when expecting net or vice versa. | true |
-| endpoint | object | Controls behavior for dynamically retrieving floors. | - |
+| enforcement.bidAdjustment | boolean | If true, the Price Floors Module will use the bidAdjustment function to adjust the floor per bidder. If false (or no bidAdjustment function is provided), floors will not be adjusted. Note: Setting this parameter to false may have unexpected results, such as signaling a gross floor when expecting net or vice versa. | true |
+| endpoint | object | Prebid.js only: controls behavior for dynamically retrieving floors. | - |
| endpoint.url | string | URL of endpoint to retrieve dynamic floor data. | - |
-| data | object (required) | Floor data used by the Floors Module to pass floor data to bidders and floor enforcement. | - |
+| data | object (required) | Floor data used by the Price Floors Module to pass floor data to bidders and floor enforcement. | - |
| data.floorProvider | string | Optional atribute (as of prebid version 4.2) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - |
| data.currency | string | Currency of floor data. Floor Module will convert currency where necessary. See Currency section for more details. | 'USD' |
-| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
-| data.floorsSchemaVersion | string | The Floors Module supports two versions of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the Floors Module will assume version 1 for the sake of backwards compatiblity. For schema version 2 see the next section. | 1 |
+| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Price Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
+| data.floorsSchemaVersion | integer | The module supports two versions of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatiblity. For schema version 2 see the next section. | 1 |
| data.modelVersion | string | Used by floor providers to train on model version performance. The expectation is a floor providerâs analytics adapter will pass the model verson back for algorithm training. | - |
-| data.modelTimestamp | int | Epoch timestamp associated with modelVersion. Can be used to track model creation of floor file for post auction analysis.| - |
+| data.modelTimestamp | integer | Epoch timestamp associated with modelVersion. Can be used to track model creation of floor file for post auction analysis.| - |
| data.schema | object |allows for flexible definition of how floor data is formatted. | - |
| data.schema.delimiter | string | Character separating the floor keys. | '\|' |
-| data.schema.fields | array of strings | Supported values are: gptSlot, adUnitCode, mediaType, size | - |
+| data.schema.fields | array of strings | Supported values are: gptSlot, adUnitCode, mediaType, size, domain | - |
| data.values | key / values | A series of attributes representing a hash of floor data in a format defined by the schema object. | - |
| data.values."rule key" | string | Delimited field of attribute values that define a floor. | - |
| data.values."rule floor value" | float | The floor value for this key. | - |
@@ -314,54 +320,63 @@ Schema 1 restricts floors providers or publishers to applying only one data grou
### Schema 2
-Schema 2 allows floors providers to A / B one or more floor groups, determined at auction time.
+Schema 2 allows floors providers to A/B-test one or more floor groups, determined at auction time.
-The following principles apply to schema 2:
-- The below attributes are required:
+The following principles apply to Schema 2:
+- These attributes are required:
- data.floorsSchemaVersion to be set to 2
- A valid modelGroups object must be set
- The field modelGroups.modelWeight is required for each model group
- - If one of the model weights is missing, no schema 2 floor will be set and the Floors Module will look in other locations for floor definitions
+ - If one of the model weights is missing, no schema 2 floor will be set and the Price Floors Module will look in other locations for floor definitions
- If common attributes are set in both the modelGroups and root level of the data object, modelGroups attributes prevail
- The Schema 2 data model can only be applied in Package level (i.e. directly in setConfig) or Dynamic level
-- Sampling weights are applied at the auction level. Each new auction the dice will be rolled
+- Sampling weights are applied at the auction level. Each new auction the dice will be rolled.
- If the data.modelGroups object and the data.values (schema 1 field) are set, the data.floorsSchemaVersion will dictate what schema version is applied
-
While some attributes are common in both schema versions, for completeness, all valid schema 2 attributes are provided:
+{: .alert.alert-info :}
+Note: if you're a dynamic floor provider service, your response must be
+a subset that will be merged under the 'data' object.
+
{: .table .table-bordered .table-striped }
| Param | Type | Description | Default |
|---+---+---+---+---|
-| floorMin | float | The mimimum CPM floor used by the Floors Module (as of 4.13). The Floors Module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | - |
+| floorMin | float | The mimimum CPM floor used by the module (as of 4.13). The module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | - |
+| floorMinCur | float | Prebid Server only: the currency used for the floorMin value. | - |
| floorProvider | string | Optional atribute (as of prebid version 4.1) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - |
-| enforcement | object | Controls the enforcement behavior within the Floors Module.| - |
-| skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
-| enforcement.enforceJS | boolean | If set to true, the floors module will provide floors to bid adapters for bid request matched rules and suppress any bids not exceeding a matching floor. If set to false, the prebid floors module will still provide floors for bid adapters, but there will be no floor enforcement.| true |
-| enforcement.enforcePBS | boolean | If set to true, the Prebid.js floors module will signal to Prebid Server to pass floors to itâs bid adapters and enforce floors. If set to false, Prebid.js should still pass matched bid request floor data to Prebid Server, however no enforcement will take place. | false |
+| skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail. | 0 |
+| enabled | boolean | Prebid Server only: provides a request level override to disable server-side floor activity. If there's server-side floor config, it must also be true in order for floor activity to take place. | true |
+| fetchStatus | string | Prebid Server only: this is a read-only field set by the Prebid-Server floors feature to let analytics adapters know whether the floors data used was dynamically fetched. | n/a |
+| skipped | boolean | Prebid Server only: this is a read-only field set by the Prebid-Server floors feature to let analytics adapters know whether the 'skipRate' feature was invoked. i.e. this value is 'true' when the floor activity has been turned off by the skipRate, and 'false' otherwise. | n/a |
+| location | string | Prebid Server only: this is a read-only field set by the Prebid-Server floors feature to let analytics adapters know where the floors data came from. Possible values are: 'request', 'fetch' or 'noData'. | n/a |
+| enforcement | object | Controls the enforcement behavior within the module.| - |
+| enforcement.enforceJS | boolean | If set to true, the module will provide floors to bid adapters for bid request matched rules and suppress any bids not exceeding a matching floor. If set to false, the module will still provide floors for bid adapters, but there will be no floor enforcement.| true |
+| enforcement.enforcePBS | boolean | If set to true, the module will signal to Prebid Server to pass floors to itâs bid adapters and enforce floors. If set to false, Prebid.js should still pass matched bid request floor data to Prebid Server, however no enforcement will take place. | false |
| enforcement.floorDeals | boolean | Enforce floors for deal bid requests. | false |
-| enforcement.bidAdjustment | boolean | If true, the Floors Module will use the bidAdjustment function to adjust the floor per bidder. If false (or no bidAdjustment function is provided), floors will not be adjusted. Note: Setting this parameter to false may have unexpected results, such as signaling a gross floor when expecting net or vice versa. | true |
+| enforcement.bidAdjustment | boolean | If true, the module will use the bidAdjustment function to adjust the floor per bidder. If false (or no bidAdjustment function is provided), floors will not be adjusted. Note: Setting this parameter to false may have unexpected results, such as signaling a gross floor when expecting net or vice versa. | true |
+| enforcement.enforceRate | integer | Prebid Server only: Defines a percentage for how often bid response enforcement activity should take place given that the floors feature is active. If the floors feature is skipped due to skipRate, this has no affect. For every non-skipped auction, this percent of them should be enforced: i.e. bids discarded. This feature lets publishers ease into enforcement in case bidders aren't adhering to floor rules. | 100 |
| endpoint | object | Controls behavior for dynamically retrieving floors. | - |
| endpoint.url | string | URL of endpoint to retrieve dynamic floor data. | - |
-| data | object (required) | Floor data used by the Floors Module to pass floor data to bidders and floor enforcement. | - |
+| data | object (required) | Floor data used by the module to pass floor data to bidders and floor enforcement. | - |
| data.floorProvider | string | Optional atribute (as of prebid version 4.2) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| - |
-| data.currency | string | Currency of floor data. Floors Module will convert currency where necessary. See Currency section for more details. | 'USD' |
-| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail.| 0 |
-| data.floorsSchemaVersion | string | The Floors Module supports two version of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the Floors Module will assume version 1 for the sake of backwards compatiblity.| 1 |
+| data.currency | string | Currency of floor data. The module will convert currency where necessary. See Currency section for more details. | 'USD' |
+| data.skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. If skipRate is supplied in both the root level of the floors object and within the data object, the skipRate configuration within the data object shall prevail.| 0 |
+| data.floorsSchemaVersion | string | The module supports two version of the data schema. Version 1 allows for only one model to be applied in a given data set, whereas Version 2 allows you to sample multiple models selected by supplied weights. If no schema version is provided, the module will assume version 1 for the sake of backwards compatiblity.| 1 |
| data.modelTimestamp | int | Epoch timestamp associated with modelVersion. Can be used to track model creation of floor file for post auction analysis.| - |
| data.modelGroups | array of objects | Array of model objects to be used for A/B sampling multiple models. This field is only used when data.floorsSchemaVersion = 2 | - |
| data.modelGroups[].currency | string | Currency of floor data. Floor Module will convert currency where necessary. See Currency section for more details. | 'USD' |
-| data.modelGroups[].skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the Floors Module is in floors mode. | 0 |
+| data.modelGroups[].skipRate | integer | skipRate is a random function whose input value is any integer 0 through 100 to determine when to skip all floor logic, where 0 is always use floor data and 100 is always skip floor data. The use case is for publishers or floor providers to learn bid behavior when floors are applied or skipped. Analytics adapters will have access to model version (if defined) when skipped is true to signal the module is in floors mode. | 0 |
| data.modelGroups[].modelVersion | string | Used by floor providers to train on model version performance. The expectation is a floor providerâs analytics adapter will pass the model verson back for algorithm training. | - |
-| data.modelGroups[].modelWeight | integer | Used by the Floors Module to determine when to apply the specific model. All weights will be normalized and appllied at runtime. Futher clarification will be provided in examples below. | - |
-| data.schema | object | Allows for flexible definition of how floor data is formatted. | - |
+| data.modelGroups[].modelWeight | integer | Used by the module to determine when to apply the specific model. All weights will be normalized and applied at runtime. Futher clarification will be provided in examples below. | - |
+| data.modelGroups[].schema | object | Allows for flexible definition of how floor data is formatted. | - |
| data.modelGroups[].schema.delimiter | string | Character separating the floor keys. | '\|' |
| data.modelGroups[].schema.fields | array of strings | Supported pre-defined values are: gptSlot, adUnitCode, mediaType, size | - |
| data.modelGroups[].values | key / values | A series of attributes representing a hash of floor data in a format defined by the schema object. | - |
| data.modelGroups[].values."rule key" | string | Delimited field of attribute values that define a floor. | - |
| data.modelGroups[].values."rule floor value" | float | The floor value for this key. | - |
| data.modelGroups[].default | float | Floor used if no matching rules are found. | - |
-| additionalSchemaFields | object | Object contain the lookup function to map custom schema.fields | - |
+| additionalSchemaFields | object | Object contain the lookup function to map custom schema.fields. Not supported by Prebid Server. | - |
| additionalSchemaFields."custom key" | string | custom key name | - |
| additionalSchemaFields."key map function" | function | Function used to lookup the value for that particular custom key | - |
@@ -370,65 +385,70 @@ While some attributes are common in both schema versions, for completeness, all
Model weights add up to 100 and are sampled at a 25%, 25%, 50% distribution. Additionally, each model group has diffirent schema fields:
{% highlight js %}
-{
- "currency": "EU",
- "skipRate": 20,
- "floorsSchemaVersion":2,
- "modelGroups": [
- {
- "modelWeight":25,
- "modelVersion": "Model1",
- "schema": {
- "fields": [ "domain", "gptSlot", "mediaType", "size" ]
- },
- "values": {
- "www.publisher.com|/1111/homepage/top-banner|banner|728x90": 1.00,
- "www.publisher.com|/1111/homepage/top-rect|banner|300x250": 1.20,
- "www.publisher.com|/1111/homepage/top-rect|banner|300x600": 1.80,
- ...
- "www.domain.com|/1111/homepage/top-banner|banner|728x90": 2.11
- ...
- "www.publisher.com|*|*|*": 0.80,
- },
- "default": 0.75
- },
- {
- "modelWeight": 25,
- "modelVersion": "Model2",
- "schema": {
- "fields": [ "domain", "mediaType", "size" ]
- },
- "values": {
- "www.publisher.com|banner|728x90": 1.00,
- "www.publisher.com|banner|300x250": 1.20,
- "www.publisher.com|banner|300x600": 1.80,
- ...
- "www.domain.com|banner|728x90": 2.11
- ...
- "www.publisher.com|*|*|*": 0.80,
- },
- "default": 0.75
- },
- {
- "modelWeight": 50,
- "modelVersion": "Model3",
- "schema": {
- "fields": [ "gptSlot", "mediaType", "size" ]
- },
- "values": {
- "/1111/homepage/top-banner|banner|728x90": 1.00,
- "/1111/homepage/top-rect|banner|300x250": 1.20,
- "/1111/homepage/top-rect|banner|300x600": 1.80,
- ...
- "/1111/homepage/top-banner|banner|728x90": 2.11
- ...
- "*|banner|*": 0.80,
- },
- "default": 0.75
- }
- ]
-
-}
+pbjs.setConfig({
+ floors: {
+ enforcement: { ... },
+ ...
+ data: {
+ "currency": "EU",
+ "skipRate": 20,
+ "floorsSchemaVersion":2,
+ "modelGroups": [
+ {
+ "modelWeight":25,
+ "modelVersion": "Model1",
+ "schema": {
+ "fields": [ "domain", "gptSlot", "mediaType", "size" ]
+ },
+ "values": {
+ "www.publisher.com|/1111/homepage/top-banner|banner|728x90": 1.00,
+ "www.publisher.com|/1111/homepage/top-rect|banner|300x250": 1.20,
+ "www.publisher.com|/1111/homepage/top-rect|banner|300x600": 1.80,
+ ...
+ "www.domain.com|/1111/homepage/top-banner|banner|728x90": 2.11
+ ...
+ "www.publisher.com|*|*|*": 0.80,
+ },
+ "default": 0.75
+ },
+ {
+ "modelWeight": 25,
+ "modelVersion": "Model2",
+ "schema": {
+ "fields": [ "domain", "mediaType", "size" ]
+ },
+ "values": {
+ "www.publisher.com|banner|728x90": 1.00,
+ "www.publisher.com|banner|300x250": 1.20,
+ "www.publisher.com|banner|300x600": 1.80,
+ ...
+ "www.domain.com|banner|728x90": 2.11
+ ...
+ "www.publisher.com|*|*|*": 0.80,
+ },
+ "default": 0.75
+ },
+ {
+ "modelWeight": 50,
+ "modelVersion": "Model3",
+ "schema": {
+ "fields": [ "gptSlot", "mediaType", "size" ]
+ },
+ "values": {
+ "/1111/homepage/top-banner|banner|728x90": 1.00,
+ "/1111/homepage/top-rect|banner|300x250": 1.20,
+ "/1111/homepage/top-rect|banner|300x600": 1.80,
+ ...
+ "/1111/homepage/top-banner|banner|728x90": 2.11
+ ...
+ "*|banner|*": 0.80,
+ },
+ "default": 0.75
+ }
+ ]
+ }
+ }
+});
{% endhighlight %}
*Example 2*
@@ -439,66 +459,69 @@ model2 = 50 -> 50 / (20 + 50) = 71% of auctions model 2 will be applied
Additionally skipRate is supplied at model group level where model1 will skip floors 20% of times when model1 is selected, whereas model2 will skip 50% of auctions when model2 is selected.
{% highlight js %}
-{
- "currency": "EU",
- "floorsSchemaVersion":2,
- "modelGroups": [
- {
- "modelWeight":25,
- "skipRate": 20,
- "modelVersion": "Model1",
- "schema": {
- "fields": [ "domain", "gptSlot", "mediaType", "size" ]
- },
- "values": {
- "www.publisher.com|/1111/homepage/top-banner|banner|728x90": 1.00,
- "www.publisher.com|/1111/homepage/top-rect|banner|300x250": 1.20,
- "www.publisher.com|/1111/homepage/top-rect|banner|300x600": 1.80,
- ...
- "www.domain.com|/1111/homepage/top-banner|banner|728x90": 2.11
- ...
- "www.publisher.com|*|*|*": 0.80,
- },
- "default": 0.75
- },
- {
- "modelWeight": 50,
- "skipRate": 50,
- "modelVersion": "Model2",
- "schema": {
- "fields": [ "gptSlot", "mediaType", "size" ]
- },
- "values": {
- "/1111/homepage/top-banner|banner|728x90": 1.00,
- "/1111/homepage/top-rect|banner|300x250": 1.20,
- "/1111/homepage/top-rect|banner|300x600": 1.80,
- ...
- "/1111/homepage/top-banner|banner|728x90": 2.11
- ...
- "*|banner|*": 0.80,
- },
- "default": 0.75
- }
- ]
-
-}
+pbjs.setConfig({
+ floors: {
+ enforcement: { ... },
+ ...
+ data: {
+ "currency": "EU",
+ "floorsSchemaVersion":2,
+ "modelGroups": [
+ {
+ "modelWeight":25,
+ "skipRate": 20,
+ "modelVersion": "Model1",
+ "schema": {
+ "fields": [ "domain", "gptSlot", "mediaType", "size" ]
+ },
+ "values": {
+ "www.publisher.com|/1111/homepage/top-banner|banner|728x90": 1.00,
+ "www.publisher.com|/1111/homepage/top-rect|banner|300x250": 1.20,
+ "www.publisher.com|/1111/homepage/top-rect|banner|300x600": 1.80,
+ ...
+ "www.domain.com|/1111/homepage/top-banner|banner|728x90": 2.11
+ ...
+ "www.publisher.com|*|*|*": 0.80,
+ },
+ "default": 0.75
+ },
+ {
+ "modelWeight": 50,
+ "skipRate": 50,
+ "modelVersion": "Model2",
+ "schema": {
+ "fields": [ "gptSlot", "mediaType", "size" ]
+ },
+ "values": {
+ "/1111/homepage/top-banner|banner|728x90": 1.00,
+ "/1111/homepage/top-rect|banner|300x250": 1.20,
+ "/1111/homepage/top-rect|banner|300x600": 1.80,
+ ...
+ "/1111/homepage/top-banner|banner|728x90": 2.11
+ ...
+ "*|banner|*": 0.80,
+ },
+ "default": 0.75
+ }
+ ]
+ }
+ }
+});
{% endhighlight %}
## Custom Schema Fields
-Custom schema fields are fields the Floors Module does not support out of the box. To use a custom schema field, one needs to perform twp steps:
+Out of the box, the Price Floors Module only supports looking up floors by AdUnit, GPT Slot, MediaType, ad size, and domain. Custom schema fields can be added to support other lookup dimensions. Here are the steps:
-1. Create lookup function to give the Floors Module context of the value of custom fields for that given auction
+1. Create a lookup function to give context of the value of custom fields for that given auction
1. Define, Set and Map Custom Schema Attributes
### Create Lookup Function
-Create a function to allow the Floors Module to understand context of a given auction. In the below example, we must create a lookup function to give the Floors Module what deviceType this auction is.
-
-Here is an example lookup function:
+Create a function to allow the module to understand context of a given auction. In the below example, a lookup function provides details about what deviceType this auction is for.
+e.g.
{% highlight js %}
-
function deviceTypes (bidRequest, bidResponse) {
//while bidRequest and bidResponse are not required for this function, they are available for custom attribute mapping
@@ -517,9 +540,9 @@ Here is an example lookup function:
### Define, Set and Map Custom Schema Attributes
-After defining a lookup function for the given context of the auction, the custom schema field(s) need to be defined in the `floors.schema.fields` array. Once your custom field is defined you can assign rule values in `floors.data.values` derived from said field(s). The last step would be to supply the lookup function(s) that map from each custom field to a value of the context wthin that auction by using the `floors.additionalSchemaFields` attribute as seen below.
+After defining a lookup function for the given context of the auction, the custom schema field(s) need to be defined in the `floors.schema.fields` array. Once your custom field is defined you can assign rule values in `floors.data.values` derived from these field(s). The last step would be to supply the lookup function(s) that map from each custom field to a value of the context wthin that auction by using the `floors.additionalSchemaFields` attribute as seen below.
-In the below example, `deviceType` is a custom field not currently supported by default in the Floors Module whose values are one of "mobile", "desktop" or "tablet".
+In the below example, `deviceType` is a custom field not currently supported by default in the Price Floors Module whose values are one of "mobile", "desktop" or "tablet".
{% highlight js %}
@@ -554,28 +577,26 @@ In the below example, `deviceType` is a custom field not currently supported by
{% endhighlight %}
-
-
## Rule Handling
### Rule Location Priority
-As defined in the overview, a Rule Location is where a particular rule is located, either defined in the Ad Unit, within setConfig or via a fetch from the browser (named Dynamic) for fresh rules. It may be possible (rather more than likely) that floor rules can be set in one or more locations for a given Prebid auction (i.e. on requestBids). At auction, the Floors Module will only ever use rules from one Rule Location, decided at run-time. Each auction will be assigned an immutable set of rules from one Rule Location, even if the rules change prior to auction complete.
+As defined in the overview, a Rule Location is where a particular rule is located, either defined in (1) the Ad Unit, (2) within setConfig or (3) via a fetch from the browser. It's likely that floor rules are set in one or more location for a given Prebid auction. During an auction, the Price Floors Module will only ever use rules from one Rule Location, decided at run-time. Each auction will be assigned an immutable set of rules from one Rule Location, even if the rules change prior to auction complete.
-The Floors Module will use the below prioritization scheme on determining which Rule Location is selected at run-time:
+The module uses the below prioritization scheme on determining which Rule Location is selected at run-time:
-- Dynamic
+- dynamic
- setConfig
- adUnit
### Rule Selection Process
-The job of the Prebid floors module is to select a matching Prebid floor rule for enforcement \(when a bid adapter bids in the auction\) given the context of each Ad Unit. With the usage of â\*â values in rules definitions \(where â\*â applies when no specific value matches\) multiple Prebid floor rules can match for a given ad unit auction.
+The job of the Price Floors Module is to select a matching floor rule for enforcement given the context of each Ad Unit. With the usage of â\*â values in rules definitions multiple floor rules can match for a given ad unit auction.
-The Prebid Floors module algorithm will produce a list of every possible permutation for each ad unit auction based on the defined schema types. The best matching rule for each enforced bid request and getFloor is based on specificity of values \(meaning match an exact value\) weighted from left to right, where the specificity of a value in the left most column would match over a rule with itâs â\*â equivalent if â\*â is supplied.
+The module algorithm will produce a list of every possible permutation for each ad unit auction based on the defined schema types. The best matching rule for each enforced bid request and call to `getFloor()` is based on specificity of values \(meaning match an exact value\) weighted from left to right, where the specificity of a value in the left most column would match over a rule with its â\*â equivalent if â\*â is supplied.
-Priority order behavior where â\_â is a specific value, and the â\*â is a catch all
+Priority order behavior where â\_â is a specific value, and the â\*â is a catch-all
Priority order for one column rule sets:
@@ -595,7 +616,6 @@ Priority order for three column rule sets:
\_ \| \_ \| \*
\_ \| \* \| \_
\* \| \_ \| \_
- \* \| \_ \| \*
\_ \| \* \| \*
\* \| \_ \| \*
\* \| \* \| \_
@@ -646,7 +666,7 @@ mediaType = banner
Size = 300x600
Domain context = www.website.com
-The Price Floor Module produces an internal hash table of all possible permutations of âbannerâ, â300x600â, âwww.website.comâ and â\*â with the most specific hash values up top, weighting rules priority from left column specific values to right. Each left value will weigh more than the subsequent columnâs specific values. The Floors Module attempt to find the matching rule by cycling through each below possible rule (from top to bottom) against the above rule provider data set.
+The Floor module produces an internal hash table of all possible permutations of âbannerâ, â300x600â, âwww.website.comâ and â\*â with the most specific hash values up top, weighting rules priority from left column specific values to right. Each left value will weigh more than the subsequent columnâs specific values. The module attempts to find the matching rule by cycling through each below possible rule (from top to bottom) against the above rule provider data set.
{% highlight js %}
{
@@ -832,12 +852,10 @@ Enforced floor: 10.01
### Floor Data Provider Interface
-Floor data providers can supply data to publishers either within the setConfig as part of a Prebid.js Package if the provider is also a host provider of the Prebid library, or via a real-time Dynamic fetch, prior to the auction.
+Floor data can be supplied to publishers either within the setConfig as part of a Prebid.js Package if the provider is also a host provider of the Prebid library, or via a real-time Dynamic fetch, prior to the auction.
Data providers can optionally build Analytics Adapters to ingest bid data within Prebid for algorithm learning and review floor performance. Please refer to the Analytics Interface section for more details.
-
-
{% capture warning_note %}
As a floor provider, your goal is to provide effective floors, with minimal page impact. If you are performing a Dynamic fetch to retrieve data prior to auctions, the following recommendations are advised to reduce page performance issues:
@@ -845,14 +863,13 @@ As a floor provider, your goal is to provide effective floors, with minimal page
- Work with publishers on setting appropriate auction delays to retrieve dynamic data
- Implement client-side caching (such as max-age headers) whenever possible
- Evaluate data freshness vs frequency of new fetches to the CDN to reduce unnecessary calls
-- Be aware of file sizes returned to the browser, implementing trimmiming algorithms for extremely large data sets
+- Be aware of file sizes returned to the browser, implementing trimming algorithms for extremely large data sets
{% endcapture %}
{% include /alerts/alert_important.html content=warning_note %}
-For Dynamic fetches, the floors module will perform a GET request to the supplied endpoint, that must return valid JSON, formatted like the data object in the âsetConfigâ Package configuration.
+For Dynamic fetches, the Price Floors Module will perform a GET request to the supplied endpoint, that must return valid JSON, which will be merged into the data object in the âsetConfigâ Package configuration. In otherwords, the schema used for dynamic fetches is a subset of the full schema.
-
-On rule creation, we recommend supplying various rules with catch all \(â\*â\) values with associated floors. This is to accommodate bid adapters who cannot retrieving floors on a per size basis, as well as using various permutations of rules with â\*â values to match auctions that do not have an exact match on a specific rule. Please refer to the Rule Selection Process when determining floors as attribute order and number of â\*âs may have an impact on which rule is selected.
+On rule creation, we recommend supplying various rules with catch-all \(â\*â\) values with associated floors. This is to accommodate bid adapters who cannot retrieve floors on a per size basis, as well as using various permutations of rules with â\*â values to match auctions that do not have an exact match on a specific rule. Please refer to the Rule Selection Process when determining floors as attribute order and number of â\*âs may have an impact on which rule is selected.
#### Example Dynamic fetch
@@ -872,9 +889,9 @@ pbjs.setConfig({
{% endhighlight %}
-#### Example Response 1
+#### Example Dynamic Response 1 - Schema 1
-floor determined by AdUnit code and Media Type:
+In this example, the floor is determined by AdUnit code and Media Type. Note that the response does not contain the 'data' object because everything in the response is merged there.
{% highlight js %}
@@ -898,9 +915,9 @@ floor determined by AdUnit code and Media Type:
{% endhighlight %}
-#### Example Response 2
+#### Example Response 2 - Schema 1
-floor determined by Domain, GPT Slot, Media Type and Size:
+In this example, the floor is determined by Domain, GPT Slot, Media Type and Size:
{% highlight js %}
@@ -908,6 +925,7 @@ floor determined by Domain, GPT Slot, Media Type and Size:
currency: 'EU',
skipRate: 20,
modelVersion: âHigh_skip_rateâ
+
schema: {
fields: [ 'domain', 'gptSlot', 'mediaType', 'size' ]
},
@@ -926,12 +944,11 @@ floor determined by Domain, GPT Slot, Media Type and Size:
{% endhighlight %}
-#### Example Response 3
+#### Example Response 3 - Schema 2
-Floors Schema version 2
+In this example, the floor is determined by domain, gptSlot, mediaType, and size. Note again that dynamic floor responses are merged into the 'data' level of the schema.
{% highlight js %}
-
{
"currency": "USD",
"floorsSchemaVersion":2,
@@ -980,31 +997,29 @@ Floors Schema version 2
### Bid Adapter Interface
-The Prebid Floors Module is capable of handling an arbitrarily large set of floor rules of any combination of supported dimensions. To reduce the need for each bid adapter to process each and every rule in the selected rule data set, an encapsulated function (getFloor) was created to allow bid adapters to query the Floors Module for a floor for each mediaType, size and currency the bid adapter needs.
-
-If the price floors module is enabled for a given auction, the Floors Module will add to the bidRequest object the getFloor function. All bid adapters are recommended to call getFloor to retrieve a desired floor. The job of the getFloor function will be to return the floor CPM of a matched rule based on the rule selection process (written out above), using the getFloor inputs.
+The Prebid Floors Module is capable of handling an arbitrarily large set of floor rules of any combination of supported dimensions. To reduce the need for each bid adapter to process each and every rule in the selected rule data set, an encapsulated function (getFloor) was created to allow bid adapters to query the module for a floor for each mediaType, size and currency the bid adapter needs.
-Intended changes for bid adapters:
+If the Price Floors Module is enabled for a given auction, it will add the getFloor() function to the bidRequest object. All bid adapters are recommended to call the getFloor() to retrieve a desired floor. The job of this function is to return the floor CPM of a matched rule based on the rule selection process (written out above), using the getFloor() inputs.
+Changes for bid adapters:
-1. Check for presence of getFloor within the bidRequest obect
-1. If getFloors exists, call getFloor with desired parameters
+1. Check for presence of getFloor() within the bidRequest obect
+1. If getFloor() exists, call it with desired parameters
1. Parse floor and currency response
1. Pass floor and / or currency to bid adapter endpoint
-getFloor takes in a single object with the following params:
+getFloor() takes in a single object with the following params:
{% highlight js %}
-
- getFloor({
+ if (typeof bidRequest.getFloor === 'function') {
+ floorInfo = bidRequest.getFloor({
currency: string,
- mediaType: string //Required
+ mediaType: string,
size : [ w, h] OR "*"
});
-
+}
{% endhighlight %}
-
{: .alert.alert-warning :}
Consider how floors will behave in multi-currency scenarios. A common pitfall is requesting floors without specifying currency, or specifying the wrong currency back to the bid adapter's platform. This may lead to bidders requesting one currency and bidding in an alternate currency.
@@ -1012,12 +1027,11 @@ Consider how floors will behave in multi-currency scenarios. A common pitfall is
{: .table .table-bordered .table-striped }
| Param | Type | Description | Default |
|---+---+---+---|
-| bidRequest | object | bidRequest object passed to buildRequests function | none |
-| mediaType | string | The media type within the current bidRequest context to receive a floor from the Floors Module. Floors Module will return best matching floor. Possible values are one of âbannerâ, âvideoâ, âNativeâ or "\*" | "banner" |
-| size | Size array or â\*â (required) | The size within the current bidRequest context to receive a floor from the Floors Module. Defaults to â\*âArray of size [w, h] for a specific size. If your bid adapter cannot handle size specific floors, use â\*â to retrieve catch all size floor if defined by the publisher or floor provider | "\*" |
+| mediaType | string | The media type within the current bidRequest context to receive a floor from the module. It will return best matching floor. Possible values are one of âbannerâ, âvideoâ, âNativeâ or "\*" | "banner" |
+| size | Size array or â\*â (required) | The size within the current bidRequest context to receive a floor from the module. Defaults to â\*âArray of size [w, h] for a specific size. If your bid adapter cannot handle size specific floors, use â\*â to retrieve catch-all size floor if defined by the publisher or floor provider | "\*" |
| currency | String | The desired currency to return the floor in. Please refer to the currency section to understand how currency conversion is applied. If no currency is supplied, the floor module will assume USD. If the Floor Module cannot convert a floor to the supplied currency, bid adapters will be required to handle the supplied floor. | "USD" |
-#### getFloor Response
+#### getFloor() Response
{% highlight js %}
@@ -1036,9 +1050,9 @@ Or empty object if a floor was not found for a given input
{% endhighlight %}
-#### Example getFloor scenarios
+#### Example getFloor() scenarios
-Example rules file used for getFloor
+Example rules file used for getFloor()
{% highlight js %}
@@ -1061,16 +1075,16 @@ Example rules file used for getFloor
{% endhighlight %}
-**Example getFloor 1**
+**Example getFloor() 1**
-getFloor for media type Banner for a bid request in the context of the gpt slot â/1111/homepage/top-rectâ where the bid adapter does not support floors per size.
+getFloor() for media type Banner for a bid request in GPT slot â/1111/homepage/top-rectâ where the bid adapter does not support floors per size.
{% highlight js %}
getFloor({
currency: 'USD',
mediatype: âbannerâ,
- Size: â*â
+ size: â*â
});
{% endhighlight %}
@@ -1083,7 +1097,7 @@ getFloor for media type Banner for a bid request in the context of the gpt slot
}
{% endhighlight %}
-To aid in the accuracy of floor selection when using size â\*â in getFloor, the Floors Module has built-in smart rule selection when an ad unit in the internal bidRequest to the bid adapters interface has one ad unit type and one size. In the above example, if the ad unit within the bidRequest object has an ad unit type of âbannerâ with only one size, say â300x250â, the Floors Module will intelligently select the rule with "banner\|300x250" in it, as opposed to the "banner\|\*" rule producing the following response:
+To aid in the accuracy of floor selection when using size â\*â in getFloor(), the Price Floors Module has built-in smart rule selection when an ad unit in the internal bidRequest to the bid adapters interface has one ad unit type and one size. In the above example, if the ad unit within the bidRequest object has an ad unit type of âbannerâ with only one size, say â300x250â, the module will intelligently select the rule with "banner\|300x250" in it, as opposed to the "banner\|\*" rule producing the following response:
{% highlight js %}
{
@@ -1093,9 +1107,9 @@ To aid in the accuracy of floor selection when using size â\*â in getFloor,
{% endhighlight %}
-**Example getFloor 2**
+**Example getFloor() 2**
-getFloor for media type Banner for a bid requests in the context of the gpt slot â/1111/homepage/top-rectâ with size of 300x600 where bid adapter does support floors per size.
+getFloor() for media type Banner for a bid requests in GPT slot â/1111/homepage/top-rectâ with size of 300x600 where bid adapter does support floors per size.
{% highlight js %}
getFloor({
@@ -1114,7 +1128,7 @@ getFloor({
}
{% endhighlight %}
-Here are some examples of how a bid adapter may wish to configure their adapter to handle getFloor function:
+Here are some examples of how a bid adapter may wish to configure their adapter to handle getFloor() function:
For a bid adapter who does not wish to handle making a request for each size in a given bid request they can leverage the \* attribute which is meant to be a skewed average for a floor.
@@ -1131,23 +1145,23 @@ For a bid adapter who does not wish to handle making a request for each size in
### Analytics Adapter Interface
-Price Floors providers will most likely rely heavily on their associated (or their partnerâs) prebid analytics adapter in order to make the most informed and optimal price floor rule sets. Because of this, the price floors module needs to relay important information about the flooring and decisions made in the lifecycle of an auction.
+Floor providers rely on an analytics adapter in order to make the most informed and optimal price floor rule sets. Because of this, the Price Floors Module needs to relay important information about the flooring and decisions made in the lifecycle of an auction.
-The price floors module will do this by leveraging the already existing implementation for prebid analytics adapters by exposing floorData information onto the bidRequest and bidResponse objects. Thus, when an analytics adapter hooks into these prebid events, it will be able to pick out the price floors data and pass it along to their servers.
+The module will do this by leveraging the already-existing implementation for analytics adapters by exposing floorData information onto the bidRequest and bidResponse objects. Thus, when an analytics adapter hooks into these objects, it will be able to pick out the price floors data and pass it along to their servers.
**bidRequest**: Bid Requests objects are updated to contain some basic top level information which a floor provider may need:
{: .table .table-bordered .table-striped }
| bidRequest.floorData. | Type | Description | example |
|---+---+---+---+---|
-| fetchStatus | String | Provides details on the status of a fetch for a JSON floors file when fetches are attempted. Valid values are: 'success' (when fetch returns an http 200 status), 'timeout' (when fetch results not returned before either auction delay or prebid timeout) or 'error' (any http status other than 200 or other error condition). To determine if fetch succeeds but returns invalid floors data, refer to the location field to infer invalid data if 'fetch' is not resultant value. | âsuccessâ |
-| floorMin | float | The mimimum CPM floor used by the Floors Module (as of 4.13). The Floors Module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. | 0.10 |
+| fetchStatus | String | Provides details on the status of a fetch for a JSON floors file when fetches are attempted. Valid values are: 'success' (when fetch returns an http 200 status), 'timeout' (when fetch results not returned before either auction delay or prebid timeout) or 'error' (any http status other than 200 or other error condition). Note: if data is received successfully, but isn't valid upon parsing, fetchStatus will be 'success', but the `location` field (below) will have a value other than 'fetch' because the system will fall back to another source. | âsuccessâ |
+| floorMin | float | The mimimum CPM floor used by the module (as of 4.13). The module will take the greater of floorMin and the matched rule CPM when evaluating getFloor() and enforcing floors. Note that the currency of this floor is the same as bidResponse.floorData.floorCurrency. | 0.10 |
| floorProvider | string | Optional atribute (as of prebid version 4.1) used to signal to the Floor Provider's Analytics adapter their floors are being applied. They can opt to log only floors that are applied when they are the provider. If floorProvider is supplied in both the top level of the floors object and within the data object, the data object's configuration shall prevail.| "rubicon" |
-| location | String | Where the Floors Module derived the rule set. Values are one of 'adUnit', 'setConfig', 'fetch' or 'noData'. If the Floors Module code is invoked and no floors object is able to be found (either by error or other condition) the floorsModule will set location to 'noData'. When on data is found, it is up to the analtyics adapter to decide what to log. All available values will be provided in teh bidRequest object. | âfetchâ |
+| location | String | Where the module derived the rule set. Values are one of 'adUnit', 'setConfig', 'fetch' or 'noData'. If the module code is invoked and no floors object is able to be found (either by error or other condition) the floorsModule will set location to 'noData'. When on data is found, it is up to the analtyics adapter to decide what to log. All available values will be provided in the bidRequest object. | âfetchâ |
| modelVersion | String | The name of the model| âfloor-model-4.3â |
| modelWeight | integer | The weight of the model selected (for schema 2 version only)| 50 |
| modelTimestamp | integer | Epoch timestamp associated with the modelVersion to be used for post auction analysis.| 1607126814 |
-| skipRate | integer | skipRate will be populated when a skip rate is configured in the Prebid Floors Module, even if the skipRate is evaluated to false. Skip Rate is used to determine when to skip all floors logic. | 15 |
+| skipRate | integer | skipRate will be populated when a skip rate is configured in the module, even if the skipRate is evaluated to false. Skip Rate is used to determine when to skip all floors logic. | 15 |
| skipped | Boolean | Whether the skipRate resolved to be true or false| true |
**bidResponse**: When a bid response is being processed it is important for analytics adapters to know the decision which was made and the context of the rule selection. Here is the data which is attached to each bidResponse:
@@ -1165,28 +1179,88 @@ The price floors module will do this by leveraging the already existing implemen
### Prebid Server Interface
-Not supported in initial build. S2S config support will be coming in the subsequent release.
+The PrebidServerBidAdapter calls `getFloor()` like any other bid adapter
+and passes it to the server side as imp.bidfloor and imp.bidfloorcur.
+
+### In-Page Interface
+If a publisher is defining their own floors, then all of the fields in the floors schema may be defined in the page.
+
+Even if a publisher is using a floors provider, they may wish to provide additional data:
+1. default floor data if dynamic data fails to load on time
+2. global floorMin: allows the publisher to constrain dynamic floors with a global min
+3. impression-level floor min (PBJS 6.24+): allows the publisher to constrain dynamic floors with an adunit-specific value
+
+Here's an example covering the first two scenarios:
+```
+pbjs.setConfig({
+ floors: {
+ enforcement: {
+ floorDeals: false //default to false
+ },
+ floorMin: 0.05, // global default
+ auctionDelay: 100, // in milliseconds
+ endpoint: { // where to get the dynamic floors
+ url: 'https://floorprovider.com/a1001-mysite.json'
+ },
+ data: {
+ currency: 'USD',
+ skipRate: 10,
+ modelVersion: 'some setconfig model version',
+ schema: {
+ fields: [ 'gptSlot', 'mediaType' ]
+ },
+ values: {
+ '*|banner': 0.98,
+ '*|video': 1.74
+ }
+ }
+ }
+});
+```
+
+And here's an example of imp-level floorMin, which is like a form of imp-level [first party data](/features/firstPartyData.html#supplying-adunit-specific-data):
+```
+pbjs.addAdUnits({
+ code: "test-div",
+ mediaTypes: {
+ banner: {
+ sizes: [[300,250]]
+ }
+ },
+ ortb2Imp: {
+ ext: {
+ prebid: {
+ data: {
+ floorMin: 0.25,
+ floorMinCur: "USD"
+ }
+ }
+ }
+ },
+ ...
+});
+```
## Currency
-The floors module will default the floor CPM currency with any associated rule to USD if none is supplied in the data object of the floors configuration. For any non-USD currency support, a publisher is required to specify the desired currency. If you are working with a floor provider, please speak to them about supplying the desired currency for your integration.
+The Price Floors Module defaults the floor currency to USD if none is supplied in the data object of the floors configuration. For any non-USD currency support, a publisher is required to specify the desired currency. If you are working with a floor provider, please speak to them about supplying the desired currency for your integration.
{% capture warning_note %}
-For publishers seeking to perform currency conversions within the floors module (for example if the floors data currency is not the same as a bid adapterâs supported currency), failure to include the currency module may result in unexpected behavior and / or may impact revenue performance.
+For publishers requiring currency conversions (for example if the floors data currency is not the same as a bid adapterâs supported currency), **failure to include the currency module may result in unexpected behavior** and / or may impact revenue performance.
{% endcapture %}
{% include /alerts/alert_warning.html content=warning_note %}
Currency conversion can occur in two areas of the Floor Module code:
-- On the **getFloor** call when Bid Adapters request a floor
+- On the **getFloor()** call when Bid Adapters request a floor
- On the **enforcement** side when each bidder submits a bidResponse
-**getFloor**
+**Currency and getFloor()**
-The job of the getFloor method is to retrieve an appropriate floor for the requesting Bid Adapter, for a given auction context. If a Bid Adapter performs a getFloor call with a currency different than the currency of the floor data, the Floors Module will attempt to perform a currency conversion, utilizing the convertCurrency function in the global Prebid object.
+The job of the getFloor() function is to retrieve an appropriate floor for the requesting Bid Adapter, for a given auction context. If a Bid Adapter performs a getFloor() call with a currency different than the currency of the floor data, the module will attempt to perform a currency conversion, utilizing the convertCurrency function in the global Prebid object.
-If a currency conversion is successful in getFloor, the resulting floor will be returned to the requesting Bid Adapter. If the conversion failed, the Floors Module will return the original floor currency defined within the selected rule location data set.
+If a currency conversion is successful in getFloor(), the resulting floor will be returned to the requesting Bid Adapter. If the conversion failed, the module will return the original floor currency defined within the selected rule location data set.
Example Rule:
currency = âUSDâ,
@@ -1209,7 +1283,7 @@ If successfully returned the requested currency:
}
{% endhighlight %}
-If unsuccessfully returned the requested currency:
+If currency conversion is unsuccessful:
{% highlight js %}
{
@@ -1228,9 +1302,9 @@ Currency conversion can fail for the following reasons:
- Bidder passes in a currency code which does not have a conversion rate
- Floors was set with a currency which does not have a conversion rate
-**Enforcement**
+**Currency and Floor Enforcement**
-Enforcement in the Floors module occurs when bidders respond (i.e. bid) with a bidResponse object into the Prebid auction. The Floors Module will read the bid submitted within each valid bidResponse and its associated currency, performing currency conversion where necessary.
+Enforcement in the Price Floors Module occurs when bidders respond with a bidResponse object into the Prebid auction. The module reads the bid submitted within each valid bidResponse and its associated currency, performing currency conversion where necessary.
There exist three locations where currencies can differ within enforcement:
@@ -1238,14 +1312,14 @@ There exist three locations where currencies can differ within enforcement:
- Price Floor Currency: Currency set in the price floors data object
- bidResponse Currency: The currency the bidder returned with their bidResponse back to Prebid
-When a bid adapter submits a bid into the auction, the currency module will first determine if any conversion logic is necessary, afterwhich the bid is passed to the Floors Module. If currency conversion occurs at this stage, the bidResponse object will have the following attributes:
+When a bid adapter submits a bid into the auction, the currency module will first determine if any conversion logic is necessary, afterwhich the bid is passed to the module. If currency conversion occurs at this stage, the bidResponse object will have the following attributes:
- Cpm: The adServerCurrency converted CPM currency
- Currency: The currency the adServerCurrency was set in
- originalCpm: The original CPM the bidder responded with
- originalCurrency: The original currency the bidder responded with
-Below is a chart explaining the behavior of currency conversion, if necessary, within the Floors Module when comparing bid CPM to floor CPM for enforcement:
+Below is a chart explaining the behavior of currency conversion, if necessary, within the module when comparing bid CPM to floor CPM for enforcement:
{: .table .table-bordered .table-striped }
| bid.currency | bid.originalCurrency | floor.currency | result |
@@ -1265,6 +1339,8 @@ If the currency function is unable to derive the correct cpm in any of the scena
{: .table }
| Partner | Contact | About |
-| | Contact Magnite (Formerly Rubicon Project) support at [globalsupport@mangite.com](mailto:globalsupport@magnite.com) to use Magnite as a floor provider. | |
-| pubx.ai | Reach out to PubX at [hello@pubx.ai](mailto:hello@pubx.ai) to learn more about our AI-powered dynamic floor optimization. | |
-| Assertive Yield | [assertiveyield.com] | Holistic flooring covering Prebid, Amazon, GAM UPR, RTB and more |
+| | [globalsupport@magnite.com](mailto:globalsupport@magnite.com) | Magnite data-science applied to dynamic floors |
+| | Reach out to OpenX at [apollo@openx.com](mailto:apollo@openx.com) | Dynamic floor optimization and more |
+| | [header-bidding@pubmatic.com](mailto:header-bidding@pubmatic.com) | PubMatic's ML powered dynamic Floor Optimization |
+| Assertive Yield | [assertiveyield.com](https://assertiveyield.com) | Holistic flooring covering Prebid, Amazon, GAM UPR, RTB and more |
+| pubx.ai | [hello@pubx.ai](mailto:hello@pubx.ai) | AI-powered dynamic floor optimization |
diff --git a/dev-docs/modules/freewheel.md b/dev-docs/modules/freewheel.md
index 24cba9286f..2aa357c750 100644
--- a/dev-docs/modules/freewheel.md
+++ b/dev-docs/modules/freewheel.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: Module - Freewheel
-description: Returns targeting key/value pairs for adpod mediaType adUnits.
+description: Passes key value targeting to Freewheel SDK for adpod mediaType adUnits.
module_code : freeWheelAdserverVideo
-display_name : Freewheel
+display_name : Freewheel Video Support
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/gdprEnforcement.md b/dev-docs/modules/gdprEnforcement.md
index 03acfeb352..2afd260ac9 100644
--- a/dev-docs/modules/gdprEnforcement.md
+++ b/dev-docs/modules/gdprEnforcement.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: GDPR Enforcement Module
-description: Module to enforce GDPR consent
+description: If you have users in Europe, you'll want this module that enforces GDPR consent
module_code : gdprEnforcement
display_name : GDPR Enforcement
enable_download : true
+recommended: true
sidebarType : 1
---
diff --git a/dev-docs/modules/geoedgeRtdProvider.md b/dev-docs/modules/geoedgeRtdProvider.md
index a9c4367cef..42113e0086 100644
--- a/dev-docs/modules/geoedgeRtdProvider.md
+++ b/dev-docs/modules/geoedgeRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : geoedgeRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/gpt-pre-auction.md b/dev-docs/modules/gpt-pre-auction.md
index a701cc8796..db71b18ce6 100644
--- a/dev-docs/modules/gpt-pre-auction.md
+++ b/dev-docs/modules/gpt-pre-auction.md
@@ -2,10 +2,12 @@
layout: page_v2
page_type: module
title: Module - GPT Pre-Auction
-description: Adds PB Ad Slot and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters
+description: If you run GAM, this module generates the 'global placement id' that's becoming required for successful auctions.
module_code : gptPreAuction
display_name : GPT Pre-Auction
enable_download : true
+recommended: true
+vendor_specific: true
sidebarType : 1
---
@@ -17,19 +19,25 @@ sidebarType : 1
## Overview
-This module enables targeting and tracking at the ad server adunit level.
+This module enables bidder targeting and tracking at the ad server ad slot level.
-Enabled by default if compiled into your package, this module will add the [Prebid Ad Slot](/features/pbAdSlot.html) and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters.
+This module is enabled by default if it's compiled into your PBJS package. It will add the [Prebid Ad Slot and GPID](/features/pbAdSlot.html) along with the matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters.
* **Prebid.js Adapters** - will be able to utilize these values as:
- * AdUnit.ortb2imp.ext.data.adserver.name="gam"
- * AdUnit.ortb2imp.ext.data.adserver.adslot="/1111/home"
- * AdUnit.ortb2imp.ext.data.pbadslot="/1111/home-left"
+ * AdUnit.ortb2Imp.ext.gpid="/1111/home-left"
+ * AdUnit.ortb2Imp.ext.data.adserver.name="gam"
+ * AdUnit.ortb2Imp.ext.data.adserver.adslot="/1111/home"
+ * AdUnit.ortb2Imp.ext.data.pbadslot="/1111/home-left"
* **Prebid Server Adapters** - will see the OpenRTB as:
+ * imp[].ext.gpid
* imp[].ext.data.adserver.name
* imp[].ext.data.adserver.adslot
* imp[].ext.data.pbadslot
+{: .alert.alert-info :}
+The Prebid Ad Slot didn't get broad adoption, so it's likely that
+someday we'll deprecate it in favor of the more standard GPID.
+
## Configuration
{: .alert.alert-info :}
@@ -38,45 +46,121 @@ into the Prebid.js package.
Optional initialization parameters:
-- enabled (on by default)
-- customGptSlotMatching function
-- customPbAdSlot function
+{: .table .table-bordered .table-striped }
+| Param | Required? | Type | Description | Example |
+| enabled | no | boolean | allows turning off of module. Default value is true | true |
+| customGptSlotMatching | no | function | GPT slot matching function should match the customSlotMatching function sent to [setTargetingForGptAsync](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) | |
+| useDefaultPreAuction | no | boolean | (PBJS 6.5+) If true, use default behavior for determining GPID and PbAdSlot. Defaults to false. | true |
+| customPreAuction | no | function | (PBJS 6.5+) Custom function for defining the GPID and PbAdSlot. | |
+| customPbAdSlot | no | function | Custom PB AdSlot function. (Note, this function will be deprecated in the future.) | |
+| mcmEnabled | no | boolean | Removes extra network IDs when Multiple Customer Management is active. Default is false. | true |
+For example:
```
pbjs.setConfig({
gptPreAuction: {
enabled: true, // enabled by default
- customPbAdSlot: function(adUnitCode, adServerAdSlot) {
+ useDefaultPreAuction: false,
+ customPreAuction: function(adUnit, adServerAdSlot) {
...
return "customPbAdSlot";
},
customGptSlotMatching: function(gptSlotObj) {
...
return true; // or false
- }
+ },
+ mcmEnabled: true
}
});
```
## How It Works
-When this module is on, it uses the BEFORE_REQUEST_BIDS event to insert functionality that:
+When this module is turned on, it uses the BEFORE_REQUEST_BIDS event to insert functionality that:
- loops through each adunit in the auction
-- maps the adunit to the GPT slot using the same algorithm as setTargetingForGPTAsync including customGptSlotMatching
+- maps the PBJS adunit to the GPT slot using the same algorithm as setTargetingForGPTAsync including customGptSlotMatching
+
+### Defining the AdServer name and adslot
If GPT slot matching succeeds:
-- it sets the Adunit ortb2imp.ext.data.adserver.name to 'gam'
-- it copies the resulting GPT slot name to ortb2imp.ext.data.adserver.adslot
+- it sets the Adunit ortb2Imp.ext.data.adserver.name to 'gam'
+- it copies the resulting GPT slot name to ortb2Imp.ext.data.adserver.adslot
+
+### Defining PbAdSlot and GPID
+
+Here's what the module does to define these values:
+
+1. If AdUnit.ortb2Imp.ext.gpid already exists, use that for GPID.
+1. If AdUnit.ortb2Imp.ext.data.pbadslot already exists, use that for PbAdSlot.
+1. Otherwise, if a customPreAuction function is specified, run that. If the result isn't empty, place it in pbAdSlot and GPID.
+1. Otherwise, if useDefaultPreAuction is true, run the default logic and place the return value in both pbAdSlot and GPID
+ 1. If ortb2Imp.ext.data.pbadslot is specified, use that.
+ 1. If ortb2Imp.ext.gpid is specified, use that.
+ 1. If GPT isn't in the page, give up.
+ 1. Query GPT slots with the adunit.code
+ 1. If there aren't any, give up.
+ 1. If there's just one, use that slot name as the GPID
+ 1. If there's more than on slot with the same name, append the div-id
+1. Otherwise, if a customPbAdSlot function is specified and the result is not empty, place it in pbAdSlot and GPID.
+1. Otherwise, if the AdUnit.code matched one or more GAM AdSlots, use that for both PbAdSlot and GPID
+1. Otherwise use the AdUnit.code for PbAdSlot.
+
+
+## Example customPbAdSlot function
-The customPbAdSlot function is called if it was specified, writing the results to ortb2imp.ext.data.pbadslot.
-If there's no customPbAdSlot, a default algorithm is used to determine ortb2imp.ext.data.pbadslot:
+{: .alert.alert-info :}
+In PBJS 6.5 and later, we recommend using the useDefaultPreAuction flag or the customPreAuction function.
+
+The following customPbAdSlot function will work for many publishers. Assumptions:
+- AdUnits have been registered with [pbjs.addAdUnits](/dev-docs/publisher-api-reference/addAdUnits.html).
+- AdUnit.code is either the GPT slot name or the div-id.
+- The site has unique (non-random) div-ids.
+
+If either of these isn't the case, you'll need to supply your own function.
-- first use the AdUnit's ortb2imp.ext.data.pbadslot if defined
-- else, see if the AdUnit.code corresponds to a div and if so, try to retrieve a data element from the div called data-adslotid.
-- else if the GPT slot matching succeeded, use the GPT slot name
-- else, just use the AdUnit.code, assuming that that's the ad unit slot
+```
+// Use adunit.ortb2Imp.ext.data.pbadslot if it exists.
+// compare adunit.code to find a single matching slot in GPT
+// if there is a single slot match, just use that slot name
+// finally, there must be multiple slots that match. Define pbadslot as slot#div
+
+pbjs.setConfig({
+ gptPreAuction: {
+ enabled: true, // enabled by default
+ customPbAdSlot: function(adUnitCode, adServerAdSlot) {
+ // get adunit object
+ au=pbjs.adUnits.filter(au => au.code==adUnitCode);
+ if (au.length==0) {
+ return;
+ }
+
+ // use pbadslot if supplied
+ if (au[0].ort2bImp && au[0].ort2bImp.ext && au[0].ort2bImp.ext.data && au[0].ort2bImp.ext.data.pbadslot) {
+ return au[0].ort2bImp.ext.data.pbadslot;
+ }
+
+ // confirm that GPT is set up
+ if (!(googletag && googletag.apiReady)) {
+ return;
+ }
+ // find all GPT slots with this name
+ var gptSlots = googletag.pubads().getSlots().filter(function(gpt) {
+ return gpt.getAdUnitPath() == adServerAdSlot;
+ });
+ if (gptSlots.length==0) {
+ return; // should never happen
+ }
+ if (gptSlots.length==1) {
+ return adServerAdSlot;
+ }
+ // else the adunit code must be div id. append it.
+ return adServerAdSlot+"#"+adUnitCode;
+ }
+ });
+};
+```
# Further Reading
-- [Prebid Ad Slot](/features/pbAdSlot.html)
+- [Prebid Ad Slot and GPID](/features/pbAdSlot.html)
diff --git a/dev-docs/modules/hadronRtdProvider.md b/dev-docs/modules/hadronRtdProvider.md
new file mode 100644
index 0000000000..52513e7172
--- /dev/null
+++ b/dev-docs/modules/hadronRtdProvider.md
@@ -0,0 +1,142 @@
+---
+layout: page_v2
+title: Audigent Hadron Real Time Data Provider
+display_name: Audigent Hadron Real-time Segmentation Module
+description: Audigent Hadron Real-time Segmentation Module
+page_type: module
+module_type: rtd
+module_code : hadronRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Audigent Hadron Real-time Data Submodule
+{:.no_toc}
+
+* TOC
+{:toc}
+
+Audigent is a next-generation, first-party data management platform and the
+worldâs first "data agency", powering the programmatic landscape and DTC
+eCommerce with actionable first-party audience and contextual data from
+retailers, lifestyle publishers, content creators, athletes and artists.
+
+The Hadron real-time data module in Prebid has been built so publishers
+can maximize the power of their first-party audiences and contextual data.
+This module provides both an integrated cookieless Hadron identity, contextual
+targeting and audience segmentation solution that seamlessly and easily
+integrates into your existing Prebid deployment.
+
+Users, devices, content, cohorts and other features are identified and utilized
+to augment every bid request with targeted, first-party data-derived segments
+before being submitted to supply-side platforms. Enriching the bid request with
+robust first-party audience and contextual data, Audigent's Hadron RTD module
+helps optimize targeting and header-bidding performance. For more information,
+please visit https://audigent.com or contact our Prebid integration team at
+prebid@audigent.com.
+
+
+## Publisher Usage
+
+Compile the Hadron RTD module into your Prebid build:
+
+`gulp build --modules=userId,unifiedIdSystem,rtdModule,hadronRtdProvider,appnexusBidAdapter`
+
+Add the Hadron RTD provider to your Prebid config. In this example we will configure
+publisher 1234 to retrieve segments from Audigent. See the
+"Parameter Descriptions" below for more detailed information of the
+configuration parameters. Please work with your Audigent Prebid support team
+(prebid@audigent.com) on which version of Prebid.js supports different bidder
+and segment configurations.
+
+```
+pbjs.setConfig(
+ ...
+ realTimeData: {
+ auctionDelay: auctionDelay,
+ dataProviders: [
+ {
+ name: "hadron",
+ waitForIt: true,
+ params: {
+ segmentCache: false,
+ partnerId: 1234
+ }
+ }
+ ]
+ }
+ ...
+}
+```
+
+**Config Syntax details:**
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | String | Real time data module name | Always 'hadron' |
+| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
+| params | Object | | |
+| params.handleRtd | Function | A passable RTD handler that allows custom adunit and ortb2 logic to be configured. The function signature is (bidConfig, rtd, rtdConfig, pbConfig) => {}. | Optional |
+| params.segmentCache | Boolean | This parameter tells the Hadron RTD module to attempt reading segments from a local storage cache instead of always requesting them from the Audigent server. | Optional. Defaults to false. |
+| params.partnerId | Number | This is the Audigent Partner ID obtained from Audigent. | Required |
+| params.hadronIdUrl | String | Parameter to specify alternate hadronid endpoint url. | Optional |
+
+## Publisher Customized RTD Handling
+
+As indicated above, it is possible to provide your own bid augmentation
+functions rather than simply merging supplied data. This is useful if you
+want to perform custom bid augmentation and logic with Hadron real-time data
+prior to the bid request being sent. Simply add your custom logic to the
+optional handleRtd parameter and provide your custom RTD handling logic there.
+
+Please see the following example, which provides a function to modify bids for
+a bid adapter called adBuzz and perform custom logic on bidder parameters.
+
+```
+pbjs.setConfig(
+ ...
+ realTimeData: {
+ auctionDelay: auctionDelay,
+ dataProviders: [
+ {
+ name: "hadron",
+ waitForIt: true,
+ params: {
+ handleRtd: function(bidConfig, rtd, rtdConfig, pbConfig) {
+ var adUnits = bidConfig.adUnits;
+ for (var i = 0; i < adUnits.length; i++) {
+ var adUnit = adUnits[i];
+ for (var j = 0; j < adUnit.bids.length; j++) {
+ var bid = adUnit.bids[j];
+ if (bid.bidder == 'adBuzz' && rtd['adBuzz'][0].value != 'excludeSeg') {
+ bid.params.adBuzzCustomSegments.push(rtd['adBuzz'][0].id);
+ }
+ }
+ }
+ },
+ segmentCache: false,
+ partnerId: 1234
+ }
+ }
+ ]
+ }
+ ...
+}
+```
+
+The handleRtd function can also be used to configure custom ortb2 data
+processing. Please see the examples available in the hadronRtdProvider_spec.js
+tests and work with your Audigent Prebid integration team (prebid@audigent.com)
+on how to best configure your own Hadron RTD & Open RTB data handlers.
+
+## Testing
+
+To view an example of available segments returned by Audigent's backends:
+
+`gulp serve --modules=userId,unifiedIdSystem,rtdModule,hadronRtdProvider,appnexusBidAdapter`
+
+and then point your browser at:
+
+`http://localhost:9999/integrationExamples/gpt/hadronRtdProvider_example.html`
diff --git a/dev-docs/modules/haloRtdProvider.md b/dev-docs/modules/haloRtdProvider.md
index 3f36b19946..3728bb185d 100644
--- a/dev-docs/modules/haloRtdProvider.md
+++ b/dev-docs/modules/haloRtdProvider.md
@@ -5,142 +5,16 @@ display_name: Audigent Halo Real-time Segmentation Module
description: Audigent Halo Real-time Segmentation Module
page_type: module
module_type: rtd
-module_code : haloRtdProvider
-enable_download : true
+module_code: haloRtdProvider
+enable_download: false
+vendor_specific: true
sidebarType : 1
---
# Audigent Halo Real-time Data Submodule
-{:.no_toc}
-
-* TOC
-{:toc}
-
-Audigent is a next-generation data management platform and a first-of-a-kind
-"data agency" containing some of the most exclusive content-consuming audiences
-across desktop, mobile and social platforms.
-
-This real-time data module provides an integrated post-cookie Halo identity and
-real-time user segmentation solution that seamlessly integrates into your bid
-request cycle. Users are identified and bid request objects are augmented
-with first-party data derived segments prior to being sent to exchange/ssp
-services in order to optimize targeting and increase publisher revenue.
-
-Audigent maintains a large database of first-party Tradedesk Unified ID,
-Audigent Halo ID and other id provider mappings to various third-party segment
-types that are utilizable across different backends. With the Halo RTD module,
-these segments and other data can be retrieved and utilized by supporting
-exchange and SSP backends in real-time during your bid request cycle.
-
-
-## Publisher Usage
-
-Compile the Halo RTD module into your Prebid build:
-
-`gulp build --modules=userId,unifiedIdSystem,rtdModule,haloRtdProvider,appnexusBidAdapter`
-
-Add the Halo RTD provider to your Prebid config. In this example we will configure
-publisher 1234 to retrieve segments from Audigent. See the
-"Parameter Descriptions" below for more detailed information of the
-configuration parameters. Please work with your Audigent Prebid support team
-(prebid@audigent.com) on which version of Prebid.js supports different bidder
-and segment configurations.
-
-```
-pbjs.setConfig(
- ...
- realTimeData: {
- auctionDelay: auctionDelay,
- dataProviders: [
- {
- name: "halo",
- waitForIt: true,
- params: {
- segmentCache: false,
- requestParams: {
- publisherId: 1234
- }
- }
- }
- ]
- }
- ...
-}
-```
-
-**Config Syntax details:**
-
-{: .table .table-bordered .table-striped }
-| Name |Type | Description | Notes |
-| :------------ | :------------ | :------------ |:------------ |
-| name | String | Real time data module name | Always 'halo' |
-| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
-| params | Object | | |
-| params.handleRtd | Function | A passable RTD handler that allows custom adunit and ortb2 logic to be configured. The function signature is (bidConfig, rtd, rtdConfig, pbConfig) => {}. | Optional |
-| params.segmentCache | Boolean | This parameter tells the Halo RTD module to attempt reading segments from a local storage cache instead of always requesting them from the Audigent server. | Optional. Defaults to false. |
-| params.requestParams | Object | Publisher partner specific configuration options, such as optional publisher id and other segment query related metadata to be submitted to Audigent's backend with each request. Contact prebid@audigent.com for more information. | Optional |
-| params.haloIdUrl | String | Parameter to specify alternate haloid endpoint url. | Optional |
-
-## Publisher Customized RTD Handling
-
-As indicated above, it is possible to provide your own bid augmentation
-functions rather than simply merging supplied data. This is useful if you
-want to perform custom bid augmentation and logic with Halo real-time data
-prior to the bid request being sent. Simply add your custom logic to the
-optional handleRtd parameter and provide your custom RTD handling logic there.
-
-Please see the following example, which provides a function to modify bids for
-a bid adapter called adBuzz and perform custom logic on bidder parameters.
-
-```
-pbjs.setConfig(
- ...
- realTimeData: {
- auctionDelay: auctionDelay,
- dataProviders: [
- {
- name: "halo",
- waitForIt: true,
- params: {
- handleRtd: function(bidConfig, rtd, rtdConfig, pbConfig) {
- var adUnits = bidConfig.adUnits;
- for (var i = 0; i < adUnits.length; i++) {
- var adUnit = adUnits[i];
- for (var j = 0; j < adUnit.bids.length; j++) {
- var bid = adUnit.bids[j];
- if (bid.bidder == 'adBuzz' && rtd['adBuzz'][0].value != 'excludeSeg') {
- bid.params.adBuzzCustomSegments.push(rtd['adBuzz'][0].id);
- }
- }
- }
- },
- segmentCache: false,
- requestParams: {
- publisherId: 1234
- }
- }
- }
- ]
- }
- ...
-}
-```
-
-The handleRtd function can also be used to configure custom ortb2 data
-processing. Please see the examples available in the haloRtdProvider_spec.js
-tests and work with your Audigent Prebid integration team (prebid@audigent.com)
-on how to best configure your own Halo RTD & Open RTB data handlers.
-
-## Testing
-
-To view an example of available segments returned by Audigent's backends:
-
-`gulp serve --modules=userId,unifiedIdSystem,rtdModule,haloRtdProvider,appnexusBidAdapter`
-
-and then point your browser at:
-
-`http://localhost:9999/integrationExamples/gpt/haloRtdProvider_example.html`
-
-
+Audigent Halo has been rebranded as Audigent Hadron. Please review the updated
+docs here:
+[Audigent Hadron Real-time Data Submodule](/dev-docs/modules/hadronRtdProvider.html)
+Please update your Halo references to Hadron before Prebid 7 is released.
diff --git a/dev-docs/modules/iabCatagoryTranslation.md b/dev-docs/modules/iabCatagoryTranslation.md
deleted file mode 100644
index 7831fbd198..0000000000
--- a/dev-docs/modules/iabCatagoryTranslation.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-layout: page_v2
-page_type: module
-title: Module - IAB Category Translation
-description: Converts between ad agency brand categories and IAB brand categories.
-module_code : CategoryTranslation
-display_name : CategoryTranslation
-enable_download : true
-sidebarType : 1
----
-
-# IAB Category Translation
-
-{:.no_toc}
-
-This module converts the IAB sub category to FreeWheel industry group identifiers. The FreeWheel identifiers ensure competitve separation of industries and products.
-
-Each bid request must return one [IAB subcategory](https://support.aerserv.com/hc/en-us/articles/207148516-List-of-IAB-Categories).
-
-The module provides the following:
-
-- Converts IAB subcategories to a FreewWheel industry group identifier.
-
-## How to use the module:
-
-1. A Prebid.js package is built that contains this module and the [FreeWheel](/dev-docs/modules/freewheel.html) module.
-2. The inclusion of this module causes Prebid to download a mapping file to local storage. The user also has the option to provide their own mapping file.
-3. At runtime, brand category translation happens as needed.
-
-
-## Using A Custom Map File
-The IAB Category Translation module uses a default mapping file to convert adserver categories to IAB sub categories. If a publisher prefers to use their own mapping file they will need to set the URL location of that file. They can do so by adding the following to their Prebid.js configuration:
-
-```
-pbjs.setConfig({
- "brandCategoryTranslation": {
- "translationFile": ""
- }
-});
-```
-
-This file will be stored locally to expedite the conversion process. If a publisher opts to not provide a conversion mapping file Prebid will use its default conversion mapping file.
-
-Publishers should ensure that the JSON returned from their custom file is valid for Prebid by adhering to the following structure:
-
-```JSON
-{
- âmappingâ: {
- ââ: {
- âidâ: ââ,
- ânameâ: ââ
- },
- ....
- }
-}
-```
-
-Refer to Prebid Github repository for a [custom file reference](https://github.com/prebid/category-mapping-file).
-
-
-## Further Reading
-
-[Prebid.js](/dev-docs/getting-started.html)
-[Prebid Video](/prebid-video/video-overview.html)
-[FreeWheel Module](/dev-docs/modules/freewheel.html)
-[Adapter Integration](/dev-docs/bidder-adaptor.html)
-
-
-
-
-
-
-
diff --git a/dev-docs/modules/iasRtdProvider.md b/dev-docs/modules/iasRtdProvider.md
index b1585553a1..99dae5c16a 100644
--- a/dev-docs/modules/iasRtdProvider.md
+++ b/dev-docs/modules/iasRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : iasRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md
index 306b877158..5874353f8e 100644
--- a/dev-docs/modules/idLibrary.md
+++ b/dev-docs/modules/idLibrary.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: ID Import Library
-description: ID Graphing Adapter
+description: Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing.
module_code : currency
display_name : ID Import Library
enable_download : true
diff --git a/dev-docs/modules/idWardRtdProvider.md b/dev-docs/modules/idWardRtdProvider.md
new file mode 100644
index 0000000000..4ac094e210
--- /dev/null
+++ b/dev-docs/modules/idWardRtdProvider.md
@@ -0,0 +1,61 @@
+---
+layout: page_v2
+title: ID Ward Real Time Data Provider Module
+display_name: ID Ward Real Time Data Provider Module
+description: ID Ward Real Time Data Provider Module
+page_type: module
+module_type: rtd
+module_code : idWardRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# ID Ward Real Time Data Provider Module
+
+ID Ward is a data anonymization technology for privacy-preserving advertising. Publishers and advertisers are able to target and retarget custom audience segments covering 100% of consented audiences.
+ID Wardâs Real-time Data Provider automatically obtains segment IDs from the ID Ward on-domain script (via `localStorage`) and passes them to the bid-stream.
+
+
+## Publisher Usage
+
+1) Build the idWardRtd module into the Prebid.js package with:
+
+```
+gulp build --modules=idWardRtdProvider,...
+```
+
+2) Use `setConfig` to instruct Prebid.js to initilaize the idWardRtdProvider module, as specified below.
+
+### Configuration
+
+```
+ pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [
+ {
+ name: "idWard",
+ waitForIt: true,
+ params: {
+ cohortStorageKey: "cohort_ids",
+ segtax: ,
+ }
+ }
+ ]
+ }
+ });
+```
+
+Please note that idWardRtdProvider should be integrated into the publisher website along with the [ID Ward Pixel](https://publishers-web.id-ward.com/pixel-integration).
+Please reach out to Id Ward representative(support@id-ward.com) if you have any questions or need further help to integrate Prebid, idWardRtdProvider, and Id Ward Pixel
+
+
+**Config Syntax details:**
+
+{: .table .table-bordered .table-striped }
+| Name |Type | Description | Notes |
+| :------------ | :------------ | :------------ |:------------ |
+| name | String | Id Ward Rtd module name | 'idWard' always|
+| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false |
+| cohortStorageKey | String | the `localStorage` key, under which Id Ward Pixel stores the segment IDs | 'cohort_ids' always |
+| segtax | Integer | the taxonomy for Id Ward | Getting this value is in progress, once done this will become optional |
\ No newline at end of file
diff --git a/dev-docs/modules/imRtdProvider.md b/dev-docs/modules/imRtdProvider.md
new file mode 100644
index 0000000000..7eee3bc60e
--- /dev/null
+++ b/dev-docs/modules/imRtdProvider.md
@@ -0,0 +1,73 @@
+---
+layout: page_v2
+title: Intimate Merger Real time Data Provider
+display_name: Intimate Merger Real-time Data Submodule
+description: Intimate Merger Real-time Data Submodule
+page_type: module
+module_type: rtd
+module_code : imRtdProvider
+enable_download : true
+sidebarType : 1
+---
+
+# Intimate Merger Real time Data Provider
+{:.no_toc}
+
+* TOC
+{:toc}
+
+This module reads segments from [Intimate Merger](https://corp.intimatemerger.com/) audience data platform and attaches them as targeting keys to bid requests.
+
+The audience data platform performs segmentation even in environments where 3rd party cookies are not available, but curretly only available in Japan.
+
+
+## Usage
+
+Add it to your Prebid.js package with:
+
+`gulp build --modules=rtdModule,imRtdProvider`
+
+## Publisher Customized RTD Handling
+
+The following configuration parameters are available:
+
+```
+pbjs.setConfig(
+ ...
+ realTimeData: {
+ auctionDelay: 5000,
+ dataProviders: [
+ {
+ name: "im",
+ waitForIt: true,
+ params: {
+ cid: 5126, // Set your Intimate Merger Customer ID here for production
+ setGptKeyValues: true
+ }
+ }
+ ]
+ }
+ ...
+}
+```
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+| Param under dataProviders | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of this module. | `"im"` |
+| waitForIt | Optional | Boolean | Required to ensure that the auction is delayed until prefetch is complete. Defaults to false but recommended to true | `true` |
+| params | Required | Object | Details of module params. | |
+| params.cid | Required | Number | This is the Customer ID value obtained via Intimate Merger. | `5126` |
+| params.setGptKeyValues | Optional | Boolean | This is set targeting for GPT/GAM. Default setting is true. | `true` |
+
+## Testing
+
+First, make sure to add the Intimate Merger submodule to your Prebid.js package with:
+
+`gulp serve --modules=rtdModule,imRtdProvider`
+
+and then point your browser at:
+
+`http://localhost:9999/integrationExamples/gpt/imRtdProvider_example.html`
diff --git a/dev-docs/modules/index.md b/dev-docs/modules/index.md
index 7721060433..4b62546f54 100644
--- a/dev-docs/modules/index.md
+++ b/dev-docs/modules/index.md
@@ -1,6 +1,6 @@
---
layout: page_v2
-title: Prebid Modules
+title: Prebid.js Modules
description: Module Documentation
sidebarType: 1
---
@@ -8,94 +8,89 @@ sidebarType: 1
# Prebid.js Module Overview
{:.no_toc}
-The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on or that covers a special case is being moved out into modules. Examples of this kind of code include:
+The core of Prebid.js contains only the foundational code needed for header bidding. Any functionality that could be considered an add-on is part of a module. These are the major categories:
-- Bidder adapters
-- Special auction logic
-- Ad server API integrations
-- Any other extensible functionality
-
-This section of the site contains user-submitted module documentation. We're hoping that it will grow over time.
-
-To see all of the modules that are available, see the [`modules` folder in the repo](https://github.com/prebid/Prebid.js/tree/master/modules).
-
-If you are looking for bidder adapter parameters, see [Bidders' Params]({{site.baseurl}}/dev-docs/bidders.html).
+- [Bidder adapters](/dev-docs/bidders.html)
+- [Analytics adapters](/overview/analytics.html)
+- Any other extensible functionality - documented on this page
* TOC
{:toc}
-## General Modules
-
-{: .table .table-bordered .table-striped }
-| Module | Description |
-|---------------------+--------------|
-| [**Currency**](/dev-docs/modules/currency.html) | Converts bid currency into ad server currency based on data in a supplied exchange rate file. |
-| **ConsentManagement** | Collecting and passing consent information in support of privacy regulations:{::nomarkdown}
{:/} See [CMP Best Practices.](/dev-docs/cmp-best-practices.html) |
-| [**Google Ad Manager Express**](/dev-docs/modules/dfp_express.html) | A simplified installation mechanism for publishers that have Google Publisher Tag (GPT) ad calls in their pages. |
-| [**Supply Chain Object**](/dev-docs/modules/schain.html) | Validates and makes the Supply Object available to bidders |
-| [**User ID**](/dev-docs/modules/userId.html) | Sub-modules are available to support a range of identification approaches. |
-| [**ID Import Library**](/dev-docs/modules/idLibrary.html) | Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing |
-| [**Advanced Size Mapping**](/dev-docs/modules/sizeMappingV2.html) | Display Responsive AdUnits in demanding page environments. |
-| [**Price Floors Module**](/dev-docs/modules/floors.html) | Configure and enforce minimum bids. |
-| [**GPT Pre-Auction Module**](/dev-docs/modules/gpt-pre-auction.html) | Adds a PB Ad Slot and matching GAM ad unit name to each ad unit's first-party data before bid requests are sent to the adapters. |
-| [**ID Import Library**](/dev-docs/modules/idLibrary.html) | Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing |
-| [**First Party Data Enrichment**](/dev-docs/modules/enrichmentFpdModule.html) | Pulls well-known FPD from the environment to form a base of data available to all adapters. |
-| [**MASS**](/dev-docs/modules/mass.html) | Enables the MASS protocol for Prebid and custom renderers by DealID |
-| [**MultiBid Module**](/dev-docs/modules/multibid.html) | Allows bidders to send multiple bids to the ad server. |
-| [**Bid Viewability**](/dev-docs/modules/bidViewable.html) | Triggers an event which can be consumed by analytics and bid adapters. |
+{% assign module_pages = site.pages | where: "page_type", "module" %}
-## Real-Time Data Providers
+## Recommended Modules
-All of the modules that fall under the Real-Time Data (RTD) category conform to
-a consistent set of publisher controls. The pub can choose to run multiple
-RTD modules, define an overall amount of time they're willing to wait for
-results, and even flag some of the modules as being more "important"
-than others.
+Prebid.org highly recommends that publishers utilize the following modules:
+
+
+
+
+
Module
+
Description
+
+
+
+{% for page in module_pages %}{% if page.recommended == true %}
+
-See [the realTimeData setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-realTimeData) reference for more details.
+## General Modules
-{% assign module_pages = site.pages | where: "page_type", "module" | where: "module_type", "rtd" %}
+Modules in the Real-Time Data (RTD) category conform to
+a consistent set of publisher controls. The publisher can choose to run multiple
+RTD modules, define an overall amount of time they're willing to wait for
+results, and even flag some of the modules as being higher priority
+than others. See [the realTimeData setConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-realTimeData) reference for more details.
Module
Description
+
RTD?
-{% for page in module_pages %}
- {% if page.enable_download == false %}{% continue %}{% endif %}
+{% for page in module_pages %}{% if page.recommended == true or page.vendor_specific == true %}{% continue %}{% endif %}
-## Video Modules
-
-{: .table .table-bordered .table-striped }
-| Module | Description |
-|---------------------+--------------|
-| [**Ad Pod**](/dev-docs/modules/adpod.html) | Enables developers to add support for a new adserver that handles ad pod (long-form) videos |
-| [**Freewheel**](/dev-docs/modules/freewheel.html) | Passes key value targeting to Freewheel SDK |
-| [**Google Ad Manager Video**](/dev-docs/modules/dfp_video.html) | Required for serving instream video through Google Ad Manager. |
-| [**IAB Category Translation**](/dev-docs/modules/categoryTranslation.html) | Converts IAB sub category to Ad server category for long-form videos. |
-| [**Instream Video Ads Tracking**](/dev-docs/modules/instreamTracking.html) | Allow Analytics Adapters and Bid Adapters to track `BID_WON` events for Instream video bids. |
-| [**Konduit Accelerate**](/dev-docs/modules/konduit.html) | Provides Real Time Start Rate Performance per Bidder. |
-
-## Testing and Debug Modules
-
-{: .table .table-bordered .table-striped }
-| Module | Description |
-|---------------------+--------------|
-| [**Server-to-Server Testing**](/dev-docs/modules/s2sTesting.html) | Adds A/B test support to ease into server-side header bidding. |
-| [**First Party Data Validation**](/dev-docs/modules/validationFpdModule.html) | Verify First Party Data ortb2 fields and data types. |
+## Vendor-Specific Modules
+These modules may require accounts with a service provider.
+
+
+
+
Module
+
Description
+
RTD?
+
+
+
+{% for page in module_pages %}{% if page.recommended == true %}{% continue %}{% endif %}{% if page.vendor_specific == true %}
+
## Further Reading
+ [Source code of all modules](https://github.com/prebid/Prebid.js/tree/master/modules)
-+ [Bidders' Params](/dev-docs/bidders.html)
++ [How to add a Bid Adapter](/dev-docs/bidder-adaptor.html)
++ [How to add an Analytics Adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html)
+ [How to add a Real Time Data Submodule](/dev-docs/add-rtd-submodule.html)
diff --git a/dev-docs/modules/instreamTracking.md b/dev-docs/modules/instreamTracking.md
index 4e3d18255e..1e2c16f128 100644
--- a/dev-docs/modules/instreamTracking.md
+++ b/dev-docs/modules/instreamTracking.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Instream Video Ads Tracking
-description: Allows to track `BID WON` events for instream ad units
+description: Allow Analytics Adapters and Bid Adapters to track `BID_WON` events for instream video bids.
module_code : instreamTracking
display_name : Instream Tracking
enable_download : true
diff --git a/dev-docs/modules/intersectionRtdProvider.md b/dev-docs/modules/intersectionRtdProvider.md
new file mode 100644
index 0000000000..a4381b8e92
--- /dev/null
+++ b/dev-docs/modules/intersectionRtdProvider.md
@@ -0,0 +1,75 @@
+---
+layout: page_v2
+title: Intersection Module
+display_name: Intersection
+description: Real Time Intersection
+page_type: module
+module_type: rtd
+module_code : intersectionRtdProvider
+enable_download : true
+sidebarType : 1
+---
+
+# Intersection Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+
+The Intersection module provides intersection for ad slots on the page using
+[Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API).
+
+Implementation works like this:
+
+ 1) Build the Intersection module into the Prebid.js package with:
+
+```
+gulp build --modules=intersectionRtdProvider&...
+```
+
+2) Use `setConfig` to instruct the browser to obtain the intersection data
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders` object:
+
+```
+ pbjs.setConfig({
+ "realTimeData": {
+ auctionDelay: 100,
+ dataProviders:[{
+ "name": "intersection",
+ "waitForIt": true
+ }]
+ }
+ });
+```
+
+## Output
+
+For each bidder, the module adds intersection in a JSON format.
+Example:
+```
+{
+ "intersection":{
+ 'boundingClientRect': {
+ 'left': 10,
+ 'top': 10,
+ 'right': 310,
+ 'bottom': 260,
+ 'width': 300,
+ 'height': 250,
+ 'x': 10,
+ 'y': 10,
+ },
+ 'intersectionRect': {/* ... */},
+ 'rootRect': {/* ... */},
+ 'intersectionRatio': 0.5,
+ 'isIntersecting': false,
+ 'time': 1636993868145
+ }
+}
+```
+
diff --git a/dev-docs/modules/jwplayerRtdProvider.md b/dev-docs/modules/jwplayerRtdProvider.md
index 66b4fc3024..75a8b81e1c 100644
--- a/dev-docs/modules/jwplayerRtdProvider.md
+++ b/dev-docs/modules/jwplayerRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : jwplayerRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
@@ -106,34 +107,53 @@ Each bidRequest for which targeting information was found will conform to the fo
```json
{
- adUnitCode: 'xyz',
- bidId: 'abc',
- ...,
- rtd: {
- jwplayer: {
- targeting: {
- segments: ['123', '456'],
- content: {
- id: 'jw_abc123'
- }
- }
- }
- }
+ adUnitCode: 'xyz',
+ bidId: 'abc',
+ ...,
+ ortb2: {
+ site: {
+ content: {
+ id: 'jw_abc123',
+ data: [
+ {
+ name: 'jwplayer.com',
+ ext: {
+ segtax: 502,
+ cids: ['abc123']
+ },
+ segment: [
+ {
+ id: '123'
+ },
+ {
+ id: '456'
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
}
```
+Each bid for which targeting information was found will have a ortb2 param conforming to the [oRTB v2 object structure](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf). The `ortb2` object will contain our proprietaty targeting segments in a format compliant with the [IAB's segment taxonomy structure](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/extensions/community_extensions/segtax.md).
-Read the bidRequest.jwTargeting object and pass the values to your endpoint as appropriate.
+The content's ID can be obtained in the `bid.ortb2.site.content.id` property path and the targeting segments can be found in `bid.ortb2.site.content.data.segment`.
**BidRequest Syntax details:**
{: .table .table-bordered .table-striped }
| Name |Type | Description | Notes |
| :------------ | :------------ | :------------ |:------------ |
-| rtd.jwplayer.targeting | Object | | |
-| rtd.jwplayer.targeting.segments | Array of Strings | jwpseg targeting segments | |
-| rtd.jwplayer.targeting.content | Object | | |
-| rtd.jwplayer.targeting.content.id | String | Unique identifier for the specific media asset | |
-
+| ortb2.site.content | Object | | |
+| ortb2.site.content.id | String | Unique identifier for the specific media asset | |
+| ortb2.site.content.data | Array | Contains segment taxonomy objects | |
+| ortb2.site.content.data[index].name | String | the `jwplayer.com` string indicating the provider name | |
+| ortb2.site.content.data[index].ext.segtax | Integer | the `502` value is the unique identifier for JW Player's proprietary taxonomy | |
+| ortb2.site.content.data[index].ext.cids | Array | List of extended content ids as defined in [oRTB's community extensions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/extensions/community_extensions/extended-content-ids.md#example---content-id-and-seller-defined-context). | |
+| ortb2.site.content.data[index].segment | Array | Contains the segment taxonomy values as an object | |
+| ortb2.site.content.data[index].segment[index].id | String | String representation of the data segment value | |
+
## Example
To view an example:
diff --git a/dev-docs/modules/konduit.md b/dev-docs/modules/konduit.md
index 7623ae7aa2..f9bb831eea 100644
--- a/dev-docs/modules/konduit.md
+++ b/dev-docs/modules/konduit.md
@@ -2,10 +2,11 @@
layout: page_v2
page_type: module
title: Module - Konduit Accelerate
-description: Applies Konduit video ad acceleration optimization to a provided bid.
+description: Applies Konduit video ad acceleration optimization to wining video bid.
module_code : konduitWrapper
display_name : Konduit Accelerate
enable_download : true
+vendor_specific: true
sidebarType : 1
---
diff --git a/dev-docs/modules/mass.md b/dev-docs/modules/mass.md
index d447773ca3..cdacac886a 100644
--- a/dev-docs/modules/mass.md
+++ b/dev-docs/modules/mass.md
@@ -2,9 +2,9 @@
layout: page_v2
page_type: module
title: Module - MASS
-description: Enable MASS protocol for Prebid
+description: General deal rendering functionality.
module_code : mass
-display_name : MASS
+display_name : Deal Rendering (aka MASS)
enable_download : true
sidebarType : 1
---
@@ -139,16 +139,46 @@ pbjs.que.push(function() {
## Integration Example
+There are two options to view the integration example:
+
+### Option 1 - Your own development environment
To view the integration example:
-1) in your cli run:
+1) Build Prebid using the following required options
+
+```
+gulp build --modules=ixBidAdapter,mass
+```
+
+2) Use a http server with a valid hostname to access its content. It is not advised to run the bid simulation using localhost or 127.0.0.1
```
-gulp serve --modules=ixBidAdapter,mass
+http://hostname/integrationExamples/mass/index.html
```
-2) in your browser, navigate to:
+### Option 2 - Hosted online
+Mass Platform Limited hosts an official integration and demo page that can be accessed using the following link: https://demo.massplatform.net/ix/prebid/
+
+## Testing MASS
+Testing requires valid bids to be returned to Prebid. To assist with this process, we recommend you use the MASS Bid Simulation tool found at https://github.com/massplatform/bidsim. Your Exchange partner might be able to assist you with other specialist tools and browser plugins to achieve similar resuls.
+The instructions below assume that you have followed the installation instructions for the MASS Bidsim tool found at https://github.com/massplatform/bidsim/blob/master/README.md.
+
+### Testing using MASS compliant tags
+The bidsim tool ships with working DSP example tags that can be found under the bidsim/tags folder.
+
+A quick way to test the Integration test page in combination with the official bootloader is to use the following command:
+```
+node bidsim --inject --bid 2000 --width 300 --height 250 --dealid 'MASS' --tag "tags/inskin-housead-desktop.js" -o https://demo.massplatform.net/ix/prebid
```
-http://localhost:9999/integrationExamples/mass/index.html
+### For third-party technology companies
+Third-parties that wish to integrate with the official MASS bootloader can get started by running the following command:
```
+node bidsim --inject --bid 2000 --width 300 --height 250 --dealid 'MASS' --tag "tags/test.js" -o https://demo.massplatform.net/ix/prebid
+```
+
+Explanation: The tags/test.js tag calls a reference endpoint for developers that can be accessed here: https://demo.massplatform.net/reference/endpoint.js.
+When running the above command to invoke this reference endpoint, you will see all the params that MASS collected and passed onto your endpoint. This includes inputs, parsed inputs, tag parameters and MASS/Provider specific configurations.
+
+### Testing on live sites
+Any sites that have been MASS configured will work with the Bidsim tool. This is a convenient way to test whether your publisher ad server and slot is correctly configured.
diff --git a/dev-docs/modules/medianetRtdProvider.md b/dev-docs/modules/medianetRtdProvider.md
new file mode 100644
index 0000000000..fac7f1cf1c
--- /dev/null
+++ b/dev-docs/modules/medianetRtdProvider.md
@@ -0,0 +1,116 @@
+---
+layout: page_v2
+title: Media.net Realtime Module
+display_name: Media.net Realtime Module
+description: Delivers added functionality based on configurations, i.e. refresh, viewability, etc.
+page_type: module
+module_type: rtd
+module_code : medianetRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Media.net Realtime Module
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+
+The module currently provisions Media.net's Intelligent Refresh configured by the publisher.
+
+### Intelligent Refresh
+
+Intelligent Refresh (IR) module lets publisher refresh their ad inventory without affecting page experience of visitors through configured criteria. The module optionally provides tracking of refresh inventory and appropriate targeting in GAM. Publisher configured criteria is fetched via an external JS payload.
+
+{: .alert.alert-warning :}
+Disclosure: This module loads external code that is not open source and has not been reviewed by Prebid.org.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders` object.
+
+{: .table .table-bordered .table-striped }
+| Name | Scope | Description | Example | Type |
+|------------|----------|----------------------------------------|---------------|----------|
+| `name ` | required | Real time data module name | `'medianet'` | `string` |
+| `params` | required | | | `Object` |
+| `params.cid` | required | The customer id is provided by Media.net. | `'8CUX0H51C'` | `string` |
+
+#### Basic Example
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'medianet',
+ params: {
+ cid: '8CUX0H51C'
+ }
+ }]
+ }
+});
+```
+
+## Prebid Adapters module usage
+
+Prebid bidder and analytics adapters can read `adunit.ortb2Imp.ext.refresh` to know the information passed by Intelligent Refresh Real Time Module. Example AdUnit:
+
+```javascript
+var adUnit = {
+ "code": "div-gpt-ad-1460505748561-1",
+ // ...
+ "ortb2Imp": {
+ "ext": {
+ "refresh": { // added by Intelligent Refresh RTD
+ "mnrf": "1", // mnrf=1 means its a refresh impression
+ "mnrfc": 2 // mrfc=2 means its the 2nd refresh-ed impression
+ },
+ "data": { "pbadslot": "div-gpt-ad-1460505748561-1" },
+ }
+ }
+};
+```
+
+## Targeting sent to GAM
+
+For each prebid adUnit we pass following key values to GAM by default
+
+```javascript
+var targeting = {
+ "slotA":{
+ "mnadc": "slotA", // used to map GPT slot => Prebid AdUnit
+ "mnrf": "1", // Refresh Impression Flag
+ "mnrfc": 2 // Refreshed count per slot
+ }
+};
+```
+
+## Integration
+To install the module, follow these instructions:
+
+#### Step 1: Prepare the base Prebid file
+
+- Option 1: Use Prebid [Download](/download.html) page to build the prebid package. Ensure that you do check *Media.net Realtime Module* module
+
+- Option 2: From the command line, run `gulp build --modules=medianetRtdProvider,...`
+
+#### Step 2: Set configuration
+
+Enable Media.net Real Time Module using `pbjs.setConfig`
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'medianet',
+ params: {
+ cid: '8CUX0H51C'
+ }
+ }]
+ }
+});
+```
+
diff --git a/dev-docs/modules/multibid.md b/dev-docs/modules/multibid.md
index 49f04d8786..e9ae46f0cc 100644
--- a/dev-docs/modules/multibid.md
+++ b/dev-docs/modules/multibid.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - MultiBid
-description: Allows bidders to return more than one bid response
+description: Allows bidders to send multiple bids to the ad server.
module_code : multibid
display_name : MultiBid
enable_download : true
diff --git a/dev-docs/modules/optimeraRtdProvider.md b/dev-docs/modules/optimeraRtdProvider.md
index ef52f29cf9..351febd353 100644
--- a/dev-docs/modules/optimeraRtdProvider.md
+++ b/dev-docs/modules/optimeraRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : optimeraRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
@@ -21,9 +22,11 @@ Optimera Real Time Data Module. Provides targeting for ad requests from data col
1) Compile the Optimera RTD Provider into your Prebid build:
```
-`gulp build --modules=optimeraRtdProvider`...
+`gulp build --modules=rtdModule,optimeraRtdProvider`...
```
+Note: You must include rtdModule in the build list.
+
2) Use `setConfig` to instruct Prebid.js to initialize the optimera module, as specified below.
## Configuration
@@ -49,6 +52,12 @@ Configuration example for using RTD module with the `optimeraRTD` provider:
}
```
+## Migration From the Optimera Bidder Adapter
+
+The Optimera Bidder Adapter is no longer active with Prebid 5.0. Therefore, the bidder settings used for the Optimera Bidder Adapter for < Prebid 5.0 can be removed and replaced with this new Optimera RTD module configuration.
+
+For the optimeraKeyName setting, the Optimera Bidder Adapter used 'hb_deal_optimera' as the key name, as this is the key that name used in GAM. There is no need to change this key name in GAM, as you can still use this key name with the Optimera RTD Module as indicated above.
+
Parameters details:
Contact Optimera to get assistance with the params.
diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md
new file mode 100644
index 0000000000..0983fe4d8a
--- /dev/null
+++ b/dev-docs/modules/permutiveRtdProvider.md
@@ -0,0 +1,76 @@
+---
+layout: page_v2
+title: Permutive Real Time Data Provider
+display_name: Permutive Real Time Data Module
+description: Permutive Real Time Data Module
+page_type: module
+module_type: rtd
+module_code : permutiveRtdProvider
+enable_download : true
+vendor_specific: true
+sidebarType : 1
+---
+
+# Permutive RTD Provider
+{:.no_toc}
+
+* TOC
+{:toc}
+
+## Overview
+This module reads cohorts from Permutive and attaches them as targeting keys to bid requests.
+
+## Usage
+Compile the Permutive RTD module into your Prebid build:
+```
+gulp build --modules=rtdModule,permutiveRtdProvider
+```
+
+> Note that the global RTD module, `rtdModule`, is a prerequisite of the Permutive RTD module.
+
+You then need to enable the Permutive RTD in your Prebid configuration, using the below format:
+
+```javascript
+pbjs.setConfig({
+ ...,
+ realTimeData: {
+ auctionDelay: 50, // optional auction delay
+ dataProviders: [{
+ name: 'permutive',
+ waitForIt: true, // should be true if there's an `auctionDelay`
+ params: {
+ acBidders: ['appnexus']
+ }
+ }]
+ },
+ ...
+})
+```
+
+## Supported Bidders
+The Permutive RTD module sets Audience Connector cohorts as bidder-specific `ortb2.user.data` first-party data, following the Prebid `ortb2` convention, for any bidder included in `acBidders`. The module also supports bidder-specific data locations per ad unit (custom parameters) for the below bidders:
+
+{: .table .table-bordered .table-striped }
+| Bidder | ID | Custom Cohorts | Audience Connector |
+| ----------- | ---------- | -------------------- | ------------------ |
+| Xandr | `appnexus` | Yes | Yes |
+| Magnite | `rubicon` | Yes | No |
+| Ozone | `ozone` | No | Yes |
+
+Key-values details for custom parameters:
+* **Custom Cohorts:** The module configuration will automatically reflect the SSP integrations (_Activations_) you have enabled in your Permutive dashboard. Any additional bidders you want to pass data to will need to be configured. Permutive cohorts will be sent in the permutive key-value.
+
+* **Audience Connector:** You'll need to define which bidders should receive Audience Connector cohorts. You need to include the `ID` of any bidder in the `acBidders` array. Audience Connector cohorts will be sent in the `p_standard` key-value.
+
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+| Name | Type | Description | Default |
+| ----------------- | -------------------- | ------------------ | ------------------ |
+| name | String | This should always be `permutive` | - |
+| waitForIt | Boolean | Should be `true` if there's an `auctionDelay` defined (optional) | `false` |
+| params | Object | | - |
+| params.acBidders | String[] | An array of bidders which should receive Audience Connector cohorts. | `[]` |
+| params.maxSegs | Integer | Maximum number of cohorts to be included in either the `permutive` or `p_standard` key-value. | `500` |
+
diff --git a/dev-docs/modules/prebidServer.md b/dev-docs/modules/prebidServer.md
new file mode 100644
index 0000000000..726b354ff9
--- /dev/null
+++ b/dev-docs/modules/prebidServer.md
@@ -0,0 +1,262 @@
+---
+layout: page_v2
+title: Module - Prebid Server Adapter
+display_name: Prebid Server Adapter
+description: Server-to-Server header bidding
+page_type: module
+module_code : prebidServerBidAdapter
+enable_download : true
+vendor_specific: false
+sidebarType : 1
+---
+
+# Prebid Server Adapter
+{: .no_toc}
+
+* TOC
+{:toc }
+
+## Overview
+
+The Prebid Server Adapter is a meta-adapter. It's not an actual bidder, but
+rather a way to get a batch of bids from other bidders with one request.
+A request for the set of auctions is sent to Prebid Server, which performs
+all the auctions server-to-server (S2S), responding in time for Prebid.js to
+send the results to the ad server. This lightens the performance load on the user's device.
+
+## Configuration
+Here's an example config enabling the AppNexus Prebid Server:
+
+```javascript
+pbjs.setConfig({
+ s2sConfig: {
+ accountId : '12345',
+ bidders : ['appnexus','pubmatic', 'rubicon'],
+ defaultVendor: 'appnexus',
+ timeout: 300
+ }
+});
+```
+
+To use multiple prebid servers, just define `s2sConfig` as an array.
+The same bidder cannot be set in both configs. For example:
+
+```javascript
+pbjs.setConfig({
+ s2sConfig: [
+ {
+ accountId: '12345',
+ bidders: ['appnexus','pubmatic'],
+ defaultVendor: 'appnexus',
+ timeout: 300,
+ },
+ {
+ accountId: '678910',
+ bidders: ['rubicon'],
+ defaultVendor: 'rubicon',
+ timeout: 300,
+ },
+ ],
+});
+```
+There are many configuration options for s2sConfig:
+
+{: .table .table-bordered .table-striped }
+| Attribute | Scope | Type | Description |
+|------------+---------+---------+---------------------------------------------------------------|
+| `accountId` | Required | String | Your Prebid Server account ID. This is obtained from whoever's hosting your Prebid Server. |
+| `bidders` | Optional | Array of Strings | Which bidders auctions should take place on the server side |
+| `allowUnknownBidderCodes` | Optional | Boolean | Allow Prebid Server to bid on behalf of bidders that are not explicitly listed in the adUnit. See important [note](#allowUnknownBidderCodes) below. Defaults to `false`. |
+| `defaultVendor` | Optional | String | Automatically includes all following options in the config with vendor's default values. Individual properties can be overridden by including them in the config along with this setting. See the Additional Notes below for more information. |
+| `enabled` | Optional | Boolean | Enables this s2sConfig block - defaults to `false` |
+| `timeout` | Required | Integer | Number of milliseconds allowed for the server-side auctions. This should be approximately 200ms-300ms less than your Prebid.js timeout to allow for all bids to be returned in a timely manner. See the Additional Notes below for more information. |
+| `adapter` | Required | String | Adapter to use to connect to Prebid Server. Defaults to 'prebidServer' |
+| `endpoint` | Required | URL or Object | Defines the auction endpoint for the Prebid Server cluster. See table below for object config properties. |
+| `syncEndpoint` | Required | URL or Object | Defines the cookie_sync endpoint for the Prebid Server cluster. See table below for object config properties. |
+| `userSyncLimit` | Optional | Integer | Max number of userSync URLs that can be executed by Prebid Server cookie_sync per request. If not defined, PBS will execute all userSync URLs included in the request. |
+| `syncTimeout` | Optional | Integer | Maximum number of milliseconds allowed for each server-side userSync to load. Default is 1000. |
+| `syncUrlModifier` | Optional | Object | Function to modify a bidder's sync url before the actual call to the sync endpoint. Bidder must be enabled for s2sConfig. |
+| `coopSync` | Optional | Boolean | Whether or not PBS is allowed to perform "cooperative syncing" for bidders not on this page. Publishers help each other improve match rates by allowing this. Default is true. |
+| `defaultTtl` | Optional | Integer | Configures the default TTL in the Prebid Server adapter to use when Prebid Server does not return a bid TTL - 60 if not set |
+| `adapterOptions` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in every impression object at request.imp[].ext.BIDDER. See the example above. |
+| `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. |
+
+If `endpoint` and `syncEndpoint` are objects, these are the supported properties:
+
+{: .table .table-bordered .table-striped }
+| Attribute | Scope | Type | Description |
+|------------+---------+---------+---------------------------------------------------------------|
+| p1Consent | Required | String | Defines the auction endpoint or the cookie_sync endpoint for the Prebid Server cluster for non-consent requests or users who grant consent. |
+| noP1Consent | Required | String | Defines the auction endpoint or the cookie_sync endpoint for the Prebid Server cluster for users who do not grant consent. (This is useful for a server configured to not accept any cookies to ensure compliance regulations.) |
+
+**Notes on s2sConfig properties**
+
+- Currently supported vendors are: appnexus, openx, and rubicon
+- When using `defaultVendor` option, `accountId` still needs to be defined.
+- If `bidders` is omitted, only adUnits that also omit bidders will be sent to Prebid Server. See the [stored impressions](#stored-imp) example below.
+- If the `s2sConfig` timeout is greater than the Prebid.js timeout, the `s2sConfig` timeout will be automatically adjusted to 75% of the Prebid.js timeout in order to fit within the auction process.
+- When using the `endpoint` or `syncEndpoint` object configs, you should define both properties. If either property is not defined, Prebid Server requests for that type of user will not be made. If you do not need to distinguish endpoints for consent reasons, you can simply define the same URL value in both fields or use the String version of the field (which is configured to use defined URL for all users).
+- When `allowUnknownBidderCodes` is `true`, bidders that have not been explicitly requested in [`adUnit.bids`](../adunit-reference.html#adunitbids) may take part in the auction. This can break custom logic that relies on the availability of a bid request object for any given bid. Known scenarios where custom code won't get the request when there's an "unknown bidder":
+ - There will not be a [`bidRequested`](getEvents.html) event.
+ - In the [MASS custom renderers](/dev-docs/modules/mass.html#configuration-parameters) module, `payload.bidRequest` will be undefined.
+ - In the [Price Floors module](/dev-docs/modules/floors.html), custom schema functions will see the bidRequest object as undefined.
+
+
+Additional options for `s2sConfig` may be enabled by including the [Server-to-Server testing module]({{site.baseurl}}/dev-docs/modules/s2sTesting.html).
+
+**Passing the Referrer to Server Side Adapters**
+
+* Setting `extPrebid.origreferrer` will be recognized by some server-side adapters as the referring URL for the current page.
+
+## Bid Params
+
+Bid params are sourced from the adapter configurations set for client side. These do not need to change for Prebid Server.
+
+{: .alert.alert-warning :}
+**Errors in bidder parameters will cause Prebid Server to reject the
+entire request.** The Prebid Server philosophy is to avoid silent failures --
+we assume you will test changes, and that it will be easier to notice a
+4xx error coming from the server than a silent failure where it skips just
+the bad parameter.
+
+
+## Examples
+
+### Defining endpoints
+
+s2sConfig example with the endpoint attributes defined instead of using the 'defaultVendor' approach:
+```javascript
+pbjs.setConfig({
+ s2sConfig: [{
+ accountId: '1001',
+ bidders: ['bidderA', 'bidderB'],
+ endpoint: 'https://mypbs.example.com/path',
+ syncEndpoint: 'https://mypbs.example.com/path',
+ timeout: 300
+ }]
+})
+```
+
+A similar example with the endpoint attributes defined as objects:
+```javascript
+pbjs.setConfig({
+ s2sConfig: [{
+ accountId: '1001',
+ bidders: ['bidderA', 'bidderB'],
+ endpoint: {
+ p1Consent: 'https://mypbs.example.com/path',
+ noP1Consent: 'https://mypbs2.example.com/path'
+ },
+ syncEndpoint: {
+ p1Consent: 'https://mypbs.example.com/path',
+ noP1Consent: 'https://mypbs2.example.com/path'
+ },
+ timeout: 300
+ }]
+})
+```
+
+### Server-Side Aliases
+
+You may want to run a particular bidder on the client for banner, but that same bidder on the
+server for video. You would do this by setting a **server-side** alias. For example:
+
+```javascript
+pbjs.setConfig({
+ s2sConfig: [{
+ accountId: '1',
+ bidders: ['tripleliftVideo'],
+ defaultVendor: 'appnexus',
+ timeout: 500,
+ extPrebid: {
+ aliases: {
+ tripleliftVideo: tripleLift
+ }
+ }
+ }]
+})
+```
+
+Here's how it works:
+
+1. Video ad units are coded with the dynamic alias. e.g. tripleliftVideo
+1. The s2sConfig.bidders array contains 'tripleliftVideo' telling Prebid.js to direct bids for that code to the server
+1. Finally, the extPrebid.aliases line tells Prebid Server to route the 'tripleliftVideo' biddercode to the 'triplelift' server-side adapter.
+
+### Video via s2sConfig
+
+Supporting video through the Server-to-Server route can be done by providing a couple of extra arguments on the `extPrebid` object. e.g.
+
+```javascript
+pbjs.setConfig({
+ s2sConfig: [{
+ accountId: '1001',
+ bidders: ['rubicon', 'pubmatic'],
+ defaultVendor: 'rubicon',
+ timeout: 250,
+ extPrebid: {
+ cache: {
+ vastxml: {returnCreative: false}
+ },
+ targeting: {
+ pricegranularity: {"ranges": [{"max": 40.00, "increment": 1.00}]}
+ }
+ }
+ }]
+})
+```
+
+
+
+### Stored impressions
+
+Prebid Server stored [requests](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-requests) can be requested through the adUnit `ortb2Imp` property. This is useful to move the list of bidders and parameters from the page to blocks of JSON stored on the server. For these cases, it's not necessary to specify `bids`:
+
+```javascript
+pbjs.addAdUnits([{
+ code: 'example-stored-request',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ ortb2Imp: {
+ ext: {
+ prebid: {
+ storedrequest: {
+ id: 'your-stored-request-id'
+ }
+ }
+ }
+ }
+}])
+```
+
+### Stored responses
+
+For debugging purposes, it can be useful to have a page that retrieves a static value rather than running an actual auction.
+For this you can use PBS [stored responses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses-pbs-java-only).
+Here's an example:
+
+```javascript
+pbjs.addAdUnits([{
+ code: 'example-stored-response',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ ortb2Imp: {
+ ext: {
+ prebid: {
+ storedauctionresponse: {
+ id: 'your-stored-response-id'
+ }
+ }
+ }
+ }
+}])
+```
+
+## Related Reading
+- [Prebid Server Overview](/prebid-server/overview/prebid-server-overview.html)
diff --git a/dev-docs/modules/pubCommonId.md b/dev-docs/modules/pubCommonId.md
index 7e42c44ade..455e89bb38 100644
--- a/dev-docs/modules/pubCommonId.md
+++ b/dev-docs/modules/pubCommonId.md
@@ -4,7 +4,7 @@ page_type: module
title: Module - Publisher Common ID
description: User ID persisted in first party domain
module_code : pubCommonId
-display_name : Publisher Common ID
+display_name : Publisher Common ID (deprecated)
enable_download : true
sidebarType : 1
---
diff --git a/dev-docs/modules/reconciliationRtdProvider.md b/dev-docs/modules/reconciliationRtdProvider.md
index da9da39642..47ff52d92e 100644
--- a/dev-docs/modules/reconciliationRtdProvider.md
+++ b/dev-docs/modules/reconciliationRtdProvider.md
@@ -5,8 +5,9 @@ description: Reconciliation Real Time Data Module
page_type: module
module_type: rtd
module_code: reconciliationRtdProvider
-display_name: Reconciliation
+display_name: Reconciliation Supply Chain Validation
enable_download: true
+vendor_specific: true
sidebarType: 1
---
diff --git a/dev-docs/modules/schain.md b/dev-docs/modules/schain.md
index 77934e227c..4534f4840b 100644
--- a/dev-docs/modules/schain.md
+++ b/dev-docs/modules/schain.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Supply Chain Object
-description: Validates Supply Chain object and makes it available to bidder
+description: Validates the Supply Chain object and makes it available to bidders.
module_code : schain
display_name : Supply Chain Object
enable_download : true
diff --git a/dev-docs/modules/sirdataRtdProvider.md b/dev-docs/modules/sirdataRtdProvider.md
index 419c8f0876..68a07237f2 100644
--- a/dev-docs/modules/sirdataRtdProvider.md
+++ b/dev-docs/modules/sirdataRtdProvider.md
@@ -7,6 +7,7 @@ page_type: module
module_type: rtd
module_code : sirdataRtdProvider
enable_download : true
+vendor_specific: true
sidebarType : 1
---
@@ -195,4 +196,4 @@ To view an example of available segments returned by Sirdata's backends:
and then point your browser at:
-`http://localhost:9999/integrationExamples/gpt/sirdataRtdProvider_example.html`
\ No newline at end of file
+`http://localhost:9999/integrationExamples/gpt/sirdataRtdProvider_example.html`
diff --git a/dev-docs/modules/sizeMappingV2.md b/dev-docs/modules/sizeMappingV2.md
index e51406e929..db922d158f 100644
--- a/dev-docs/modules/sizeMappingV2.md
+++ b/dev-docs/modules/sizeMappingV2.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - Size Mapping
-description: Display Conditional and Responsive Ad Units
+description: Display Responsive AdUnits in demanding page environments.
module_code: sizeMappingV2
display_name: Advanced Size Mapping
enable_download: true
@@ -42,6 +42,8 @@ It's meant for publishers that have complex site designs. You should use this mo
If, on the other hand, the AdUnits, bidders, and mediaTypes all change behavior together at the same viewport width,
then the built-in [`sizeConfig`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-Responsive-Ads) feature will work.
+
+Note that the Prebid Server bid adapter does not currently support the scenario where an adUnit has multiple mediaTypes, with different bidders set to different relevantMediaTypes for the same screen size.
{% endcapture %}
{% include alerts/alert_tip.html content=tip-choosing %}
@@ -56,7 +58,7 @@ If you've used [`sizeConfig`](/dev-docs/publisher-api-reference/setConfig.html#s
{% highlight js %}
mediaTypes: {
banner: {
- sizeConfig = [
+ sizeConfig: [
{ minViewPort: [0, 0], sizes: [] }, // deactivate if viewport < 750px
{ minViewPort: [750, 0], sizes: [[300, 250], [300, 600]] } // activate viewport > 750px
];
diff --git a/dev-docs/modules/timeoutRtdProvider.md b/dev-docs/modules/timeoutRtdProvider.md
new file mode 100644
index 0000000000..7830eb7b40
--- /dev/null
+++ b/dev-docs/modules/timeoutRtdProvider.md
@@ -0,0 +1,159 @@
+---
+layout: page_v2
+title: Timeout Rtd Module
+display_name: Timeout RTD
+description: Module for managing timeouts in real time
+page_type: module
+module_type: rtd
+module_code : timeoutRtdProvider
+enable_download : true
+sidebarType : 1
+---
+
+## Overview
+The timeout RTD module enables publishers to set rules that determine the timeout based on
+certain features. It supports rules dynamically retrieved from a timeout provider as well as rules
+set directly via configuration.
+Build the timeout RTD module into the Prebid.js package with:
+```
+gulp build --modules=timeoutRtdProvider,rtdModule...
+```
+
+## Configuration
+The module is configured in the realTimeData.dataProviders object. The module will override
+`bidderTimeout` in the pbjs config.
+
+### Timeout Data Provider interface
+The timeout RTD module provides an interface of dynamically fetching timeout rules from
+a data provider just before the auction begins. The endpoint url is set in the config just as in
+the example below, and the timeout data will be used when making bid requests.
+
+```
+pbjs.setConfig({
+ ...
+ "realTimeData": {
+ "dataProviders": [{
+ "name": 'timeout',
+ "params": {
+ "endpoint": {
+ "url": "http://{cdn-link}.json"
+ }
+ }
+ }
+ ]},
+
+ // This value below will be modified by the timeout RTD module if it successfully
+ // fetches the timeout data.
+ "bidderTimeout": 1500,
+ ...
+});
+```
+
+Sample Endpoint Response:
+```
+{
+ "rules": {
+ "includesVideo": {
+ "true": 200,
+ "false": 50
+ },
+ "numAdUnits" : {
+ "1-5": 100,
+ "6-10": 200,
+ "11-15": 300
+ },
+ "deviceType": {
+ "2": 50,
+ "4": 100,
+ "5": 200
+ },
+ "connectionSpeed": {
+ "slow": 200,
+ "medium": 100,
+ "fast": 50,
+ "unknown": 10
+ },
+}
+```
+
+### Rule Handling:
+The rules retrieved from the endpoint will be used to add time to the `bidderTimeout` based on certain features such as
+the user's deviceType, connection speed, etc. These rules can also be configured statically on page via a `rules` object.
+Note that the timeout Module will ignore the static rules if an endpoint url is provided. The timeout rules follow the
+format:
+```
+{
+ '': {
+ '':
+ }
+}
+```
+See bottom of page for examples.
+
+Currently supported features:
+
+|Name |Description | Keys | Example
+| :------------ | :------------ | :------------ |:------------ |
+| includesVideo | Adds time to the timeout based on whether there is a video ad unit in the auction or not | 'true'/'false'| { "true": 200, "false": 50 } |
+| numAdUnits | Adds time based on the number of ad units. Ranges in the format `'lowerbound-upperbound` are accepted. This range is inclusive | numbers or number ranges | {"1": 50, "2-5": 100, "6-10": 200} |
+| deviceType | Adds time based on device type| 2, 4, or 5| {"2": 50, "4": 100} |
+| connectionSpeed | Adds time based on connection speed. `connectionSpeed` defaults to 'unknown' if connection speed cannot be determined | slow, medium, fast, or unknown | { "slow": 200} |
+
+If there are multiple rules set, all of them would be used and any that apply will be added to the base timeout. For example, if the rules object contains:
+```
+{
+ "includesVideo": {
+ "true": 200,
+ "false": 50
+ },
+ "numAdUnits" : {
+ "1-3": 100,
+ "4-5": 200
+ }
+}
+```
+and there are 3 ad units in the auction, all of which are banner, then the timeout to be added will be 150 milliseconds (50 for `includesVideo[false]` + 100 for `numAdUnits['1-3']`).
+
+Full example:
+```
+pbjs.setConfig({
+ ...
+ "realTimeData": {
+ "dataProviders": [{
+ "name": 'timeout',
+ "params": {
+ "rules": {
+ "includesVideo": {
+ "true": 200,
+ "false": 50
+ },
+ "numAdUnits" : {
+ "1-5": 100,
+ "6-10": 200,
+ "11-15": 300
+ },
+ "deviceType": {
+ "2": 50,
+ "4": 100,
+ "5": 200
+ },
+ "connectionSpeed": {
+ "slow": 200,
+ "medium": 100,
+ "fast": 50,
+ "unknown": 10
+ }
+ }
+ }
+ ]}
+ }
+ ...
+ // The timeout RTD module will add time to `bidderTimeout` based on the rules set above.
+ "bidderTimeout": 1500,
+```
+
+## Timeout Providers
+
+{: .table }
+| Partner | Contact | About |
+| OpenX | [apollo@openx.com](mailto:apollo@openx.com) | Dynamic timeout optimization and more |
\ No newline at end of file
diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md
index dcfc0245a0..3398e3a390 100644
--- a/dev-docs/modules/userId.md
+++ b/dev-docs/modules/userId.md
@@ -2,7 +2,7 @@
layout: page_v2
page_type: module
title: Module - User ID
-description: Supports multiple cross-vendor user IDs
+description: Vendor-specific user ID sub-modules are available to support a range of identification approaches.
module_code : userId
display_name : User ID
enable_download : false
@@ -29,6 +29,7 @@ The User ID module supports multiple ways of establishing pseudonymous IDs for u
1. If GDPR applies, the consent signal from the CMP is hashed and stored in a cookie called `_pbjs_userid_consent_data`. This is required so that ID sub-modules may be called to refresh their ID if the user's consent preferences have changed from the previous page, and ensures cached IDs are no longer used if consent is withdrawn.
1. An object containing one or more IDs (`bidRequest.userId`) is made available to Prebid.js adapters and Prebid Server S2S adapters.
1. In addition to `bidRequest.userId`, `bidRequest.userIdAsEids` is made available to Prebid.js adapters and Prebid Server S2S adapters. `bidRequest.userIdAsEids` has userIds in ORTB EIDS format.
+1. The page can call [pbjs.getUserIds()](/dev-docs/publisher-api-reference/getUserIds.html), [pbjs.getUserIdsAsEids()](/dev-docs/publisher-api-reference/getUserIdsAsEids.html), or [pbjs.getUserIdsAsync()](/dev-docs/publisher-api-reference/getUserIdsAsync.html).
{: .alert.alert-info :}
Note that User IDs aren't needed in the mobile app world because device ID is available in those ad serving scenarios.
@@ -66,13 +67,23 @@ Publishers that want to do this should design their workflow and then set `_pbjs
## Basic Configuration
By including this module and one or more of the sub-modules, a number of new options become available in `setConfig()`,
-all of them under the `userSync` object as attributes of the `userIds` array
-of sub-objects. The table below has the options that are common across ID systems. See the sections below for specific configuration needed by each system and examples.
+under the `userSync` object as attributes of the `userIds` array
+of sub-objects.
+
+Publishers using Google AdManager may want to sync one of the identifiers as their Google PPID for frequency capping or reporting.
+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"` |
+
+The table below has the options that are common across ID systems. See the sections below for specific configuration needed by each system and examples.
{: .table .table-bordered .table-striped }
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | May be: `"admixerId"`, `"amxId"`, `"britepoolId"`, `"criteo"`, `"fabrickId"`, `"flocId"`, `"haloId"`, `"id5id"`, `identityLink`, `"idx"`, `"intentIqId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"mwOpenLinkId"`, `"netId"`, `"novatiqId"`, `"parrableId"`, `"quantcastId"`, `"pubProvidedId"`, `"sharedId"`, `"tapadId"`, `"unifiedId"`,`"uid2"`, `"verizonMediaId"`, `"zeotapIdPlus"` | `"unifiedId"`
+| name | Required | String | May be: `"33acrossId"`, `"admixerId"`, `"qid"`, `"adtelligentId"`, `"amxId"`, `"britepoolId"`, `"criteo"`, `"fabrickId"`, `"flocId"`, `"hadronId"`, `"id5id"`, `identityLink`, `"idx"`, `"intentIqId"`, `"justId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"naveggId"`, `"mwOpenLinkId"`, `"netId"`, `"novatiqId"`, `"parrableId"`, `"quantcastId"`, `"pubProvidedId"`, `"sharedId"`, `"tapadId"`, `"unifiedId"`,`"uid2"`, `"verizonMediaId"`, `"zeotapIdPlus"` | `"unifiedId"`
| params | Based on User ID sub-module | Object | | |
| bidders | Optional | Array of Strings | An array of bidder codes to which this user ID may be sent. | `['bidderA', 'bidderB']` |
| storage | Optional | Object | The publisher can 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. This is not needed when `value` is specified or the ID system is managing its own storage | |
@@ -80,8 +91,7 @@ of sub-objects. The table below has the options that are common across ID system
| storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | `"_unifiedId"` |
| storage.expires | Strongly Recommended | Integer | How long (in days) the user ID information will be stored. If this parameter isn't specified, session cookies are used in cookie-mode, and local storage mode will create new IDs on every page. | `365` |
| storage.refreshInSeconds | Optional | Integer | The amount of time (in seconds) the user ID should be cached in storage before calling the provider again to retrieve a potentially updated value for their user ID. If set, this value should equate to a time period less than the number of days defined in `storage.expires`. By default the ID will not be refreshed until it expires.
-| value | Optional | Object | Used only if the page has a separate mechanism for storing a User ID. The value is an object containing the values to be sent to the adapters. | `{"tdid": "1111", "pubcid": {2222}, "IDP": "IDP-2233", "id5id": {"uid": "ID5-12345"}}` |
-
+| value | Optional | Object | Used only if the page has a separate mechanism for storing a User ID. The value is an object containing the values to be sent to the adapters. | `{"tdid": "1111", "IDP": "IDP-2233", "id5id": {"uid": "ID5-12345"}}` |
## Permissions
Publishers can control which user ids are shared with the bid adapters they choose to work with by using the bidders array. The bidders array is part of the User id module config, publisher may choose to send an id to some bidders but not all, the default behavior is that each user id go to all bid adapters the publisher is working with.
@@ -139,6 +149,53 @@ The Rubicon bid adapter would then receive
## User ID Sub-Modules
+### 33Across ID
+
+The 33Across User ID sub-module is a way for publishers to monetize their cookieless inventory across multiple supply-side platforms via Prebid.JS. The sub-module provides publishers with addressability for their open marketplace cookieless inventory and access to cookieless demand. The 33Across User ID sub-module utilizes Lexicon technology to connect Publishers to Demand partners via proprietary technologies in a probabilistic and privacy-safe manner. Please contact [PrebidUIM@33across.com](mailto:PrebidUIM@33across.com) to get your authorization process started.
+
+#### 33Across ID Configuration
+
+Please make sure to add the 33across user ID sub-module to your Prebid.js package with:
+
+```shell
+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"` |
+| params ||| Details for the sub-module initialization ||
+| params.pid | Required | String | Partner ID (PID) | Please reach out to [PrebidUIM@33across.com](mailto:PrebidUIM@33across.com) and request your PID |
+| storage |||||
+| storage.name | Required | String | The name of the cookie or html5 local storage key | `"33acrossId"` (recommended) |
+| storage.type | Required | String | This is where the 33across user ID will be stored | `"html5"` (recommended) or `"cookie"` |
+| storage.expires | Strongly Recommended | Number | How long (in days) the user ID information will be stored | `90` (recommended) |
+| storage.refreshInSeconds | Strongly Recommended | Number | How many seconds until the ID is refreshed | `8 * 3600` (recommended) |
+
+#### 33Across ID Example
+```
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "33acrossId",
+ params: {
+ pid: "0010b00002GYU4eBAH" // Example ID
+ },
+ storage: {
+ name: "33acrossId",
+ type: "html5",
+ expires: 90,
+ refreshInSeconds: 8 * 3600
+ }
+ }]
+ }
+});
+```
+
+
### AdmixerID
Admixer ID, provided by [Admixer] (https://admixer.com/), is a universal ID solution that doesn't rely on 3rd party cookies and helps publishers and advertisers to recognize users across various browsers and environments. Our sub adapter takes deterministic signals like email and phone as input and returns an anonymous id that unlocks access to a wide range of Admixer's demand sources, amplifying audience segmentation, targeting and measurement.
@@ -157,7 +214,7 @@ gulp build --modules=admixerIdSystem
| --- | --- | --- | --- | --- |
| name | Required | String | `"admixerId"` | `"admixerId"` |
| params | Required | Object | Details for admixer initialization. | |
-| params.pid | Required | String | id provided by admixer | "458frgde-djd7-3ert-gyhu-12fghy76dnmko" |
+| params.pid | Optional | String | id provided by admixer | "458frgde-djd7-3ert-gyhu-12fghy76dnmko" |
| params.e | Optional | String | The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha256. | "3d400b57e069c993babea0bd9efa79e5dc698e16c042686569faae20391fd7ea" |
| params.p | Optional | String | The hashed phone number of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha256. | "05de6c07eb3ea4bce45adca4e0182e771d80fbb99e12401416ca84ddf94c3eb9" |
@@ -186,6 +243,123 @@ gulp build --modules=admixerIdSystem
});
{% endhighlight %}
+### adQuery QiD
+
+The adQuery QiD is a first-party identifier designed for publishers using the Adquery adapter. For more information please contact [prebid@adquery.io](prebid@adquery.io)
+
+#### adQuery QiD Configuration
+
+First, add the adQuery QiD module to your Prebid.js build:
+
+```shell
+gulp build --modules=userId,adqueryIdSystem
+```
+
+Then configure the qui in your `userSync` configuration:
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'qid',
+ storage: {
+ name: 'qid',
+ type: 'html5',
+ expires: 365,
+ }
+ }]
+ }
+});
+```
+
+This will add a `userId.qid` property to all bidRequests. This will be read by the Adquery bid adapter, and any other adapters that support EIDs:
+
+```javascript
+{
+ qid: 'p9v2dpnuckkzhuc92i'
+}
+```
+
+### Adtelligent
+
+The [Adtelligent](https://adtelligent.com) ID system is a unique per-session user identifier for providing high quality DMP data for advertisers
+
+Add it to your Prebid.js package with:
+
+{: .alert.alert-info :}
+gulp build --modules=userId,adtelligentIdSystem
+
+#### Adtelligent Configuration
+
+adtelligentIdSystem adapter doesn't require any configuration or storage params. The adapter performs asynchronously and to achieve better performance it is recommended to set the `storage` object `refreshInSeconds` to a short period, such as ten minutes. At the end of the set storage refresh the adapter will refresh its configuration.
+
+#### Adtelligent Example
+
+{% highlight javascript %}
+ pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'adtelligent'
+ }]
+ }
+ });
+{% endhighlight %}
+
+Example with a short storage for ~10 minutes and refresh in 5 minutes:
+
+{% highlight javascript %}
+ pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'adtelligent',
+ storage: {
+ type: "html5",
+ name: "adt_id",
+ expires:0.003,
+ refreshInSeconds: 60 * 5
+ }
+ }]
+ }
+ });
+{% endhighlight %}
+
+### AMX RTB ID
+
+The AMX RTB ID is a first-party identifier designed for publishers using the AMX RTB adapter. For more information please contact [prebid@amxrtb.com](prebid@amxrtb.com)
+
+#### AMX RTB ID Configuration
+
+First, add the AMX RTB ID module to your Prebid.js build:
+
+```shell
+gulp build --modules=userId,amxIdSystem
+```
+
+Then configure the amxId in your `userSync` configuration:
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'amxId',
+ storage: {
+ name: 'amxId',
+ type: 'html5',
+ expires: 14,
+ }
+ }]
+ }
+});
+```
+
+This will add a `userId.amxId` property to all bidRequests. This will be read by the AMX RTB bid adapter, and any other adapters that support EIDs:
+
+```javascript
+{
+ amxId: '3ca11058-ecbc-419f-bda7-b52fe7baf02a'
+}
+```
+
### BritePool
The [BritePool](https://britepool.com) ID is a persistent identifier that enables identity resolution for people-based marketing in the cookieless world. Every BritePool ID is associated with a real identity. As a result, publishers, SSPs and DSPs that integrate with BritePool, or automated
@@ -271,6 +445,61 @@ pbjs.setConfig({
});
{% endhighlight %}
+### Czech Publisher Exchange ID (CPExID)
+
+CPExID is provided by [Czech Publisher Exchange](https://www.cpex.cz/), or CPEx. It is a user ID for ad targeting by using first party cookie, or localStorage mechanism. Please contact CPEx before using this ID.
+
+{: .alert.alert-info :}
+gulp build --modules=cpexIdSystem
+
+#### CPExId Configuration
+
+{: .table .table-bordered .table-striped }
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of this module | `"cpexId"` |
+
+#### CPExId Example
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'cpexId'
+ }]
+ }
+});
+{% endhighlight %}
+
+### AudienceOne ID by DAC
+
+AudienceOne ID, provided by [D.A.Consortium Inc.](https://www.dac.co.jp/), is ID for ad targeting by using 1st party cookie.
+Please contact D.A.Consortium Inc. before using this ID.
+
+Add the AudienceOne ID to your Prebid.js Package with:
+
+{: .alert.alert-info :}
+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"` |
+
+#### AudienceOne ID Example
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'dacId'
+ }]
+ }
+});
+{% endhighlight %}
+
### Deepintent DPES ID by Deepintent
The DeepIntent Healthcare Marketing Platform is the first and only DSP that combines real-world health data, premium partnerships, and custom integrations to reach patients and providers across any device. DeepIntent empowers publishers to maximize their inventory, collaborate and transact directly with advertisers, and grow their business in a safe, controlled, transparent, and privacy-compliant way. Our publisher partners sell inventory on every channel via real-time bidding or conducting one-to-one trading with hundreds of the countryâs leading healthcare brands and agencies.
@@ -302,7 +531,7 @@ pbjs.setConfig({
name: 'deepintentId',
storage: {
type: 'cookie', // "html5" is the required storage type option is "html5"
- name: '_dpes_id',
+ name: '_dpes_id',
expires: 90 // storage lasts for 90 days, optional if storage type is html5
}
}],
@@ -329,7 +558,7 @@ pbjs.setConfig({
### DMD ID by DMD Marketing Corp
-DMD is the preeminent supplier of US-based healthcare professional (HCP) identity data to the pharmaceutical, health system and medical publishing industries. DMD is the only data provider that has acquired its deterministic identity data through a fully consented, first-party, opt-in process. DMDâs privacy policy that can be found at [Privacy Policy](https://hcn.health/privacy-policy).
+DMD is the preeminent supplier of US-based healthcare professional (HCP) identity data to the pharmaceutical, health system and medical publishing industries. DMD is the only data provider that has acquired its deterministic identity data through a fully consented, first-party, opt-in process. DMDâs privacy policy that can be found at [Privacy Policy](https://hcn.health/privacy-policy).
For assistance setting up your module, please contact us at prebid@dmdconnects.com
@@ -396,6 +625,11 @@ Please reach out to [FabrickIntegrations@team.neustar](mailto:FabrickIntegration
| params.m | | String | This is a mobile advertising ID (IDFA/AAID) used to link a user to their Fabrick ID. | |
| params.ia | | String | This is an identifier for advertising (IFA) used to link a user to their Fabrick ID. | |
| params.iv | | String | This is an identifier for vendors (IFV) used to link a user to their Fabrick ID. | |
+| params.1pd | | String | This is the 1st party user ID (e.g. a Customer ID/CUSTID). Note: This requires separate delivery of identity log files keyed off the 1st party user ID to establish an identity sync. | |
+| params.u | | String | This is the page_url - the url which the user is currently browsing. Note: Encoding is required for any character outside of alphabets (A-Z a-z), digits (0-9), hyphen (-), underscore (_) tilde (~), and dot (.). | |
+| params.f | | String | This is the referrer_url - the url which the user visited prior to landing on the page_url. Note: Encoding is required for any character outside of alphabets (A-Z a-z), digits (0-9), hyphen (-), underscore (_) tilde (~), and dot (.). | |
+| params.ifa_type | | String | This denotes the source of the IFA. Please refer to [IAB IFA Guidelines](https://iabtechlab.com/wp-content/uploads/2018/12/OTT-IFA-guidelines.final_Dec2018.pdf) for recommended values and additional details. | |
+| params.lmt | | Boolean | Possible values are '0' or '1'. A value of '1' indicates that a user has requested that ad tracking and measurement be disabled. If a value of '1' is being passed, the real IFA must not be sent via the 'ia' parameter â a 'synthetic' or 'session' IFA can be sent. Please refer to [IAB IFA Guidelines](https://iabtechlab.com/wp-content/uploads/2018/12/OTT-IFA-guidelines.final_Dec2018.pdf) for recommended values and additional details. | |
#### Fabrick Examples
@@ -443,9 +677,9 @@ pbjs.setConfig({
### FLoC ID
-The [Federated Learning of Cohorts (FLoC)](https://web.dev/floc/) system provides a privacy-preserving mechanism for interest-based ad selection. As a user moves around the web, their browser uses the FLoC algorithm to work out an "interest cohort", which will be the same for thousands of browsers with a similar recent browsing history. The user's browser is associated with one interest cohort at a time and recalculates its cohort periodically (currently once every seven days during this initial origin trial) on the user's device, without sharing individual browsing data with the browser vendor or anyone else.
+The [Federated Learning of Cohorts (FLoC)](https://web.dev/floc/) system provides a privacy-preserving mechanism for interest-based ad selection. As a user moves around the web, their browser uses the FLoC algorithm to work out an "interest cohort", which will be the same for thousands of browsers with a similar recent browsing history. The user's browser is associated with one interest cohort at a time and recalculates its cohort periodically (currently once every seven days during this initial origin trial) on the user's device, without sharing individual browsing data with the browser vendor or anyone else.
-There are two important things to note when using the FLoC Userid Sub adapter.
+There are two important things to note when using the FLoC Userid Sub adapter.
1. Unlike other user id subadapters FLoC ids cannot be stored in a cookie or Local Storage. FLoC ids change periodically and should always be fetched from the FLoC API
@@ -489,76 +723,103 @@ pbjs.setConfig({
});
{% endhighlight %}
-### AMX RTB ID
+### FTrack ID from Flashtalking By Mediaocean
-The AMX RTB ID is a first-party identifier designed for publishers using the AMX RTB adapter. For more information please contact [prebid@amxrtb.com](prebid@amxrtb.com)
+The FTrack Identity Framework (["FTrack"](https://www.flashtalking.com/identity-framework#FTrack)) User ID Module allows publishers to take advantage of Flashtalking's FTrack ID during the bidding process.
-#### AMX RTB ID Configuration
+Flashtalkingâs cookieless tracking technology uses probabilistic device recognition to derive a privacy-friendly persistent ID for each device.
-First, add the AMX RTB ID module to your Prebid.js build:
+Questions? Comments? Bugs? Praise? Please contact FlashTalking's Prebid Support at [prebid-support@flashtalking.com](mailto:prebid-support@flashtalking.com)
-```shell
-gulp build --modules=userId,amxIdSystem
-```
+Complete information available on the Flashtalking [privacy policy page](https://www.flashtalking.com/privacypolicy).
-Then configure the amxId in your `userSync` configuration:
+#### FTrack ID from Flashtalking By Mediaocean Configuration
```javascript
pbjs.setConfig({
- userSync: {
- userIds: [{
- name: 'amxId',
- storage: {
- name: 'amxId',
- type: 'html5',
- expires: 14,
- }
- }]
- }
+ userSync: {
+ userIds: [{
+ name: 'FTrack',
+ params: {
+ url: 'https://d9.flashtalking.com/d9core', // required, if not populated ftrack will not run
+ ids: {
+ 'device id': true,
+ 'single device id': true,
+ 'household id': true
+ }
+ },
+ storage: {
+ type: 'html5', // "html5" is the required storage type
+ name: 'FTrackId', // "FTrackId" is the required storage name
+ expires: 90, // storage lasts for 90 days
+ refreshInSeconds: 8*3600 // refresh ID every 8 hours to ensure it's fresh
+ }
+ }],
+ auctionDelay: 50 // 50ms maximum auction delay, applies to all userId modules
+ }
});
```
-This will add a `userId.amxId` property to all bidRequests. This will be read by the AMX RTB bid adapter, and any other adapters that support EIDs:
-
-```javascript
-{
- amxId: '3ca11058-ecbc-419f-bda7-b52fe7baf02a'
-}
-```
-
-### Halo ID from Audigent
-
-Audigent is a next-generation data management platform and a first-of-a-kind "data agency" containing some of the most exclusive content-consuming audiences across desktop, mobile and social platforms. Our HaloId module allows for user id resolution and Audigent user data segmentation to be retrieved for users across the web. For assistance setting up your module please contact us at [prebid@audigent.com](mailto:prebid@audigent.com).
-
-#### HaloId Configuration
-Add the Halo ID system to your Prebid.js package with:
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| :-- | :-- | :-- | :-- | :-- |
+| name | Required | String | The name of this module: `"FTrack"` | `"FTrack"` |
+| params | Required | Object | The IDs available, if not populated then the defaults "Device ID" and "Single Device ID" will be returned | |
+| params.url | Required | String | The URL for the ftrack library reference. If not populated, ftrack will not run. | 'https://d9.flashtalking.com/d9core' |
+| params.ids | Optional | Object | The ftrack IDs available, if not populated then the defaults "Device ID" and "Single Device ID" will be returned | |
+| params.ids['device id'] | Optional | Boolean | Should ftrack return "device id". Set to `true` to return it. If set to `undefined` or `false`, ftrack will not return "device id". Default is `false` | `true` |
+| params.ids['single device id'] | Optional | Boolean | Should ftrack return "single device id". Set to `true` to return it. If set to `undefined` or `false`, ftrack will not return "single device id". Default is `false` | `true` |
+| params.ids['household id'] | Optional; _Requires pairing with either "device id" or "single device id"_ | Boolean | __1.__ Should ftrack return "household id". Set to `true` to attempt to return it. If set to `undefined` or `false`, ftrack will not return "household id". Default is `false`. __2.__ _This will only return "household id" if value of this field is `true` **AND** "household id" is defined on the device._ __3.__ _"household id" requires either "device id" or "single device id" to be also set to `true`, otherwise ftrack will not return "household id"._ | `true` |
+| storage | Required | Object | Storage settings for how the User ID module will cache the FTrack ID locally | |
+| storage.type | Required | String | This is where the results of the user ID will be stored. FTrack **requires** `"html5"`. | `"html5"` |
+| storage.name | Required | String | The name of the local storage where the user ID will be stored. FTrack **requires** `"FTrackId"`. | `"FTrackId"` |
+| storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. FTrack recommends `90`. | `90` |
+| storage.refreshInSeconds | Optional | Integer | How many seconds until the FTrack ID will be refreshed. FTrack strongly recommends 8 hours between refreshes | `8*3600` |
+
+### Hadron ID from Audigent
+
+Audigent is a next-generation data management platform and a first-of-a-kind "data agency" containing some of the most exclusive content-consuming audiences across desktop, mobile and social platforms. Our HadronId module allows for user id resolution and Audigent user data segmentation to be retrieved for users across the web. For assistance setting up your module please contact us at [prebid@audigent.com](mailto:prebid@audigent.com).
+
+#### HadronId Configuration
+Add the Hadron ID system to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=userId,haloIdSystem
+gulp build --modules=userId,hadronIdSystem
-Add HaloId to the userSync configuration.
+Add HadronId to the userSync configuration.
```
pbjs.setConfig({
userSync: {
userIds: [{
- name: 'haloId',
+ name: 'hadronId',
storage: {
- name: 'haloId',
+ name: 'hadronId',
type: 'html5'
+ },
+ params: {
+ partnerId: 1234
}
}]
}
});
```
-The `request.userId.haloId` will contain the Audigent HaloId and associated segments:
+The `request.userId.hadronId` will contain the Audigent HadronId:
```
{
- "haloId": "user-halo-id",
- "auSeg": ["segment1", "segment2"]
+ "hadronId": "0201chpvai07jv2yg08xizqr0bwpa1w0evvmq014d2ykn0b5oe"
}
```
+The following configuration parameters are available:
+
+{: .table .table-bordered .table-striped }
+| Param under usersync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | ID value for the HadronID module - `"hadronId"` | `"hadronId"` |
+| params | Optional | Object | Used to store params for the HadronId system |
+| params.url | Optional | String | Set an alternate GET url for HadronId with this parameter |
+| params.urlArg | Optional | Object | Optional url parameter for params.url |
+| params.partnerId | Required | Number | This is the Audigent Partner ID obtained from Audigent. |
### ID+
@@ -594,15 +855,16 @@ pbjs.setConfig({
### ID5 Universal ID
-The ID5 Universal ID is a shared, neutral identifier that publishers and ad tech platforms can use to recognise users even in environments where 3rd party cookies are not available. The ID5 Universal ID is designed to respect users' privacy choices and publishersâ preferences throughout the advertising value chain. For more information about the ID5 Universal ID and detailed integration docs, please visit [our documentation](https://support.id5.io/portal/en/kb/articles/prebid-js-user-id-module). We also recommend that you sign up for our [release notes](https://id5.io/universal-id/release-notes) to stay up-to-date with any changes to the implementation of the ID5 Universal ID in Prebid.
+The ID5 ID is a shared, neutral identifier that publishers and ad tech platforms can use to recognise users even in environments where 3rd party cookies are not available. The ID5 ID is designed to respect users' privacy choices and publishersâ preferences throughout the advertising value chain. For more information about the ID5 ID and detailed integration docs, please visit [our documentation](https://support.id5.io/portal/en/kb/articles/prebid-js-user-id-module).
-#### ID5 Universal ID Registration
-The ID5 Universal ID is free to use, but requires a simple registration with ID5. Please visit [id5.io/universal-id](https://id5.io/universal-id) to sign up and request your ID5 Partner Number to get started.
+#### ID5 ID Registration
-The ID5 privacy policy is at [https://www.id5.io/platform-privacy-policy](https://www.id5.io/platform-privacy-policy).
+The ID5 ID is free to use, but requires a simple registration with ID5. Please visit [our website](https://id5.io/solutions/#publishers) to sign up and request your ID5 Partner Number to get started.
-#### ID5 Universal ID Configuration
+The ID5 privacy policy is at [https://id5.io/platform-privacy-policy](https://id5.io/platform-privacy-policy).
+
+#### ID5 ID Configuration
First, make sure to add the ID5 submodule to your Prebid.js package with:
@@ -615,7 +877,7 @@ The following configuration parameters are available:
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
| name | Required | String | The name of this module: `"id5Id"` | `"id5Id"` |
-| params | Required | Object | Details for the ID5 Universal ID. | |
+| params | Required | Object | Details for the ID5 ID. | |
| params.partner | Required | Number | This is the ID5 Partner Number obtained from registering with ID5. | `173` |
| params.pd | Optional | String | Partner-supplied data used for linking ID5 IDs across domains. See [our documentation](https://support.id5.io/portal/en/kb/articles/passing-partner-data-to-id5) for details on generating the string. Omit the parameter or leave as an empty string if no data to supply | `"MT1iNTBjY..."` |
| params.abTesting | Optional | Object | Allows publishers to easily run an A/B Test. If enabled and the user is in the Control Group, the ID5 ID will NOT be exposed to bid adapters for that request | Disabled by default |
@@ -623,7 +885,7 @@ The following configuration parameters are available:
| params.abTesting.controlGroupPct | Optional | Number | Must be a number between `0.0` and `1.0` (inclusive) and is used to determine the percentage of requests that fall into the control group (and thus not exposing the ID5 ID). For example, a value of `0.20` will result in 20% of requests without an ID5 ID and 80% with an ID. | `0.1` |
{: .alert.alert-info :}
-**NOTE:** The ID5 Universal ID that is delivered to Prebid is encrypted by ID5 with a rotating key to enforce privacy requirements and avoid unauthorized usage. Therefore, we strongly recommend setting `storage.refreshInSeconds` to `8` hours (`8*3600` 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.
+**NOTE:** The ID5 ID that is delivered to Prebid will be encrypted by ID5 with a rotating key to avoid unauthorized usage and to enforce privacy requirements. Therefore, we strongly recommend setting `storage.refreshInSeconds` to `8` hours (`8*3600` seconds) or less 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.
##### A Note on A/B Testing
@@ -636,7 +898,7 @@ To turn on A/B Testing, simply edit the configuration (see above table) to enabl
{: .alert.alert-warning :}
**ATTENTION:** As of Prebid.js v4.14.0, ID5 requires `storage.type` to be `"html5"` and `storage.name` to be `"id5id"`. Using other values will display a warning today, but in an upcoming release, it will prevent the ID5 module from loading. This change is to ensure the ID5 module in Prebid.js interoperates properly with the [ID5 API](https://github.com/id5io/id5-api.js) and to reduce the size of publishers' first-party cookies that are sent to their web servers. If you have any questions, please reach out to us at [prebid@id5.io](mailto:prebid@id5.io).
-Publisher wants to retrieve the ID5 Universal ID through Prebid.js
+Publisher wants to retrieve the ID5 ID through Prebid.js
{% highlight javascript %}
pbjs.setConfig({
@@ -663,109 +925,77 @@ pbjs.setConfig({
});
{% endhighlight %}
-### IdentityLink
+### IDx
+
+IDx, a universal ID solution provided by [Retargetly](https://retargetly.com), is the evolution of digital identifiers for the Latin American region. Through a proprietary identity graph, it allows publishers, advertisers, and ad tech platforms to recognize users across domains and devices even where third party cookies aren't available.
-IdentityLink, provided by [LiveRamp](https://liveramp.com) is a single person-based identifier which allows marketers, platforms and publishers to perform personalized segmentation, targeting and measurement use cases that require a consistent, cross-channel view of the user in anonymous spaces.
+The IDx platform is designed with privacy at its core and allows for nearly every conceivable digital use case including but not limited to audience targeting, retargeting, frequency management, personalization, and total reach reporting.
Add it to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=identityLinkIdSystem
+gulp build --modules=idxIdSystem
-#### IdentityLink Registration
+#### IDx Registration
-Please reach out to [prebid@liveramp.com](mailto:prebid@liveramp.com) and request your `placementId`.
+If you are a publisher or an advertiser, then IDx is free to use but requires a simple registration process. To do this, please send an email to [idx-partners@retargetly.com](mailto:idx-partners@retargetly.com) to request your IDx Partner ID.
-The IdentityLink privacy policy is at [https://liveramp.com/privacy/service-privacy-policy/](https://liveramp.com/privacy/service-privacy-policy/).
+We may ask for some basic information from you before approving your request. For more information on IDx, please visit [retargetly.com/idx](http://retargetly.com/idx).
-#### IdentityLink Configuration
+#### IDx Configuration
{: .table .table-bordered .table-striped }
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | `"identityLink"` | `"identityLink"` |
-| params | Required for Id Link | Object | Details for identityLink initialization. | |
-| params.pid | This parameter is required for IdentityLink | String | This is the placementId, value needed for obtaining userâs IdentityLink envelope
-| params.notUse3P | This parameter is not required for IdentityLink | Boolean | Property for choosing should 3P Liveramp envelope endpoint be fired or not, in order to get IdentityLink envelope
-
-#### IdentityLink Examples
-
-1) Publisher passes a placement ID and elects to store the IdentityLink envelope in a cookie.
-
-
-{% highlight javascript %}
-pbjs.setConfig({
- userSync: {
- userIds: [{
- name: "identityLink",
- params: {
- pid: '999', // Set your real identityLink placement ID here
- // notUse3P: true/false // If you do not want to use 3P endpoint to retrieve the envelope. If you do not set this property to true, 3P endpoint will be fired. By default this property is undefined and 3P request will be fired.
- },
- storage: {
- type: "cookie",
- name: "idl_env", // create a cookie with this name
- expires: 30 // cookie can last for 30 days
- }
- }],
- syncDelay: 3000 // 3 seconds after the first auction
- }
-});
-{% endhighlight %}
+| name | Required | String | `"idx"` | `"idx"` |
-2) Publisher passes a placement ID and elects to store the IdentityLink envelope in HTML5 localStorage.
+#### IDx Example
{% highlight javascript %}
pbjs.setConfig({
userSync: {
userIds: [{
- name: "identityLink",
- params: {
- pid: '999', // Set your real identityLink placement ID here
- // notUse3P: true/false // If you do not want to use 3P endpoint to retrieve the envelope. If you do not set this property to true, 3P endpoint will be fired. By default this property is undefined and 3P request will be fired.
- },
- storage: {
- type: "html5",
- name: "idl_env", // set localstorage with this name
- expires: 30
- }
- }],
- syncDelay: 3000
+ name: "idx"
+ }]
}
});
{% endhighlight %}
-### IDx
-
-IDx, a universal ID solution provided by [Retargetly](https://retargetly.com), is the evolution of digital identifiers for the Latin American region. Through a proprietary identity graph, it allows publishers, advertisers, and ad tech platforms to recognize users across domains and devices even where third party cookies aren't available.
+### IM-UID by Intimate Merger
-The IDx platform is designed with privacy at its core and allows for nearly every conceivable digital use case including but not limited to audience targeting, retargeting, frequency management, personalization, and total reach reporting.
+IM-UID, provided by [Intimate Merger](https://corp.intimatemerger.com/), is a universal identifier that designed for publishers, platforms and advertisers to perform segmentation and targeting even in environments where 3rd party cookies are not available. IM-UID is currently only available in Japan.
Add it to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=idxIdSystem
+gulp build --modules=imuIdSystem
-#### IDx Registration
+#### IM-UID Registration
-If you are a publisher or an advertiser, then IDx is free to use but requires a simple registration process. To do this, please send an email to [idx-partners@retargetly.com](mailto:idx-partners@retargetly.com) to request your IDx Partner ID.
+Please visit [https://lp.intimatemerger.com/im-uid](https://lp.intimatemerger.com/im-uid) and request your Customer ID to get started.
-We may ask for some basic information from you before approving your request. For more information on IDx, please visit [retargetly.com/idx](http://retargetly.com/idx).
+The Intimate Merger privacy policy is at https://corp.intimatemerger.com/privacypolicy/
-#### IDx Configuration
+#### IM-UID Configuration
{: .table .table-bordered .table-striped }
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | `"idx"` | `"idx"` |
+| name | Required | String | The name of this module. | `"imuid"` |
+| params | Required | Object | Details of module params. | |
+| params.cid | Required | Number | This is the Customer ID value obtained via Intimate Merger. | `5126` |
+| params.url | Optional | String | Use this to change the default endpoint URL. | `"https://example.com/some/api"` |
-#### IDx Example
+#### IM-UID Example
{% highlight javascript %}
pbjs.setConfig({
userSync: {
userIds: [{
- name: "idx"
+ name: "imuid",
+ params: {
+ cid: 5126 // Set your Intimate Merger Customer ID here for production
+ }
}]
}
});
@@ -884,9 +1114,102 @@ pbjs.setConfig({
});
{% endhighlight %}
-### LiveIntent nonID
+### Just ID
-LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent nonID is a user identifier tied to an active, encrypted email in our graph and functions in cookie-challenged environments and browsers.
+[Justtag Group](https://www.justtag.com/en) is a European, privacy focused DMP and segment provider. Having a leading position in Poland and growing presence in the CEE region, we created Just ID - an alternative ID solution, designed to respect usersâ privacy choices which doesnât rely on 3rd party cookies. Our aim is to help Publishers and Advertisers to recognize users across various environments and enable ad-tech market players with a smooth transition into post 3rd party cookie era.
+
+#### Just ID Modes
+
+- **BASIC** - In this mode we rely on Justtag library that already exists on publisher page. Typicaly that library expose global variable called `__atm`
+
+- **COMBINED** - Just ID generation process may differ between various cases depends on publishers. This mode combines our js library with prebid for ease of integration
+
+If you have any questions about Just ID, please reach out by emailing [prebid@justtag.com](mailto:prebid@justtag.com).
+
+#### Just ID Configuration
+
+{: .table .table-bordered .table-striped }
+| Param under usersync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | ID of the module - `'justId'` | `'justId'` |
+| params | Optional | Object | Details for Just ID syncing. | |
+| params.mode | Optional | String | Mode in which the module works. Available Modes: `'COMBINED'`, `'BASIC'`(default) | `'COMBINED'` |
+| params.atmVarName | Optional | String | Name of global object property that point to Justtag ATM Library. Defaults to `'__atm'` | `'__atm'` |
+| params.url | Optional | String | API Url, **required** in `COMBINED` mode | `'https://id.nsaudience.pl/getId.js'` |
+| params.partner | Optional | String | This is the Justtag Partner Id which may be required in some custom integrations with Justtag | `'some-publisher'` |
+
+#### Just ID Example
+
+ex. 1. Mode `COMBINED`
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'justId',
+ params: {
+ mode: 'COMBINED',
+ url: 'https://id.nsaudience.pl/getId.js'
+ }
+ }]
+ }
+});
+{% endhighlight %}
+
+ex. 2. Mode `BASIC`
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'justId'
+ }]
+ }
+});
+{% endhighlight %}
+
+#### Just ID Disclosure
+
+This module in `COMBINED` mode loads external JavaScript to generate optimal quality user ID. It is possible to retrieve user ID, without loading additional script by this module in `BASIC` mode.
+
+### Kinesso ID
+
+Kinesso ID solution is a new approach to persistent cross domain authentication.
+
+#### How it works
+
+The Kinesso identity solution creates a persistent cross domain authenticated user id that is then used to link users with their interest signals (commonly known as segments). The Kinesso user ID (knsso) is never broadcast into the bid stream. Instead it is sent to a server side data store, merged with accompanying data from the Prebid Id Library and shipped to Kinesso. All data is encrypted at rest and in transit so your identifiers are never stored or transmitted in an insecure manner.
+
+The Kinesso ID sub adapter sets two cookies, one as a third party cookie and the other as a first party cookie in the publisher's domain. These cookies are merged with the user's hashed email address (when present) server side and sent to Kinesso. The combined output looks like this:
+
+{: .table .table-bordered .table-striped }
+| kpuid | knsso | hid | account_id | created on |
+| --- | --- | --- | --- | --- |
+| `` | `` | `` | `` | `` |
+
+Kinesso will then attach these users to deals ids that they will target in the ORTB bid stream by brands and agencies represented by IPG.
+
+Add it to your Prebid.js package with:
+
+{: .alert.alert-info :}
+gulp build --modules=kinessoIdSystem
+
+#### Kinesso ID Registration
+
+You can set up Kinesso ID sub adapter by contacting Kinesso at prebid@kinesso.com
+
+The Kinesso ID privacy policy is covered under the [Kinesso Privacy Notice](https://kinesso.com/privacy-policy/). Please note, at present the Kinesso ID module is not meant for use inside the EEA.
+
+{: .table .table-bordered .table-striped }
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of this module. | `'kpuid'` |
+| params | Required | Object | Details for KinessoId initialization | |
+| params.accountid | Required | Int | Your SSP Account Id | 123 |
+
+### LiveIntent nonID
+
+LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent nonID is a user identifier tied to an active, encrypted email in our graph and functions in cookie-challenged environments and browsers.
There are two ways to build your Prebid.js package to include the LiveIntent nonID:
* The standard version which allows publishers to include the module with full functionalities, like hashing email addresses and identity resolution
@@ -1028,9 +1351,15 @@ pbjs.setConfig({
### Lotame Panorama ID
-[Lotame Panorama](https://www.lotame.com/panorama/) is a suite of data-enrichment solutions for digital advertising that empowers marketers, agencies, publishers and media companies to transform consumer personas into addressable audiences. At the heart of Lotame Panorama is the [Panorama ID](https://www.lotame.com/panorama/id/), a people-based identifier powered by deterministic and probabilistic data, available across the cookie-challenged web and all browsers.
+[Lotame Panorama](https://www.lotame.com/panorama/) is a suite of data-enrichment solutions for digital advertising that empowers marketers, agencies, publishers and media companies to transform consumer personas into addressable audiences. At the heart of Lotame Panorama is the Panorama ID, a people-based identifier powered by deterministic and probabilistic data, available across the cookie-challenged web and all browsers.
+
+Lotameâs Panorama ID module sends information from the request to its identity graph in order to successfully generate a Panorama ID. For more information on how the Panorama ID works, please visit [https://www.lotame.com/panorama/id/](https://www.lotame.com/panorama/id/).
-The Lotame privacy policy is at [https://www.lotame.com/about-lotame/privacy/](https://www.lotame.com/about-lotame/privacy/). If you have any questions about Panorama ID, please reach out by emailing [prebid@lotame.com](mailto:prebid@lotame.com).
+**Ease of Implementation**: Deployment of the Lotame Panorama ID module has been optimized for ease by not requiring any registration to utilize. Simply add the generic module to start producing the Panorama ID across your inventory.
+
+Lotame's privacy policy related to the Panorama ID and the collection of data and how data is used is available at [https://www.lotame.com/about-lotame/privacy/lotames-products-services-privacy-policy/](https://www.lotame.com/about-lotame/privacy/lotames-products-services-privacy-policy/). Consult with your legal counsel to determine the appropriate user disclosures with respect to use of the Lotame Panorama ID module.
+
+If you have any questions about Panorama ID, please reach out by emailing [PanoramaID@lotame.com](mailto:PanoramaID@lotame.com).
Add it to your Prebid.js package with:
@@ -1046,6 +1375,11 @@ NOTE: For optimal performance, the Lotame Panorama Id module should be called at
#### Lotame Panorama ID Example
+{: .table .table-bordered .table-striped }
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of the module | "lotamePanoramaId" |
+
{% highlight javascript %}
pbjs.setConfig({
userSync: {
@@ -1056,6 +1390,49 @@ pbjs.setConfig({
});
{% endhighlight %}
+### MediaWallah OpenLinkID
+
+MediaWallah's openLink is an anonymous person based ID that enables buyers and sellers of media to connect a person and their devices across the web and mobile apps. openLink facilities the buying of media between DSPs, SSPs and publishers.
+
+Add support for MediaWallah OpenLinkID to your Prebid.js package with:
+
+{: .alert.alert-info :}
+gulp build --modules=userId,mwOpenLinkIdSystem
+
+#### MediaWallah OpenLinkID Registration
+
+MediaWallah requires the creation of an accountId a partnerId in order to take advantage of openLink. Please contact your partner resource to get these Ids provisioned.
+
+#### MediaWallah OpenLinkID Configuration
+
+
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | The name of this module. | `'mwOpenLinkId'` |
+| params | Required | Object | Details for mwOLID syncing. ||
+| 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
+
+```
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'mwOpenLinkId',
+ params: {
+ accountId: '1000',
+ partnerId: '1001',
+ uid: 'u-123xyz'
+ }
+ }]
+ }
+})
+```
+
### Merkle ID
[Merkury by Merkle](https://merkury.merkleinc.com/contact) enables marketers, media owners, and publishers to own, build, and control a cookie-less Private Identity Graph. Merkury uses an organizationâs first-party CRM data and valuable interactions such as logins, outbound email campaigns and media reach to create and grow a universe of person-based IDs for cross-channel targeting, personalization, measurement and more.
@@ -1070,10 +1447,8 @@ pbjs.setConfig({
userIds: [{
name: 'merkleId',
params: {
- vendor:'example_vendor',
- sv_cid:'example_cid',
sv_pubid:'example_pubid',
- sv_domain:'example.com'
+ ssp_ids: ['example_sspid_1', 'example_sspid_2']
},
storage: {
type: 'html5',
@@ -1085,6 +1460,24 @@ pbjs.setConfig({
});
{% endhighlight %}
+### Navegg ID
+
+[Navegg](https://www.navegg.com) enables publishers, advertisers and agencies to use their own first party data together to activate media in a cookie-less way across several Ad Tech platforms. Navegg has one of the largest data networks in Latin America which also allows the enhancement of data with unique categories.
+
+#### Navegg ID Examples
+
+Publisher stores NaveggId in local storage and/or 1st party cookies
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'naveggId'
+ }]
+ }
+});
+{% endhighlight %}
+
### netID
The [European netID Foundation (EnID)](https://developerzone.netid.de/index.html) aims to establish with the netID an independent European alternative in the digital market for Demand and Supply side. With the netID Single-Sign-On, the EnID established an open standard for consumer logins for services of Buyers and Brands, that also includes user-centric consent management capabilities that results in a standardized, EU-GDPR compliant, IAB TCF aware, cross-device enabled Advertising Identifier, which can be leveraged by publishers and advertisers (and vendors supporting them) to efficiently deliver targeted advertising through programmatic systems to already more than 38 million Europeans on mobile and desktop devices.
@@ -1108,72 +1501,96 @@ pbjs.setConfig({
});
{% endhighlight %}
-### NextRoll ID
-
-NextRoll is an industry-leading marketing technology and data stack that fuels growth for businesses of all kinds. Our technology powers two multi-million dollar high-growth businesses: AdRoll and RollWorks. The NextRoll ID is a cookieless identifier built from NextRollâs proprietary identity graph. Publishers, ad tech platforms, and NextRollâs brands (AdRoll and RollWorks) leverage the NextRoll ID to access unique demand in cookieless environments. The NextRoll ID respects user privacy preferences and enables users to opt out through multiple web based mechanisms found in [Section 8 of NextRollâs Privacy Policy](https://nextroll.com/privacy#service-8).
+### Novatiq Hyper ID
-#### NextRoll ID Registration
+The [Novatiq](https://www.novatiq.com) proprietary dynamic Hyper ID is a unique, non sequential and single use identifier for marketing activation. Our in network solution matches verification requests to telco network IDs safely and securely inside telecom infrastructure. The Novatiq Hyper ID can be used for identity validation and as a secured 1st party data delivery mechanism.
-To sign up for a Partner ID please contact your NextRoll representative or send an email to [publishers@nextroll.com](mailto:publishers@nextroll.com).
+#### Novatiq Hyper ID Configuration
-#### NextRoll ID Configuration
-
-Add it to your Prebid.js package with:
+Enable by adding the Novatiq submodule to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=nextrollIdSystem
+gulp build --modules=novatiqIdSystem,userId
+
-Enable the module in configuration, with your Partner ID:
+Module activation and configuration:
{% highlight javascript %}
pbjs.setConfig({
- userSync: {
- userIds: [{
- name: "nextrollId",
- params: {
- partnerId: 'YOUR_PARTNER_ID'
- }
- }]
- }
+ userSync: {
+ userIds: [{
+ name: 'novatiq',
+ params: {
+ // change to the Partner Number you received from Novatiq
+ sourceid '1a3'
+ }
+ }
+ }],
+ // 50ms maximum auction delay, applies to all userId modules
+ auctionDelay: 50
+ }
});
{% endhighlight %}
-### Novatiq Snowflake ID
+#### Parameters for the Novatiq Module
+
+
+| Param | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | Module identification: `"novatiq"` | `"novatiq"` |
+| params | Required | Object | Configuration specifications for the Novatiq module. | |
+| params.sourceid | Required | String | This is the Novatiq Partner Number obtained via Novatiq registration. | `1a3` |
+| params.useSharedId | Optional | Boolean | Use the sharedID module if it's activated. | `true` |
+| params.sharedIdName | Optional | String | Same as the SharedID "name" parameter Defaults to "_pubcid" | `"demo_pubcid"` |
+| params.useCallbacks | Optional | Boolean | Use callbacks for custom integrations | `false` |
+| params.urlParams | Optional | Object | Sync URl configuration for custom integrations | |
+| params.urlParams.novatiqId | Optional | String | The name of the parameter used to indicate the Novatiq ID uuid | `snowflake` |
+| 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 proprietary dynamic snowflake ID is a unique, non sequential and single use identifier for marketing activation. Our in network solution matches verification requests to telco network IDs, safely and securely inside telecom infrastructure. Novatiq snowflake ID can be used for identity validation and as a secured 1st party data delivery mechanism.
+### Novatiq Hyper ID with Prebid SharedID support
+You can make use of the Prebid.js SharedId module as follows.
-#### Novatiq Snowflake ID Configuration
+#### Novatiq Hyper ID Configuration
-Enable by adding the Novatiq submodule to your Prebid.js package with:
+Enable by adding the Novatiq and SharedId submodule to your Prebid.js package with:
-```
+{: .alert.alert-info :}
gulp build --modules=novatiqIdSystem,userId
-```
Module activation and configuration:
-```javascript
+{% highlight javascript %}
pbjs.setConfig({
userSync: {
- userIds: [{
+ userIds: [
+ {
name: 'novatiq',
params: {
- sourceid '1a3', // change to the Partner Number you received from Novatiq
+ // change to the Partner Number you received from Novatiq
+ sourceid '1a3',
+
+ // Use the sharedID module
+ useSharedId: true,
+
+ // optional: will default to _pubcid if left blank.
+ // If not left blank must match "name" in the the module above
+ sharedIdName: 'demo_pubcid'
}
}
}],
- auctionDelay: 50 // 50ms maximum auction delay, applies to all userId modules
+ // 50ms maximum auction delay, applies to all userId modules
+ auctionDelay: 50
}
});
-```
+{% endhighlight %}
-| Param under userSync.userIds[] | Scope | Type | Description | Example |
-| --- | --- | --- | --- | --- |
-| name | Required | String | Module identification: `"novatiq"` | `"novatiq"` |
-| params | Required | Object | Configuration specifications for the Novatiq module. | |
-| params.sourceid | Required | String | This is the Novatiq Partner Number obtained via Novatiq registration. | `1a3` |
-If you have any questions, please reach out to us at prebid@novatiq.com.
+If you have any questions, please reach out to us at [prebid@novatiq.com](mailto:prebid@novatiq.com)
### Parrable ID
@@ -1247,17 +1664,152 @@ pbjs.setConfig({
});
{% endhighlight %}
+### Publisher Link
+Publisher Link, provided by [Epsilon](https://www.epsilon.com/us), is a cross-device identity solution that activates publisher first-party, authenticated
+data to improve audience identification and increase bid opportunities, specifically designed for sites with authenticated
+traffic. Publisher first-party authenticated data and a user's unique encrypted ID is linked to an existing people-based
+Epsilon CORE ID. By utilizing Publisher Link, publishers are able to reap the benefits of Epsilon's CORE ID.
+
+#### Publisher Link Registration
+Please contact [Epsilon](mailto:PublisherSupport@Epsilon.com) to sign up.
+
+The Epsilon privacy is covered in the [Epsilon Privacy Policy](https://www.epsilon.com/us/privacy-policy).
+
+The Publisher Link opt-out is included [here](https://www.epsilon.com/privacy/dms/opt-out/email)
+
+#### Publisher Link Configuration
+
+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'`
+
+#### Publisher Link Examples
+```javascript
+ pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "publinkId",
+ storage: {
+ name: "pbjs_publink",
+ type: "cookie",
+ expires: 30
+ },
+ params: {
+ e: "7D320454942620664D96EF78ED4E3A2A", // example hashed email (md5)
+ site_id: "123456",
+ api_key: "00000000-0000-0000-0000-00000000000"
+ }
+ }]
+ }
+ });
+```
+
+### RampID
+
+RampID, formerly known as IdentityLink, provided by [LiveRamp](https://liveramp.com) is a single person-based identifier which allows marketers, platforms and publishers to perform personalized segmentation, targeting and measurement use cases that require a consistent, cross-channel view of the user in anonymous spaces.
+
+Add it to your Prebid.js package with:
+
+{: .alert.alert-info :}
+gulp build --modules=identityLinkIdSystem
+
+#### RampID Registration
+
+LiveRamp's RampID is free of charge and only requires a simple registration with Liveramp. Please sign up through our [Console](https://launch.liveramp.com) platform and request a Placement ID, a unique identifier that is used to identify each publisher, to get started.
+
+The RampID privacy policy is at [https://liveramp.com/privacy/service-privacy-policy/](https://liveramp.com/privacy/service-privacy-policy/).
+
+#### 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 envelope should be set and stored until the user authenticates and a RampID envelope can be created (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.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`
+
+{: .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.
+
+#### RampID Examples
+
+1) Publisher passes a Placement ID and elects to store the RampID envelope in a cookie.
+
+{: .alert.alert-info :}
+**NOTE:** Make sure that the expiration time of the cookie is similar to what is set in your ATS configuration.
+
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "identityLink",
+ params: {
+ pid: '999', // Set your valid Placement ID here
+ // notUse3P: true/false // If you do not want to use cookieable envelopes until the user authenticates set this property to true
+ },
+ storage: {
+ type: "cookie",
+ name: "idl_env", // "idl_env" is the required storage name
+ expires: 15, // Cookie can last for 15 days
+ refreshInSeconds: 1800
+ }
+ }],
+ syncDelay: 3000 // 3 seconds after the first auction
+ }
+});
+{% endhighlight %}
+
+2) Publisher passes a Placement ID and elects to store the RampID envelope in HTML5 localStorage.
+
+{: .alert.alert-info :}
+**NOTE:** Make sure that the expiration time of the HTML5 localStorage is similar to what is set in your ATS configuration.
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "identityLink",
+ params: {
+ pid: '999', // Set your valid Placement ID here
+ // notUse3P: true/false // If you do not want to use cookieable envelopes until the user authenticates set this property to true
+ },
+ storage: {
+ type: "html5",
+ name: "idl_env", // "idl_env" is the required storage name
+ expires: 15, // HTML5 localStorage can last for 15 days
+ refreshInSeconds: 1800
+ }
+ }],
+ syncDelay: 3000 // 3 seconds after the first auction
+ }
+});
+{% endhighlight %}
+
### SharedID
-This module stores an unique user id in the first party domain and makes it accessible to all adapters. Similar to IDFA and AAID, this is a simple UUID that can be utilized to improve user matching, especially for iOS and MacOS browsers, and is compatible with ITP (Intelligent Tracking Prevention). Itâs lightweight and self contained. Adapters that support Publisher Common ID will be able to pick up the user ID and return it for additional server-side cross device tracking.
+This module stores an unique user id in the first party domain and makes it accessible to all adapters. Similar to IDFA and AAID, this is a simple UUID that can be utilized to improve user matching, especially for iOS and MacOS browsers, and is compatible with ITP (Intelligent Tracking Prevention). Itâs lightweight and self contained. Adapters that support SharedId will be able to pick up the user ID and return it for additional server-side cross device tracking.
There is no special registration or configuration for SharedID. Each publisher's privacy policy should take
-SharedID into account.
+SharedID into account. Prebid recommends implementing a method where users can easily opt-out of targeted advertising. Please refer to the User Opt-Out section located at the bottom of this page. For more information check out Prebid's dedicated [identity page](/identity/sharedid.html)
Add it to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=pubCommonIdSystem
+gulp build --modules=sharedIdSystem
#### SharedID ID Configuration
@@ -1266,11 +1818,15 @@ In addition to the parameters documented above in the Basic Configuration sectio
{: .table .table-bordered .table-striped }
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | The name of this module. | `'pubCommonId'` |
+| 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. This is a URL of a pixel for updating cookies' expiration times. Fired after a new ID has been created or an existing ID is being extended. No default. | `'https://example.com/ping'`
+| 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.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`
#### SharedID Examples
@@ -1280,10 +1836,10 @@ In addition to the parameters documented above in the Basic Configuration sectio
pbjs.setConfig({
userSync: {
userIds: [{
- name: "pubCommonId",
+ name: "sharedId",
storage: {
type: "cookie",
- name: "_pubcid", // create a cookie with this name
+ name: "_sharedid", // create a cookie with this name
expires: 365 // expires in 1 years
}
}]
@@ -1307,10 +1863,13 @@ pbjs.setConfig({
expires: 60
}
},{
- name: "pubCommonId",
+ name: "sharedId",
+ params: {
+ pixelUrl: "/wp-json/pubcid/v1/extend/"
+ },
storage: {
type: "cookie",
- name: "_pubcid", // create a cookie with this name
+ name: "_sharedid", // create a cookie with this name
expires: 180
}
}],
@@ -1319,6 +1878,73 @@ pbjs.setConfig({
});
{% endhighlight %}
+3) Publisher supports SharedID and first party domain cookie storage initiated by a first party server
+
+{% highlight javascript %}
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "sharedId",
+ params: {
+ pixelUrl: "/wp-json/pubcid/v1/extend/" //pixelUrl should be specified when the server plugin is used
+ },
+ storage: {
+ type: "cookie",
+ name: "_sharedid", // create a cookie with this name
+ expires: 365 // expires in 1 year
+ }
+ }]
+ }
+});
+{% endhighlight %}
+
+### Trustpid
+
+Trustpid generates unique tokens, enabling improved efficiency in programmatic advertising while safeguarding transparency and control for end customers via `trustpid.com`. A website visitorâs Trustpid is generated based on network identifiers provided by network operators and requires explicit user consent.
+
+Trustpid is also the brand name of the service, which is provided by Vodafone Sales and Services Limited (âVSSLâ).
+
+#### Trustpid configuration
+
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| 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']` |
+| storage | Required | Object | Local storage configuration object | - |
+| storage.type | Required | String | Type of the storage that would be used to store user ID. Must be `"html5"` to utilise HTML5 local storage. | `"html5"` |
+| storage.name | Required | String | The name of the key in local storage where the user ID will be stored. | `"trustpid"` |
+| storage.expires | Required | Integer | How long (in days) the user ID information will be stored. For safety reasons, this information is required.| `1` |
+
+Configuration example:
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [
+ {
+ name: "trustpid",
+ params: {
+ maxDelayTime: 2500,
+ },
+ bidders: ["adf"],
+ storage: {
+ type: "html5",
+ name: "trustpid",
+ expires: 1,
+ },
+ }],
+ syncDelay: 3000,
+ auctionDelay: 3000
+ }
+});
+```
+
+#### Truspid onboarding
+
+If you wish to find out more about Trustpid, please contact onboarding@trustpid.com
+
### PubProvided ID
The PubProvided Id module allows publishers to set and pass a first party user id into the bid stream. This module has several unique characteristics:
@@ -1343,27 +1969,27 @@ Or, the eids values can be passed directly into the `setConfig` call:
pbjs.setConfig({
userSync: {
userIds: [{
- name: "example.com",
+ name: "pubProvidedId",
params: {
eids: [{
source: "domain.com",
- uids:[{
- id: "value read from cookie or local storage",
- atype: 1,
- ext: {
- stype: "ppuid"
- }
-
- }]
- },{
+ uids: [{
+ id: "value read from cookie or local storage",
+ atype: 1,
+ ext: {
+ stype: "ppuid"
+ }
+
+ }]
+ }, {
source: "3rdpartyprovided.com",
- uids:[{
- id: "value read from cookie or local storage",
- atype: 3,
- ext: {
- stype: "dmp"
- }
- }]
+ uids: [{
+ id: "value read from cookie or local storage",
+ atype: 3,
+ ext: {
+ stype: "dmp"
+ }
+ }]
}]
}
}]
@@ -1388,7 +2014,7 @@ In either case, bid adapters will receive the eid values after consent is valida
Add it to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=pubProvidedId
+gulp build --modules=pubProvidedIdSystem
#### PubProvided Configuration
@@ -1404,25 +2030,32 @@ gulp build --modules=pubProvidedId
### Quantcast ID
-Quantcast ID enables publishers that use Quantcast Measure tag to uniquely identify
-their clients within Quantcast's extensive publisher network without relying on third party
-cookies. The Quantcast User ID submodule makes the existing Quantcast first party
-cookie available in the bid request. The first party cookie allows Quantcast to correlate
-the bid request with Quantcast's Measure dataset.
-
-Currently, Quantcast ID only works with the presence of Quantcast Measure tag. More information
-about Measure can be found in https://www.quantcast.com/measure.
-
-The Quantcast privacy policy is at https://www.quantcast.com/privacy/.
+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 :}
gulp build --modules=userId,quantcastIdSystem
+Quantcastâs privacy policies for the services rendered can be found at
+ https://www.quantcast.com/privacy/
+
+Publishers deploying the module are responsible for ensuring legally required notices and choices for users.
+
+The Quantcast ID module will only perform any action and return an ID in situations where:
+1. the publisher has not set a âcoppa' flag on the prebid configuration on their site (see [pbjs.setConfig.coppa](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa))
+2. there is not a IAB us-privacy string indicating the digital property has provided user notice and the user has made a choice to opt out of sale
+3. if GDPR applies, an IAB TCF v2 string exists indicating that Quantcast does not have consent for purpose 1 (cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you), or an established legal basis (by default legitimate interest) for purpose 10 (your data can be used to improve existing systems and software, and to develop new products).
+
#### Quantcast ID Configuration
-Quantcast ID module does not require any configuration parameters at this time.
+{: .table .table-bordered .table-striped }
+| Param under userSync.userIds[] | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| name | Required | String | `"quantcastId"` | `"quantcastId"` |
+| params | Optional | Object | Details for Quantcast initialization. | |
+| params.ClientID | Optional | String | Optional parameter for Quantcast prebid managed service partners. The parameter is not required for websites with Quantcast Measure tag. Reach out to Quantcast for ClientID if you are not an existing Quantcast prebid managed service partner: quantcast-idsupport@quantcast.com | |
+
#### Quantcast ID Example
@@ -1430,13 +2063,14 @@ Quantcast ID module does not require any configuration parameters at this time.
pbjs.setConfig({
userSync: {
userIds: [{
- name: "quantcastId",
+ name: "quantcastId"
}]
}
});
{% endhighlight %}
+
### Tapad ID
Tapad's ID module provides access to a universal identifier that publishers, ad tech platforms and advertisers can use for data collection and collation without reliance on third-party cookies.
@@ -1615,100 +2249,87 @@ pbjs.setConfig({
{% endhighlight %}
-### Verizon Media ConnectID
+### Yahoo ConnectID
-Verizon Media ConnectID is a person based ID and does not depend on 3rd party cookies. It enables ad tech platforms to recognize and match users consistently across the open web. Built on top of Verizon Mediaâs robust and proprietary ID Graph it delivers a higher find rate of audiences on publishersâ sites user targeting that respects privacy.
+Yahoo ConnectID is a person based ID and does not depend on 3rd party cookies. It enables ad tech platforms to recognize and match users consistently across the open web. Built on top of Yahooâs robust and proprietary ID Graph it delivers a higher find rate of audiences on publishersâ sites user targeting that respects privacy.
-Verizon Media ConnectID honors privacy choices from the [Verizon Media Privacy Dashboard](https://www.verizonmedia.com/policies/us/en/verizonmedia/privacy/dashboard/index.html) as well as global privacy acts.
+Yahoo ConnectID honors privacy choices from the [Yahoo Privacy Dashboard](https://legal.yahoo.com/us/en/yahoo/privacy/dashboard/index.html) as well as global privacy acts.
-Add support for Verizon Media ConnectID to your Prebid.js package with:
+Add support for Yahoo ConnectID to your Prebid.js package with:
{: .alert.alert-info :}
-gulp build --modules=userId,verizonMediaIdSystem
+gulp build --modules=userId,connectIdSystem
-#### Verizon Media ConnectID Registration
+#### Yahoo ConnectID Registration
-A Verizon Media supplied publisher specific pixel Id is required. Reach out to your account manager for assistance with setup.
+A Yahoo supplied publisher specific pixel Id is required. Please reach out to your account manager for assistance with setup.
-#### Verizon Media ConnectID Configuration
+#### Yahoo ConnectID Configuration
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | The name of this module. | `'verizonMediaId'` |
+| name | Required | String | The name of this module. | `'connectId'` |
| params | Required | Object | Container of all module params. ||
-| params.pixelId | Required | Number | The Verizon Media supplied publisher specific pixel Id | `8976` |
+| params.pixelId | Required | Number | The Yahoo supplied publisher specific pixel Id | `8976` |
| params.he | Required | String | The SHA-256 hashed user email address |`'ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4'`|
| storage | Required | Object | Defines where and for how long the results of the call to get a user ID will be stored. | |
| storage.type | Required | String | Defines where the resolved user ID will be stored (either `'cookie'` or `'html5'` localstorage).| `'html5'` |
-| storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved user ID will be stored. | `'connectid'` |
+| storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved user ID will be stored. | `'connectId'` |
| storage.expires | Recommended | Integer | How long (in days) the user ID information will be stored. The recommended value is `15` | `15` |
{: .table .table-bordered .table-striped }
-#### Verizon Media ConnectID Examples
+#### Yahoo ConnectID Examples
```
pbjs.setConfig({
userSync: {
userIds: [{
- name: "verizonMediaId",
+ name: "connectId",
params: {
pixelId: 8976,
he: "ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"
},
storage: {
type: "html5",
- name: "connectid",
- expires: 1
+ name: "connectId",
+ expires: 15
}
}]
}
})
```
-### MediaWallah OpenLinkID
+### GRAVITO ID by Gravito Ltd.
-MediaWallah's openLink is an anonymous person based ID that enables buyers and sellers of media to connect a person and their devices across the web and mobile apps. openLink facilities the buying of media between DSPs, SSPs and publishers.
+Gravito ID, provided by [Gravito Ltd.](https://gravito.net), is ID for ad targeting by using 1st party cookie.
+Please contact Gravito Ltd. for using this ID.
-Add support for MediaWallah OpenLinkID to your Prebid.js package with:
+Add the Gravito ID to your Prebid.js Package with:
{: .alert.alert-info :}
-gulp build --modules=userId,mwOpenLinkIdSystem
-
-#### MediaWallah OpenLinkID Registration
+gulp build --modules=gravitoIdSystem
-MediaWallah requires the creation of an accountId a partnerId in order to take advantage of openLink. Please contact your partner resource to get these Ids provisioned.
+#### Gravito ID Configuration
-#### MediaWallah OpenLinkID Configuration
-
-
+{: .table .table-bordered .table-striped }
| Param under userSync.userIds[] | Scope | Type | Description | Example |
| --- | --- | --- | --- | --- |
-| name | Required | String | The name of this module. | `'mwOpenLinkId'` |
-| params | Required | Object | Details for mwOLID syncing. ||
-| 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 }
-
diff --git a/dev-docs/plugins/bc/bc-prebid-plugin-prebid-options.md b/dev-docs/plugins/bc/bc-prebid-plugin-prebid-options.md
index 4d8265ea4a..bb4aa2f5bf 100644
--- a/dev-docs/plugins/bc/bc-prebid-plugin-prebid-options.md
+++ b/dev-docs/plugins/bc/bc-prebid-plugin-prebid-options.md
@@ -56,7 +56,7 @@ Not required but recommended.
**Default Value:**
-https://acdn.adnxs.com/prebid/not-for-prod/prebid.js
+https://cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js
**Example:**
@@ -305,7 +305,7 @@ None
**Example:**
-`options.prebidConfigOptions = { publisherDomain: "https://www.theverge.com"};`
+`options.prebidConfigOptions = { pageUrl: "https://www.theverge.com"};`
### dfpParameters
diff --git a/dev-docs/plugins/cross-player-prebid-component/cross-player-config.md b/dev-docs/plugins/cross-player-prebid-component/cross-player-config.md
index 7a62c85734..97ebcb97fe 100644
--- a/dev-docs/plugins/cross-player-prebid-component/cross-player-config.md
+++ b/dev-docs/plugins/cross-player-prebid-component/cross-player-config.md
@@ -45,7 +45,7 @@ Not required but recommended.
**Default Value:**
-https://acdn.adnxs.com/prebid/not-for-prod/prebid.js
+https://cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js
**Example:**
@@ -193,7 +193,7 @@ None
**Example:**
-`options.prebidConfigOptions = { publisherDomain: "https://www.mydomain.com"};`
+`options.prebidConfigOptions = { pageUrl: "https://www.mydomain.com"};`
## dfpParameters
@@ -297,7 +297,7 @@ Here is a sample Prebid configuration JSON object returned via URL:
```
{
- "prebidPath" : "//acdn.adnxs.com/prebid/not-for-prod/prebid.js",
+ "prebidPath" : "//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js",
"biddersSpec" : {
"code" : "my-video-tag",
"mediaTypes": {
diff --git a/dev-docs/prebid-troubleshooting-guide.md b/dev-docs/prebid-troubleshooting-guide.md
index a842461c37..70f4d1f22b 100644
--- a/dev-docs/prebid-troubleshooting-guide.md
+++ b/dev-docs/prebid-troubleshooting-guide.md
@@ -2,10 +2,6 @@
layout: page_v2
title: Prebid.js Troubleshooting Guide
head_title: Prebid.js Troubleshooting Guide
-description: How to troubleshoot Prebid.js from the perspective of an ad call from start to finish.
-pid: 10
-top_nav_section: dev_docs
-nav_section: troubleshooting
sidebarType: 1
---
@@ -14,109 +10,4 @@ sidebarType: 1
# Prebid.js Troubleshooting Guide
{:.no_toc}
-{: .alert.alert-danger :}
-Prebid.org does not support any version of Prebid.js prior to version 1.0.
-
-Use this guide to troubleshoot your Prebid.js integration. You can follow this guide sequentially to determine whether Prebid.js is working as intended on your website. It takes you through the ad call from start to finish.
-
-* TOC
-{:toc}
-
-## Check Your Prebid Version
-
-The open source code in Prebid.js can change frequently. To see what version of Prebid.js you are using, open your browser console and type `pbjs.version;`.
-
-You can reference this against the changes listed in the [Prebid.js Release Notes](https://github.com/prebid/Prebid.js/releases).
-
-## Delay the Ad Server Call so Key-Values can be Set
-
-Make sure that you delay any calls to the ad server. This allows all of the key-values to be set before the auction in the ad server occurs.
-
-Within Google Ad Manager, this is achieved by adding the following code to your page. It should be called before any of the ad server code to make sure it runs first.
-
-{% highlight js %}
-var googletag = googletag || {};
-googletag.cmd = googletag.cmd || [];
-googletag.cmd.push(function() {
- googletag.pubads().disableInitialLoad();
-});
-{% endhighlight %}
-
-## Check the Ad Units on the Page
-
-Make sure the ad units configured for Prebid.js match up with the ad units that have been set up in your ad server.
-
-You can review what ad units have been configured for Prebid by opening your browser console and typing `pbjs.getBidResponses();`. This will show a list of what div IDs are present:
-
-![pbjs.getBidResponses() showing ad units in browser console]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/ad-units.png "pbjs.getBidResponses() showing ad units in browser console"){: .pb-lg-img :}
-
-## List your Bids and Bidders
-
-Open your browser console and type `pbjs.getBidResponses();` to see a list of the ad units that have been configured. This also shows what bids have been returned from each of the bidder partners in chronological order as shown in the screenshot below.
-
-To see all of the winning bids, open your browser console and type [`pbjs.getAllWinningBids();`]({{site.baseurl}}/dev-docs/publisher-api-reference/getAllWinningBids.html).
-
-{: .alert.alert-danger :}
-Keep in mind that any bid responses that come back after [the timeout you configured during setup]({{site.github.url}}/dev-docs/getting-started.html#set-the-ad-server-timeout) will not be sent to the ad server.
-
-{: .alert.alert-success :}
-You can also [print this data to the console in table format]({{site.baseurl}}/dev-docs/troubleshooting-tips.html#see-all-bids-in-the-console) for easier reading.
-
-![pbjs.getBidResponses() in browser console]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/bids.png "pbjs.getBidResponses()"){: .pb-lg-img :}
-
-## Verify your Ad Server Targeting
-
-After the auction on page has occurred, Prebid.js will set key-value targeting for the ad server for those bids that have been returned before the [timeout you configured during setup]({{site.github.url}}/dev-docs/getting-started.html#set-the-ad-server-timeout).
-
-To see what values Prebid.js intends to send to the ad server, open your browser console and type `pbjs.getAdserverTargeting();` as shown below:
-
-![pbjs.getAdserverTargeting() in browser console]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/ad-server-target.png "pbjs.getAdserverTargeting()"){: .pb-lg-img :}
-
-{: .alert.alert-danger :}
-Note that if no bids are returned, no key-values will be set. You may need to increase your timeout setting or reach out to your bidder partners to determine why no bid responses are being sent.
-
-## Check the Ad Server's Auction
-
-After the Prebid auction has occurred and key-values have been set for the ad server, the ad server will use the line items targeting those key-values within its auction.
-
-If you're using Google Ad Manager, you can verify this by using the [Google Publisher Console](https://support.google.com/dfp_sb/answer/2462712?hl=en), which can be accessed as follows:
-
-+ Open your browser's console and type `googletag.openConsole();`
-
-+ Append `googfc` as a query parameter to the URL. Then, click the *Delivery Diagnostics* option to reveal most of the information described below.
-
-To make sure your ad server is set up correctly, answer the following questions:
-
-+ **How many ads have been fetched for an ad unit?** Ideally, only 1 ad will be requested on page load. If not, check for unnecessary extra calls to the ad server in your page's source code.
-
- ![Google Publisher Console Ad fetch count]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/ad-server-1.png "Google Publisher Console Ad fetch count"){: .pb-sm-img :}
-
-+ **Are the key-values being set in the ad server?** If not, review your page's source code to ensure that the Prebid auction completes **before** sending the key-value targeting to the ad server.
-
- ![Google Ad Manager Delivery Troubleshooting]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/ad-server-2.png "Google Ad Manager Delivery Troubleshooting"){: .pb-lg-img :}
-
-+ **Has the ad server order been activated?** If not, you'll have to activate the order to see Prebid-delivered ads.
-
-+ **Are there other higher priority campaigns running within your ad server?** Higher priority campaigns will prevent Prebid ads with a higher CPM bid from winning in the ad server's auction. For testing purposes, you may want to pause these campaigns or have them excluded when the prebid key values are present.
-
-+ **Is there other remnant inventory in the ad server with a higher CPM that is winning?** To test for this, you may want to use a test creative set up within a bidder partner that has a high CPM or create artificial demand with a [bidCPMadjustment]({{site.github.url}}/dev-docs/publisher-api-reference/bidderSettings.html).
-
-+ **Have you set up all of the line items in the ad server to match the [setPriceGranularity setting]({{site.github.url}}/dev-docs/examples/custom-price-buckets.html) within Prebid.js?** All of the line items that correspond to your price granularity settings must be set up in your ad server. When there are gaps in the price granularity of your line item setup, bids will be reduced according to the size of the gap. For example, with [dense granularity]({{site.github.url}}/dev-docs/publisher-api-reference.html#dense-granularity), a $3.32 bid will be sent to the ad server as $3.30.
-
-## Look for the Winning Bid
-
-When a prebid line item wins the ad server's auction, a `renderAd` event will be logged in the browser console. To see this event, you need to do either of the following before the auction:
-
-+ Have typed `pbjs.logging=true` into your your browser console
-
-+ Appended `pbjs_debug=true` as a query parameter to the URL
-
-When this event is logged, it shows that Prebid.js has requested to render the ad from the winning bidder partner, and that this partner's bid has won both the Prebid and ad server auctions.
-
-![renderAd event in browser console]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/render-ad.png "renderAd event in browser console"){: .pb-lg-img :}
-
-## Related Topics
-
-+ [Developer Troubleshooting Tips]({{site.github.url}}/dev-docs/troubleshooting-tips.html)
-
-+ [Common Setup Issues]({{site.github.url}}/dev-docs/common-issues.html)
+Moved to a new [Troubleshooting Guide](/troubleshooting/troubleshooting-guide.html)
diff --git a/dev-docs/publisher-api-reference/addAdUnits.md b/dev-docs/publisher-api-reference/addAdUnits.md
index 60df9ebc50..1ad30680b8 100644
--- a/dev-docs/publisher-api-reference/addAdUnits.md
+++ b/dev-docs/publisher-api-reference/addAdUnits.md
@@ -21,7 +21,7 @@ See the table below for the list of properties on the ad unit. For example ad u
|--------------+----------+---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `code` | Required | String | Unique identifier that you create and assign to this ad unit. Used to set query string targeting on the ad. If using GPT, we recommend setting this to slot element ID. |
| `sizes` | Required | Array[Number] or Array[Array[Number]] | All the sizes that this ad unit can accept. Examples: `[400, 600]`, `[[300, 250], [300, 600]]`. For 1.0 and later, prefer [`mediaTypes.banner.sizes`](#adUnit-banner). |
-| `bids` | Required | Array[Object] | Each bid represents a request to a bidder. For a list of properties, see [Bids](#addAdUnits-Bids) below. |
+| `bids` | Optional | Array[Object] | Each bid represents a request to a bidder. For a list of properties, see [Bids](#addAdUnits-Bids) below. |
| `mediaTypes` | Optional | Object | Defines one or multiple media types the ad unit supports. For a list of properties, see [Media Types](#addAdUnits-MediaTypes) below. |
| `labelAny` | optional | array | An array of string labels, used for showing responsive ads. With the `labelAny` operator, just one label has to match for the condition to be true. Works with the `sizeConfig` object passed in to [pbjs.setConfig]({{site.baseurl}}/dev-docs/publisher-api-reference/setConfig.html). |
| `labelAll` | optional | array | An array of string labels, used for showing responsive and conditional ads. With the `labelAll` conditional, every element of the target array must match an element of the label array in order for the condition to be true. Works with the `sizeConfig` object passed in to [pbjs.setConfig]({{site.baseurl}}/dev-docs/publisher-api-reference/setConfig.html). |
@@ -32,6 +32,8 @@ See the table below for the list of properties on the ad unit. For example ad u
See the table below for the list of properties in the `bids` array of the ad unit. For example ad units, see the [Examples](#addAdUnits-Examples) below.
+Note that `bids` is optional only for [Prebid Server stored impressions](/dev-docs/modules/prebidServer.html#stored-imp), and required in all other cases.
+
{: .table .table-bordered .table-striped }
| Name | Scope | Type | Description |
diff --git a/dev-docs/publisher-api-reference/bidderSettings.md b/dev-docs/publisher-api-reference/bidderSettings.md
index 224ef27548..a51070b804 100644
--- a/dev-docs/publisher-api-reference/bidderSettings.md
+++ b/dev-docs/publisher-api-reference/bidderSettings.md
@@ -43,6 +43,10 @@ Some sample scenarios where publishers may wish to alter the default settings:
| bidCpmAdjustment | standard or adapter-specific | all | n/a | Could, for example, adjust a bidder's gross-price bid to net price. |
| sendStandardTargeting | adapter-specific | 0.13.0 | true | If adapter-specific targeting is specified, can be used to suppress the standard targeting for that adapter. |
| suppressEmptyKeys | standard or adapter-specific | 0.13.0 | false | If custom adserverTargeting functions are specified that may generate empty keys, this can be used to suppress them. |
+| allowZeroCpmBids | standard or adapter-specific | 6.2.0 | false | Would allow bids with a 0 CPM to be accepted by Prebid.js and could be passed to the ad server. |
+| storageAllowed | standard or adapter-specific | 6.13.0 | true in 6.x, false after 7.0 | Allow use of cookies and local storage. |
+| allowAlternateBidderCodes | standard or adapter-specific | 6.23.0 | true in v6.x false from v7.0| Allow adapters to bid with alternate bidder codes. |
+| allowedAlternateBidderCodes | standard or adapter-specific | 6.23.0 | n/a | Array of bidder codes for which an adapter can bid. `undefined` or `['*']` will allow adapter to bid with any bidder code. |
##### 2.1. adserverTargeting
@@ -58,8 +62,8 @@ you'll need to fully manage the targeting -- the default `hb_` targeting variabl
**Keyword targeting for all bidders**
The below code snippet is the *default* setting for ad server targeting. For each bidder's bid,
-Prebid.js will set 6 keys (`hb_bidder`, `hb_adid`, `hb_pb`, `hb_size`, `hb_source`, `hb_format`) with their corresponding values.
-In addition, video will receive additional keys: `hb_cache_id`, `hb_uuid`, and `hb_cache_host`.
+Prebid.js will set 6 keys (`hb_bidder`, `hb_adid`, `hb_pb`, `hb_size`, `hb_format`) with their corresponding values.
+In addition, video will receive additional keys: `hb_cache_id` and `hb_cache_host`.
The key value pair targeting is applied to the bid's corresponding ad unit. Your ad ops team will have the ad server's line items and creatives to utilize these keys.
If you'd like to customize the key value pairs, you can overwrite the settings as the below example shows. *Note* that once you updated the settings, let your ad ops team know about the change, so they can update the line item targeting accordingly. See the [Ad Ops](/adops/before-you-start.html) documentation for more information.
@@ -110,7 +114,7 @@ pbjs.bidderSettings = {
{% endhighlight %}
{: .alert.alert-warning :}
-Note that the existence of `bidderSettings.adserverTargeting.standard` will prevent the system from adding the standard display targeting values: hb_bidder, hb_adid, hb_pb, hb_size, hb_source, and hb_format. However, if the mediaType is video and `bidderSettings.adserverTargeting.standard` does not specify hb_uuid, hb_cache_id, or hb_cache_host, they will be added unless `bidderSettings.sendStandardTargeting` is set to false.
+Note that the existence of `bidderSettings.adserverTargeting.standard` will prevent the system from adding the standard display targeting values: hb_bidder, hb_adid, hb_pb, hb_size, and hb_format. However, if the mediaType is video and `bidderSettings.adserverTargeting.standard` does not specify hb_uuid, hb_cache_id, or hb_cache_host, they will be added unless `bidderSettings.sendStandardTargeting` is set to false.
**Keyword targeting for a specific bidder**
@@ -218,4 +222,59 @@ See the [example above](#key-targeting-specific-bidder) for example usage.
If a custom adServerTargeting function can return an empty value, this boolean flag can be used to avoid sending those empty values to the ad server.
+##### 2.5. allowZeroCpmBids
+
+By default, 0 CPM bids are ignored by Prebid.js entirely. However if there's a valid business reason to allow these bids, this setting can be enabled to allow
+either specific bid adapter(s) or all bid adapters the permission for these bids to be processed by Prebid.js and potentially sent to the respective ad server
+(depending on the Prebid.js auction results).
+
+##### 2.6. storageAllowed
+
+By default, bid adapters can access browser cookies and local storage. This can be disabled by setting `storageAllowed` to `false`.
+
+Note that:
+ - [Disabling device access](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess) will prevent access to storage regardless of this setting;
+ - `storageAllowed` will only affect bid adapters and not any other type of module (such as analytics or RTD).
+
+
+##### 2.7. allowAlternateBidderCodes
+
+If this flag is set to `true`, bidders that have not been explicitly requested in [`adUnit.bids`](../adunit-reference.html#adunitbids) may take part in the auction.
+ Default value is `true` in version 6.x
+ Default value will be `false` from version 7.0
+
+
+##### 2.8. allowedAlternateBidderCodes
+
+This array will work in conjunction with `allowAlternateBidderCodes`. In this array, you can specify the names of the bidder for which an adapter can accept the bid. If the value is not specified for the array or `[â*â]` is specified, Prebid will accept bids of all the bidders for the given adapter.
+
+{% highlight js %}
+
+pbjs.bidderSettings = {
+ standard: {
+ allowAlternateBidderCodes: false,
+ bidCpmAdjustment: function(bidCpm, bid){ return bidCpm * .95; },
+ [...]
+ },
+ pubmatic: {
+ allowAlternateBidderCodes: true,
+ allowedAlternateBidderCodes: ["groupm"],
+ [...]
+ },
+ appnexus: {
+ allowAlternateBidderCodes: true,
+ allowedAlternateBidderCodes: ["*"],
+ bidCpmAdjustment: function(bidCpm, bid){ return bidCpm * .90; },
+ [...]
+ },
+ groupm:{
+ bidCpmAdjustment: function(bidCpm, bid){ return bidCpm * .80; },
+ [...]
+ }
+}
+{% endhighlight %}
+
+In the above example, `groupm` bid will have a bid adjustment of 80% since the `bidCpmAdjustment` function says so.
+If `appnexus` bids with another bidder code, say `appnexus2`. This bidder code will adjust the bid cpm to 95% because it will apply the `bidCpmAdjustment` function from `standard` setting, since the `bidCpmAdjustment` is missing for given bidder code I.e `appnexus2`
+
diff --git a/dev-docs/publisher-api-reference/getConfig.md b/dev-docs/publisher-api-reference/getConfig.md
index 9ff5f12ff9..99ac02fd88 100644
--- a/dev-docs/publisher-api-reference/getConfig.md
+++ b/dev-docs/publisher-api-reference/getConfig.md
@@ -4,8 +4,9 @@ title: pbjs.getConfig([string])
description:
---
+## Overview
-The `getConfig` function is for retrieving the current configuration object or subscribing to configuration updates. When called with no parameters, the entire config object is returned. When called with a string parameter, a single configuration property matching that parameter is returned.
+The `getConfig` function is used for retrieving the current configuration object or subscribing to configuration updates. When called with no parameters, the entire config object is returned. When called with a string parameter, a single configuration property matching that parameter is returned. Be careful with use of this function, as it returns a reference to the configuration instead of a clone. The readConfig function has been introduced for safer use.
{% highlight js %}
/* Get config object */
@@ -15,7 +16,10 @@ config.getConfig()
config.getConfig('debug')
{% endhighlight %}
-The `getConfig` function also contains a 'subscribe' ability that adds a callback function to a set of listeners that are invoked whenever `setConfig` is called. The subscribed function will be passed the options object that was used in the `setConfig` call. Individual topics can be subscribed to by passing a string as the first parameter and a callback function as the second. For example:
+
+### Subscribe
+
+The `getConfig` function contains a `subscribe` feature that adds a callback function to a set of listeners that are invoked whenever `setConfig` is called. The `subscribed` function will be passed the `options` object that was used in the `setConfig` call. Individual topics can be subscribed to by passing a string as the first parameter and a callback function as the second. For example:
{% highlight js %}
@@ -31,4 +35,4 @@ unsubscribe(); // no longer listening
{% endhighlight %}
-
\ No newline at end of file
+
diff --git a/dev-docs/publisher-api-reference/getConsentMetadata.md b/dev-docs/publisher-api-reference/getConsentMetadata.md
new file mode 100644
index 0000000000..abdae9bd1a
--- /dev/null
+++ b/dev-docs/publisher-api-reference/getConsentMetadata.md
@@ -0,0 +1,25 @@
+---
+layout: api_prebidjs
+title: pbjs.getConsentMetadata()
+description:
+---
+
+
+The `getConsentMetadata()` function will return basic information about the status of supported (and configured!) consent content within Prebid.
+
+```
+pbjs.getConsentMetadata() // returns e.g.
+{
+ "coppa": false,
+ "gdpr": {
+ "apiVersion": 2,
+ "consentStringSize": 100,
+ "gdprApplies": true,
+ "generatedAt": 1644358143306
+ },
+ "usp": {
+ "generatedAt": 1644358143306,
+ "usp": "1YYY"
+ }
+}
+```
\ No newline at end of file
diff --git a/dev-docs/publisher-api-reference/getEvents.md b/dev-docs/publisher-api-reference/getEvents.md
index 70fd24a5a7..64c0752206 100644
--- a/dev-docs/publisher-api-reference/getEvents.md
+++ b/dev-docs/publisher-api-reference/getEvents.md
@@ -4,23 +4,19 @@ title: pbjs.getEvents()
description:
---
+The `getEvents` method returns a copy of all emitted events since the page loaded.
-The methods `onEvent` and `offEvent` are provided for you to register
-a callback to handle a Prebid.js event.
+**Kind**: static method of `pbjs`
-The `getEvents` method returns a copy of all emitted events.
+**Args**: none
-The optional `id` parameter provides more finely-grained event
-callback registration. This makes it possible to register callback
-events for a specific item in the event context.
+**Returns**: `array of objects`
-For example, `bidWon` events will accept an `id` for ad unit code.
-`bidWon` callbacks registered with an ad unit code id will be called
-when a bid for that ad unit code wins the auction. Without an `id`
-this method registers the callback for every `bidWon` event.
-
-{: .alert.alert-info :}
-Currently, `bidWon` is the only event that accepts the `id` parameter.
+**Returned Object Params**:
+- eventType (see table below)
+- args (varies for each event type)
+- id (only for bidWon, set to adUnit.code)
+- elapsedTime
The available events are:
@@ -30,6 +26,7 @@ The available events are:
| auctionInit | The auction has started | Object containing auction details |
| auctionEnd | The auction has ended | Object containing auction details |
| beforeRequestBids | Bids are about to be requested from adapters (added in 3.x) | Array of adunits in the auction |
+| beforeBidderHttp | bidder network request is about be triggered | Array of Bid request objects |
| bidRequested | A bid was requested from a specific bidder | Bid request object |
| bidResponse | A bid response has arrived | Bid response object |
| bidAdjustment | A bid was adjusted | Bid response object |
@@ -39,75 +36,21 @@ The available events are:
| requestBids | Bids have been requested from adapters (i.e. pbjs.requestBids() was called) | None |
| addAdUnits | Ad units have been added to the auction | None |
| adRenderFailed| Ad rendering failed | Object containing 'reason' and 'message' |
+| adRenderSucceeded | Ad rendering succeeded| Object containing 'doc', 'bid', and 'adId'. 'doc' is the DOM root containing the ad and may be `null` if it was rendered in a cross-origin iframe.|
| auctionDebug | An error was logged to the console | Object containing 'type' and 'arguments' |
| bidderDone | A bidder has signaled they are done responding | Bid request object |
+| bidderError | A bidder responded with an error | Object with the XMLHttpRequest error and the bid request object `{ error, bidderRequest }` |
| tcf2Enforcement | There was a TCF2 enforcement action taken | `{ storageBlocked: ['moduleA', 'moduleB'], biddersBlocked: ['moduleB'], analyticsBlocked: ['moduleC'] }` |
-The examples below show how these events can be used.
-
-Events example 1
-{% highlight js %}
-
- /* Log when ad units are added to Prebid */
- pbjs.onEvent('addAdUnits', function() {
- console.log('Ad units were added to Prebid.')
- console.log(pbjs.adUnits);
- });
-
- /* Log when Prebid wins the ad server auction */
- pbjs.onEvent('bidWon', function(data) {
- console.log(data.bidderCode+ ' won the ad server auction for ad unit ' +data.adUnitCode+ ' at ' +data.cpm+ ' CPM');
- });
-
-{% endhighlight %}
-
-Events example 2: Use the optional 3rd parameter for the `bidWon` event
-{% highlight js %}
- /* This handler will be called only for rightAdUnit */
- /* Uses the `pbjs.offEvent` method to remove the handler once it has been called */
- var bidWonHandler = function bidWonHandler() {
- console.log('bidWonHandler: ', arguments);
- pbjs.offEvent('bidWon', bidWonHandler, rightAdUnit);
- };
-
- var rightAdUnit="/111111/right";
- pbjs.que.push(function () {
- var adUnits = [{
- code: rightAdUnit,
- ...
- },{
- ...
- }];
-
- pbjs.addAdUnits(adUnits);
- pbjs.requestBids({
- ...
- });
-
- /* Register a callback for just the rightSlot `bidWon` event */
- /* Note that defining an event that uses the 3rd parameter must come after initiating the auction */
- pbjs.onEvent('bidWon', bidWonHandler, rightAdUnit);
+The example below shows how these events can be used.
- ...
-{% endhighlight %}
-
-Events example 3: Dynamically modify the auction
{% highlight js %}
- var bidderFilter = function bidderFilter(adunits) {
- // pub-specific logic to optimize bidders
- // e.g. "remove any that haven't bid in the last 4 refreshes"
- };
- pbjs.onEvent('beforeRequestBids', bidderFilter);
+ pbjs.getEvents().forEach(event => {
+ console.log("event: "+event.eventType)
+ });
{% endhighlight %}
-Events example 4: Log errors and render fails to your own endpoint
-{% highlight js %}
- pbjs.onEvent('adRenderFailed', function () {
- // pub-specific logic to call their own endpoint
- });
- pbjs.onEvent('auctionDebug', function () {
- // pub-specific logic to call their own endpoint
- });
-{% endhighlight %}
-
\ No newline at end of file
+## See Also
+- [onEvent](/dev-docs/publisher-api-reference/onEvent.html)
+- [offEvent](/dev-docs/publisher-api-reference/offEvent.html)
diff --git a/dev-docs/publisher-api-reference/getNoBids.md b/dev-docs/publisher-api-reference/getNoBids.md
index 8730a42852..aa2ebd491f 100644
--- a/dev-docs/publisher-api-reference/getNoBids.md
+++ b/dev-docs/publisher-api-reference/getNoBids.md
@@ -5,6 +5,6 @@ description:
---
-Use this method to get all of the bid requests that resulted in a NO_BID. These are bid requests that were sent to a bidder but, for whatever reason, the bidder decided not to bid on. Used by debugging snippet in [Tips for Troubleshooting](/dev-docs/troubleshooting-tips.html).
+Use this method to get all of the bid requests that resulted in a NO_BID. These are bid requests that were sent to a bidder but, for whatever reason, the bidder decided not to bid on. Used by debugging snippet in the [Troubleshooting Guide](/troubleshooting/troubleshooting-guide.html).
-+ `pbjs.getNoBids()`: returns an array of bid request objects that were deliberately not bid on by a bidder.
\ No newline at end of file
++ `pbjs.getNoBids()`: returns an array of bid request objects that were deliberately not bid on by a bidder.
diff --git a/dev-docs/publisher-api-reference/getUserIdsAsync.md b/dev-docs/publisher-api-reference/getUserIdsAsync.md
new file mode 100644
index 0000000000..69fd2f2ee9
--- /dev/null
+++ b/dev-docs/publisher-api-reference/getUserIdsAsync.md
@@ -0,0 +1,18 @@
+---
+layout: api_prebidjs
+title: pbjs.getUserIdsAsync()
+description:
+---
+
+{: .alert.alert-info :}
+To use this function, include the [UserId module](/dev-docs/modules/userId.html) in your Prebid.js build.
+
+`getUserIdsAsync()` returns a promise to the same value returned by [getUserIds()](/dev-docs/publisher-api-reference/getUserIds.html), but it's guaranteed to resolve only once the complete set of IDs is available:
+
+```
+pbjs.getUserIdsAsync().then(function (userIds) {
+ // all IDs are available here:
+ pbjs.getUserIds() // same as the `userIds` argument
+ pbjs.getUserIdsAsEids()
+});
+```
diff --git a/dev-docs/publisher-api-reference/mergeBidderConfig.md b/dev-docs/publisher-api-reference/mergeBidderConfig.md
new file mode 100644
index 0000000000..f2bca7b14a
--- /dev/null
+++ b/dev-docs/publisher-api-reference/mergeBidderConfig.md
@@ -0,0 +1,20 @@
+---
+layout: api_prebidjs
+title: pbjs.mergeBidderConfig(options)
+description:
+---
+
+This is the same as [`setBidderConfig(options, true)`](/dev-docs/publisher-api-reference/setBidderConfig.html) -- it merges the supplied bidder config into the config structure rather than replacing it.
+
+The page usage is:
+
+{% highlight js %}
+pbjs.mergeBidderConfig({
+ bidders: ['bidderA'],
+ config: {
+ customArg: "customVal"
+ }
+});
+{% endhighlight %}
+
+Intrepration: When 'bidderA' calls `getConfig('customArg')`, it will receive the object that contains 'customArg'. If any other bidder calls `getConfig('customArg')`, it will receive nothing.
diff --git a/dev-docs/publisher-api-reference/mergeConfig.md b/dev-docs/publisher-api-reference/mergeConfig.md
new file mode 100644
index 0000000000..b428aacce1
--- /dev/null
+++ b/dev-docs/publisher-api-reference/mergeConfig.md
@@ -0,0 +1,10 @@
+---
+layout: api_prebidjs
+title: pbjs.mergeConfig(options)
+description:
+---
+
+This is the same as [`setConfig(options)`](/dev-docs/publisher-api-reference/setConfig.html) except that it merges the supplied config into the structure rather than replacing it.
+
+This is a convenience function, particularly useful to real time data modules, so one doesn't have to read the
+config structure, update it, then call setConfig.
diff --git a/dev-docs/publisher-api-reference/offEvent.md b/dev-docs/publisher-api-reference/offEvent.md
index 1a365aafc2..31dc71af82 100644
--- a/dev-docs/publisher-api-reference/offEvent.md
+++ b/dev-docs/publisher-api-reference/offEvent.md
@@ -1,6 +1,56 @@
---
layout: api_prebidjs
-title: pbjs.offEvent(event, handler, id)
+title: pbjs.offEvent(eventType, handler, id)
description:
---
+Turns off an event callback defined with [onEvent](/dev-docs/publisher-api-reference/onEvent.html)
+
+**Kind**: static method of `pbjs`
+
+**Args**: eventType, callbackFunction, id
+
+**Returns**: none
+
+See the [getEvents](/publisher-api-reference/getEvents.html) function for the full list of eventTypes supported.
+
+Causes PBJS to search through registered event callbacks and remove the
+supplied callbackFunction for the specifc eventType.
+
+The optional `id` parameter provides more finely-grained event
+callback de-registration. This makes it possible to de-register callback
+events for a specific item in the event context.
+
+Example
+
+{% highlight js %}
+ /* This handler will be called only for rightAdUnit */
+ /* Uses the `pbjs.offEvent` method to remove the handler once it has been called */
+ var bidWonHandler = function bidWonHandler() {
+ console.log('bidWonHandler: ', arguments);
+ pbjs.offEvent('bidWon', bidWonHandler, rightAdUnit);
+ };
+
+ var rightAdUnit="/111111/right";
+ pbjs.que.push(function () {
+ var adUnits = [{
+ code: rightAdUnit,
+ ...
+ },{
+ ...
+ }];
+ pbjs.addAdUnits(adUnits);
+ pbjs.requestBids({
+ ...
+ });
+
+ /* Register a callback for just the rightSlot `bidWon` event */
+ /* Note that defining an event that uses the 3rd parameter must come after initiating the auction */
+ pbjs.onEvent('bidWon', bidWonHandler, rightAdUnit);
+
+ ...
+{% endhighlight %}
+
+## See Also
+- [getEvents](/dev-docs/publisher-api-reference/getEvents.html)
+- [onEvent](/dev-docs/publisher-api-reference/onEvent.html)
diff --git a/dev-docs/publisher-api-reference/onEvent.md b/dev-docs/publisher-api-reference/onEvent.md
index 716048f519..6e779971ca 100644
--- a/dev-docs/publisher-api-reference/onEvent.md
+++ b/dev-docs/publisher-api-reference/onEvent.md
@@ -1,6 +1,65 @@
---
layout: api_prebidjs
-title: pbjs.onEvent(event, handler, id)
+title: pbjs.onEvent(eventType, handler, id)
description:
---
+This routine allows the page (or module) to create a callback function that's invoked when heading bidding events are fired.
+
+**Kind**: static method of `pbjs`
+
+**Args**: eventType, callbackFunction, id
+
+**Returns**: none
+
+See the [getEvents](/dev-docs/publisher-api-reference/getEvents.html) function for the full list of eventTypes supported.
+
+The optional `id` parameter provides more finely-grained event
+callback registration. This makes it possible to register callback
+events for a specific item in the event context.
+
+For example, `bidWon` events will accept an `id` for ad unit code.
+`bidWon` callbacks registered with an ad unit code id will be called
+when a bid for that ad unit code wins the auction. Without an `id`
+this method registers the callback for every `bidWon` event.
+
+{: .alert.alert-info :}
+Currently, `bidWon` is the only event that accepts the `id` parameter.
+
+Example 1: Basic event logging
+```
+ /* Log when ad units are added to Prebid */
+ pbjs.onEvent('addAdUnits', function() {
+ console.log('Ad units were added to Prebid.')
+ console.log(pbjs.adUnits);
+ });
+
+ /* Log when Prebid wins the ad server auction */
+ pbjs.onEvent('bidWon', function(data) {
+ console.log(data.bidderCode+ ' won the ad server auction for ad unit ' +data.adUnitCode+ ' at ' +data.cpm+ ' CPM');
+ });
+
+```
+
+Example 2: Dynamically modify the auction
+```
+ var bidderFilter = function bidderFilter(adunits) {
+ // pub-specific logic to optimize bidders
+ // e.g. "remove any that haven't bid in the last 4 refreshes"
+ };
+ pbjs.onEvent('beforeRequestBids', bidderFilter);
+```
+
+Example 3: Log errors and render fails to your own endpoint
+```
+ pbjs.onEvent('adRenderFailed', function () {
+ // pub-specific logic to call their own endpoint
+ });
+ pbjs.onEvent('auctionDebug', function () {
+ // pub-specific logic to call their own endpoint
+ });
+```
+
+## See Also
+- [getEvents](/dev-docs/publisher-api-reference/getEvents.html)
+- [offEvent](/dev-docs/publisher-api-reference/offEvent.html)
diff --git a/dev-docs/publisher-api-reference/readConfig.md b/dev-docs/publisher-api-reference/readConfig.md
new file mode 100644
index 0000000000..734647e762
--- /dev/null
+++ b/dev-docs/publisher-api-reference/readConfig.md
@@ -0,0 +1,18 @@
+---
+layout: api_prebidjs
+title: pbjs.readConfig([string])
+description:
+---
+
+
+The `readConfig` function is used for retrieving the current configuration object or subscribing to configuration updates. When called with no parameters, the entire config object is returned. When called with a string parameter, a single configuration property matching that parameter is returned. The readConfig function has been introduced for safer use of the getConfig functionality, as it returns a clone.
+
+{% highlight js %}
+/* Get config object */
+config.readConfig()
+
+/* Get debug config */
+config.readConfig('debug')
+{% endhighlight %}
+
+
diff --git a/dev-docs/publisher-api-reference/refreshUserIds.md b/dev-docs/publisher-api-reference/refreshUserIds.md
index cfb4edaabb..68caf97957 100644
--- a/dev-docs/publisher-api-reference/refreshUserIds.md
+++ b/dev-docs/publisher-api-reference/refreshUserIds.md
@@ -21,4 +21,4 @@ The `refreshUserIds` function allows you to force either all or a subset of user
```
pbjs.refreshUserIds();
pbjs.refreshUserIds({ submoduleNames: ['britepoolId'] }, () => console.log("Done!"));
-```
\ No newline at end of file
+```
diff --git a/dev-docs/publisher-api-reference/requestBids.md b/dev-docs/publisher-api-reference/requestBids.md
index 103b2db8d2..92ef42eb1c 100644
--- a/dev-docs/publisher-api-reference/requestBids.md
+++ b/dev-docs/publisher-api-reference/requestBids.md
@@ -20,6 +20,7 @@ Request bids. When `adUnits` or `adUnitCodes` are not specified, request bids fo
| requestObj.bidsBackHandler | Optional | `function` | Callback to execute when all the bid responses are back or the timeout hits. Callback will be passed three parameters, the [bidResponses](#module_pbjs.getBidResponses) themselves, a `timedOut` flag (true if any bidders timed out) and the `auctionId`. |
| requestObj.labels | Optional | `Array of strings` | Defines [labels](#labels) that may be matched on ad unit targeting conditions. |
| requestObj.auctionId | Optional | `String` | Defines an auction ID to be used rather than having the system generate one. This can be useful if there are multiple wrappers on a page and a single auction ID is desired to tie them together in analytics. |
+| requestObj.ortb2 | Optional | `Object` | Additional [first-party data](/features/firstPartyData.html) to use for this auction only |
Example call
```
diff --git a/dev-docs/publisher-api-reference/setBidderConfig.md b/dev-docs/publisher-api-reference/setBidderConfig.md
index accaca9548..fd388acedb 100644
--- a/dev-docs/publisher-api-reference/setBidderConfig.md
+++ b/dev-docs/publisher-api-reference/setBidderConfig.md
@@ -1,6 +1,6 @@
---
layout: api_prebidjs
-title: pbjs.setBidderConfig(options)
+title: pbjs.setBidderConfig(options, mergeFlag)
description:
---
@@ -12,6 +12,8 @@ globally available to all bidder adapters. This makes sense because
most of these settings are global in nature. However, there are use cases where different bidders require different data, or where certain parameters apply only to a given
bidder. Use `setBidderConfig` when you need to support these cases.
+Note if you would like to add to existing config you can pass `true` for the optional second `mergeFlag` argument like `setBidderConfig(options, true)`. If not passed, this argument defaults to false and `setBidderConfig` replaces all values for specified bidders.
+
The page usage is:
{% highlight js %}
diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md
index 3a580ad401..32cc79b198 100644
--- a/dev-docs/publisher-api-reference/setConfig.md
+++ b/dev-docs/publisher-api-reference/setConfig.md
@@ -5,7 +5,9 @@ description:
---
-`setConfig` supports a number of advanced configuration options:
+`setConfig` supports a number of configuration options. Every
+call to setConfig overwrites supplied values at the top level. e.g. if `ortb2` is provided as a value, any previously-supplied `ortb2` values will disappear.
+If this is not the desired behavior, there is a [`mergeConfig()`](mergeConfig.html) function that will preserve previous values to do not conflict with the newly supplied values.
See below for usage examples.
@@ -22,7 +24,6 @@ Core config:
+ [Bid cache](#setConfig-Use-Bid-Cache)
+ [Set the order in which bidders are called](#setConfig-Bidder-Order)
+ [Set the page URL](#setConfig-Page-URL)
-+ [Set the publisher's domain](#setConfig-Publisher-Domain)
+ [Set price granularity](#setConfig-Price-Granularity)
+ [Set media type price granularity](#setConfig-MediaType-Price-Granularity)
+ [Configure server-to-server header bidding](#setConfig-Server-to-Server)
@@ -52,7 +53,7 @@ Debug mode can be enabled permanently in a page if desired. In debug mode,
Prebid.js will post additional messages to the browser console and cause Prebid Server to
return additional information in its response. If not specified, debug is off.
Note that debugging can be specified for a specific page view by adding
-`pbjs_debug=true` to the URL's query string. e.g. /pbjs_demo.html?pbjs_debug=true See [Prebid.js troubleshooting tips](/dev-docs/troubleshooting-tips.html) for more information.
+`pbjs_debug=true` to the URL's query string. e.g. /pbjs_demo.html?pbjs_debug=true See [Prebid.js troubleshooting guide](/troubleshooting/troubleshooting-guide.html) for more information.
Turn on debugging permanently in the page:
{% highlight js %}
@@ -246,6 +247,20 @@ pbjs.setConfig({ useBidCache: true })
{% endhighlight %}
+#### Bid Cache Filter Function
+
+
+
+When [Bid Caching](#setConfig-Use-Bid-Cache) is turned on, a custom Filter Function can be defined to gain more granular control over which "cached" bids can be used. This function will only be called for "cached" bids from previous auctions, not "current" bids from the most recent auction. The function should take a single bid object argument, and return `true` to use the cached bid, or `false` to not use the cached bid. For Example, to turn on Bid Caching, but exclude cached video bids, you could do this:
+
+{% highlight js %}
+pbjs.setConfig({
+ useBidCache: true,
+ bidCacheFilterFunction: bid => bid.mediaType !== 'video'
+});
+{% endhighlight %}
+
+
#### Bidder Order
Set the order in which bidders are called:
@@ -264,18 +279,6 @@ Override the Prebid.js page referrer for some bidders.
pbjs.setConfig({ pageUrl: "https://example.com/index.html" })
{% endhighlight %}
-
-
-#### Publisher Domain
-
-{: .alert.alert-warning :}
-This API is deprecated. Please use 'pageUrl' instead.
-
-Set the publisher's domain where Prebid is running, for cross-domain iframe communication:
-
-{% highlight js %}
-pbjs.setConfig({ publisherDomain: "https://www.theverge.com" )
-{% endhighlight %}
@@ -374,34 +377,44 @@ This implies that ranges should have max values that are really the min value of
#### Media Type Price Granularity
-The default [Prebid price granularities](#setConfig-Price-Granularity) cap out at $20, which isn't always convenient for video ads, which can command more than $20. One solution is to just set up a
-custom price
-granularity as described above. Another approach is
-`mediaTypePriceGranularity` config that may be set to define granularities for each of five media types:
-banner, video, video-instream, video-outstream, and native. e.g.
+The standard [Prebid price granularities](#setConfig-Price-Granularity) cap out at 20, which isn't always convenient for video ads, which can command more than that. One solution is to set up a custom price
+granularity as described above. Another approach is to use
+`mediaTypePriceGranularity` config that may be set to define different price bucket
+structures for different types of media:
+- for each of five media types: banner, video, video-instream, video-outstream, and native.
+- it is recommended that defined granularities be custom. It's possible to define "standard" granularities (e.g. "medium"), but it's not possible to mix both custom and standard granularities.
{% highlight js %}
-const customPriceGranularity = {
+const customPriceGranularityVideo = {
'buckets': [
- { 'precision': 2, 'max':x 5, 'increment': 0.25 },
+ { 'precision': 2, 'max': 5, 'increment': 0.25 },
{ 'precision': 2, 'max': 20, 'increment': 0.5 },
{ 'precision': 2, 'max': 100, 'increment': 1 }
]
};
+const customPriceGranularityBanner = {
+ 'buckets': [
+ { 'precision': 2, 'max': 5, 'increment': 0.5 },
+ { 'precision': 2, 'max': 20, 'increment': 1 }
+ ]
+};
pbjs.setConfig({'mediaTypePriceGranularity': {
'video': customPriceGranularity, // used as default for instream video
- 'video-outstream': customPriceGranularityOutstream,
- 'banner': 'medium',
- 'native': 'medium',
+ 'video-outstream': customPriceGranularityBanner,
+ 'banner': 'customPriceGranularityBanner'
}
});
{% endhighlight %}
Any `mediaTypePriceGranularity` setting takes precedence over `priceGranularity`.
+{: .alert.alert-warning :}
+mediaTypePriceGranularity works in two modes: either auctions contain adunits with a single media type, or all defined price granularities are custom.
+i.e. You cannot run an auction containing a mix of mediatypes across an adunit AND having a mix of "custom" and "standard" price granularities across mediatypes.
+
{: .alert.alert-info :}
-Note: mediaTypePriceGranularity is the only place that 'video-outstream' or 'video-instream'
+Note that mediaTypePriceGranularity is the only place that 'video-outstream' or 'video-instream'
are recognized. This was driven by the recognition that outstream often shares line items with banner.
If the mediatype is video, the price bucketing code further looks at the context (e.g. outstream) to see if there's
a price granularity override. If it doesn't find 'video-outstream' defined, it will then look for just 'video'.
@@ -410,115 +423,7 @@ a price granularity override. If it doesn't find 'video-outstream' defined, it w
#### Server to Server
-{: .alert.alert-info :}
-Use of this config option requires the `prebidServerBidAdapter` module.
-
-
-Prebid.js can be configured to connect to one or more [Prebid Servers](/prebid-server/overview/prebid-server-overview.html) for one or more bidders.
-
-Example config:
-
-{% highlight js %}
-pbjs.setConfig({
- s2sConfig: [{
- accountId: '1',
- bidders: ['appnexus', 'openx', 'tripleliftVideo'],
- defaultVendor: 'appnexus',
- timeout: 500,
- adapterOptions: {
- openx: { key: 'value' },
- appnexus: { key: 'value' }
- },
- syncUrlModifier: {
- 'openx': function(type, url, bidder) {
- const publisherId = '00000123231231'
- url += `&ri=${publisherId}`;
- return url
- }
- },
- extPrebid: {
- aliases: {
- tripleliftVideo: tripleLift
- }
- }
- }]
-})
-{% endhighlight %}
-
-{: .alert.alert-info :}
-Note that `s2sConfig` can be specified as an object or an array.
-
-The `s2sConfig` properties:
-
-{: .table .table-bordered .table-striped }
-| Attribute | Scope | Type | Description |
-|------------+---------+---------+---------------------------------------------------------------|
-| `accountId` | Required | String | Your Prebid Server account ID. This is obtained from whoever's hosting your Prebid Server. |
-| `bidders` | Required | Array of Strings | Which bidders auctions should take place on the server side |
-| `defaultVendor` | Optional | String | Automatically includes all following options in the config with vendor's default values. Individual properties can be overridden by including them in the config along with this setting. See the Additional Notes below for more information. |
-| `enabled` | Optional | Boolean | Enables this s2sConfig block - defaults to `false` |
-| `timeout` | Required | Integer | Number of milliseconds allowed for the server-side auctions. This should be approximately 200ms-300ms less than your Prebid.js timeout to allow for all bids to be returned in a timely manner. See the Additional Notes below for more information. |
-| `adapter` | Required | String | Adapter to use to connect to Prebid Server. Defaults to 'prebidServer' |
-| `endpoint` | Required | URL | Defines the auction endpoint for the Prebid Server cluster |
-| `syncEndpoint` | Required | URL | Defines the cookie_sync endpoint for the Prebid Server cluster |
-| `userSyncLimit` | Optional | Integer | Max number of userSync URLs that can be executed by Prebid Server cookie_sync per request. If not defined, PBS will execute all userSync URLs included in the request. |
-| `coopSync` | Optional | Boolean | Whether or not PBS is allowed to perform "cooperative syncing" for bidders not on this page. Publishers help each other improve match rates by allowing this. Default is true. Supported in PBS-Java only. |
-| `defaultTtl` | Optional | Integer | Configures the default TTL in the Prebid Server adapter to use when Prebid Server does not return a bid TTL - 60 if not set |
-| `adapterOptions` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in every impression object at request.imp[].ext.BIDDER. See the example above. |
-| `extPrebid` | Optional | Object | Arguments will be added to resulting OpenRTB payload to Prebid Server in request.ext.prebid. See the examples below. |
-| `syncUrlModifier` | Optional | Object | Function to modify a bidder's sync url before the actual call to the sync endpoint. Bidder must be enabled for s2sConfig. |
-
-**Notes on s2sConfig properties**
-
-- Currently supported vendors are: appnexus & rubicon
-- When using `defaultVendor` option, `accountId` and `bidders` properties still need to be defined.
-- If the `s2sConfig` timeout is greater than the Prebid.js timeout, the `s2sConfig` timeout will be automatically adjusted to 75% of the Prebid.js timeout in order to fit within the auction process.
-
-{: .alert.alert-warning :}
-**Errors in bidder parameters will cause Prebid Server to reject the
-entire request.** The Prebid Server philosophy is to avoid silent failures --
-we assume you will test changes, and that it will be easier to notice a
-4xx error coming from the server than a silent failure where it skips just
-the bad parameter.
-
-**Video via s2sConfig**
-
-Supporting video through the Server-to-Server route can be done by providing a couple of extra arguments on the `extPrebid` object. e.g.
-
-{% highlight js %}
-pbjs.setConfig({
- s2sConfig: [{
- accountId: '1001',
- bidders: ['rubicon', 'pubmatic'],
- defaultVendor: 'rubicon',
- timeout: 250,
- extPrebid: {
- cache: {
- vastxml: { returnCreative: false }
- },
- targeting: {
- pricegranularity: {"ranges": [{"max":40.00,"increment":1.00}]}
- }
- }
- }]
-})
-{% endhighlight %}
-
-Additional options for `s2sConfig` may be enabled by including the [Server-to-Server testing module]({{site.baseurl}}/dev-docs/modules/s2sTesting.html).
-
-**Server-Side Aliases**
-
-You may want to run a particular bidder on the client for banner, but that same bidder on the
-server for video. You would do this by setting a **server-side** alias. The
-[example](#setConfig-Server-to-Server) at the start of this section provides an example. Here's how it works:
-
-1. Video ad units are coded with the dynamic alias. e.g. tripleliftVideo
-1. The s2sConfig.bidders array contains 'tripleliftVideo' telling Prebid.js to direct bids for that code to the server
-1. Finally, the extPrebid.aliases line tells Prebid Server to route the 'tripleliftVideo' biddercode to the 'triplelift' server-side adapter.
-
-**Passing the Referrer to Server Side Adapters**
-
-* Setting `extPrebid.origreferrer` will be recognized by some server-side adapters as the referring URL for the current page.
+See the [Prebid Server module](/dev-docs/modules/prebidServer.html).
@@ -716,6 +621,7 @@ The `targetingControls` object passed to `pbjs.setConfig` provides some options
| auctionKeyMaxChars | integer | Specifies the maximum number of characters the system can add to ad server targeting. |
| alwaysIncludeDeals | boolean | If [enableSendAllBids](#setConfig-Send-All-Bids) is false, set this value to `true` to ensure that deals are sent along with the winning bid |
| allowTargetingKeys | Array of Strings | Selects supported default targeting keys. |
+| addTargetingKeys | Array of Strings | Selects targeting keys to be supported in addition to the default ones |
| allowSendAllBidsTargetingKeys | Array of Strings | Selects supported default targeting keys. |
{: .alert.alert-info :}
@@ -761,6 +667,8 @@ Between these two values (Prebid's targeting key count and the overall ad URL qu
Between this feature and the overlapping [sendBidsControl.bidLimit](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-Bids-Control), you should be able to make sure that there's not too much data going to the ad server.
+
+
##### Details on the allowTargetingKeys setting
The `allowTargetingKeys` config creates a targeting key mask based on the default targeting keys defined in CONSTANTS.TARGETING_KEYS and CONSTANTS.NATIVE_KEYS. Any default keys that do not match the mask will not be sent to the adserver. This setting can be helpful if you find that your default Prebid.js implementation is sending key values that your adserver isn't configured to process; extraneous key values may lead to the ad server request being truncated, which can cause potential issues with the delivery or rendering ads.
@@ -784,9 +692,9 @@ The targeting key names and the associated prefix value filtered by `allowTarget
| PRICE_BUCKET | `hb_pb` | yes | The results of the [price granularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity) calculation. |
| SIZE | `hb_size` | yes | '300x250' |
| DEAL | `hb_deal` | yes | |
-| SOURCE | `hb_source` | yes | 'client' or 's2s' |
+| SOURCE | `hb_source` | no | 'client' or 's2s' |
| FORMAT | `hb_format` | yes | 'banner', 'video', or 'native' |
-| UUID | `hb_uuid` | yes | Network cache ID for video |
+| UUID | `hb_uuid` | no | Network cache ID for video |
| CACHE_ID | `hb_cache_id` | yes | Network cache ID for AMP or Mobile |
| CACHE_HOST | `hb_cache_host` | yes | |
| ADOMAIN | `hb_adomain` | no | Set to bid.meta.advertiserDomains[0]. Use cases: report on VAST errors, set floors on certain buyers, monitor volume from a buyer, track down bad creatives. |
@@ -828,6 +736,65 @@ config.setConfig({
});
```
+
+
+##### Details on the addTargetingKeys setting
+
+The `addTargetingKeys` config is similar to `allowTargetingKeys`, except it adds to the keys in CONSTANTS.DEFAULT_TARGETING_KEYS instead of replacing them. This is useful if you need Prebid.js to generate targeting for some keys that are not allowed by default without removing any of the default ones (see [allowTargetingKeys](#targetingControls-allowTargetingKeys) for details on how targeting is generated).
+
+Note that you may specify only one of `allowTargetingKeys` or `addTargetingKeys`.
+
+For example, this allows every default key, plus `hb_adomain`:
+
+```javascript
+config.setConfig({
+ targetingControls: {
+ addTargetingKeys: ['ADOMAIN']
+ }
+});
+```
+
+Which is equivalent to:
+
+```javascript
+config.setConfig({
+ targetingControls: {
+ allowTargetingKeys: [
+ 'BIDDER',
+ 'AD_ID',
+ 'PRICE_BUCKET',
+ 'SIZE',
+ 'DEAL',
+ 'FORMAT',
+ 'UUID',
+ 'CACHE_HOST',
+ 'title',
+ 'body',
+ 'body2',
+ 'privacyLink',
+ 'privacyIcon',
+ 'sponsoredBy',
+ 'image',
+ 'icon',
+ 'clickUrl',
+ 'displayUrl',
+ 'cta',
+ 'rating',
+ 'address',
+ 'downloads',
+ 'likes',
+ 'phone',
+ 'price',
+ 'salePrice',
+ 'rendererUrl',
+ 'adTemplate',
+ 'ADOMAIN'
+ ]
+ }
+});
+```
+
+
##### Details on the allowSendAllBidsTargetingKeys setting
The `allowSendAllBidsTargetingKeys` is similar to `allowTargetingKeys` except it limits any default bidder specific keys sent to the adserver when sendAllBids is enabled. Any default bidder specific keys that do not match the mask will not be sent to the adserver. This setting can be helpful if you find that your default Prebid.js implementation is sending key values that your adserver isn't configured to process; extraneous key values may lead to the ad server request being truncated, which can cause potential issues with the delivery or rendering ads. An example of an extraneous key value many publishers may find redundant and want to remove is `hb_bidder_biddercode = biddercode`.
@@ -1072,11 +1039,15 @@ The `ortb2` JSON structure reflects the OpenRTB standard:
- Segments should go in site.content.data[] or user.data[].
- Any other OpenRTB 2.5 field could be added here as well, e.g. site.content.language.
-**Scenario 2** - Global (cross-adunit) First Party Data open only to a subset of bidders
+**Scenario 2** - Auction (cross-adunit) First Party Data open to all bidders
+
+If a page needs to specify multiple different sets of top-level data (`site`, `user`, or `app`), use the `ortb2` parameter of [`requestBids`](/dev-docs/publisher-api-reference/setConfig.html) ([example](/features/firstPartyData.html#supplying-auction-specific-data)
+
+**Scenario 3** - Global (cross-adunit) First Party Data open only to a subset of bidders
If a publisher only wants certain bidders to receive the data, use the [setBidderConfig](/dev-docs/publisher-api-reference/setBidderConfig.html) function.
-**Scenario 3** - AdUnit-specific First Party Data
+**Scenario 4** - AdUnit-specific First Party Data
See the [AdUnit Reference](/dev-docs/adunit-reference.html) for AdUnit-specific first party data.
@@ -1335,3 +1306,7 @@ ERROR: setConfig options must be an object
If you don't see that message, you can assume the config object is valid.
+
+## Related Reading
+
+- [Prebid.js and Ad Server Key Values](/features/adServerKvps.html)
diff --git a/dev-docs/release-notes.md b/dev-docs/release-notes.md
index 7cae1390fc..66da5c0fcd 100644
--- a/dev-docs/release-notes.md
+++ b/dev-docs/release-notes.md
@@ -14,6 +14,10 @@ This page has links to release notes for each of the projects associated with Pr
## Prebid.js
+ [Release notes on GitHub](https://github.com/prebid/Prebid.js/releases)
++ [Prebid.js 7 Release Notes](/dev-docs/pb7-notes.html)
++ [Prebid.js 6 Blog Post](https://prebid.org/blog/prebid-6-0-release/)
++ [Prebid.js 5 Blog Post](https://prebid.org/blog/prebid-5-0-release/)
++ [Prebid.js 4 Blog Post](https://prebid.org/blog/prebid-js-release-4-0/)
## Prebid Server
diff --git a/dev-docs/show-outstream-video-ads.md b/dev-docs/show-outstream-video-ads.md
index 6b4a9dde66..77d9576a31 100644
--- a/dev-docs/show-outstream-video-ads.md
+++ b/dev-docs/show-outstream-video-ads.md
@@ -30,7 +30,7 @@ There should be no changes required on the ad ops side, since the outstream unit
Use the `adUnit.mediaTypes` object to set up your ad units with the `video` media type and assign the appropriate context
-The fields supported in a given `bid.params.video` object will vary based on the rendering options supported by each bidder. For more information, see [Bidders' Params]({{site.github.url}}/dev-docs/bidders.html).
+For full details on video ad unit parameters, see [Ad Unit Reference for Video]({{site.baseurl}}/dev-docs/adunit-reference.html#adunitmediatypesvideo)
{% highlight js %}
@@ -43,17 +43,14 @@ var videoAdUnits = [{
mimes: ['video/mp4'],
protocols: [1, 2, 3, 4, 5, 6, 7, 8],
playbackmethod: [2],
- skip: 1
+ skip: 1,
+ playback_method: ['auto_play_sound_off']
}
},
bids: [{
bidder: 'appnexus',
params: {
placementId: 13232385,
- video: {
- skip: 1,
- playback_method: ['auto_play_sound_off']
- }
}
}]
}];
diff --git a/dev-docs/show-prebid-ads-on-amp-pages.md b/dev-docs/show-prebid-ads-on-amp-pages.md
index 0195cc63fe..b57aa4d347 100644
--- a/dev-docs/show-prebid-ads-on-amp-pages.md
+++ b/dev-docs/show-prebid-ads-on-amp-pages.md
@@ -91,34 +91,40 @@ that doesn't come from /amp parameters:
}
}
},
- "imp": [
- {
- "id": "some-impression-id",
- "banner": {
- "format": [
- {
- "w": 300,
- "h": 250
- }
- ]
- },
- "ext": {
+ "imp": [{
+ "id": "some-impression-id",
+ "banner": {
+ "format": [{
+ "w": 300,
+ "h": 250
+ }]
+ },
+ "ext": {
+ "prebid": {
+ "bidder": {
"bidderA": {
// Insert parameters here
},
"bidderB": {
// Insert parameters here
}
- }
+ }
}
- ]
+ }
+ }]
}
-
```
This basic OpenRTB record will be enhanced by the parameters from the call to the [/amp endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html).
### AMP content page
+First ensure that the amp-ad component is imported in the header.
+
+```
+
+```
+This script provides code libraries that will convert `` properties to the endpoint query parameters usint the [Real Time Config](https://github.com/ampproject/amphtml/blob/main/extensions/amp-a4a/rtc-documentation.md) (RTC) protocol.
+
The `amp-ad` elements in the page body need to be set up as shown below, especially the following attributes:
+ `data-slot`: Identifies the ad slot for the auction.
@@ -130,8 +136,8 @@ e.g. for the AppNexus cluster of Prebid Servers:
```html
+ data-slot="/1111/universal_creative"
+ rtc-config='{"vendors": {"prebidappnexuspsp": {"PLACEMENT_ID": "13144370"}}, "timeoutMillis": 500}'>
```
@@ -139,11 +145,20 @@ e.g. for Rubicon Project's cluster of Prebid Servers:
```html
```
+For other hosts, you can specify the URL directly rather than using one of the convenient vendor aliases. e.g.
+```html
+
+```
+
### HTML Creative
This is the creative that your Ad Ops team needs to upload to the ad server (it's also documented at [Setting up Prebid for AMP in Google Ad Manager]({{site.github.url}}/adops/setting-up-prebid-for-amp-in-dfp.html)).
@@ -244,46 +259,62 @@ If you're using AppNexus' managed service, you would enter something like this:
height="1"
sandbox="allow-scripts allow-same-origin"
frameborder="0"
- src="https://acdn.adnxs.com/prebid/amp/user-sync/load-cookie.html?endpoint=appnexus&max_sync_count=5">
+ src="https://acdn.adnxs.com/prebid/amp/user-sync/load-cookie.html?endpoint=appnexus&max_sync_count=5&source=amp">
```
-If you are utilizing Magnite's managed service, there's an extra parameter:
+If you are utilizing Magnite's managed service, there's an extra `args` parameter:
```html
+ src="https://GET_URL_FROM_MAGNITE_ACCOUNT_TEAM/prebid/load-cookie.html?endpoint=rubicon&max_sync_count=5&source=amp&args=account:MAGNITE_ACCOUNT_ID">
```
-The usage of `load-cookie.html` and `load-cookie-with-consent.html` is the same. The arguments available on the query string are:
-
-{: .table .table-bordered .table-striped }
-| Param | Scope | Values | Description |
-| --- | --- | --- | --- |
-| endpoint | recommended | appnexus or rubicon | Determines which cluster of prebid servers to load from. Default, for legacy reasons, is appnexus. |
-| max_sync_count | optional | integer | How many sync pixels should be returned from Prebid Server |
-| args | optional | attr1:val1,attr2:val2 | These attribute value pairs will be passed to Prebid Server in the /cookie_sync call. The attribute and value will be quoted by the system when appropriate. |
-| gdpr | optional | 0 or 1 | Defines whether GDPR processing is in scope for this request. 0=no, 1=yes. Leave unknown if not sure. |
-| gdpr_consent | optional | String | IAB CMP-formatted consent string |
-
-{% capture endpointNote %}
-Currently, if you need to sync with a Prebid Server other than appnexus or rubicon, you'll need to fork the repo, change the endpoint, and host it somewhere. There is an [issue open to resolve](https://github.com/prebid/prebid-universal-creative/issues/122) this.
-{% endcapture %}
-{% include alerts/alert_note.html content=endpointNote %}
+
+Or you can specify a full URL to another Prebid Server location (including a QA site) by setting `endpoint` to a URL-encoded string. e.g.
+```html
+
+
+
+```
+
+See [manually initiating a sync](/prebid-server/developers/pbs-cookie-sync.html#manually-initiating-a-sync) for more information about the available parameters.
### AMP RTC and GDPR
-The two Prebid Server RTC vendor strings 'prebidappnexus' and 'prebidrubicon'
+The two Prebid Server RTC vendor strings 'prebidappnexuspsp' and 'prebidrubicon'
support passing GDPR consent to Prebid Server.
The CONSENT_STRING macro will be populated if you've integrated with a CMP
that supports amp-consent v2 -- custom CMP integration.
-If you're using a custom RTC callout, you'll need to add `gdpr_consent=CONSENT_STRING` to the list of parameters.
+If you're using a custom RTC callout, here are the parameters that can be passed through the RTC string:
+- tag_id
+- w=ATTR(width)
+- h=ATTR(height)
+- ow=ATTR(data-override-width)
+- oh=ATTR(data-override-height)
+- ms=ATTR(data-multi-size)
+- slot=ATTR(data-slot)
+- targeting=TGT
+- curl=CANONICAL_URL
+- timeout=TIMEOUT
+- adc=ADCID
+- purl=HREF
+- gdpr_consent=CONSENT_STRING
+- consent_type=CONSENT_METADATA(consentStringType)
+- gdpr_applies=CONSENT_METADATA(gdprApplies)
+- attl_consent=CONSENT_METADATA(additionalConsent)
+
+See the entries in the [AMP vendors callout file](https://github.com/ampproject/amphtml/blob/main/src/service/real-time-config/callout-vendors.js).
## Debugging Tips
To review that Prebid on AMP is working properly the following aspects can be looked at:
@@ -302,3 +333,4 @@ To review that Prebid on AMP is working properly the following aspects can be lo
[PBS]: /prebid-server/overview/prebid-server-overview.html
[callout-vendors.js]: https://github.com/ampproject/amphtml/blob/master/src/service/real-time-config/callout-vendors.js
+[RTC-Overview]: https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-documentation.md
\ No newline at end of file
diff --git a/dev-docs/show-video-with-a-dfp-video-tag.md b/dev-docs/show-video-with-a-dfp-video-tag.md
index 929cffe49b..a2a724ccec 100644
--- a/dev-docs/show-video-with-a-dfp-video-tag.md
+++ b/dev-docs/show-video-with-a-dfp-video-tag.md
@@ -75,6 +75,8 @@ var videoAdUnit = {
};
```
+For full details on video ad unit parameters, see [Ad Unit Reference for Video]({{site.baseurl}}/dev-docs/adunit-reference.html#adunitmediatypesvideo)
+
### 2. Implement Custom Price Buckets
By default, Prebid.js caps all CPMs at $20. As a video seller, you may expect to see CPMs over $20. In order to receive those bids, you'll need to implement custom price buckets setting the [priceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity) object in the `setConfig` method.
diff --git a/dev-docs/troubleshooting-tips.md b/dev-docs/troubleshooting-tips.md
index 874e3d90e6..1b2375c9e1 100644
--- a/dev-docs/troubleshooting-tips.md
+++ b/dev-docs/troubleshooting-tips.md
@@ -3,12 +3,9 @@ layout: page_v2
title: Dev Tips
description: Troubleshooting tips for developers implementing Prebid.js Header Bidding.
pid: 0
-
-top_nav_section: dev_docs
nav_section: troubleshooting
redirect_from: "/dev-docs/toubleshooting-tips.html"
sidebarType: 1
-
---
@@ -16,221 +13,4 @@ sidebarType: 1
# Tips for Troubleshooting
{:.no_toc}
-This page has tips and tricks for troubleshooting issues with your Prebid.js integration.
-
-* TOC
-{:toc}
-
-## Turn on Prebid.js debug messages
-
-Add `pbjs_debug=true` to the end of your page's URL. For example: /pbjs_demo.html?pbjs_debug=true. This will add two types of messages to your browser's developer console:
-
-1. Prebid.js suppresses Javascript errors in the normal mode to not break the rest of your page. Adding the `pbjs_debug` parameter will expose the Javascript errors.
-2. You'll find additional debug messages. Filter the messages by string `MESSAGE:`. For example:
-
-
-
-![Prebid.js Debug Console]({{ site.github.url }}/assets/images/dev-docs/pbjs_debug-console-log.png){: .pb-sm-img :}
-
-
-
-{: .table .table-bordered .table-striped }
-| Message | Description |
-| :---- |:--------|
-| Calling bidder | When Prebid.js sends out bid requests, this message is logged |
-| Set key value for placement | After all the bids came back, or when timeout is reached, prebid.js will set keyword targeting for the defined ad units. |
-| Calling renderAd | If a header bidding bid wins the ad server's auction, prebid.js will render the winning bid's creative. |
-
-
-
-## Turn on your ad server's developer console
-
-The ad server's developer console usually provide information such as targeting, latency, and key events logging. For example, here is a screenshot of Google Ad Manager's GPT developer console logs:
-
-
-
-![Prebid.js Debug Console]({{ site.github.url }}/assets/images/dev-docs/googfc.png){: .pb-md-img :}
-
-
-
-## See all bids in the console
-
-To print information about all of the bids that come in to the Console on any page that is running Prebid.js, follow these steps.
-
-Open the Chrome Dev Tools. In the **Sources** tab, next to **Content Scripts**, click the **>>** button and you can add **Snippets**:
-
-![View Snippets in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/01-view-snippets.png){: .pb-sm-img :}
-
-
-
-Right-click to add a **New** snippet:
-
-![Add New Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/02-add-new-snippet.png){: .pb-sm-img :}
-
-
-
-Paste in the following code using Control-V (or Command-V on Mac), and give the snippet a name, such as 'show-all-bids':
-
-```javascript
-(function() {
- function forEach(responses, cb) {
- Object.keys(responses).forEach(function(adUnitCode) {
- var response = responses[adUnitCode];
- response.bids.forEach(function(bid) {
- cb(adUnitCode, bid);
- });
- });
- }
- var winners = pbjs.getAllWinningBids();
- var output = [];
- forEach(pbjs.getBidResponses(), function(code, bid) {
- output.push({
- bid: bid,
- adunit: code,
- adId: bid.adId,
- bidder: bid.bidder,
- time: bid.timeToRespond,
- cpm: bid.cpm,
- msg: bid.statusMessage,
- rendered: !!winners.find(function(winner) {
- return winner.adId==bid.adId;
- })
- });
- });
- forEach(pbjs.getNoBids && pbjs.getNoBids() || {}, function(code, bid) {
- output.push({
- msg: "no bid",
- adunit: code,
- adId: bid.bidId,
- bidder: bid.bidder
- });
- });
- if (output.length) {
- if (console.table) {
- console.table(output);
- } else {
- for (var j = 0; j < output.length; j++) {
- console.log(output[j]);
- }
- }
- } else {
- console.warn('NO prebid responses');
- }
-})();
-```
-
-
-
-Right-click the snippet and choose **Run**:
-
-![Run a Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/03-run-snippet.png){: .pb-sm-img :}
-
-
-
-Check the output in Console to see the bids:
-
-![See Snippet Output in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/04-snippet-output.png){: .pb-sm-img :}
-
-## See all winning bids in the console
-
-To print information about all of the winning bids that come in to the Console on any page that is running Prebid.js, follow these steps.
-
-Open the Chrome Dev Tools. In the **Sources** tab, next to **Content Scripts**, click the **>>** button and you can add **Snippets**:
-
-![View Snippets in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/01-view-snippets.png){: .pb-sm-img :}
-
-
-
-Right-click to add a **New** snippet:
-
-![Add New Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/02-add-new-snippet.png){: .pb-sm-img :}
-
-
-
-Paste in the following code using Control-V (or Command-V on Mac), and give the snippet a name, such as 'show-all-winning-bids':
-
-```javascript
-var bids = pbjs.getAllWinningBids();
-var output = [];
-for (var i = 0; i < bids.length; i++) {
- var b = bids[i];
- output.push({
- 'adunit': b.adUnitCode, 'adId': b.adId, 'bidder': b.bidder,
- 'time': b.timeToRespond, 'cpm': b.cpm
- });
-}
-if (output.length) {
- if (console.table) {
- console.table(output);
- } else {
- for (var j = 0; j < output.length; j++) {
- console.log(output[j]);
- }
- }
-} else {
- console.warn('No prebid winners');
-}
-```
-
-
-
-Right-click the snippet and choose **Run**:
-
-![Run a Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/03-run-snippet.png){: .pb-sm-img :}
-
-
-
-Check the output in Console to see the bids (note that this screenshot shows the output from "see all bids" but they're very similar):
-
-![See Snippet Output in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/04-snippet-output.png){: .pb-sm-img :}
-
-## Modify bid responses for testing
-
-Using `pbjs.setConfig({debugging:{ ... }})` from the javascript console, it is possible to override and filter bids as they come in.
-When this type of debugging is enabled it will persist across page loads using `sessionStorage`. This allows
-for easy testing of pages that immediately start auctions (most pages), but also means you need to remember
-to deactivate debugging when you are done (or clear your local storage / use incognito mode when testing).
-
-```
-// Filtering bidders
-javascript console> pbjs.setConfig({
- debugging: {
- enabled: true, // suppresses bids from other bidders
- bidders: ['bidderA', 'bidderB']
- }
-});
-
-// Overwriting bid responses for all bidders
-javascript console> pbjs.setConfig({
- debugging: {
- enabled: true,
- bids: [{
- cpm: 1.5
- }]
- }
-});
-
-// Overwriting bid responses for a specific bidder and adUnit code (can use either separately)
-javascript console> pbjs.setConfig({
- debugging: {
- enabled: true,
- bids: [{
- bidder: 'bidderA',
- adUnitCode: '/19968336/header-bid-tag-0',
- cpm: 1.5
- }]
- }
-});
-
-// Disabling debugging
-javascript console> pbjs.setConfig({
- debugging: {
- enabled: false
- }
-});
-```
-
-## Related Reading
-
-+ [Prebid.js FAQ](/dev-docs/faq.html)
-+ [Prebid.js Common Issues](/dev-docs/common-issues.html)
+Moved to [the PBJS Troubleshooting Guide](/troubleshooting/troubleshooting-guide.html).
diff --git a/dev-docs/vendor-billing.md b/dev-docs/vendor-billing.md
new file mode 100644
index 0000000000..9dc0bf9f7a
--- /dev/null
+++ b/dev-docs/vendor-billing.md
@@ -0,0 +1,55 @@
+---
+layout: page_v2
+title: Vendor Billing in Prebid.js
+description: Documentation on how to add Vendor Billing in Prebid.js
+sidebarType: 1
+---
+
+# Vendor Billing in Prebid.js
+{:.no_toc}
+
+Prebid.js now supports a new event type: **Billable Event**. Billable events allow **Real Time Data (RTD)** modules to signal that their system calculated that a billing event occurred. Billable events are trackable by analytics adapters as well as publishers to track and aggregate billing data.
+
+## Emitting Events
+
+In order to emit events, **RTD** modules simply need to utilize the existing Events system already integrated into Prebid.js. A new event, **BILLABLE_EVENT**, is registered inside the constants.json file for usage.
+
+At this time there are limited requirements about the contents of billable events. However, it should be expected that partners who choose to leverage billable events may have unique requirements or implementations that will be documented individually, including adding additional parameters to the events as they see fit.
+
+**Event Payload Parameters**
+
+There are two parameters that emitters of this event must supply. Other parameters may be supplied as desired by the application.
+
+{: .table .table-bordered .table-striped }
+| **Required Parameter** | **Type** | **Definition** |
+|----------------+-----------+-----------------|
+| vendor | string | Contains the unique name of the vendor, and will be used to identify which vendor triggered a given event. |
+| billingId | UUID | A unique UUID associated with a given billing event. Generated by the vendor. |
+
+For example, a RTD module could emit an event like this:
+
+```
+ events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, {
+ vendor: 'vendorA',
+ billingId: generateUUID(),
+ type: 'ad_request',
+ transactionId: transactionId,
+ auctionId: auctionId
+ })
+
+It is expected that vendors will not emit duplicate events.
+
+## Analytics Adapter Interface
+
+[Analytics Adapters](/dev-docs/integrate-with-the-prebid-analytics-api.html) just listen for the **BILLABLE_EVENT**. It is assumed that analytics adapters and their downstream reporting handles their own tracking of events any validation of the contract between vendors and publishers.
+```
+ switch (eventType) {
+ ...
+ case BILLABLE_EVENT:
+ ...
+```
+
+## Related Reading
+- [pbjs.getEvents()](/dev-docs/publisher-api-reference/getEvents.html)
+- [Real Time Data modules](/dev-docs/add-rtd-submodule.html)
+- [Analytics Adapters](/dev-docs/integrate-with-the-prebid-analytics-api.html)
diff --git a/download.md b/download.md
index faeadbae78..86d097300a 100644
--- a/download.md
+++ b/download.md
@@ -5,6 +5,33 @@ description: Documentation on how to download Prebid.js for header bidding.
sidebarType: 0
---
+
+
-
- To control Publisher Common ID settings click here.
-
-
diff --git a/examples/legacy/multi-format/index.md b/examples/legacy/multi-format/index.md
deleted file mode 100644
index 151d4f2591..0000000000
--- a/examples/legacy/multi-format/index.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: page_v2
-title: Prebid Multi-Format Examples
-description: This section provides examples of multi-format ads with Prebid.js.
-sidebarType:
----
-
-# {{page.title}}
-
-{{page.description}}
-
- - [Mulit-Format Example]({{site.baseurl}}/examples/multi-format/multi_format_example.html)
diff --git a/examples/legacy/multi-format/multi_format_example.html b/examples/legacy/multi-format/multi_format_example.html
deleted file mode 100644
index 5238614a28..0000000000
--- a/examples/legacy/multi-format/multi_format_example.html
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -42,16 +42,16 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
- To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//acdn.adnxs.com/prebid/not-for-prod/prebid.js`.
+ To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js`.
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -28,16 +28,16 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
- To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//acdn.adnxs.com/prebid/not-for-prod/prebid.js`.
+ To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js`.
-
-
Place this code in the page header.
-
+
Place this code in the page header.
+
+
<script type="text/javascript">
var options = {
@@ -46,12 +46,12 @@
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
- To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//acdn.adnxs.com/prebid/not-for-prod/prebid.js`.
+ To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js`.
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -33,16 +33,16 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
- To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//acdn.adnxs.com/prebid/not-for-prod/prebid.js`.
+ To allow the Cross-Player plugin to load your custom build of Prebid.js ensure that the option key `prebidPath` is set to the custom build's location. If `prebidPath` is not set, the plugin will point to `//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js`.
-
-
Place this code in the page header.
-
+
Place this code in the page header.
+
+
<!-- use recent version of videojs to ensure proper functioning with the iOS devices -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/video.js/6.4.0/video-js.css">
@@ -58,12 +58,12 @@
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -28,95 +28,91 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
Place this code in the page header.
-
-
+
Place this code in the page header.
+
+
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<script type="text/javascript" src="https://static.adplayer.pro/player/demo.js"></script>
<script>
- var pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
-
- // define invokeVideoPlayer in advance in case we get the bids back from prebid before the entire page loads
- var tempTag = false;
- var invokeVideoPlayer = function(url) {
- tempTag = url;
- }
-
- var videoAdUnit = {
- code: 'video1',
- mediaTypes: {
- video: {
+ var pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+
+ // define invokeVideoPlayer in advance in case we get the bids back from prebid before the entire page loads
+ var tempTag = false;
+ var invokeVideoPlayer = function(url) {
+ tempTag = url;
+ }
+
+ var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
context: 'instream',
playerSize: [640, 480],
mimes: ['video/mp4'],
protocols: [1, 2, 3, 4, 5, 6, 7, 8],
playbackmethod: [2],
skip: 1
- }
- },
- bids: [{
- bidder: 'appnexus',
- params: {
- placementId: 13232361 // Add your own placement id here
- }
- }]
- };
-
- pbjs.que.push(function() {
- pbjs.addAdUnits(videoAdUnit); // add your ad units to the bid request
- pbjs.setConfig({
- debug: true,
- cache: {
- url: 'https://prebid.adnxs.com/pbc/v1/cache'
- }
- });
-
- pbjs.requestBids({
- bidsBackHandler: function(bids) {
- var videoUrl = pbjs.adServers.dfp.buildVideoUrl({
- adUnit: videoAdUnit,
- params: {
- iu: '/19968336/prebid_cache_video_adunit',
- cust_params: {
- section: 'blog',
- anotherKey: 'anotherValue'
- },
- output: 'vast'
- }
- });
- invokeVideoPlayer(videoUrl);
- }
- });
- });
-
-</script>
-
+ }
+ },
+ bids: [{
+ bidder: 'appnexus',
+ params: {
+ placementId: 13232361 // Add your own placement id here
+ }
+ }]
+ };
-
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production
use. It includes all available adapters. Production implementations should build from source or
@@ -31,91 +31,91 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
As an alternative an adUnit can be passed within the built-int prebid plugin for AMP. The prebid bid request will be handled by prebid plugin automatically just before the ad request takes place.
The plugin can be implemented by providing a prebid object to the player config as follows
-
+
-
+
-
diff --git a/examples/video/instream/flowplayer/pb-ve-flowplayer.html b/examples/video/instream/flowplayer/pb-ve-flowplayer.html
index e5744635ba..a7d4dd1774 100644
--- a/examples/video/instream/flowplayer/pb-ve-flowplayer.html
+++ b/examples/video/instream/flowplayer/pb-ve-flowplayer.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Instream Example with Flowplayer
-description: An example of an instream pre-roll ad using Prebid.js and Flowplayer.
+title: Prebid Video | Instream Example with Flowplayer
+description: An example of an instream pre-roll ad using Prebid.js and Flowplayer.
videoType: pb-is-fp
isVideo: true
sidebarType: 4
@@ -15,47 +15,37 @@
{{ page.title }}
{{page.description }}
-
+
-
-
Important:
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
-
+
-
-
-
The button will be enabled only during ads
-
-
-
-
+
-
+
-
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
float: left;
}
- #controls {
- float: left;
- padding: 1em;
- }
</style>
<script>
var pbjs = pbjs || {};
pbjs.que = pbjs.que || [];
+ const BIDDER1_PROVIDER = 'appnexus';
+ const BIDDER1_PLACEMENT_ID = '13232361';
+
// The ad tag in Flowplayer can be actual ad tag or promise to an ad tag.
// We return the ad tag if it is available before the player is ready to play
// Otherwise the player waits for 2 secs for tag to be available.
var adtag = null
var timeout = 2000
- var asyncTag = function() {
+ window.prebid_fetcher = function() {
if (adtag) return Promise.resolve(adtag)
return new Promise(function (resolve) {
@@ -107,9 +96,9 @@
Place this code in the page header.
},
bids: [
{
- bidder: 'appnexus',
+ bidder: BIDDER1_PROVIDER,
params: {
- placementId: '13232361' // Add your own placement id here
+ placementId: BIDDER1_PLACEMENT_ID
}
}
]
@@ -142,16 +131,15 @@
Place this code in the page header.
}
});
});
-
-</script>
-
+</script>
+
-
-
-
-
Place this code in the page body.
-
+
+
Place this code in the page body.
+
+
+
<div id="player"></div>
<!--video player div-->
@@ -162,76 +150,44 @@
Place this code in the page body.
</button>
<p>The button will be enabled only during ads</p>
</div>
-
+
<script type="text/javascript">
var player = flowplayer('#player', {
src: "//edge.flowplayer.org/drive.mp4",
title: "Flowplayer demo",
description: "Demo showing ads",
- autoplay: true,
ima: {
- ads: [
- {"time":0,"adTag":asyncTag}
+ ads: [{
+ time: 0, // preroll
+ adTag: 'flowplayer://prebid_fetcher' // this will try to call window.prebid_fetcher
]
},
token:"eyJraWQiOiJZSVI0VVJZODA2TGoiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjIjoie1wiYWNsXCI6NixcImlkXCI6XCJZSVI0VVJZODA2TGpcIn0iLCJpc3MiOiJGbG93cGxheWVyIn0.YUoY8b2vl1Z15PikwgYeWQ8Cp85C-TvtmwIJ_UFxpfAYYH8yiiUrhmd3SaY_qb3AvVDz45xVV6R9wizYl-NRGQ"
})
-
- var btn = document.querySelector('#ad-toggle');
-
- btn.addEventListener('click', function() {
- if (player.ads.adPlaying) player.ads.pause();
- else player.ads.resume();
- })
-
- function toggleDisabled(disabled) {
- return function() { btn.disabled = disabled }
- }
-
- player.ads.on(flowplayer.AdEvents.AD_STARTED, toggleDisabled(false));
- player.ads.on(flowplayer.AdEvents.AD_COMPLETED, toggleDisabled(true));
- player.ads.on(flowplayer.AdEvents.AD_SKIPPED, toggleDisabled(true));
-</script>
-
-
+</script>
+
-
-
+
-
+
-
diff --git a/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html b/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html
index 350fdfea7d..b880a48e04 100644
--- a/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html
+++ b/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Instream Example with JW Player (Self-Hosted)
-description: An example of an instream pre-roll ad using Prebid.js and JW Player (Hosted).
+title: Prebid Video | Instream Example with JW Player (Self-Hosted)
+description: An example of an instream pre-roll ad using Prebid.js and JW Player (Hosted).
videoType: pb-is-jw02
isVideo: true
sidebarType: 4
@@ -15,144 +15,141 @@
{{ page.title }}
{{page.description }}
-
+
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
-
Place this code in the page header.
-
+
Place this code in the page header.
+
+
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<script type="text/javascript" src="https://ssl.p.jwpcdn.com/player/v/7.2.4/jwplayer.js"></script>
<script type="text/javascript">
- jwplayer.key = "YOUR_JW_PLAYER_KEY"; //Test Key - replace this with your own valid JWPlayer license key
+ jwplayer.key = "YOUR_JW_PLAYER_KEY"; //Test Key - replace this with your own valid JWPlayer license key
</script>
<script>
- var pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
-
- // define invokeVideoPlayer in advance in case we get the bids back from prebid before the entire page loads
- var tempTag = false;
- var invokeVideoPlayer = function(url) {
- tempTag = url;
- }
-
- var videoAdUnit = {
- code: 'video1',
- mediaTypes: {
- video: {
+ var pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+
+ // define invokeVideoPlayer in advance in case we get the bids back from prebid before the entire page loads
+ var tempTag = false;
+ var invokeVideoPlayer = function(url) {
+ tempTag = url;
+ }
+
+ var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
context: 'instream',
playerSize: [640, 480],
mimes: ['video/mp4'],
protocols: [1, 2, 3, 4, 5, 6, 7, 8],
playbackmethod: [2],
skip: 1
- }
- },
- bids: [{
- bidder: 'appnexus',
- params: {
- placementId: 13232361 // Add your own placement id here
- }
- }]
- };
-
- pbjs.que.push(function() {
- pbjs.addAdUnits(videoAdUnit); // add your ad units to the bid request
- pbjs.setConfig({
- debug: true,
- cache: {
- url: 'https://prebid.adnxs.com/pbc/v1/cache'
- }
- });
-
- pbjs.requestBids({
- bidsBackHandler: function(bids) {
- var videoUrl = pbjs.adServers.dfp.buildVideoUrl({
- adUnit: videoAdUnit,
- params: {
- iu: '/19968336/prebid_cache_video_adunit',
- cust_params: {
- section: 'blog',
- anotherKey: 'anotherValue'
- },
- output: 'vast'
- }
- });
- invokeVideoPlayer(videoUrl);
- }
- });
- });
-
-</script>
-
+ }
+ },
+ bids: [{
+ bidder: 'appnexus',
+ params: {
+ placementId: 13232361 // Add your own placement id here
+ }
+ }]
+ };
-
-
+
-
+
-
diff --git a/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html b/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html
index 3370763d1f..e2116360fb 100644
--- a/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html
+++ b/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Instream Example with JW Player (Platform)
-description: An example of an instream pre-roll ad using Prebid.js and JW Player (Platform).
+title: Prebid Video | Instream Example with JW Player (Platform)
+description: An example of an instream pre-roll ad using Prebid.js and JW Player (Platform).
videoType: pb-is-jw01
isVideo: true
sidebarType: 4
@@ -15,31 +15,31 @@
{{ page.title }}
{{page.description }}
-
+
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
-
Place this code in the page header.
-
+
+
Place this code in the page header.
+
+
<!--Prebid.js and video player code-->
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<script>
var pbjs = pbjs || {};
pbjs.que = pbjs.que || [];
@@ -71,8 +71,8 @@
Place this code in the page header.
};
pbjs.que.push(function() {
- //put your adunits here
- pbjs.addAdUnits(videoAdUnit);
+ //put your adunits here
+ pbjs.addAdUnits(videoAdUnit);
pbjs.setConfig({
debug: true,
@@ -100,14 +100,13 @@
Place this code in the page header.
});
</script>
-
-
+
-
-
-
-
Place this code in the page body.
-
+
+
Place this code in the page body.
+
+
+
<div id="myElement1"></div>
@@ -140,14 +139,13 @@
Place this code in the page body.
tempTag = false;
}
-</script>
+</script>
-
+
-
-
+
@@ -179,8 +177,7 @@
Place this code in the page body.
tempTag = false;
}
-
+
+
-
-
diff --git a/examples/video/instream/ooyala/pb-ve-ooyala.html b/examples/video/instream/ooyala/pb-ve-ooyala.html
index efa39ea99d..605ed7fe46 100644
--- a/examples/video/instream/ooyala/pb-ve-ooyala.html
+++ b/examples/video/instream/ooyala/pb-ve-ooyala.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Instream Example with Ooyala player
-description: An example of an instream pre-roll ad using Prebid.js and Ooyala player .
+title: Prebid Video | Instream Example with Ooyala player
+description: An example of an instream pre-roll ad using Prebid.js and Ooyala player .
videoType: pb-is-ol
isVideo: true
sidebarType: 4
@@ -15,31 +15,29 @@
{{ page.title }}
{{page.description }}
-
+
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
-
Place this code in the page header.
-
-
-
+
+
Place this code in the page header.
+
+
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<!-- LOAD OOYALA PLUGINS
Load the Ooyala player scripts you plan to use.
@@ -98,18 +96,18 @@
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -26,168 +26,165 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
Place this code in the page header.
-
-
-
+
Place this code in the page header.
+
+
<!--production version of prebid.js-->
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<!-- Radiant Media Player core library - debug browser console mode (use rmp.min.js for production) -->
<script src="https://cdn.radiantmediatechs.com/rmp/5.5.6/js/rmp.debug.js"></script>
-
-
+
+
-
-
-
Place this code in the page body.
-
+
Place this code in the page body.
+
+
+
<script>
- /* our app where we run player
- our app variables */
- var pbApp = {};
- pbApp.playerSetup = false;
- pbApp.prebidTempTag = false;
- pbApp.debug = true;
- /* in case pre-bidding takes too long or fails we provide a playerSetupTimeout and fallbackAdTagUrl
- to insure player setup happens - this is optional */
- pbApp.playerSetupTimeout = 5000;
- pbApp.fallbackAdTagUrl = 'https://www.radiantmediaplayer.com/vast/tags/inline-linear-1.xml';
- /* no console - no logs */
- if (typeof window.console === 'undefined' || typeof window.console.log === 'undefined' || typeof window.console.dir === 'undefined') {
- pbApp.debug = false;
- }
-
- /* invokeVideoPlayer may not be defined when bidsBackHandler runs
- we pre-defined it here so as to capture the returned adTagUrl to be passed to the player */
- pbApp.invokeVideoPlayer = function (adTagUrl) {
- pbApp.prebidTempTag = adTagUrl;
- };
-
- /* prebid.js variables */
- var pbjs;
- pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
-
- /* Prebid video ad unit
- This is a working example but you must use your own settings/bidders for production
- More docs at https://prebid.org/prebid-video/video-overview.html */
- var videoAdUnit = {
- code: 'video1',
- mediaTypes: {
- video: {
- context: 'instream',
- playerSize: [640, 480],
- mimes: ['video/mp4'],
- protocols: [1, 2, 3, 4, 5, 6, 7, 8],
- playbackmethod: [2],
- skip: 1
- }
- },
- bids: [{
- bidder: 'appnexus',
- params: {
- placementId: 13232361
- }
- }]
- };
-
- pbjs.que.push(function () {
- pbjs.addAdUnits(videoAdUnit);
-
- pbjs.setConfig({
- debug: true,
- cache: {
- url: 'https://prebid.adnxs.com/pbc/v1/cache'
- }
- });
-
- pbjs.requestBids({
- bidsBackHandler: function (bids) {
- if (pbApp.debug) {
- window.console.dir(bids);
- }
- var videoUrl = pbjs.adServers.dfp.buildVideoUrl({
- adUnit: videoAdUnit,
- params: {
- iu: '/19968336/prebid_cache_video_adunit',
- cust_params: {
- section: 'blog',
- anotherKey: 'anotherValue'
- },
- output: 'vast'
- }
- });
- pbApp.invokeVideoPlayer(videoUrl);
- }
- });
- });
-
- /* here we re-define invokeVideoPlayer with Radiant Media Player set-up */
- pbApp.invokeVideoPlayer = function (adTagUrl) {
- if (pbApp.playerSetup) {
- return;
- }
- pbApp.playerSetup = true;
- if (pbApp.debug) {
- window.console.log('invokeVideoPlayer with Prebid VAST url = ' + adTagUrl);
- }
- var src = {
- mp4: [
- 'https://www.rmp-streaming.com/media/bbb-360p.mp4'
- ]
- };
- var settings = {
- licenseKey: 'Kl8lZ292K3N6MmVvZD9yb201ZGFzaXMzMGRiMEElXyo=',
- src: src,
- width: 640,
- height: 360,
- /*we enabled ads for our player
- note that we requested a winning bid for skippable auto_play_sound_off so player starts muted autoplay*/
- ads: true,
- autoplay: true,
- muted: true,
- // we use Google IMA in this demo, but you can use rmp-vast as well depending on your requirements
- adParser: 'ima',
- // since we may request a skippable ads we set adDisableCustomPlaybackForIOS10Plus: true to allow rendering of skippable ads on iOS
- adDisableCustomPlaybackForIOS10Plus: true,
- // here is our winner VAST adTagUrl
- adTagUrl: adTagUrl,
- poster: 'https://www.radiantmediaplayer.com/images/poster-rmp-showcase.jpg'
- };
- var elementID = 'rmpPlayer';
- var rmp = new RadiantMP(elementID);
- rmp.init(settings);
-
- };
-
- /* in case we already have a winning bid let's use the returned adTagUrl to run player */
- if (pbApp.prebidTempTag) {
- pbApp.invokeVideoPlayer(pbApp.prebidTempTag);
- pbApp.prebidTempTag = false;
- }
-
- /* in case something went wrong (latency, network errors, bid issues ...) and we have no winning bid we still need to run the player
- this is done after pbApp.playerSetupTimeout ms and we use fallbackAdTagUrl as adTagUrl to pass to the player */
- setTimeout(function () {
- if (pbApp.playerSetup) {
- return;
- }
- pbApp.invokeVideoPlayer(pbApp.fallbackAdTagUrl);
- }, pbApp.playerSetupTimeout);
- </script>
-
-
-
+ /* our app where we run player
+ our app variables */
+ var pbApp = {};
+ pbApp.playerSetup = false;
+ pbApp.prebidTempTag = false;
+ pbApp.debug = true;
+ /* in case pre-bidding takes too long or fails we provide a playerSetupTimeout and fallbackAdTagUrl
+ to insure player setup happens - this is optional */
+ pbApp.playerSetupTimeout = 5000;
+ pbApp.fallbackAdTagUrl = 'https://www.radiantmediaplayer.com/vast/tags/inline-linear-1.xml';
+ /* no console - no logs */
+ if (typeof window.console === 'undefined' || typeof window.console.log === 'undefined' || typeof window.console.dir === 'undefined') {
+ pbApp.debug = false;
+ }
+
+ /* invokeVideoPlayer may not be defined when bidsBackHandler runs
+ we pre-defined it here so as to capture the returned adTagUrl to be passed to the player */
+ pbApp.invokeVideoPlayer = function (adTagUrl) {
+ pbApp.prebidTempTag = adTagUrl;
+ };
+
+ /* prebid.js variables */
+ var pbjs;
+ pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+
+ /* Prebid video ad unit
+ This is a working example but you must use your own settings/bidders for production
+ More docs at https://prebid.org/prebid-video/video-overview.html */
+ var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
+ playbackmethod: [2],
+ skip: 1
+ }
+ },
+ bids: [{
+ bidder: 'appnexus',
+ params: {
+ placementId: 13232361
+ }
+ }]
+ };
+
+ pbjs.que.push(function () {
+ pbjs.addAdUnits(videoAdUnit);
+
+ pbjs.setConfig({
+ debug: true,
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ }
+ });
+
+ pbjs.requestBids({
+ bidsBackHandler: function (bids) {
+ if (pbApp.debug) {
+ window.console.dir(bids);
+ }
+ var videoUrl = pbjs.adServers.dfp.buildVideoUrl({
+ adUnit: videoAdUnit,
+ params: {
+ iu: '/19968336/prebid_cache_video_adunit',
+ cust_params: {
+ section: 'blog',
+ anotherKey: 'anotherValue'
+ },
+ output: 'vast'
+ }
+ });
+ pbApp.invokeVideoPlayer(videoUrl);
+ }
+ });
+ });
+
+ /* here we re-define invokeVideoPlayer with Radiant Media Player set-up */
+ pbApp.invokeVideoPlayer = function (adTagUrl) {
+ if (pbApp.playerSetup) {
+ return;
+ }
+ pbApp.playerSetup = true;
+ if (pbApp.debug) {
+ window.console.log('invokeVideoPlayer with Prebid VAST url = ' + adTagUrl);
+ }
+ var src = {
+ mp4: [
+ 'https://www.rmp-streaming.com/media/bbb-360p.mp4'
+ ]
+ };
+ var settings = {
+ licenseKey: 'Kl8lZ292K3N6MmVvZD9yb201ZGFzaXMzMGRiMEElXyo=',
+ src: src,
+ width: 640,
+ height: 360,
+ /*we enabled ads for our player
+ note that we requested a winning bid for skippable auto_play_sound_off so player starts muted autoplay*/
+ ads: true,
+ autoplay: true,
+ muted: true,
+ // we use Google IMA in this demo, but you can use rmp-vast as well depending on your requirements
+ adParser: 'ima',
+ // since we may request a skippable ads we set adDisableCustomPlaybackForIOS10Plus: true to allow rendering of skippable ads on iOS
+ adDisableCustomPlaybackForIOS10Plus: true,
+ // here is our winner VAST adTagUrl
+ adTagUrl: adTagUrl,
+ poster: 'https://www.radiantmediaplayer.com/images/poster-rmp-showcase.jpg'
+ };
+ var elementID = 'rmpPlayer';
+ var rmp = new RadiantMP(elementID);
+ rmp.init(settings);
+
+ };
+
+ /* in case we already have a winning bid let's use the returned adTagUrl to run player */
+ if (pbApp.prebidTempTag) {
+ pbApp.invokeVideoPlayer(pbApp.prebidTempTag);
+ pbApp.prebidTempTag = false;
+ }
+
+ /* in case something went wrong (latency, network errors, bid issues ...) and we have no winning bid we still need to run the player
+ this is done after pbApp.playerSetupTimeout ms and we use fallbackAdTagUrl as adTagUrl to pass to the player */
+ setTimeout(function () {
+ if (pbApp.playerSetup) {
+ return;
+ }
+ pbApp.invokeVideoPlayer(pbApp.fallbackAdTagUrl);
+ }, pbApp.playerSetupTimeout);
+ </script>
+
+
diff --git a/examples/video/instream/videojs/pb-ve-videojs.html b/examples/video/instream/videojs/pb-ve-videojs.html
index 4a5f96e4ac..c99dc1785e 100644
--- a/examples/video/instream/videojs/pb-ve-videojs.html
+++ b/examples/video/instream/videojs/pb-ve-videojs.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Instream Example with VideoJS
-description: An example of an instream pre-roll ad using Prebid.js and VideoJS.
+title: Prebid Video | Instream Example with VideoJS
+description: An example of an instream pre-roll ad using Prebid.js and VideoJS.
videoType: pb-is-vjs
isVideo: true
sidebarType: 4
@@ -15,34 +15,35 @@
{{ page.title }}
{{page.description }}
-
+
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
-
+
+
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
-
Place this code in the page header.
-
+
+
Place this code in the page header.
+
+
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<!-- use recent version of videojs to ensure proper functioning with the iOS devices -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/video.js/6.4.0/video-js.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/video.js/6.4.0/video.js"></script>
@@ -105,26 +106,23 @@
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
+
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
@@ -38,99 +38,97 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
@@ -38,7 +38,7 @@
{{ page.title }}
-
+
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
@@ -47,14 +47,14 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
<div id='video1'>
<p>Prebid Outstream Video Ad</p>
@@ -139,9 +138,8 @@
Place this code in the page body.
</script>
</div>
-
-
-
+
+
diff --git a/examples/video/outstream/pb-ve-outstream-no-server-specify-renderer.html b/examples/video/outstream/pb-ve-outstream-no-server-specify-renderer.html
new file mode 100644
index 0000000000..ab09e8518f
--- /dev/null
+++ b/examples/video/outstream/pb-ve-outstream-no-server-specify-renderer.html
@@ -0,0 +1,145 @@
+---
+layout: video_sample
+title: Prebid Video | Video Outstream Example with No Ad Server using Specified Renderer
+description: An example of an outstream video ad using Prebid.js and no ad server but with a specified renderer.
+videoType: pb-os-nas-renderer
+isVideo: true
+sidebarType: 4
+---
+
+
+
+
+
+
+
{{ page.title }}
+
{{page.description }}
+
+
+
+
+
Important:
+ This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
+
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Prebid Outstream Video Ad
+
+
+
+
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
+
+
+
+
+
+
Warning:
+ Do not forget to exchange the placementId in the code examples with your own placementId!
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
@@ -33,7 +33,7 @@
{{ page.title }}
Prebid Outstream Video Ad
-
+
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
@@ -44,14 +44,14 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
+
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
@@ -40,102 +40,100 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
<script>
- /* our app where we run player
+ /* our app where we run player
our app variables */
- var pbjs;
- pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
- var debug = false;
- if (typeof window.console === 'undefined' || typeof window.console.log === 'undefined' || typeof window.console.dir === 'undefined') {
- debug = false;
- }
- var videoId = 'video1';
-
- /* Prebid video ad unit
- This is a working example but you must use your own settings/bidders for production
- More docs at https://prebid.org/prebid-video/video-overview.html */
- var adUnits = [{
- code: videoId,
- mediaTypes: {
- video: {
- context: 'outstream',
+ var pbjs;
+ pbjs = pbjs || {};
+ pbjs.que = pbjs.que || [];
+ var debug = false;
+ if (typeof window.console === 'undefined' || typeof window.console.log === 'undefined' || typeof window.console.dir === 'undefined') {
+ debug = false;
+ }
+ var videoId = 'video1';
+
+ /* Prebid video ad unit
+ This is a working example but you must use your own settings/bidders for production
+ More docs at https://prebid.org/prebid-video/video-overview.html */
+ var adUnits = [{
+ code: videoId,
+ mediaTypes: {
+ video: {
+ context: 'outstream',
playerSize: [640, 480],
mimes: ['video/mp4'],
protocols: [1, 2, 3, 4, 5, 6, 7, 8],
playbackmethod: [2],
skip: 1
- }
- },
- bids: [{
- bidder: 'appnexus',
- params: {
- placementId: 13232385
- }
- }]
- }];
-
- pbjs.que.push(function () {
- pbjs.addAdUnits(adUnits);
- pbjs.requestBids({
- timeout: 1000,
- bidsBackHandler: function (bids) {
- if (debug) {
- window.console.dir(bids);
- }
- // we get the VAST XML from bids adResponse and pass it to our outstream player
- if (bids && bids[videoId] && bids[videoId].bids && bids[videoId].bids[0] && bids[videoId].bids[0].adResponse) {
- var adResponse = bids[videoId].bids[0].adResponse;
- if (adResponse.ad && adResponse.ad.video && typeof adResponse.ad.video.content === 'string') {
- var vastXml = bids[videoId].bids[0].adResponse.ad.video.content;
- if (vastXml !== '') {
- if (debug) {
- window.console.log(vastXml);
- }
- var settings = {
- licenseKey: 'Kl8lZ292K3N6MmVvZD9yb201ZGFzaXMzMGRiMEElXyo=',
- width: 640,
- height: 360,
- autoplay: true,
- adOutStreamMutedAutoplay: true,
- ads: true,
- adsResponse: vastXml,
- adOutStream: true,
- skin: 'outstream'
- };
- var elementID = 'rmpPlayer';
- var rmp = new RadiantMP(elementID);
- rmp.init(settings);
- }
- }
- }
- }
- });
- });
+ }
+ },
+ bids: [{
+ bidder: 'appnexus',
+ params: {
+ placementId: 13232385
+ }
+ }]
+ }];
+
+ pbjs.que.push(function () {
+ pbjs.addAdUnits(adUnits);
+ pbjs.requestBids({
+ timeout: 1000,
+ bidsBackHandler: function (bids) {
+ if (debug) {
+ window.console.dir(bids);
+ }
+ // we get the VAST XML from bids adResponse and pass it to our outstream player
+ if (bids && bids[videoId] && bids[videoId].bids && bids[videoId].bids[0] && bids[videoId].bids[0].adResponse) {
+ var adResponse = bids[videoId].bids[0].adResponse;
+ if (adResponse.ad && adResponse.ad.video && typeof adResponse.ad.video.content === 'string') {
+ var vastXml = bids[videoId].bids[0].adResponse.ad.video.content;
+ if (vastXml !== '') {
+ if (debug) {
+ window.console.log(vastXml);
+ }
+ var settings = {
+ licenseKey: 'Kl8lZ292K3N6MmVvZD9yb201ZGFzaXMzMGRiMEElXyo=',
+ width: 640,
+ height: 360,
+ autoplay: true,
+ adOutStreamMutedAutoplay: true,
+ ads: true,
+ adsResponse: vastXml,
+ adOutStream: true,
+ skin: 'outstream'
+ };
+ var elementID = 'rmpPlayer';
+ var rmp = new RadiantMP(elementID);
+ rmp.init(settings);
+ }
+ }
+ }
+ }
+ });
+ });
</script>
-
-
-
+
+
diff --git a/examples/video/pb-video-template.html b/examples/video/pb-video-template.html
index 1d1f9e5ef8..c5c74be35f 100644
--- a/examples/video/pb-video-template.html
+++ b/examples/video/pb-video-template.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Video Outstream Example with Google Ad Manager
-description: An example of an outstream video with a pre-roll ad using Prebid.js and Google Ad Manager.
+title: Prebid Video | Video Outstream Example with Google Ad Manager
+description: An example of an outstream video with a pre-roll ad using Prebid.js and Google Ad Manager.
videoType: pb-os-dfp
isVideo: true
sidebarType: 4
@@ -13,27 +13,27 @@
{{ page.title }}
{{page.description }}
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
{{page.title}}
-
+
{{page.description}}
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
Quisque ac luctus nisi, vitae ornare arcu. Proin fermentum sapien vitae odio vestibulum porta. Suspendisse faucibus sapien enim, et faucibus urna tempus et. Integer porttitor justo sed faucibus blandit. Morbi semper lectus vitae semper facilisis. Quisque
@@ -159,24 +159,24 @@
{{page.title}}
vel tortor. Aenean ultrices libero sed neque fermentum tempor. Morbi tincidunt dui turpis, non mollis est dignissim at. Suspendisse molestie convallis interdum. Donec sit amet fermentum purus.
-
-
+
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
+
Place this code in the page header.
<script async src="//www.googletagservices.com/tag/js/gpt.js"></script>
- <script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+ <script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<script type="text/javascript" src="https://ssl.p.jwpcdn.com/player/v/8.0.5/jwplayer.js"></script>
<script type="text/javascript">
jwplayer.key = "ssbF6k0i9BPe87xfG/s0ipdp5gwbLoZaDON/GQvuwPU9nVJy"; //Test Key - replace this with your own valid JWPlayer license key
@@ -248,7 +248,7 @@
-
+
-
diff --git a/examples/video/server/brid/pbs-ve-brid.html b/examples/video/server/brid/pbs-ve-brid.html
index 93b89d953b..0590ef792e 100644
--- a/examples/video/server/brid/pbs-ve-brid.html
+++ b/examples/video/server/brid/pbs-ve-brid.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Prebid Server Example with Brid player
-description: An example of a pre-roll ad using Prebid Server and Brid player.
+title: Prebid Video | Prebid Server Example with Brid player
+description: An example of a pre-roll ad using Prebid Server and Brid player.
videoType: pbs-br
isVideo: true
sidebarType: 4
@@ -15,29 +15,29 @@
{{ page.title }}
{{page.description }}
-
+
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
+
-
+
-
diff --git a/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html b/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html
index 62e4108e2e..372974066e 100644
--- a/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html
+++ b/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html
@@ -1,7 +1,7 @@
---
layout: video_sample
-title: Prebid Video | Prebid Server Example with JW Player (Self-Hosted)
-description: An example of a pre-roll ad using Prebid Server and JW Player (Hosted).
+title: Prebid Video | Prebid Server Example with JW Player (Self-Hosted)
+description: An example of a pre-roll ad using Prebid Server and JW Player (Hosted).
videoType: pbs-jw02
isVideo: true
sidebarType: 4
@@ -14,29 +14,29 @@
{{ page.title }}
{{page.description }}
-
+
-
+
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
-
+
-
+
-
+
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -26,106 +26,105 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
Place this code in the page header.
-
+
Place this code in the page header.
+
+
<script>
- var pbjs = pbjs || {};
- pbjs.que = pbjs.que || [];
-
- /* PRE-DEFINE `invokeVideoPlayer`
-
- Because we have no way of knowing when all the bids will be
- returned from Prebid we can't be sure that the browser will
- reach the point where `invokeVideoPlayer` is defined before
- `bidsBackHandler` fires and tries to call it.
-
- To prevent an "`invokeVideoPlayer` not defined" error, we
- pre-define it before we make the call to Prebid, and redefine
- it later on with the code to create the player and play the
- ad.
-
- In this first version, it simply stores the winning VAST to
- use later. */
-
- var tempTag = false;
- var invokeVideoPlayer = function(url) {
- tempTag = url;
- };
-
- var videoAdUnit = {
- code: 'video1',
- mediaTypes: {
- video: {
- context: 'instream',
- playerSize: [640, 480],
- mimes: ['video/mp4'],
- protocols: [1, 2, 3, 4, 5, 6, 7, 8],
- playbackmethod: [2],
- skip: 1
- }
- },
- bids: [{
- bidder: 'appnexus',
- params: {
- placementId: 13232361 // Add your own placement id here.
- }
- }]
- };
-
- pbjs.que.push(function() {
-
- // configure prebid to use prebid cache and prebid server
- // make sure to add your own accountId to your s2sConfig object
- pbjs.setConfig({
- cache: {
- url: 'https://prebid.adnxs.com/pbc/v1/cache'
- },
- debug: true,
- s2sConfig: {
- endpoint: 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction',
- enabled: true,
- accountId: 'c9d412ee-3cc6-4b66-9326-9f49d528f13e',
- bidders: ['appnexus']
- }
- });
-
- pbjs.addAdUnits(videoAdUnit); // add your ad units to the bid request
-
- pbjs.requestBids({
- bidsBackHandler: function(bids) {
-
- var videoUrl = pbjs.adServers.dfp.buildVideoUrl({
- adUnit: videoAdUnit,
- params: {
- iu: '/19968336/prebid_cache_video_adunit',
- cust_params: {
- section: 'blog',
- anotherKey: 'anotherValue'
- },
- output: 'vast'
- }
- });
- invokeVideoPlayer(videoUrl);
- }
- });
- });
-
- </script>
-
+ /* PRE-DEFINE `invokeVideoPlayer`
+
+ Because we have no way of knowing when all the bids will be
+ returned from Prebid we can't be sure that the browser will
+ reach the point where `invokeVideoPlayer` is defined before
+ `bidsBackHandler` fires and tries to call it.
+
+ To prevent an "`invokeVideoPlayer` not defined" error, we
+ pre-define it before we make the call to Prebid, and redefine
+ it later on with the code to create the player and play the
+ ad.
+
+ In this first version, it simply stores the winning VAST to
+ use later. */
+
+ var tempTag = false;
+ var invokeVideoPlayer = function(url) {
+ tempTag = url;
+ };
+
+ var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
+ playbackmethod: [2],
+ skip: 1
+ }
+ },
+ bids: [{
+ bidder: 'appnexus',
+ params: {
+ placementId: 13232361 // Add your own placement id here.
+ }
+ }]
+ };
+
+ pbjs.que.push(function() {
+
+ // configure prebid to use prebid cache and prebid server
+ // make sure to add your own accountId to your s2sConfig object
+ pbjs.setConfig({
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ },
+ debug: true,
+ s2sConfig: {
+ endpoint: 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction',
+ enabled: true,
+ accountId: 'c9d412ee-3cc6-4b66-9326-9f49d528f13e',
+ bidders: ['appnexus']
+ }
+ });
+
+ pbjs.addAdUnits(videoAdUnit); // add your ad units to the bid request
+
+ pbjs.requestBids({
+ bidsBackHandler: function(bids) {
+
+ var videoUrl = pbjs.adServers.dfp.buildVideoUrl({
+ adUnit: videoAdUnit,
+ params: {
+ iu: '/19968336/prebid_cache_video_adunit',
+ cust_params: {
+ section: 'blog',
+ anotherKey: 'anotherValue'
+ },
+ output: 'vast'
+ }
+ });
+ invokeVideoPlayer(videoUrl);
+ }
+ });
+ });
+
+ </script>
+
+
-
-
-
Place this code in the page body.
-
+
Place this code in the page body.
+
+
+
<!-- This line loads a player without loading any video content -->
<!-- Replace this with the correct url for your player -->
@@ -160,10 +159,8 @@
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -28,16 +28,16 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -29,16 +29,16 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
Place this code in the page header.
-
-
-
+
Place this code in the page header.
+
+
+
+
<!-- LOAD OOYALA PLUGINS
Load the Ooyala player scripts you plan to use.
@@ -132,7 +132,7 @@
Place this code in the page header.
}
});
- // add your ad units to the bid request
+ // add your ad units to the bid request
pbjs.addAdUnits(videoAdUnit);
pbjs.requestBids({
@@ -155,15 +155,13 @@
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -26,30 +26,28 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
Place this code in the page header.
-
-
-
+
Place this code in the page header.
+
+
<!--production version of prebid.js-->
-<script async src="//acdn.adnxs.com/prebid/not-for-prod/prebid.js"></script>
+<script async src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
<!-- Radiant Media Player core library - debug browser console mode (use rmp.min.js for production) -->
<script src="https://cdn.radiantmediatechs.com/rmp/5.5.6/js/rmp.debug.js"></script>
-
-
+
+
-
-
-
Place this code in the page body.
-
+
+
Place this code in the page body.
+
+
/* our app where we run player
our app variables */
@@ -84,12 +82,12 @@
Important:
This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.
@@ -35,14 +35,14 @@
{{ page.title }}
-
+
Warning:
Do not forget to exchange the placementId in the code examples with your own placementId!
-
-
Place this code in the page header.
-
+
Place this code in the page header.
+
+
<!-- videojs -->
<!-- use recent version of videojs to ensure proper functioning with the iOS devices -->
@@ -115,7 +115,7 @@
Place this code in the page header.
}
});
- // add your ad units to the bid request
+ // add your ad units to the bid request
pbjs.addAdUnits(videoAdUnit);
pbjs.requestBids({
@@ -137,16 +137,13 @@
diff --git a/faq/prebid-server-faq.md b/faq/prebid-server-faq.md
index 897921131b..d9975d5d69 100644
--- a/faq/prebid-server-faq.md
+++ b/faq/prebid-server-faq.md
@@ -168,3 +168,51 @@ Another way is to [register for our host company mailing list](/prebid-server/ho
Prebid Server is not a full-fledged SSP. Any DSP bid adapters should keep this in mind when it comes to assuming SSP functionality like resolving OpenRTB macros. We debated building this functionality into PBS, but realized it would take precious milliseconds away from the overall header bidding auction to scan kilobytes of bidder creatives for the 9 different OpenRTB macros. Since so few bidders require this functionality, it makes sense to have those adapters do it themselves.
If an adapter doesn't resolve its own macros, AUCTION_PRICE will eventually get resolved by the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative), but by then the bid price will be in the ad server currency and quantized by the price granularity. This will likely cause reporting discrepancies.
+
+## Does Prebid Server support region-specific endpoints for bidders?
+
+Yes. This is handled by the PBS host company in their datacenter config.
+Bidders that want to make use of region-specific endpoints will need to work
+with each PBS host company:
+
+- determine which regions the host company supports
+- map the regions to the bidder's endpoints
+- the host company overrides the bidder's default auction endpoint when they deploy the configuration for each region.
+
+We recognize that it's inconvenient for bidders to be required to have this
+conversation with each host company, but there's really not a better way
+in an open source project. Any number of companies may choose to host
+PBS and we cannot constrain them into a defined set of regions.
+
+## Can bidder endpoints differ by publisher?
+
+You may not use an endpoint domain as a 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.
+
+e.g. this config is not allowed because the entire domain name is a variable:
+
+```
+endpoint: "https://{host}/path"
+```
+but this would be ok:
+```
+endpoint: "https://{host}.example.com/path"
+```
+
+## Did the location of the bidder parameters change?
+
+Why yes, glad you noticed. The original 2017 OpenRTB extension where bidders
+and parameters were placed was imp[].ext.BIDDER. Since 2020, the recommended location
+is imp[].ext.prebid.bidder.BIDDER. This change was driven by the existence of
+other fields in imp[].ext that aren't bidders, like `skadn`, `data`, etc.
+
+Bidders are copied from imp[].ext to imp[].ext.prebid.bidder, and they will be copied for years to come, but we would ask that new implementations of stored requests
+utilize the new location.
+
+## Does PBS support SSL?
+
+No, Prebid Server is intended to run behind a load balancer or proxy, so it does not currently support defining a security certificate.
diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md
index 3eda2187fa..67a68304fe 100644
--- a/features/InterstitialAds.md
+++ b/features/InterstitialAds.md
@@ -11,24 +11,26 @@ sidebarType: 1
* TOC
{:toc}
-Interstitails ads are often placed at natural transition points of the user's experince, such as moving from one page to the next. These ads are generally center aligned overlaying user content.
+Interstitial ads are often placed at natural transition points of the user's experience, such as moving from one page to the next. These ads are generally center-aligned overlaying user content.
This document covers how to setup interstitial ad units.
{: .alert.alert-warning :}
-Please check with each of your bidders to ensure they're reading the interstitial flag from the standard Prebid location.
+Please check with each of this AdUnit's bidders to ensure they're reading the interstitial flag from the standard Prebid location.
+If the bidder doesn't specifically support interstitials, results may be unexpected.
## How It Works
-The intended flow for publishers is the following:
-- Publisher traffics interstitial line item with appropriate size(s) ([GAM example](https://support.google.com/admanager/answer/9840201?hl=en))
+The flow for publishers is the following:
+- Publisher traffics an interstitial line item with appropriate size(s) ([GAM example](https://support.google.com/admanager/answer/9840201?hl=en))
- Publisher defines ad server interstitial slot on the page ([GAM Example](https://developers.google.com/publisher-tag/samples/display-web-interstitial-ad))
-- Publisher defines the appropriate interstitial ad sizes within appriate adUnit.mediaType and supplies the adUnit Interstitial flag within the [AdUnit.ortb2Imp](/dev-docs/adunit-reference.html#adUnit-interstitial-example) config
+- Publisher creates a PBJS AdUnit and defines the appropriate interstitial ad sizes, adUnit.mediaType, and a special interstitial flag
+- Publisher adds bidders and parameters that support interstitials to the PBJS AdUnit(s)
- Prebid requests bids for interstitial adUnits and invokes the ad server call from the requestBids callback
## Ad Sizes
-Publishers are intended to set the desired size in the respective adUnit.
+Publishers must set the desired size in the respective adUnit.
The below sizes are specials sizes to indicate the ad will be full screen for mobile or tablet devices:
- 320x480: Fullscreen mobile phone portrait ad
@@ -40,7 +42,6 @@ The below sizes are specials sizes to indicate the ad will be full screen for mo
The Prebid Interstitial flag reflects the OpenRTB standard, specifying it at the imp level.
-
### Supplying Interstitial Flag
If an attribute is specific to an AdUnit, it can be passed this way:
@@ -54,9 +55,11 @@ pbjs.addAdUnits({
}
},
ortb2Imp: {
- intl:1
+ instl:1
},
- ...
+ bids: [
+ ... bidders that support interstitials ...
+ ]
});
{% endhighlight %}
@@ -64,7 +67,7 @@ pbjs.addAdUnits({
## How Bid Adapters Should Read Interstitial Flag
-To access global data, a Prebid.js bid adapter needs only to retrive the interstitial flag from the adUnit like this:
+To access global data, a Prebid.js bid adapter needs only to retrieve the interstitial flag from the adUnit like this:
{% highlight js %}
utils.deepAccess(bidRequest.ortb2Imp, 'instl')
diff --git a/features/adServerKvps.md b/features/adServerKvps.md
new file mode 100644
index 0000000000..0db05e0539
--- /dev/null
+++ b/features/adServerKvps.md
@@ -0,0 +1,243 @@
+---
+layout: page_v2
+title: Prebid.js and Ad Server Key Values
+description: Prebid.js and Ad Server Key Values
+sidebarType: 1
+---
+
+# Prebid.js and Ad Server Key Values
+{: .no_toc}
+
+* TOC
+{:toc}
+
+
+The point of header bidding is to supply bids into the regular ad server calls.
+Prebid.js provides many ways to do this. This document describes the
+controls for obtaining auction results.
+
+## Overview
+
+Here's the general way PBJS is integrated into the page:
+1. Define AdUnits so they can be linked to existing ad server ad slots in the page
+1. Set auction parameters
+1. Initiate the auction
+1. Gather bid responses to send to the ad server
+1. The ad server makes the final decision about which ad to render
+
+This last step has historically been called "targeting" in Prebid.js, but really what's
+sent to the adserver is a set of Key Value Pairs (KVPs) that serve several purposes:
+- **Ad server line item targeting**. These values are used to pick out which line items match the request. Generally targets depend on the hb_pb attribute, but could also include hb_deal and hb_format.
+- **Display**. Some of these values are needed for rendering the creative properly when the Prebid line item is chosen, including hb_adid, hb_uuid, hb_size, and for AMP/app hb_cache_host.
+- **Reporting**. Some publishers rely on ad server key-values for important business reporting. The keys used for reporting could be any of the above, along with hb_source.
+
+## Decide How The Results Will Be Used
+
+How a publisher should configure Prebid.js to report auction results
+will depend on how the final ad decision will be made. These approaches
+need to be in sync.
+
+There are four main scenarios that follow.
+
+### Ad Server Line Items are Created Per-Bidder
+
+In order to have header bidding compete with direct-sold demand,
+a publisher can set up placeholder line items in their ad server.
+
+Prebid.org recommends setting up separate line items
+for each bidder. Benefits:
+- use ad server reporting to get a view of which bidders are performing well
+- control ad decisions with the ad server
+- video bids have a fallback available
+
+There are more details on this scenario in the [Ad Ops section](/adops/before-you-start.html#one-set-of-line-items-for-each-bidder).
+
+Once implemented in the ad server, setting this up in Prebid.js is
+simple, as it is the default [Send All Bids](#send-all-kvps) mode. However
+to limit the number of values sent to the ad server, some flavor of
+this solution like the [Top Two Bids and Deals](#top-two-bids-and-deals)
+may be of interest.
+
+{: .alert.alert-info :}
+Note that `enableSendAllBids` mode can send a lot of keys to your
+ad server. Though we recommend this setting, we also recommend that
+publishers monitor the key traffic and [control](#controls) as necessary.
+
+### Only One Set of Ad Server Line Items are Created
+
+However, there are reasons a publisher may not want to create
+separate line items for each bidder:
+- some ad servers have a limit on how many line items can be created
+- it takes work to set up line items
+- the volume of key-value pairs can be a factor
+
+So the other ad-server based solution is to create one set of line
+items that is used by all bidders.
+
+Setting this mode up in Prebid.js is done by setting [enableSendAllBids](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-All-Bids)
+to false. See the [Bare Minimum solution](#the-bare-minimum-for-display-ads) for reference.
+
+### Post-Bid
+
+Sometimes Prebid.js is used as a fallback. This mode is called [PostBid](/overview/what-is-post-bid.html)
+
+In this scenario, the ad server line item is scheduled as a low-priority 'remnant' and the auction takes place when there's nothing else to serve.
+The Prebid.js code is in the ad server creative, which decides the overall winner itself. See the [Post Bid Example](/dev-docs/examples/postbid.html).
+
+### No Ad Server
+
+Finally, a publisher may want a particular ad unit to be programmatic-only, which Prebid.js can support.
+Please see the [No Ad Server Example](https://github.com/prebid/Prebid.js/blob/master/integrationExamples/noadserver/basic_noadserver.html).
+
+## Obtaining Auction Results
+
+### Display and Native
+
+In early versions of Prebid.js, there were a couple of basic functions
+publishers could use to get the auction results:
+
+- [pbjs.setTargetingForGPTAsync](/dev-docs/publisher-api-reference/setTargetingForGPTAsync.html) - matches Google Publisher Toolkit ad slots to Prebid.js AdUnits, obtains the auction results for that adunit, and adds "targeting" values using GPT-provided functions.
+- [pbjs.getAdserverTargeting](/dev-docs/publisher-api-reference/getAdserverTargeting.html) - a more generic interface for obtaining KVPs
+
+All of the other functions available in the [publisher API](/dev-docs/publisher-api-reference.html) for obtaining auction bids came later.
+
+When there are a lot of adunits and bidders on a page, the number of KVPs being sent
+to the ad server can grow pretty large, so it quickly became apparent that many options were needed for controlling which KVPs these functions returned.
+
+Note that in old versions of Prebid.js, native ad components were passed via ad server KVPs.
+That approach has been deprecated -- all implementations should now use [one of the recommended approaches for native](/prebid/native-implementation.html).
+
+### Video
+
+Video's always been a different implementation than banners because
+it's the video player that controls the ad call, not in-page javascript like
+the GPT library. So the [Google Ad Manager Video module](/dev-docs/modules/dfp_video.html) includes the [buildVideoUrl](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html) function.
+
+Publishers using other ad servers need to integrate on their own
+using the [pbjs.getAdserverTargetingForAdUnitCode](/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCode.html) function to build whatever
+needed to pass to the video player.
+
+### Mobile App
+
+The Prebid SDK does not have a direct way to control what key-value pairs will
+be generated by Prebid Server. Instead, the [top-level stored request](/prebid-server/features/pbs-storedreqs.html) stored in Prebid Server defines what should be produced.
+
+That stored request will contain the 'targeting' options needed to
+match the line item setup. See the [Prebid-Server-based
+targeting configuration](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#ad-server-targeting), for more detail. The rest of this document is about Prebid.js.
+
+## Controls
+
+Over the years, quite a few options have been added to to Prebid.js to adjust the number of bids and the exact set of KVPs sent to the ad server. This is an overlapping-but-powerful set of controls. There are often
+
+multiple ways to implement the same requirements, and there's no "wrong"
+way to do it.
+
+The list is ordered by those functions that Prebid recommends starting with:
+
+1. [enableSendAllBids](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-All-Bids) - the grandaddy of targeting options. If false, only the winning set of KVPs will be sent. We recommend leaving this to the default value of true so that all bidders are represented in the final decision and for detailed reporting in the ad server, but setting it to false (aka "Send Top Bid" mode) is the most dramatic way to minimize what's sent to the ad server.
+1. [targetingControls.alwaysIncludeDeals](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) - this option makes sure that deals are sent along even if another control would have suppressed it. Publishers running deals should set this value to true.
+1. [sendBidsControl.bidLimit](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-Bids-Control) - this option sorts the bids in CPM order and returns the top N, plus any deals if the 'alwaysIncludeDeals' flag is true.
+1. [targetingControls.allowTargetingKeys](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) - this resets the default keys defined by Prebid.js, defining which KVPs are sent for the winning set. (e.g. hb_pb)
+1. [targetingControls.allowSendAllBidsTargetingKeys](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) - similar to allowTargetingKeys but works on the bidder-specific KVPs. (e.g. hb_pb_BIDDER)
+1. [bidderSettings.standard.adserverTargeting](/dev-docs/publisher-api-reference/bidderSettings.html) - completely redefine what Prebid produces for the winning bid's KVPs.
+1. [bidderSettings.standard.sendStandardTargeting](/dev-docs/publisher-api-reference/bidderSettings.html) - turn off the sending of the standard winning KVPs
+1. [bidderSettings.BIDDER.adserverTargeting](/dev-docs/publisher-api-reference/bidderSettings.html) - completely redefine what Prebid produces for the bidder-specific KVPs.
+1. [bidderSettings.BIDDER.sendStandardTargeting](/dev-docs/publisher-api-reference/bidderSettings.html) - turn off the sending of the standard bidder-specific KVPs
+1. [targetingControls.addTargetingKeys](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) - This is similar to allowTargetingKeys but adds KVPs to the default set rather than replacing them.
+1. [targetingControls.auctionKeyMaxChars](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) - This limits the number of characters Prebid is allowed to add to the KVPs. The function will count the number of characters used and will limit to the integer number of bids that won't exceed this count.
+1. [sendBidsControl.dealPrioritization](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-Bids-Control) - This changes the sort order used by 'bidLimit' to put deals first. It's not useful when alwaysIncludeDeals is specified.
+
+### Examples
+
+Here are a few scenarios to give you a sense of the configurability.
+
+#### Send All KVPs
+
+If the number of KVPs sent to the ad server is not a concern, then the recommended approach is to Send All Bids and all deals:
+
+```
+pbjs.setConfig({
+ enableSendAllBids: true,
+ targetingControls: {
+ alwaysIncludeDeals: true
+ }
+});
+```
+
+#### The Bare Minimum for Display Ads
+
+The opposite approach is to send only the winning set of KVPs directly needed for targeting line items and rendering.
+
+```
+pbjs.setConfig({
+ enableSendAllBids: false,
+ targetingControls: {
+ allowTargetingKeys: ['PRICE_BUCKET', 'AD_ID', 'SIZE']
+ }
+});
+```
+
+Note: this example lacks video support, deal support, and doesn't even tell you which bidder won.
+
+#### Top Two Bids and Deals
+
+```
+pbjs.setConfig({
+ sendBidsControl: { bidLimit: 2 },
+ targetingControls: {
+ alwaysIncludeDeals: true,
+ allowTargetingKeys: ['BIDDER', 'AD_ID',
+ 'PRICE_BUCKET', 'SIZE', 'UUID', 'FORMAT', 'DEAL'],
+ allowSendAllBidsTargetingKeys: ['AD_ID', 'PRICE_BUCKET', 'SIZE',
+ 'FORMAT', 'DEAL']
+ }
+});
+```
+Notes:
+- this assumes that video creatives are set up refering to HB_UUID rather than bidder-specific UUID values.
+
+#### Completely Custom KVPs
+
+Publishers that don't want to use KVPs prefixed with "hb_" can change them with
+bidderSettings:
+
+```
+pbjs.setConfig({
+ enableSendAllBids: false
+});
+pbjs.bidderSettings={
+ standard: {
+ adserverTargeting: [{
+ key: "pb_price",
+ // note the price granularity assumption below is Medium Granularity
+ // other options are pbAg (auto), pbCg (custom), pbDg (dense),
+ // pbHg (high), pbLg (low)
+ val: function(bidResponse) { return bidResponse.pbMg; }
+ },{
+ key: "pb_size",
+ val: function(bidResponse) { return bidResponse.size; }
+ },{
+ key: "pb_adid",
+ val: function(bidResponse) { return bidResponse.adId; }
+ },{
+ key: "pb_uuid",
+ val: function(bidResponse) { return bidResponse.videoCacheKey; }
+ },{
+ key: "pb_format",
+ val: function(bidResponse) { return bidResponse.mediaType; }
+ },{
+ key: "pb_bidder",
+ val: function(bidResponse) { return bidResponse.bidder; }
+ },{
+ key: "pb_deal",
+ val: function(bidResponse) { return bidResponse.dealId; }
+ }]
+ }
+};
+```
+
+## Related Topics
+
+- [Prebid.js Publisher API setConfig() routine](/dev-docs/publisher-api-reference/setConfig.html)
+- [Ad Ops and Prebid](/adops/before-you-start.html)
diff --git a/features/firstPartyData.md b/features/firstPartyData.md
index 8d25d5c329..79fb7fdd50 100644
--- a/features/firstPartyData.md
+++ b/features/firstPartyData.md
@@ -31,9 +31,10 @@ which can be used for more than just First Party Data.
Publishers supply First Party Data (FPD) by specifying attributes as
configuration or on a Prebid.js AdUnit:
-- Global site or user data that applies to all AdUnits and all bidders. Use [`setConfig()`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd)
-- AdUnit-specific data that applies to all bidders. Define [AdUnit.ortb2Imp](/dev-docs/adunit-reference.html#first-party-data)
-- Bidder-specific site or user data that applies to all AdUnits. Use [`setBidderConfig()`](/dev-docs/publisher-api-reference/setBidderConfig.html)
+- Global site or user data that applies to all AdUnits, bidders, and auctions. Use [`setConfig()`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd)
+- Auction-specific site or user data that applies to all AdUnits and bidders in that auction. Use the `ortb2` parameter of [`requestBids()`](/dev-docs/publisher-api-reference/requestBids.html)
+- AdUnit-specific data that applies to all bidders and auctions. Define [AdUnit.ortb2Imp](/dev-docs/adunit-reference.html#first-party-data)
+- Bidder-specific site or user data that applies to all AdUnits and auctions. Use [`setBidderConfig()`](/dev-docs/publisher-api-reference/setBidderConfig.html)
## In-Page Examples
@@ -63,7 +64,10 @@ pbjs.setConfig({
userrating: "4",
data: [{
name: "www.dataprovider1.com",
- ext: { "segtax": 1 },
+ ext: {
+ segtax: 7,
+ cids: [ "iris_c73g5jq96mwso4d8" ]
+ },
segment: [
{ id: "687" },
{ id: "123" }
@@ -83,7 +87,7 @@ pbjs.setConfig({
keywords: "a,b",
data: [{
name: "dataprovider.com",
- ext: { segtax: 3 },
+ ext: { segtax: 4 },
segment: [
{ id: "1" }
]
@@ -107,6 +111,36 @@ of user data as part of its GDPR or CCPA modules.
{: .alert.alert-warning :}
If you're using PBJS version 4.29 or before, replace the following in the example above: 'ortb' with 'fpd', 'site' with 'context' and 'site.ext.data' with 'context.data'.
+### Supplying Auction-Specific Data
+
+In some situations the same page may wish to supply different `site` data for some of its sections,
+for example in infinite scroll or instream video scenarios where multiple pieces of content that would benefit from different contexts are served together.
+
+To support this use case, Prebid version 7 and above accepts auction-specific first-party data as a parameter to `requestBids`. For example:
+
+{% highlight js %}
+pbjs.requestBids({
+ ortb2: {
+ site: {
+ content: {
+ data: [{
+ name: 'www.iris.com',
+ ext: {
+ segtax: 500,
+ cids: ['iris_c73g5jq96mwso4d8']
+ },
+ segment: [
+ {id: '687'},
+ {id: '123'}
+ ]
+ }]
+ }
+ }
+ }
+});
+{% endhighlight %}
+
+
### Supplying AdUnit-Specific Data
If an attribute is specific to an AdUnit, it can be passed this way:
@@ -177,6 +211,82 @@ pbjs.setBidderConfig({ // different bidders can receive different data
});
{% endhighlight %}
+### Supplying App Content Data
+
+Occasionally, an app which embeds a webview might run Prebid.js. In this case, the app object is often specified for OpenRTB, and the site object would be invalid. When this happens, one should specify app.content.data in place of site.content.data.
+
+{% highlight js %}
+pbjs.setConfig({
+ ortb2: {
+ app: {
+ name: "myappname",
+ keywords: "power tools, drills",
+ content: {
+ data: [
+ {
+ name: "www.dataprovider1.com",
+ ext: {
+ segtax: 6
+ },
+ segment: [
+ {
+ id: "687"
+ },
+ {
+ id: "123"
+ }
+ ]
+ },
+ {
+ name: "www.dataprovider1.com",
+ ext: {
+ segtax: 7
+ },
+ segment: [
+ {
+ id: "456"
+ },
+ {
+ id: "789"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+)
+
+{% endhighlight %}
+
+### Supplying OpenRTB Content Data
+OpenRTB `content` object describes specific (mostly audio/video) content information, and it is useful for targeting.
+For website ad, the content object should be defined in `ortb2.site.content`, for non-browser ad, it should be defined in `ortb2.app.content`
+
+{% highlight js %}
+pbjs.setConfig({
+ ortb2: {
+ site: {
+ content: {
+ id: "some_id",
+ episode: "1",
+ title: "some title",
+ series: "some series",
+ season: "s1",
+ artist: "John Doe",
+ genre: "some genre",
+ isrc: "CC-XXX-YY-NNNNN",
+ url: "http://foo_url.de",
+ cat: ["IAB1-1", "IAB1-2", "IAB2-10"],
+ context: "7",
+ keywords: ["k1", "k2"],
+ live: "0"
+ }
+ }
+ }
+});
+{% endhighlight %}
+
## Segments and Taxonomy
The [IAB](https://iab.com) offers standard content and audience taxonomies for categorizing sites and users. Prebid supports defining these values as first party data in `site.content.data` or `user.data` as shown in the examples above.
@@ -188,7 +298,7 @@ Segment support is still under development. You can follow the [Prebid.js discus
user: {
data: [{
name: "dataprovider.com", // who resolved the segments
- ext: { segtax: 3 }, // taxonomy used to encode the segments
+ ext: { segtax: 4 }, // taxonomy used to encode the segments
segment: [
{ id: "1" }
]
@@ -204,20 +314,22 @@ here to their page. For now, here's the beta table defining the segtax values:
{: .table .table-bordered .table-striped }
| Segtax ID | Taxonomy Type | Version | Description |
|-----------+---------------+---------+-------------|
-| 1 | Content | 2.1 | [IAB - Content Taxonomy version 2.1](https://iabtechlab.com/wp-content/uploads/2020/07/IABTL-Content-Taxonomy-2.1-Final.xlsx) |
-| 2 | Content | 2.2 | [IAB - Content Taxonomy version 2.2](https://iabtechlab.com/wp-content/uploads/2020/12/IABTechLab_Content_Taxonomy_2-2_Final.xlsx) |
-| 3 | Audience | 1.1 | [IAB - Audience Taxonomy version 1.1](https://iabtechlab.com/wp-content/uploads/2020/07/IABTL-Audience-Taxonomy-1.1-Final.xlsx) |
+| 1 | Content | 1.x | IAB - Content Taxonomy version 1 |
+| 2 | Content | 2.x | [IAB - Content Taxonomy version 2](https://iabtechlab.com/wp-content/uploads/2020/12/IABTechLab_Content_Taxonomy_2-2_Final.xlsx) |
+| 4 | Audience | 1.1 | [IAB - Audience Taxonomy version 1.1](https://iabtechlab.com/wp-content/uploads/2020/07/IABTL-Audience-Taxonomy-1.1-Final.xlsx) |
{: .alert.alert-info :}
-Publishers need to check with their SSPs and DSPs to confirm which
+The [IAB version of this table](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/master/AdCOM%20v1.0%20FINAL.md#list--category-taxonomies-) is associated with ADCOM. Publishers should check with their SSPs and DSPs to confirm which
segment taxonomies they support.
## How Bid Adapters Should Read First Party Data
-To access global data, a Prebid.js bid adapter needs only to call [`getConfig()`](/dev-docs/publisher-api-reference/getConfig.html), like this:
+Prebid.js bid adapters are supplied global data in the `ortb2` property of [bid requests](/dev-docs/bidder-adaptor.html#building-the-request):
{% highlight js %}
-config.getConfig('ortb2'))
+buildRequests: function(validBidRequests, bidderRequest) {
+ const firstPartyData = bidderRequest.ortb2;
+}
{% endhighlight %}
AdUnit-specific values must be parsed out of the AdUnit object.
diff --git a/features/pbAdSlot.md b/features/pbAdSlot.md
index 05478a0f76..8da35d6380 100644
--- a/features/pbAdSlot.md
+++ b/features/pbAdSlot.md
@@ -1,114 +1,151 @@
---
layout: page_v2
-title: Prebid Ad Slot
-description: The Prebid Ad Slot
+title: Prebid Ad Slot and GPID
+description: Prebid Ad Slot and GPID
sidebarType: 1
---
-# Prebid Ad Slot
+# The Prebid Ad Slot and the GPID
+{:.no_toc}
-The Prebid AdUnit 'code' is a mixed attribute that's generally either the GPT slot name or the HTML div ID. The undecided nature of the 'code' makes it harder to utilize for reporting and auction targeting.
+* TOC
+{:toc}
-The `Prebid Ad Slot` is an optional inventory management convention allowing publishers to supply a descriptive and stable label for each ad on the page. This makes it possible to have more granular reporting and better deal targeting.
+Prebid Ad Slot and the Global Placement ID (GPID) are overlapping conventions that allow publishers to identify ad inventory on their pages so bidders and reporting systems can better deal with their sites.
+
+## Background
+
+It all starts with how publishers decide to label their ad slots: the places on their pages
+where ads can be served. In some ad servers like GAM, these things are called "ad units".
+Most publishers use unique ad slot names, but some publishers utilize the same name for every ad slot on their page. e.g. "/homepage" might be the name for 5 different slots.
+
+It's the case of 'same ad slot names' that Prebid Ad Slot and GPID are
+meant to address.
+
+### The Prebid.js AdUnit
+
+When Prebid.js was developed in 2015, they needed a data structure that would link each ad slot to the bidders and parameters involved in the auction for that slot. Thus was born the Prebid.js [AdUnit](/dev-docs/adunit-reference.html). The AdUnit 'code' is what links this object to the adserver's ad slot. Because some pubs use the same ad slot name everywhere, AdUnit.code is a mixed attribute that can be either the ad slot name **or** the HTML div ID. The undecided nature of AdUnit.code makes it hard to utilize for reporting and auction targeting.
+
+### The Prebid Ad Slot
+
+The 'Prebid Ad Slot' was developed in Prebid.js v3 as an optional inventory management convention allowing publishers to supply a descriptive and stable label for each ad on the page. This makes it possible to have more granular reporting and better deal targeting.
+However, the PB ad slot is not an industry standard convention, so didn't gain
+much traction.
+
+### The GPID
+
+The Global Placement ID (GPID) was an initiative in the Fall of 2021 led
+by the TradeDesk to solve the problem of inventory identification in an industry-wide way. i.e. Buyers want to be able to identify ad slots in a unique way even
+when the publisher uses the same ad slot name multiple times.
+
+The original suggestion for GPID was to simply append the HTML div element id (aka the 'div-id') to the ad slot name. But some publishers generate div-ids randomly, so the definition of GPID has become:
+
+```
+imp[].ext.gpid: ADSLOTNAME#UNIQUIFIER
+```
+Where ADSLOTNAME is the ad server's slot name (e.g. /1111/homepage) and UNIQUIFIER is something that makes the ADSLOTNAME different from others. Normally it's a
+div-id, but if div-ids are random, it can be something else. The "#UNIQUIFIER" is only required if the ADSLOTNAME isn't unique enough on its own.
{: .alert.alert-info :}
-The Prebid Ad Slot was introduced with Prebid.js 3.x.
+The Prebid Ad Slot didn't ever get broad adoption, so it's likely that
+someday we'll deprecate it in favor of the more standard GPID.
-## A Scenario
+## Defining Prebid Ad Slot and GPID
-1. The publisher utilizes the same 'slotname' in the page for multiple holes-in-the-page, differentiating in the ad server by size. e.g.
-- defineSlot('/1111/homepage', [[300,250]], 'div-293rj893p9wje9we9fj');
-- defineSlot('/1111/homepage', [[728,90]], 'div-j98s9u9usj987665da');
-- defineSlot('/1111/homepage', [[160,600]], 'div-B2q3s4gseshekhsei9sh');
-2. In order to be able to display the right ad in the right hole, the Prebid AdUnit therefore sets the 'code' to the div ID instead of the slotname.
-3. The div ID in this case is a random number, not very useful for reporting.
-4. Therefore, to get a stable ID that's useful from a business perspective to identify a hole-in-the-page, the publisher
-decides to add another identifier... the Prebid Ad Slot.
-5. The publisher adds a function to the page that annotates each Prebid AdUnit in the auction with the `pbadslot`.
-6. Participating bid adapters read the `pbadslot` and can target deals to them.
-7. Participating analytics adapters read the `pbadslot` for more granular reporting.
-
-Example page function:
-{% highlight js %}
-
-// Use adunit.ortb2Imp.ext.data.pbadslot if it exists. Otherwise, if the
-// the adunit.code is a div ID, then look for a data-adslotid attribute, then look a matching slot in GPT
-// Otherwise, just use the AdUnit.code
-var setPbAdSlot = function setPbAdSlot(adUnits) {
- // set pbadslot for all ad units
- adUnits.forEach(function (adUnit) {
- if (!adUnit.ortb2Imp) {
- adUnit.ortb2Imp = {}
- }
- if (!adUnit.ortb2Imp.ext) {
- adUnit.ortb2Imp.ext = {};
- }
- if (!adUnit.ortb2Imp.ext.data) {
- adUnit.ortb2Imp.ext.data = {};
- }
-
- // use existing pbadslot if it is already set
- if (adUnit.ortb2Imp.ext.data.pbadslot) {
- return;
- }
-
- // check if AdUnit.code has a div with a matching id value
- const adUnitCodeDiv = document.getElementById(adUnit.code);
- if (adUnitCodeDiv) {
- // try to retrieve a data element from the div called data-adslotid.
- if (adUnitCodeDiv.dataset.adslotid) {
- adUnit.ortb2Imp.ext.data.pbadslot = adUnitCodeDiv.dataset.adslotid;
- return;
- }
- // Else if AdUnit.code matched a div and it's a banner mediaType and googletag is present
- if (adUnit.mediaTypes && typeof adUnit.mediaTypes === 'object' && adUnit.mediaTypes.banner && adUnit.mediaTypes.banner.sizes && window.googletag && googletag.apiReady) {
- var gptSlots = googletag.pubads().getSlots();
- // look up the GPT slot name from the div.
- var linkedSlot = gptSlots.find(function (gptSlot) {
- return (gptSlot.getSlotElementId() === adUnitCodeDiv.id);
- });
- if (linkedSlot) {
- adUnit.ortbImp.ext.data.pbadaslot = linkedSlot.getAdUnitPath();
- return;
- }
- }
- }
- // Else, just use the AdUnit.code, assuming that it's an ad unit slot
- adUnit.ortb2Imp.ext.data.pbadslot = adUnit.code;
- });
-};
+There are two ways a publisher can inject these values into the header bidding auctions:
-pbjs.onEvent('beforeRequestBids', setPbAdSlot);
+1. Supply them manually on the PBJS AdUnits
+2. Install the [GPT Pre-Auction module](/dev-docs/modules/gpt-pre-auction.html)
-{% endhighlight %}
+### Defining them on the PBJS Ad Unit
-## How It Works
+#### Example 1 - unique ad slot names
-The Prebid Ad Slot is just a convention -- it's a form of adunit-specific first party data
-stored under `adunit.ortb2Imp.ext.data.pbadslot`.
-It can be utilized by any code ready to look for it.
+In this example, there's no need for the "UNIQUIFIER" string because every ad slot
+on the publisher page is already unique.
-It's intended to be specified via Prebid.js in one of two ways:
+```
+pbjs.addAdUnits({
+ code: '/1111/homepage-leftnav',
+ ortb2Imp: {
+ ext: {
+ gpid: "/1111/homepage-leftnav",
+ data: {
+ pbadslot: "/1111/homepage-leftnav"
+ }
+ }
+ },
+ mediaTypes: ...
+ bids: ...
+});
+```
+
+#### Example 2 - duplicate ad slots
+
+In this example, the publisher's ad slots all have the same name, but at least
+ the div-ids are unique.
+
+```
+pbjs.addAdUnits({
+ code: 'div-leftnav',
+ ortb2Imp: {
+ ext: {
+ gpid: "/1111/homepage#div-leftnav",
+ data: {
+ pbadslot: "/1111/homepage#div-leftnav"
+ }
+ }
+ },
+ mediaTypes: ...
+ bids: ...
+});
+```
-1. Either directly on the AdUnit itself
-2. Or defined during the run of a function before the auction
+#### Example 3 - duplicate ad slots, random div IDs
-The function could determine the pbadslot in any way that produces a stable value useful for targeting and reporting.
-Some scenarios that could be supported:
+In this example, the publisher utilizes the same 'slotname' in the page for multiple holes-in-the-page, differentiating in the ad server by size. They also use random div-ids. e.g.
+- defineSlot('/1111/homepage', [[300,250]], 'div-293rj893p9wje9we9fj');
+- defineSlot('/1111/homepage', [[728,90]], 'div-j98s9u9usj987665da');
-- parse a substring of the ad server's slot name
-- use a custom div data element ID, else the AdUnit.code
-- use the AdUnit.ortb2Imp.ext.data.pbadslot as a default rather than primary
-- support a different ad server
+```
+pbjs.addAdUnits({
+ code: 'div-293rj893p9wje9we9fj',
+ ortb2Imp: {
+ ext: {
+ gpid: "/1111/homepage#300x250",
+ data: {
+ pbadslot: "/1111/homepage#300x250"
+ }
+ }
+ },
+ mediaTypes: ...
+ bids: ...
+},{
+ code: 'div-j98s9u9usj987665da',
+ ortb2Imp: {
+ ext: {
+ gpid: "/1111/homepage#728x90",
+ data: {
+ pbadslot: "/1111/homepage#728x90"
+ }
+ }
+ },
+ mediaTypes: ...
+ bids: ...
+});
+```
## Prebid Server
-The OpenRTB location for the Prebid Ad Slot is `imp[].ext.data.pbadslot`:
+The Prebid Server Bid Adapter just sends the values to the conventional OpenRTB locations:
+- Prebid Ad Slot is `imp[].ext.data.pbadslot`
+- GPID is `imp[].ext.gpid`
+
+Mobile and AMP Stored Requests should place the values there as desired.
-- The Prebid SDK will place the value there.
-- AMP Stored Requests should place the value there if desired.
-- Server-side bid and anlytics adapters may be modified to read the value.
+Server-side bid and anlytics adapters may be modified to read the value.
## Further Reading
-- The [onEvent()](/dev-docs/publisher-api-reference/onEvent.html) function
+- [GPT Pre-Auction Module](/dev-docs/modules/gpt-pre-auction.html)
+- [Ad Unit Reference](/dev-docs/adunit-reference.html)
diff --git a/features/timeouts.md b/features/timeouts.md
index aa07e5ddef..d3d592b91b 100644
--- a/features/timeouts.md
+++ b/features/timeouts.md
@@ -26,7 +26,7 @@ header bidding activities. Determining this value is a delicate balance: too sho
may go down due to delaying the ad server call to the point where users have left
the page. Publishers must determine the value that works for them, considering
a balance of factors: average user time on page, direct sellthrough, value of different ad channels, and average user network delay.
-3. **Timout Buffer** - The JavaScript timer environment is not perfectly accurate
+3. **Timeout Buffer** - The JavaScript timer environment is not perfectly accurate
because competing JavaScript on the page can delay the header bidding auction
or the recognition that auction results have returned. By default, Prebid.js adds a 400ms buffer to the Auction Timeout to account for the noisy environment. Publishers can
change this default value with the [`timeoutBuffer`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-timeoutBuffer) configuration.
diff --git a/formats/native.md b/formats/native.md
index aecf26f0a4..fb60092f1e 100644
--- a/formats/native.md
+++ b/formats/native.md
@@ -10,10 +10,21 @@ sidebarType: 6
# Prebid Native Ads
{:.no_toc}
-Native ads are supported by Prebid.js for mobile web. Prebid Server support is coming soon.
+## Prebid Server
+
+At a high level, Prebid Server just passes native parameters through to
+bid adapters. See [Prebid Server Native](/prebid-server/features/pbs-native.html) for more information.
+
+## Prebid SDK
+
+See the separate pages for
+- [iOS](/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.html)
+- [Android](/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.html)
## Prebid.js
+Native ads are supported by Prebid.js for mobile web.
+
### Adops
- [Setting up Prebid Native in Google Ad Manager](/adops/gam-native.html)
diff --git a/guide.md b/guide.md
index f397c5a8d5..d358c4d4cc 100644
--- a/guide.md
+++ b/guide.md
@@ -9,14 +9,32 @@ sidebarType: 0
# Prebid Website Maintenance Guide
-v 1.1
-Sept 7, 2019
+v 1.2
+Sept 24, 2021
***
+## Reviewing Pull Requests and Issues
+
+Being a reviewer means you're in weekly rotation where you keep an eye on pull requests (PRs) and issues opened in this repo.
+
+### PR Review Guidelines
+
+1. Make sure no inappropriate changes are made. This covers obvious things like bad language and content, but we also don't allow overt marketing language on the site. Phrases like "we're the best BLAH" or "number one FOOZIT" need to be toned down.
+2. Make sure competitors aren't messing with each other's docs. This can be hard to tell because we don't know which github handles belong to which companies, but in general, if a destructive or suspicious change is being made to a doc, check on the Prebid Slack channel to confirm that the affected company approves the change.
+3. Make sure the change doesn't break formatting. It's not always necessary to preview locally, but for large changes, it's worthwhile verifying visually because markdown can be cranky.
+4. Help the author with basic readability - if you as a reviewer don't understand a sentence, probably others will have trouble too. Push back and ask questions about what they're really trying to say.
+5. We don't generally merge a docs PR until the related code is released. Prebid.js releases happen on Weds or Thurs, and people really like to have their docs PRs merged shortly after the code is released. For Prebid Server, it's ok to merge the docs after the code is merged.
+6. Fix broken or out-of-date things you run across. At least flag it in the team slack channel so we can fix it someday.
+7. Bid Adapter Guidelines
+ 1. Check the front-matter: required fields are title and either pbjs or pbs.
+ 2. Every adapter needs a parameters table that contains exactly 5 columns in this order: Name, Scope, Description, Example, Type.
+ 3. Discourage full-page HTML examples. Better to have just the bidder-specific logic and a pointer to a standard Prebid.js example.
+ 4. All headers must be level 3, 4, or 5.
+
## Core Technologies
-The Prebid website is developed using [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages.
+The Prebid website is developed using [GitHub pages](https://pages.github.com/) and [Jekyll](https://jekyllrb.com/), a static site generator which uses the following technology to create and style HTML pages. See the [main README file](https://github.com/prebid/prebid.github.io/blob/master/README.md) for instructions on how to set this up.
**Markdown**: The majority of the content is written in Markdown language. Jekyll transform this into raw HTML.
@@ -34,11 +52,18 @@ Learn more about [Liquid](https://help.shopify.com/en/themes/liquid/basics)
**CSS**: The site builds on the base Bootstrap template with custom CSS stored in the style.css file.
-***
+### Environment
+
+- prebid.org is built with Wordpress. We call it "the marketing site". We generally use a contracting company to make major updates there so it's pretty. But if you know Wordpress, we may give you permissions to do minor updates there.
+- docs.prebid.org is the Github pages site. We call it "the docs site".
+- dev.prebid.org is served through Netlify from the 'dev' branch of the repo. It's often out of date and only used for major projects or for sharing major docs for external review.
+- stage.prebid.org is also served through Netlify, but from the 'staging' branch. You should assume it's out of date.
+
+On the rare occasions where we need to use the 'dev' or 'stage' sites, we just check with each other to make sure it's not already being used for something.
## Site Config
-The _config.yml file (note underscore prefix) sets the base configuration for the site. Refer to [Jekyll](https://jekyllrb.com/docs/configuration/) documentation on which properties can be set in the _congig.yml file.
+The _config.yml file (note underscore prefix) sets the base configuration for the site. Refer to [Jekyll](https://jekyllrb.com/docs/configuration/) documentation on which properties can be set in the _config.yml file.
***
@@ -75,7 +100,7 @@ The includes directory contains HTML files that can be included within files, su
**_bidders**
-The bidders directory is not a standard part of Jekyll; itâs a special use directory specifically for the Prebid.org site. The files in this directory are used to construct the table of partners on the partners/partners.html page.
+The bidders directory is not a standard part of Jekyll; itâs a special use directory specifically to construct the table of bidders on dev-docs/bidders.md and dev-docs/pbs-bidders.md
**_sites**
@@ -236,18 +261,14 @@ The attributes in the Jekyll 'front matter' drive various behaviors and dynamic
| ----- | ------ | ------ | ------ |
| layout | yes | bidder | Links this file to the bidder.html layout |
| title | yes | company name | For display |
+| pbjs | sorta | true or false | defines whether this is a Prebid.js bidder |
+| pbs | sorta | true or false | defines whether this is a Prebid Server bidder |
| description | no | - | Not used |
-| hide | no | - | Not used |
| biddercode | yes | preferred bidder code | Used as the default ad server targeting suffix and the default download filename |
| aliasCode | no | download filename | Overrides the filename used to build the PBJS package on the download page |
| prevBiddercode | no | secondary bidder code | Adds a note about an alternate code that may have been used. |
-| bidder_supports_deals | no | true or false, whether the adapter supports deals | For display. Defaults to 'true'. |
-| s2s_only | no | true or false, whether the adapter is server-to-server only | Adds a note to the display. Defaults to 'false'. |
-| gdpr_supported | no | true or false, whether the adapter supports GDPR | For display. Defaults to 'false'. |
-| coppa_supported | no | true or false, whether the adapter supports COPPA | For display. Defaults to 'false'. |
-| media_types | no | comma-separated list of: banner, video, native | For display. |
-| userIds | no | comma-separated list of supported user id modules | For display. |
-| prebid_member | no | true or false, whether this company is a prebid.org member | For display. |
+| pbjs_version_notes | no | string | Displays on the download page |
+| ANYTHING ELSE | no | string | There are many pieces of metadata (e.g. GDPR support, user IDs supported) that bid adapters can disclose. They're displayed on the bidder's parameter page. |
The bidderCode, aliasCode, and prevBiddercode parameters bear some description.
Some adapters have a longer bidderCode and a shorter bidderCode -- their adapter supports both (with the `alias` feature) but
diff --git a/identity/prebid-identity.md b/identity/prebid-identity.md
new file mode 100644
index 0000000000..d83d63b126
--- /dev/null
+++ b/identity/prebid-identity.md
@@ -0,0 +1,63 @@
+---
+layout: page_v2
+title: Prebid User Identity
+description: What is Prebid User Identity
+sidebarType: 9
+---
+
+# Prebid User Identity Overview
+
+Prebid's aim is to enable the protection of user privacy while still supporting publisher's ability to make revenue,
+keeping the Open Web healthy.
+
+To do this, Prebid offers a number of identity-related products that encourage awareness of privacy regulations such as GDPR, CCPA, and COPPA. The most important projects are:
+
+- [Prebid.js User Identity Module](/dev-docs/modules/userId.html). This module supports more than 20 different flavors of global IDs with different features that publishers can work with.
+- [SharedID](/identity/sharedid.html). This native hosted ID offering from Prebid is simple, free, robust, and privacy-minded.
+- **Coming soon:** [Unified ID 2.0](https://prebid.org/blog/prebid-org-to-serve-as-operator-of-unified-id-2-0/)
+
+## Prebid.js and Identity
+
+Publishers have several ways to include user identity as part of
+the header bidding auction:
+
+1. Install one or more [User ID modules](/dev-docs/modules/userId.html). These modules obtain
+the user's ID from the service and make it available to participating bidders. Publishers
+can define [permissions](/dev-docs/modules/userId.html#permissions) to control which bidders receive which IDs.
+2. Install the [ID Import Module](/dev-docs/modules/idLibrary.html). This module can be
+used to generate a map of identities present on the page.
+3. Pass [First Party Data](/features/firstPartyData.html), such as interests, to bidders for more relevant advertising.
+4. Include [User Syncing](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) to allow bid adapters to establish IDs. Publishers have control over which bidders may sync, which syncing mechanisms are allowed, and when the syncing occurs. Syncing is subject to privacy controls such as GDPR, CCPA, and COPPA.
+
+## Prebid Server and Identity
+
+Prebid Server has user sync functionality, allowing server-side bidders to establish
+IDs given appropriate permission from the user for setting cookies.
+
+Prebid Server can receive extended ID arrays (eids) from Prebid.js and provide them to
+participating server-side bid adapters. It also supports permissioning to determine
+which eids can be sent to which bidders.
+
+User IDs are not sent to bid adapters in privacy scenarios such as COPPA and
+GDPR requests lacking appropriate consent. For more details see [Prebid Server Privacy](/prebid-server/features/pbs-privacy.html).
+
+## Prebid SDK and Identity
+
+In application environments, performance-based advertisers rely on a deviceâs IDFA to target,
+frequency cap, and determine attribution, similar to how cookies are used in desktop
+environments. However, IDFAs are persistent to the device. Prebid SDK will read the IDFA from
+the device when available. Additionally, Prebid SDK supports third party identity IDs.
+
+Prebid Server will strip the IDFA and/or third party identity IDs when enforcing regulations such as GDPR and CCPA.
+
+## AMP, Prebid, and Identity
+
+Prebid Server supports a user [cookie-sync](/prebid-server/developers/pbs-cookie-sync.html) functionality, including integration with
+a consent management platform. This allows server-side bidders to establish IDs given
+the appropriate cookie-setting permissions from the user.
+
+## Further Reading
+
+- [PBJS User ID module](/dev-docs/modules/userId.html)
+- [SharedID](/identity/sharedid.html)
+- [Prebid Server Privacy](/prebid-server/features/pbs-privacy.html)
diff --git a/identity/sharedid.md b/identity/sharedid.md
new file mode 100644
index 0000000000..be8913d04a
--- /dev/null
+++ b/identity/sharedid.md
@@ -0,0 +1,376 @@
+---
+layout: page_v2
+title: SharedID
+description: What is SharedID
+sidebarType: 9
+---
+
+# Prebid SharedID
+{: .no_toc}
+
+* TOC
+{:toc}
+
+{: .alert.alert-warning :}
+As of Prebid.js 5.0, PubCommon ID is no longer supported -- it's been merged into SharedId. Also, SharedId no longer syncs to sharedid.org like it did in Prebid.js 4.x.
+
+## What is it?
+
+SharedId is a convenient Prebid-owned first party identifier within the [Prebid UserId Module framework](/dev-docs/modules/userId.html).
+
+There are multiple ways to integrate SharedId on your site. See the table below for a breakout of options, and the rest of this document for detailed integration instructions.
+
+{: .table .table-bordered .table-striped }
+| Implementation | Description | Cookie Lifetime | Safari Cookie Lifetime | Technical Difficulty | Revenue Benefit |
+| --- | --- | --- | --- | --- | --- |
+| 3rd Party Cookie Only | No first party cookie solution. | Some Blocked | Blocked | None | Low |
+| User Id Submodule | Including User Id Module in your Prebid.js installation. | 365 days | 7 days | Basic | Good |
+| PubCID Script | Adding the legacy PubCID script; not maintained by Prebid.org. | 365 days | 7 days | High | Varies |
+| SharedId First Party Endpoint | Writing a first party cookie from your web server code. | 365 days | 365 days | Intermediate | Best |
+
+## How does the Prebid UserId Module implementation work?
+
+The SharedID ID system sets a user id cookie in the publisherâs domain.
+Since the cookie is set in the publisher's first party domain it does not fall in scope of browser restrictions on third party cookies. Safari has restrictions on first party cookies set via document.cookie. For this reason we recommend considering a server endpoint installation for maximum effect. See the "Alternate Implementations" section below.
+
+### Prebid.js 5.x
+
+The SharedId module reads and/or sets a random ID in
+the cookie name defined by the publisher when initializing
+the module:
+
+Example 1: client-side cookie setting
+```
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'sharedId', //"pubCommonId" as a name is supported for backwards compatibility,
+ storage: {
+ name: '_sharedID', // name of the 1st party cookie, _pubcid is supported for backwards compatibility
+ type: 'cookie',
+ expires: 30
+ }
+ }]
+ }
+});
+```
+
+Example 2: setting the cookie with a first party endpoint
+```
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'sharedId', //"pubCommonId" as a name is supported for backwards compatibility,
+ params: {
+ pixelUrl: "/wp-json/pubcid/v1/extend/" // this parameter identifies your server-side endpoint that will set a first party cookie'
+ },
+ storage: {
+ name: '_sharedID', // name of the 1st party cookie, _pubcid is supported for backwards compatibility
+ type: 'cookie',
+ expires: 30
+ }
+ }]
+ }
+});
+```
+
+The 'source' value transmitted through OpenRTB (user.ext.eids) is pubcid.org. For example:
+```
+user: {
+ ext: {
+ eids: {
+ "source":"pubcid.org",
+ "uids":[
+ {
+ "id":"01EAJWWNEPN3CYMM5N8M5VXY22",
+ "atype":1
+ }
+ ]
+ }
+ }
+}
+```
+
+{: .alert.alert-info :}
+The 'pubcid.org' EID source was adopted by more buyers than 'sharedid.org', so
+when PubCommon was folded into SharedID, we kept the more commonly recognized
+source value.
+
+### Before Prebid.js 5.0
+
+In addition to setting a first party cookie, SharedId in Prebid.js 4.x also sets a third party cookie where possible, syncing the first and third party cookies (subject to browser capability and user opt-out).
+
+SharedId in Prebid.js 4.x was transmitted through the header-bidding ecosystem on user.ext.eids with a different 'source':
+```
+user: {
+ ext: {
+ eids: {
+ "source":"sharedid.org",
+ "uids":[
+ {
+ "id":"01EAJWWNEPN3CYMM5N8M5VXY22",
+ "atype":1,
+ "ext":{
+ "third":"01EAJWWNEPN3CYMM5N8M5VXY22"
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+### Detailed Walkthrough
+
+This diagram summarizes the workflow for SharedId:
+
+![SharedId](/assets/images/sharedid5.png){: .pb-lg-img :}
+
+1. The page loads the Prebid.js package, which includes the SharedId module.
+2. The page enables one or more user ID modules with pbjs.setConfig({usersync}) per the module documentation. The publisher can control which bidders are allowed to receive each type of ID.
+3. If permitted, the SharedId module retrieves and/or sets the designated first party cookie for this user.
+4. When a header bidding auction is run, the ID modules are invoked to add their IDs into the bid requests.
+5. Bid adapters send the additional IDs to the bidding endpoints, along with other privacy information such as GDPR consent, US Privacy consent, and the Global Privacy Control header.
+6. SharedId is used by the bidder for ad targeting, frequency capping, and/or sequential ads.
+7. Bids are sent to the publisher's ad server, where the best ad is chosen for rendering.
+
+{: .alert.alert-info :}
+In Prebid.js 4.x, when SharedId performed third-party syncing there
+was an extra step in the diagram between steps 3 and 4 where the module would connect to a server on sharedid.org. This step was
+removed in Prebid.js 5.0.
+
+### Privacy Discussion
+
+There are several privacy scenarios in which a user ID is not created or read:
+
+1. The User ID module suppresses all cookie reading and setting activity
+when the [GDPR Enforcement Module](/dev-docs/modules/gdprEnforcement.html) is in place and there's no consent for Purpose 1.
+2. The User ID module infrastructure supports a first-party opt-out, by setting the `_pbjs_id_optout` cookie or local storage to any value. No other cookies will be set if this one is set.
+3. The SharedId module will suppress the ID when the COPPA flag is set.
+
+For all other privacy-sensitive scenarios, it is encumbent upon bid adapters and endpoints
+to be aware of and enforce relevant regulations such as CCPA and Global Privacy Control.
+
+## Opt-Out
+
+Prebid recommends that publishers provide their users with information about how IDs are utilized, including targeting, frequency capping, and special ad features like sequential ads.
+
+If the publisher's legal staff has determined that a user opt-out is necessary beyond existing
+mechanisms like GDPR and CCPA, the use of first party cookies requires that opt-out flow be owned
+by the publisher.
+
+Publishers that decide to build a first-party opt-out workflow might follow a process like this:
+- User is presented with an option to turn off ad targeting
+- If the user opts out, the page can do one of two things:
+ - set a `_pbjs_id_optout` first party cookie
+ - avoid calling pbjs.setConfig to initialize the user ID modules
+
+## Alternative Implementations
+
+For those not using Prebid's header bidding solution, SharedId can deployed via in inline script reference or from a web server.
+
+### SharedId Script
+
+For those interested in implementing SharedId without prebid.js.
+1. Clone the [SharedId script repository](https://github.com/prebid/Shared-id-v2)
+2. Implement the pubcid.js script on the desired page by following the build instructions in the [readme.md](https://github.com/prebid/Shared-id-v2#readme)
+
+Prebid also recommends implementing a method where users can easily opt-out of targeted advertising. Please refer to the User Opt-Out section located at the bottom of this page.
+
+If there are no custom configurations, then just include the script and it'll use the default values.
+
+```
+
+```
+
+If custom configurations are needed, define the pubcid_options object before inclusion of the script. Below is an example to switch from using local storage to cookie:
+
+```
+
+
+```
+
+#### Configuration
+
+Below are the available configuration options for the PubCID script.
+
+{: .table .table-bordered .table-striped }
+| Parameter Name | Type | Description | | Example |
+| --- | --- | --- | --- | --- |
+| create | boolean | If true, then an id is created automatically by the script if it's missing. Default is true. If your server has a component that generates the id instead, then this should be set to false | | `true` |
+| expInterval | decimal | Expiration interval in minutes. Default is 525600, or 1 year | | `525600` |
+| extend | boolean | If true, the the expiration time is automatically extended whenever the script is executed even if the id exists already. Default is true. If false, then the id expires from the time it was initially created. | For publisher server support only. If true, the publisher's server will create the (pubcid) cookie. Default is true. | `true` |
+| pixelUrl | string (optional) | For publisher server support only. Where to call out to for a server cookie. | | `/wp-json/pubcid/v1/extend/`
+| type | string | Type of storage. It's possible to specify one of the following: 'html5', 'cookie'. Default is 'html5' priority, aka local storage, and fall back to cookie if local storage is unavailable. | If true, the expiration time of the stored IDs will be refreshed during each page load. Default is false. | `cookie` |
+
+#### Example Configurations
+
+Always use cookies and create an ID that expires in 30 days after creation.
+
+```
+{
+ type: 'cookie',
+ extend: false,
+ expInterval: 43200
+}
+```
+
+Using a SharedId Endpoint implementation, create the cookie once, which will be allowed to expire before it is created again.
+
+```
+{
+ type: 'cookie',
+ pixelUrl: '/wp-json/pubcid/v1/extend/',
+ create: false,
+ extend: false
+}
+
+```
+
+### SharedId First Party Endpoint
+
+Add server-side support for SharedId to better handle the ever-increasing restrictions on cookies in modern web browsers by having the SharedId first party cookie written and extended by your web server.
+
+#### CMS
+
+PubCID/SharedId plugins are available for Wordpress and Drupal. Because the CMS can cache pages to improve scalability, it's impractical to set unique cookies during page generation. Instead these plugins require a dynamic endpoint that serves back a blank pixel along with a unique cookie value. The client side script needs one additional parameter for this URL. Please consult the corresponding plugin documents for default values:
+
+1. Wordpress : Install directly from the [Wordpress admin page](https://wordpress.org/plugins/publisher-common-id/). Install from [GITHUB](https://github.com/prebid/sharedid-wordpress)
+2. Drupal : Install from [Github](https://github.com/prebid/sharedid-drupal).
+
+#### Endpoint Implementations
+
+The Wordpress and Drupal plugins require that the host company integrate a new endpoint into their webserver that can receive request from the page and set a unique cookie.
+Below are some examples for how to implement this function in various languages or platforms. It is up to the site owner to integrate an appropriate script for their specific scenario.
+
+##### JAVA
+```JAVA
+public class PubCid {
+ private static final String pubcidCookieName = "_pubcid";
+ private static final int expireTime = (int) TimeUnit.DAYS.toSeconds(365); //store cookie for 1 year
+
+ /**
+ * Returns the pubcid cookie found in the user's list of cookies.
+ * Always update the expire time to another year so that the cookie persists.
+ *
+ * @param cookies User's list of cookies
+ * @return the pubcid cookie if found, null otherwise
+ */
+ public static Cookie getPubcidCookie(Cookie[] cookies) {
+
+ Cookie pubcidCookie = fetchPubcidCookie(cookies);
+ if (pubcidCookie != null)
+ pubcidCookie.setMaxAge(expireTime);
+
+ return pubcidCookie;
+ }
+
+ /**
+ * Simple function to test if the user has a pubcid cookie
+ *
+ * @param cookies User's list of cookies
+ * @return true if the cookie is found, false otherwise
+ */
+ public static boolean hasPubcidCookie(Cookie[] cookies) {
+ return fetchPubcidCookie(cookies) != null;
+ }
+
+ /**
+ * Local function to find the pubcid cookie within the user's list of cookie
+ *
+ * @param cookies User's list of cookies
+ * @return pubcid cookie if found, null otherwise
+ */
+ private static Cookie fetchPubcidCookie(Cookie[] cookies) {
+ if (cookies == null) return null;
+ return Arrays.stream(cookies)
+ .filter(e -> e.getName().equals(pubcidCookieName))
+ .findFirst()
+ .orElse(null);
+ }
+}
+```
+##### PHP
+```PHP
+$cookie_name = '_pubcid';
+$cookie_path = '/';
+$max_age = 365;
+
+$value = NULL;
+
+// See if the cookie exist already
+
+if (isset($_COOKIE[$cookie_name ]))
+ $value = $_COOKIE[$cookie_name];
+
+// Obtain site domain if defined
+if (defined(COOKIE_DOMAIN))
+ $cookie_domain = COOKIE_DOMAIN;
+else
+ $cookie_domain = "";
+
+// Update the cookie
+if (isset($value)) {
+ setcookie(
+ $cookie_name,
+ $value,
+ time() + $max_age * DAY_IN_SECONDS,
+ $cookie_path,
+ $cookie_domain
+ );
+}
+```
+##### Node.js
+```Node
+const express = require('express');
+const cookieParser = require('cookie-parser');
+const app = express();
+const port = 3000;
+
+app.use(cookieParser());
+
+app.get('/', function(req, res) {
+
+ // Check for existence of _pubcid cookie
+ let value = req.cookies['_pubcid'];
+
+ // If pubcid exists, then update its expiration time
+ if (value) {
+ res.cookie('_pubcid', value, {domain: '.example.com', path: '/', expires: new Date(Date.now() + 1000*60*60*24*365)});
+ }
+
+ res.render('index');
+});
+
+app.listen(port, ()=>console.log(`App listening on port ${port}`));
+```
+##### Apache
+```Apache
+# Add to httpd.conf
+# Requires mod_headers and mod_env
+
+# Capture _pubcid cookie value if available
+SetEnvIf Cookie "(^|;\ *)_pubcid=([^;\ ]+)" PUBCID_VALUE=$2
+SetEnvIf Cookie "(^|;\ *)_pubcid=([^;\ ]+)" HAVE_PUBCID=1
+
+# Add _pubcid cookie if it exists to the response with 1 year expiration time
+Header add Set-Cookie "_pubcid=%{PUBCID_VALUE}e;Domain=.example.com;Path=/;Max-Age=31536000" env=HAVE_PUBCID
+```
+##### Nginx
+```Nginx
+# Add to a location directive
+
+ location /example {
+ set $pubcid_value $cookie__pubcid;
+ if ($pubcid_value) {
+ add_header Set-Cookie "_pubcid=$pubcid_value;Domain=.example.com;Path=/;Max-Age=31536000";
+ }
+ }
+```
+
+## Related Topics
+
+- [Prebid Identity Overview](/identity/prebid-identity.html)
+- [Prebid.js User ID modules](/dev-docs/modules/userId.html)
diff --git a/mix-manifest.json b/mix-manifest.json
new file mode 100644
index 0000000000..7e2920e36b
--- /dev/null
+++ b/mix-manifest.json
@@ -0,0 +1,4 @@
+{
+ "/assets/css/main-bundle.css": "/assets/css/main-bundle.css",
+ "/_site/assets/css/main-bundle.css": "/_site/assets/css/main-bundle.css"
+}
diff --git a/overview/ga-analytics.md b/overview/ga-analytics.md
index 004a08a5a9..7f21487364 100644
--- a/overview/ga-analytics.md
+++ b/overview/ga-analytics.md
@@ -80,14 +80,71 @@ Similar query for bidders' bid CPM:
## How does it work?
-Prebid.js has a seamless integration with Google Analytics and Google Spreadsheet, as well as [several other Analytics providers]({{site.baseurl}}/overview/analytics.html).
+Prebid.js has a seamless integration with Google Analytics and Google Spreadsheet, as well as [several other Analytics providers](/overview/analytics.html).
-1. Prebid.js has a built-in plugin for Google Analytics, i.e. zero development work if your site uses Prebid.js.
+1. Prebid.js has a module for Google Analytics.
2. All data are sent as Events to Google Analytics. You can build reports and dashboards there just as you do today with web traffic data.
3. We've also built dashboards and data visualization in Spreadsheet (where all the above diagrams come from). You can copy our demo dashboard and link it to your Google Analytics account in a few minutes!
4. The Spreadsheet dashboard can be scheduled to run every morning (or in other intervals). You can get 7 day revenue lookback, latency/CPM distribution analysis and more every morning!
+### Building the Prebid.js Package with GA
+
+You can build the Google Analytics module into your Prebid package in two ways:
+
+1. The "Easy Button" - use the handy web-based [Prebid.js Download](/download.html) tool, and check the Google Analytics adapter box along with the other modules and adapters desired.
+2. From the command line
+
+```
+gulp build --modules=googleAnalyticsAdapter, OTHER_MODULES, OTHER_ADAPTERS, ...
+```
+### Enabling the GA Adapter in Your Page
+
+1. First, make sure GA is on your page as directed by Google. Get the 'tracking code' from the GA interface. It will look something like:
+
+```
+
+
+
+```
+
+2. Enable the Prebid.js GA module:
+
+```
+pbjs.que.push(function() {
+ pbjs.enableAnalytics({
+ provider: 'ga',
+ options: {
+ sampling: 0.1,
+ cpmDistribution: myBucketFunction
+ }
+ });
+});
+
+// takes a CPM value and returns a string price bucket
+var myBucketFunction = function(cpm) {
+ return cpm <= 1 ? '<= 1$' : '> 1$';
+}
+```
+
+Here are the options available. None of them are required.
+
+{: .table .table-bordered .table-striped }
+| Option | Type | Example | Notes |
+|---+---+---+---|
+|global | string | ga | Name of the global analytics object. Default is `ga` |
+|trackerName | string | "mytracker" | Use another tracker for prebid events. Default is the default tracker. |
+|sampling | float | 0.1 | Choose a value from `0` to `1`, where `0` means 0% and `1` means 100% tracked. |
+|enableDistribution | boolean | true | Enables additional events that track load time and cpm distribution by creating buckets for load time and cpm. Default is false. |
+|cpmDistribution | function | see example | A function that customizes the buckets for cpm distribution. |
+|sendFloors | boolean | true | if set, will include floor data in the eventCategory field and include ad unit code in eventAction field. Defaults to false. |
+
## Further Reading
-- [Analytics for Prebid]({{site.baseurl}}/overview/analytics.html) (Overview and list of analytics providers)
-- [Integrate with the Prebid Analytics API]({{site.baseurl}}/dev-docs/integrate-with-the-prebid-analytics-api.html) (For developers)
+- [Analytics for Prebid](/overview/analytics.html) (Overview and list of analytics providers)
+- [Integrate with the Prebid Analytics API](/dev-docs/integrate-with-the-prebid-analytics-api.html) (For developers)
diff --git a/overview/intro.md b/overview/intro.md
index 914e35f5d9..23342c615b 100644
--- a/overview/intro.md
+++ b/overview/intro.md
@@ -31,7 +31,7 @@ Our flagship product, Prebid.js, is sometimes referred to as simply *Prebid*, bu
### What is Header Bidding?
-Header bidding is a response to a fragmented and inefficient process for digital ad display. It is an alternative to the "waterfall" method, in which impressions impressions are offered to one sales channel at a time, moving down an inflexible stack of sources.
+Header bidding is a response to a fragmented and inefficient process for digital ad display. It is an alternative to the "waterfall" method, in which impressions are offered to one sales channel at a time, moving down an inflexible stack of sources.
With header bidding, the publisher creates a short delay in their ad serving to obtain bids from many SSPs and ad exchanges. In this way, publishers can receive high value bids on their inventory that may be unavailable through their primary ad server and exchange.
The returned bids are then passed into the ad server so they can compete with direct demand and the primary ad server's exchange on a level playing field.
diff --git a/overview/prebid-management-committees.md b/overview/prebid-management-committees.md
index daedc6563a..459d6b1a90 100644
--- a/overview/prebid-management-committees.md
+++ b/overview/prebid-management-committees.md
@@ -8,118 +8,10 @@ sidebarType: 0
# Project Management Committees
{: .no_toc}
-Project Management Committees are responsible for the active management of one or more GitHub repositories, which are also identified by resolution of the Board.
-
-The committees meet periodically to:
-
-- establish and prioritize roadmap items
-- review open issues and pull requests
-- discuss policies
-- create development plans
-
-The following sections describe the committees.
-
-* TOC
-{:toc}
-
-## Prebid.js
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Prebid.js and related repositories |
-| **Description** | browser-based header bidding |
-| **Chair** | Gareth Glaser (Rubicon Project) |
-| **Audience** | Product and Engineers |
-
-GitHub Repositories:
-
-+ https://github.com/prebid/prebid.js
-+ https://github.com/prebid/Prebid.js-packager
-+ https://github.com/prebid/prebid-universal-creative
-+ https://github.com/prebid/currency-file-generator
-+ https://github.com/prebid/prebid-js-build-generator
-
-
-## Prebid Mobile
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Prebid Mobile SDK |
-| **Description** | Mobile-app based header bidding |
-| **Chair** | Bryan Szekely (Rubicon Project) |
-| **Audience** | Product and Engineers |
-
-GitHub Repositories:
-
-+ https://github.com/prebid/prebid-mobile-ios
-+ https://github.com/prebid/prebid-mobile-android
-
-
-## Prebid Server
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Prebid Server and Prebid Cache |
-| **Description** | Server-side header bidding |
-| **Chair** | Bret Gorsline (Rubicon Project) |
-| **Audience** | Product and Engineers |
-
-GitHub Repositories:
-
-+ https://github.com/prebid/prebid-server
-+ https://github.com/prebid/prebid-cache
-+ https://github.com/prebid/prebid-server-java
-+ https://github.com/prebid/prebid-cache-java
-
-
-## Prebid Tools
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Misc. Tools |
-| **Description** | Debugging and Operational Support |
-| **Chair** | Asaf Shamly (Browsi) |
-| **Audience** | Product, Business, and Engineers |
-
-GitHub Repositories:
-
-+ https://github.com/prebid/header-bidder-expert
-
-## Identity
-
-{: .table .table-bordered .table-striped }
-| **Scope** | User Identification |
-| **Description** | Chart Prebid's role in the future of identity on the web and coordinate any implementation efforts |
-| **Chair** | Stephanie Layser (NewsCorp) |
-| **Audience** | Product, Business, and Engineers |
-
-GitHub Repositories:
-
-+ TBD
-
-## Video Taskforce
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Video |
-| **Description** | Define the needs for video header bidding |
-| **Chair** | Mike Chowla (Pubmatic) |
-| **Format Lead** | Joel Korpi (Xandr) |
-| **Audience** | Product, Business, and Engineers |
-
-## Marketing Taskforce
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Prebid.org events and marketing |
-| **Description** | Coordinates Prebid events and press releases |
-| **Chair** | Joel Fisher (Rubicon Project) |
-| **Audience** | Marketing, Business |
-
-## Publisher Taskforce
-
-{: .table .table-bordered .table-striped }
-| **Scope** | Publisher-related topics |
-| **Description** | Header bidding issues, optimization, strategy, best practices |
-| **Chair** | Stephanie Layser (NewsCorp) |
-| **Audience** | Business |
+This page has moved to [https://prebid.org/project-management-committees/](https://prebid.org/project-management-committees/)!
## Further Reading
{: .no_toc}
* [What is Prebid.org?](/overview/what-is-prebid-org.html)
-* [Prebid.org Membership and Partners](/partners/partners.html)
+* [Prebid.org Membership](/partners/partners.html)
diff --git a/overview/prebid-universal-creative.md b/overview/prebid-universal-creative.md
index 77e1a99d17..29e28e06d2 100644
--- a/overview/prebid-universal-creative.md
+++ b/overview/prebid-universal-creative.md
@@ -11,40 +11,99 @@ nav_section: intro
# Prebid Universal Creative
{:.no_toc}
-The Prebid Universal Creative makes it easier for publishers to configure Prebid in their ad server. The Prebid Universal Creative provides a single creative configuration that can be used across many formats, platforms, devices, and ad servers.
+* TOC
+{:toc}
-Specifically, you need to use the Universal Creative in these scenarios:
+## Overview
-- AMP and Prebid SDK (these require loading creatives from cache)
-- when you need to support safeframes
-- when you need to support native
+The Prebid Universal Creative (PUC) is a collection of rendering routines
+that can pull a particular ad ID from Prebid's cache and do the right
+thing to display it. The scripts are generally entered into the ad server for
+when a Prebid ad has won the auction. There are a number of use cases:
+
+{: .table .table-bordered .table-striped }
+| Use Case | PUC file | Alternate Approach |
+| --- | --- | --- |
+| web banner: iframe | creative.js | [Banner and Outstream Video iframes](#banner-and-outstream-video-iframes) |
+| web banner: safeframe | creative.js | [Banner Safeframes](#banner-safeframes) |
+| web outstream video: iframe | creative.js | [Banner and Outstream Video iframes](#banner-and-outstream-video-iframes) |
+| web outstream video: safeframe | n/a | Outstream renderers each choose where to render differently, but none writes to the safeframe. |
+| AMP banner: always safeframe | creative.js | n/a |
+| native: iframe | native-render.js | n/a |
+| native: safeframe | native-render.js | n/a |
+
+The Prebid Universal Creative is the simplest approach for publishers to configure Prebid in their ad server. The PUC provides a creative configuration that can be used across several formats, platforms, devices, and ad servers.
+
+Here are the features of the PUC in various scenarios:
+
+### What the PUC does for Web iframe Banners/Outstream
+1. Simply calls the Prebid.js renderAd function
+
+### What the PUC does for Web Safeframe Banners
+1. Calls PostMessage to get the winning ad from Prebid.js
+1. Creates an iframe of the appropriate size and displays the winning ad within it
+
+### What the PUC does for AMP and Mobile Apps
+1. Updates the size of the iframe to the size of the winning ad.
+1. Retrieves the body of the creative from Prebid Cache based on the UUID
+1. If the 'burl' parameter is present, creates a tracking pixel. Includes special support for triggering the viewable billing url for mobile MRAID creatives.
+1. If the 'nurl' parameter is present, creates the appropriate HTML to fire the notice URL.
+1. If the 'wurl' parameter is present, creates a tracking pixel. This is needed for [Programmatic Guaranteed](/prebid-server/features/pg/pbs-pg-idx.html) support.
+1. Resolves any `${AUCTION_PRICE}` macro in the creative body.
+
+### What the PUC does for Native
+1. Retrieves the native attributes from the winning ad.
+1. Coordinates the rendering of the native ad using the template method specified by the publisher.
+
+## Alternate Approaches
+
+Some publishers prefer to not load the extra creative.js code at render time
+due to a tiny but measurable impact on measurement discrepancies.
+
+While Prebid recommends the use of creative.js because we regularly add
+features and fix bugs, publishers may choose to hardcode the functionality
+into their ad server creatives.
+
+They would do this differently for each of the scenarios below.
+
+### Alternate method for Banner and Outstream Video iframes
If you only ever need to display non-safeframed banner and outstream-video creatives, you may use
-the original simple approach of just calling the Prebid.js `renderAd` function directly:
+the simple approach of just calling the Prebid.js `renderAd` function directly:
```
```
-## How to Implement
+### Alternate Method for Banner Safeframes
+
+See the example at [https://github.com/prebid/Prebid.js/blob/master/integrationExamples/gpt/x-domain/creative.html](https://github.com/prebid/Prebid.js/blob/master/integrationExamples/gpt/x-domain/creative.html)
+
+This is basically just part of the PUC that's been isolated to be standalone.
+
+## More Information
### Google Ad Manager
-- [Step by Step Guide to Google Ad Manager Setup]({{site.baseurl}}/adops/step-by-step.html)
+- [Step by Step Guide to Google Ad Manager Setup](/adops/step-by-step.html)
### AMP
-- Adops: [Setting Up Prebid for AMP in Google Ad Manager]({{site.baseurl}}/adops/setting-up-prebid-for-amp-in-dfp.html)
-- Developer: [Show Prebid Ads on AMP Pages]({{site.baseurl}}/dev-docs/show-prebid-ads-on-amp-pages.html)
+- Adops: [Setting Up Prebid for AMP in Google Ad Manager](/adops/setting-up-prebid-for-amp-in-dfp.html)
+- Developer: [Show Prebid Ads on AMP Pages](/dev-docs/show-prebid-ads-on-amp-pages.html)
### Mobile App
-- [Step by Step Line Item Setup for Google Ad Manager]({{site.baseurl}}/prebid-mobile/adops-line-item-setup-dfp.html)
-- [Step by Step Line Item Setup for MoPub]({{site.baseurl}}/prebid-mobile/adops-line-item-setup-mopub.html)
+- [Step by Step Line Item Setup for Google Ad Manager](/prebid-mobile/adops-line-item-setup-dfp.html)
+- [Step by Step Line Item Setup for MoPub](/prebid-mobile/adops-line-item-setup-mopub.html)
+
+### Native
+
+- [Setting up Prebid Native in GAM](/adops/gam-native.html)
### AppNexus Publisher Adserver
-- [Setting up Prebid with the AppNexus Publisher Ad Server]({{site.baseurl}}/adops/setting-up-prebid-with-the-appnexus-ad-server.html)
+- [Setting up Prebid with the AppNexus Publisher Ad Server](/adops/setting-up-prebid-with-the-appnexus-ad-server.html)
### Other
-- [Send All Bids to the Ad Server - Ad Ops Setup]({{site.baseurl}}/adops/send-all-bids-adops.html)
+- [Send All Bids to the Ad Server - Ad Ops Setup](/adops/send-all-bids-adops.html)
diff --git a/overview/what-is-prebid-org.md b/overview/what-is-prebid-org.md
index 46ede93b71..ef0dfef76c 100644
--- a/overview/what-is-prebid-org.md
+++ b/overview/what-is-prebid-org.md
@@ -27,8 +27,7 @@ We focus on providing value-add to publishers and encourage the industry to depl
Prebid takes two approaches to accomplish this:
### Wrapper Code of Conduct
-Prebid members must agree to support the [Wrapper Code of Conduct](/wrapper_code_of_conduct.html
-). This ensures that all wrapper providers are operating within the same principles.
+Prebid members must agree to support the [Wrapper Code of Conduct](https://prebid.org/code-of-conduct/). This ensures that all wrapper providers are operating within the same principles.
### Trademark
We support wrappers based on Prebid technology with rights to the **Powered by Prebid** brand.
diff --git a/package-lock.json b/package-lock.json
index 36437ee5ff..13c6d55aa4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1123,7 +1123,6 @@
"merge-source-map": "^1.1.0",
"postcss": "^7.0.14",
"postcss-selector-parser": "^6.0.2",
- "prettier": "^1.18.2",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.9.0"
},
@@ -2345,7 +2344,6 @@
"dependencies": {
"anymatch": "~3.1.1",
"braces": "~3.0.2",
- "fsevents": "~2.1.2",
"glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
@@ -2694,21 +2692,26 @@
}
},
"node_modules/browserslist": {
- "version": "4.14.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz",
- "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==",
+ "version": "4.19.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
+ "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
"dev": true,
"dependencies": {
- "caniuse-lite": "^1.0.30001135",
- "electron-to-chromium": "^1.3.571",
- "escalade": "^3.1.0",
- "node-releases": "^1.1.61"
+ "caniuse-lite": "^1.0.30001312",
+ "electron-to-chromium": "^1.4.71",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.2",
+ "picocolors": "^1.0.0"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
}
},
"node_modules/bs-recipes": {
@@ -2896,10 +2899,14 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001150",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz",
- "integrity": "sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==",
- "dev": true
+ "version": "1.0.30001312",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
},
"node_modules/chalk": {
"version": "2.4.2",
@@ -2933,7 +2940,6 @@
"anymatch": "^2.0.0",
"async-each": "^1.0.1",
"braces": "^2.3.2",
- "fsevents": "^1.2.7",
"glob-parent": "^3.1.0",
"inherits": "^2.0.3",
"is-binary-path": "^1.0.0",
@@ -3151,9 +3157,9 @@
"dev": true
},
"node_modules/color-string": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
- "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz",
+ "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==",
"dev": true,
"dependencies": {
"color-name": "^1.0.0",
@@ -4250,9 +4256,9 @@
"dev": true
},
"node_modules/dns-packet": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
- "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
+ "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
"dev": true,
"dependencies": {
"ip": "^1.1.0",
@@ -4380,9 +4386,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.3.582",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz",
- "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==",
+ "version": "1.4.73",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.73.tgz",
+ "integrity": "sha512-RlCffXkE/LliqfA5m29+dVDPB2r72y2D2egMMfIy3Le8ODrxjuZNVo4NIC2yPL01N4xb4nZQLwzi6Z5tGIGLnA==",
"dev": true
},
"node_modules/elliptic": {
@@ -4822,9 +4828,9 @@
}
},
"node_modules/eventsource": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
- "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz",
+ "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==",
"dev": true,
"dependencies": {
"original": "^1.0.0"
@@ -7335,9 +7341,9 @@
}
},
"node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"node_modules/minipass": {
@@ -7604,9 +7610,9 @@
}
},
"node_modules/node-releases": {
- "version": "1.1.64",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz",
- "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
"dev": true
},
"node_modules/normalize-path": {
@@ -8167,9 +8173,9 @@
}
},
"node_modules/path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/path-to-regexp": {
@@ -8215,6 +8221,12 @@
"node": ">=0.12"
}
},
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
"node_modules/picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@@ -10733,9 +10745,9 @@
"dev": true
},
"node_modules/ssri": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
- "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz",
+ "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==",
"dev": true,
"dependencies": {
"figgy-pudding": "^3.5.1",
@@ -11411,10 +11423,20 @@
"dev": true
},
"node_modules/ua-parser-js": {
- "version": "0.7.22",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz",
- "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==",
- "dev": true,
+ "version": "0.7.31",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
+ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ }
+ ],
"engines": {
"node": "*"
}
@@ -11664,9 +11686,9 @@
}
},
"node_modules/url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"dev": true,
"dependencies": {
"querystringify": "^2.1.1",
@@ -11839,10 +11861,8 @@
"integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
"dev": true,
"dependencies": {
- "chokidar": "^3.4.1",
"graceful-fs": "^4.1.2",
- "neo-async": "^2.5.0",
- "watchpack-chokidar2": "^2.0.0"
+ "neo-async": "^2.5.0"
},
"optionalDependencies": {
"chokidar": "^3.4.1",
@@ -12414,9 +12434,9 @@
}
},
"node_modules/webpack/node_modules/ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+ "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
"dev": true,
"dependencies": {
"figgy-pudding": "^3.5.1"
@@ -15256,15 +15276,16 @@
}
},
"browserslist": {
- "version": "4.14.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz",
- "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==",
+ "version": "4.19.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
+ "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001135",
- "electron-to-chromium": "^1.3.571",
- "escalade": "^3.1.0",
- "node-releases": "^1.1.61"
+ "caniuse-lite": "^1.0.30001312",
+ "electron-to-chromium": "^1.4.71",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.2",
+ "picocolors": "^1.0.0"
}
},
"bs-recipes": {
@@ -15428,9 +15449,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001150",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz",
- "integrity": "sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==",
+ "version": "1.0.30001312",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
"dev": true
},
"chalk": {
@@ -15644,9 +15665,9 @@
"dev": true
},
"color-string": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
- "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz",
+ "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==",
"dev": true,
"requires": {
"color-name": "^1.0.0",
@@ -16568,9 +16589,9 @@
"dev": true
},
"dns-packet": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
- "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
+ "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
"dev": true,
"requires": {
"ip": "^1.1.0",
@@ -16684,9 +16705,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.582",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz",
- "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==",
+ "version": "1.4.73",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.73.tgz",
+ "integrity": "sha512-RlCffXkE/LliqfA5m29+dVDPB2r72y2D2egMMfIy3Le8ODrxjuZNVo4NIC2yPL01N4xb4nZQLwzi6Z5tGIGLnA==",
"dev": true
},
"elliptic": {
@@ -17075,9 +17096,9 @@
"dev": true
},
"eventsource": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
- "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz",
+ "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==",
"dev": true,
"requires": {
"original": "^1.0.0"
@@ -18318,9 +18339,9 @@
"dev": true
},
"ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
"internal-ip": {
@@ -19180,9 +19201,9 @@
}
},
"minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"minipass": {
@@ -19418,9 +19439,9 @@
}
},
"node-releases": {
- "version": "1.1.64",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz",
- "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
"dev": true
},
"normalize-path": {
@@ -19879,9 +19900,9 @@
"dev": true
},
"path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-to-regexp": {
@@ -19920,6 +19941,12 @@
"sha.js": "^2.4.8"
}
},
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@@ -22145,9 +22172,9 @@
"dev": true
},
"ssri": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
- "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz",
+ "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==",
"dev": true,
"requires": {
"figgy-pudding": "^3.5.1",
@@ -22701,9 +22728,9 @@
"dev": true
},
"ua-parser-js": {
- "version": "0.7.22",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz",
- "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==",
+ "version": "0.7.31",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
+ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==",
"dev": true
},
"uglify-js": {
@@ -22918,9 +22945,9 @@
}
},
"url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"dev": true,
"requires": {
"querystringify": "^2.1.1",
@@ -23284,9 +23311,9 @@
"dev": true
},
"ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+ "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
"dev": true,
"requires": {
"figgy-pudding": "^3.5.1"
diff --git a/package.json b/package.json
index 27b2226477..320ee697a4 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
- "watch": "npm run development -- --watch",
+ "watch": "bundle exec jekyll serve",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --nide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
diff --git a/partners/partners.md b/partners/partners.md
index 34e9fce27c..71a7cf6417 100644
--- a/partners/partners.md
+++ b/partners/partners.md
@@ -1,54 +1,15 @@
---
layout: page_v2
-title: Partners | Prebid
-description: Partners
+title: Membership
+description: Membership
sidebarType: 0
---
-# Prebid.Org Members
+# Prebid.Org Membership
-
-
Join Now
-
+This page has moved to [https://prebid.org/membership/](https://prebid.org/membership/)!
-Prebid.org was developed to bring together the oversight, guidance, and development capabilities of the ad tech community to solve the industryâs common technical hurdles. By structuring the organization with a tiered membership system, we can ensure that the organizationâs standards are upheld and appropriately funded, and that Prebid solutions continue to be built by and made available to the Prebid community.
-
-Join your industry peers in helping build and shape the ad tech ecosystem.
-
-
-
-## Why Join?
-
-Companies join Prebid.org because they want to take an active role in supporting the growth and evolution of the ad tech ecosystem:
-- Network with other members of Prebid.org.
-- Support the community by helping fund Prebid services and events.
-- Demonstrate thought leadership in the ad tech space.
-- Promote Prebid projects for faster market adoption.
-- Help define the technologies that shape of the industry by participating in our Slack workspace and joining the [Product Management Committees](/overview/prebid-management-committees.html).
-
-
-
-## How To Join
-
-1. Download and review the [Prebid.org Bylaws](https://files.prebid.org/docs/Prebid_org_bylaws_jun_2019.pdf).
-2. Complete the [Prebid.org Membership Agreement](https://na3.docusign.net/Member/PowerFormSigning.aspx?PowerFormId=610f838a-3001-4999-aca0-6682cbcac66c&env=na3-eu1&acct=2160069d-b42e-4c0a-9528-3a58d1c58bf9&v=2).
-3. Prebid will consider your membership application.
-
-
-
-## Membership Levels and Pricing
-
-{: .table .table-bordered .table-striped }
-| | Board Seat | PMC Participation | Private Slack Instance | Participate in Prebid.org Events | Prebid.org Email Address | Logo on Prebid.org Website | Annual Fees |
-|---------------------|-----------------------------------------------------------------------|-------------------|------------------------|----------------------------------|--------------------------|----------------------------|-------------|
-| Leader Members | â | â | â | â | â | â | $40,000 |
-| Technology Partners | As a Group, Technology members elect a representative to the board | â | â | â | â | â | $25,000 |
-| Publishers | As a Group, Publisher members elect a representative to the board | â | â | â | â | â | $5,000 |
-| Buyers | As a Group, Buyer members elect a representative to the board | â | â | â | â | â | $5,000 |
-| Community | â | â | â | â | â | â | Free |
-
-Have questions about becoming a member, email us at [membership@prebid.org](mailto:membership@prebid.org).
-
-
-
+## Related Reading
+- [Why Prebid](https://prebid.org/why-prebid/)
+- [Code of Conduct](https://prebid.org/code-of-conduct/)
diff --git a/prebid-mobile/adops-line-item-setup-mopub.md b/prebid-mobile/adops-line-item-setup-mopub.md
deleted file mode 100644
index cd5d578c87..0000000000
--- a/prebid-mobile/adops-line-item-setup-mopub.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-layout: page_v2
-title: Setup Line Items for MoPub
-description: Setup line items for MoPub
-pid: 1
-top_nav_section: prebid-mobile
-nav_section: prebid-mobile-adops
-sidebarType: 3
----
-
-
-
-
-# Step-by-Step Line Item Setup for MoPub
-
-* TOC
-{:toc }
-
-This page provides step-by-step instructions to set up Prebid Mobile line items for MoPub to serve ads on app with the Prebid SDK. It is using the Universal Prebid Creative.
-
-## Step 1. Add a line item
-
-- Set the **Type & Priority** to **Non-guaranteed** and **12**, respectively, so the line item will compete with all other demand
-- Set the **Rate** to the price you want to target, for example $0.50, in the screenshot below
-
-![MoPub Line Item Setup]({{site.github.url}}/assets/images/prebid-mobile/adops-line-item-setup-mopub/mopub1.png "Example MoPub Line Item"){: .pb-md-img :}
-
-- In the **Advanced Targeting** section, in **Keywords** target **hb_pb:0.50**
-
-![MoPub Advanced Targeting Setup]({{site.github.url}}/assets/images/prebid-mobile/adops-line-item-setup-mopub/mopub2.png "Example MoPub Advanced Targeting"){: .pb-md-img :}
-
-For each level of pricing granularity you need, you will have to set up one line item/creative pair.
-
-Line items must be set up to target custom keywords that include bid price information. The bid price keywords tell you how much the buyer bid on the impression.
-
-By default, `Prebid Mobile` will send the highest bid price to Google Ad Manager using the keyword `hb_pb` but will also pass the keys `hb_pb_BIDDERCODE`. You can decide to create one set of line items for all bidders or one set of line items for each bidder.
-
-## Step 2. Add creatives to your line item
-
-Banner creatives must be HTML banners with the **Format** set to **Banner** that include the code shown below.
-
-![MoPub Creative Setup]({{site.github.url}}/assets/images/prebid-mobile/adops-line-item-setup-mopub/mopub3.png "Example MoPub Creative"){: .pb-md-img :}
-
-The **hb_cache_id** variable stands for the cache id that will load the ad markup from the bid from Prebid Cache. Within each line item, for each ad unit size there should be one creative with this content.
-
-
-{: .alert.alert-success :}
-You can always get the latest version of the creative code below from [the Mobile example creative file in our GitHub repo](https://github.com/prebid/prebid-universal-creative/blob/master/template/amp/dfp-creative.html).
-
-{% highlight javascript %}
-
-
-
-
-{% endhighlight %}
-
-## Step 3. Duplicate line items
-
-Duplicate your line items according to your [price granularity]({{site.github.url}}/prebid-mobile/adops-price-granularity.html) setting.
diff --git a/prebid-mobile/adops-setup-full-screen-video-mopub.md b/prebid-mobile/adops-setup-full-screen-video-mopub.md
deleted file mode 100644
index 429c0488d3..0000000000
--- a/prebid-mobile/adops-setup-full-screen-video-mopub.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-layout: page_v2
-title: Setup Rewarded Video for MoPub
-description: Setup Full Screen Video for MoPub
-pid: 1
-top_nav_section: prebid-mobile
-nav_section: prebid-mobile-adops
-sidebarType: 3
----
-
-# Step-by-Step Line Item Setup for Full-screen Video on MoPub
-
-* TOC
-{:toc }
-
-This page provides step-by-step instructions to set up full-screen video line items on MoPub to be used with the Prebid Mobile SDK.
-
-## Step 1. Create full screen adUnit
-
-
-## Step 2. Add a line item
-In the *Add a Line Item* section:
-1. For the *Type and Priority* settings, select *Non-Guaranteed* as the type and set the priority to *12*. This ensures the line item will compete with all other demand.
-2. Set the Rate to the price you want to target.
-
-3. In the *Advanced Targeting* section, set the target for *Keywords* to `hb_pb:0.50`
-
-
-For each level of pricing granularity required, one line item/creative pairing will need to be set up.
-
-Line items must be set up to target custom keywords that include bid price information. The bid price keywords will contain how much the buyer bid on the impression.
-
-Prebid Mobile, by default, will send the highest bid price to MoPub using the keyword `hb_pb` but will also submit the key `hb_pb_BIDDERCODE` for each bidder. You can decide to create one set of line items for all bidders or one set of line items for each bidder.
-
-## Step 3. Add creatives to your line item
-Full-screen video creatives must have a *VAST tag* with the *Format* set to *Fullscreen* that includes the code below:
-```
-
-
-
- MoPub
-
-
-
-
-
-```
-
-
-
-The `hb_uuid` variable value is the cache id that will load the ad markup from the bid stored in Prebid Cache. Within each line item, for each ad unit size, there should be one creative with this content.
-
-The XML can be constructed by providing the VAST tag URL as:
-`https://%%KEYWORD:hb_cache_host%%%%KEYWORD:hb_cache_path%%?uuid=%%KEYWORD:hb_uuid%%`
-
-## Step 4. Duplicate line items
-Duplicate your line items according to your [price granularity](/prebid-mobile/adops-price-granularity.html) setting.
diff --git a/prebid-mobile/adops-setup-rewarded-video-mopub.md b/prebid-mobile/adops-setup-rewarded-video-mopub.md
deleted file mode 100644
index 839a8593e7..0000000000
--- a/prebid-mobile/adops-setup-rewarded-video-mopub.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-layout: page_v2
-title: Setup Rewarded Video for MoPub
-description: Setup Rewarded Video for MoPub
-pid: 1
-top_nav_section: prebid-mobile
-nav_section: prebid-mobile-adops
-sidebarType: 3
----
-
-# Step-by-Step Line Item Setup for Rewarded Video on MoPub
-
-* TOC
-{:toc }
-
-This page provides step-by-step instructions to set up rewarded-video line items on MoPub to be used with the Prebid Mobile SDK.
-
-## Step 1. Add a line item
-
- In the *Add a Line Item* section:
- 1. For the *Type and Priority* settings, select *Non-Guaranteed* as the type and set the priority to *12*. This ensures the line item will compete with all other demand.
- 2. Set the Rate to the price you want to target.
-
- 3. In the *Advanced Targeting* section, set the target for *Keywords* to `hb_pb:0.50`
-
-
-For each level of pricing granularity required, one line item/creative pairing will need to be set up.
-
-Line items must be set up to target custom keywords that include bid price information. The bid price keywords will contain how much the buyer bid on the impression.
-
-Prebid Mobile, by default, will send the highest bid price to MoPub using the keyword `hb_pb` but will also submit the key `hb_pb_BIDDERCODE` for each bidder. You can decide to create one set of line items for all bidders or one set of line items for each bidder.
-
-## Step 2. Add creatives to your line item
-Rewarded video creatives must have a *VAST tag* with the *Format* set to *Rewarded Video* that includes the code below:
-
-```
-
-
-
- MoPub
-
-
-
-
-```
-
-
-
-The `hb_uuid` variable value is the cache id that will load the ad markup from the bid stored in Prebid Cache. Within each line item, for each ad unit size, there should be one creative with this content.
-
-The XML can be constructed by providing the VAST tag URL as:
-`https://%%KEYWORD:hb_cache_host%%%%KEYWORD:hb_cache_path%%?uuid=%%KEYWORD:hb_uuid%%`
-
-## Step 3. Duplicate line items
-Duplicate your line items according to your [price granularity](/prebid-mobile/adops-price-granularity.html) setting.
diff --git a/prebid-mobile/modules/modules-overview.md b/prebid-mobile/modules/modules-overview.md
new file mode 100644
index 0000000000..6db9db2a90
--- /dev/null
+++ b/prebid-mobile/modules/modules-overview.md
@@ -0,0 +1,47 @@
+---
+
+layout: page_v2
+title: Prebid Modules Overview
+description: What is Prebid.js
+sidebarType: 2
+
+---
+
+# Prebid Mobile Modules Overview
+
+The design of Prebid Mobile is to provide a lightweight SDK with minimal logic, leveraging Prebid Server to handle requests for demand and a much logic as possible as far as auction dynamics go. Keeping with the spirit of this design principle, Prebid Mobile supports a modular architecture to add in new feature sets, that can potentially load the size of Prebid SDK, into components publishers can select to build when assembling their apps. Modularity follows the approach used across the Prebid suite of products (Prebid JS and Prebid Server) to help reduce the overall size of the prebid library/package.
+
+This page will serve as the central location to link all modular packages, descriptions, and resources for modular links.
+
+## Benefits and Features
+
+Some of the benefits to the modular architecture are the following:
+
+- Allows the ability to customize the Prebid SDK to the developer needs
+- Allows for the reduced size of Prebid SDK, adding only modules need
+- Allows for the community to add custom and/or 3rd party code without adding code to the core of Prebid SDK
+- Reduces the size of Prebid SDK
+
+## How It Works
+
+The following diagram describes the overall architecture of modularity prior and after release of 1.12 for both iOS and Android. Both platforms share the same architecture.
+
+![Modularity](/assets/images/prebid-mobile/modules/modularity.png)
+
+
+Prior to Prebid SDK 1.12 there were two targets(PrebidMobile and PrebidMobileCore) which use the same product name and module name(PrebidMobile). These two modules are the same, they include the same source files. Since no new modules have been created prior to 1.12, new modules can be added and built
+
+1. Set a unique product name and module name for each product:
+ * PrebidMobile instead of PrebidMobileCore. It will allows us to seamless migration because it doesn't cause breaking changes. All publishers which now use PrebidMobileCore or PrebidMobile don't need to replace module names in source files
+ * PrebidMobileFull instead of PrebidMobile. PrebidMobileFull will not include any source files it will be just a name of dependency which will be responsible to add all sub-dependencies
+1. Set dependencies between them
+1. Edit final distribution binaries(FatFramework, CocoaPods, Carthage, SPM, cross-project dependency)
+
+Usage:
+
+```bash
+import PrebidMobile
+import PrebidMobileRendering
+```
+
+
diff --git a/prebid-mobile/modules/rendering/android-sdk-customization-controls.md b/prebid-mobile/modules/rendering/android-sdk-customization-controls.md
new file mode 100644
index 0000000000..6c7e9ade5a
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-customization-controls.md
@@ -0,0 +1,76 @@
+---
+
+layout: page_v2
+title: Ad Experience Controls
+description: Customization of ad expirience
+sidebarType: 2
+
+---
+
+# Ad Experience Controls
+
+Prebid SDK provides an API way to customize its behaviour.
+
+> NOTE: In the nearest future the Server Side Configuration will be supported as well. Follow this [feature request](https://github.com/prebid/prebid-server/issues/2186) for the details.
+
+
+## Rendering Controls
+
+The following properties allow to customize the rendering of Video Interstitial Ads.
+
+### Max Video Duration
+
+The `maxVideoDuration` indicates the maximum available playback time in seconds.
+If the value in the **Duration** tag is bigger than the given value SDK will fail to load ad, providing a respective error message.
+
+### Application Muted
+
+The `isMuted` property indicates whether the ad should run playback with sound or not.
+Default value - **false**.
+
+### Close Button Area
+
+The `closeButtonArea` property indicates the percent of device screen which the close button should occupy. The possible values are from **0** to **1**.
+
+### Close Button Position
+
+The `closeButtonPosition` property indicates the position of the close button on the screen. The possible values are **Position.BOTTOM_LEFT** and **Position.TOP_RIGHT**. The default value is **Position.TOP_RIGHT**.
+
+The example:
+
+![Close Button Position - Top Right](/assets/images/prebid-mobile/modules/rendering/ad-experience-android-close-button-possition-top-left.png){:width="250px"}
+
+### Skip Button Area
+
+The `skipButtonArea` property indicates the percent of device screen which the skip button should occupy. The possible values are from **0** to **1**.
+
+### Skip Button Position
+
+The `skipButtonPosition` property indicates the position of the close button on the screen. The possible values are **Position.BOTTOM_LEFT** and **Position.TOP_RIGHT**. The default value is **Position.BOTTOM_LEFT**.
+
+The example:
+
+![Close Button Position - Top Right](/assets/images/prebid-mobile/modules/rendering/ad-experience-android-skip-button-possition-top-left.png){:width="250px"}
+
+### Skip Delay
+
+The `skipDelay` property indicates the number of seconds which should be passed from the start of playback until the skip or close button should be shown. The default value is **10**.
+
+The code sample:
+
+``` kotlin
+adUnit = MediationInterstitialAdUnit(
+ activity,
+ configId,
+ EnumSet.of(AdUnitFormat.DISPLAY),
+ mediationUtils
+)
+
+adUnit?.setMaxVideoDuration(30)
+adUnit?.setCloseButtonArea(0.1)
+adUnit?.setSkipDelay(5)
+adUnit?.setSkipButtonArea(0.1)
+adUnit?.setSkipButtonPosition(Position.TOP_RIGHT)
+adUnit?.setCloseButtonPosition(Position.BOTTOM_LEFT)
+```
+
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md
new file mode 100644
index 0000000000..68af32f417
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md
@@ -0,0 +1,411 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering GAM Line Item Setup
+description: Prebid Mobile Rendering Modules GAM line item setup
+sidebarType: 2
+
+---
+
+# AdMob Integration
+
+The integration of Prebid Mobile with Google AdMob assumes that the publisher has an AdMob account and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app.
+
+See the [Google's integration documentation](https://developers.google.com/admob/android/quick-start) for the AdMob integration details.
+
+Prebid is integrated into the AdMob monetization via adapters.
+
+## AdMob Integration Overview
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-admob.png)
+
+**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid.
+
+**Step 3** GMA SDK makes an ad request. AdMob returns the mediation chain with respective ad sources.
+
+**Step 4** For each prebid's ad source, the GMA SDK sequentially instantiates an adapter.
+
+**Step 5** The adapter verifies the targeting keywords of the winning bid and the server properties of the given ad source. If they match adapter will render the winning bid. Otherwise, it will fail with "no ad" immediately and the next ad source will instantiate the same adapter but for another set of server params.
+
+Prebid Mobile supports these ad formats:
+
+- Display Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+- Native
+
+They can be integrated using these mediation API categories:
+
+- [**Banner API**](#banner-api) - for *Display Banner*
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+- [**Native API**](#native-api) - for *Native Ads*
+
+
+## Init Prebid Rendering Module
+
+To start running bid requests you have to set the Prebid Server **Host** and **Account Id** and then initilize the SDK with application context. The best place for this is the `onCreate()` method of your Application class.
+
+```
+PrebidMobile.setBidServerHost(HOST)
+PrebidMobile.setAccountId(YOUR_ACCOUNT_ID)
+
+// Init SDK
+PrebidMobile.setApplicationContext(this)
+```
+
+> **NOTE:** The account ID is an identifier of the **Stored Request**.
+
+### Prebid Adapters
+
+To integrate Prebid Adapters just add the following lines into your build.gradle files:
+
+Root build.gradle
+
+```
+allprojects {
+ repositories {
+ ...
+ mavenCentral()
+ ...
+ }
+}
+```
+
+App module build.gradle:
+
+```
+implementation('org.prebid:prebid-mobile-sdk-admob-adapters:x.x.x')
+```
+
+## Banner API
+
+Integration example:
+
+
+``` kotlin
+// 1. Create AdView and AdRequest
+bannerView = AdView(activity)
+bannerView?.adSize = AdSize.BANNER
+bannerView?.adUnitId = adUnitId
+
+val extras = Bundle()
+val request = AdRequest
+ .Builder()
+ .addCustomEventExtrasBundle(PrebidBannerAdapter::class.java, extras)
+ .build()
+
+// 2. Create AdMobBannerMediationUtils
+val mediationUtils = AdMobBannerMediationUtils(extras, bannerView)
+
+// 3. Create MediationBannerAdUnit
+adUnit = MediationBannerAdUnit(
+ wrapper.context,
+ configId,
+ org.prebid.mobile.rendering.bidding.data.AdSize(width, height),
+ mediationUtils
+)
+adUnit?.setRefreshInterval(autoRefreshTime / 1000)
+
+// 4. Make a bid request
+adUnit?.fetchDemand { result ->
+ Log.d("Prebid", "Fetch demand result: $result")
+
+ // 5. Request the ad
+ bannerView?.loadAd(request)
+}
+```
+
+#### Step 1: Create AdView and AdRequest
+
+This step is totally the same as for the original [AdMob integration](https://developers.google.com/admob/android/banner). You don't have to make any modifications here.
+
+
+#### Step 2: Create AdMobMediationBannerUtils
+
+The `AdMobBannerMediationUtils` is a helper class, wich performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationBannerAdUnit
+
+The `MediationBannerAdUnit` is part of the prebid mediation API. This class is responsible for making the bid request and providing the winning bid and targeting keywords to the mediating SDKs.
+
+#### Step 4: Make a bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters.
+
+## Interstitial API
+
+Integration example:
+
+``` kotlin
+// 1. Create AdRequest
+val extras = Bundle()
+val request = AdRequest
+ .Builder()
+ .addCustomEventExtrasBundle(PrebidInterstitialAdapter::class.java, extras)
+ .build()
+
+// 2. Create AdMobInterstitialMediationUtils
+val mediationUtils = AdMobInterstitialMediationUtils(extras)
+
+// 3. Create MediationInterstitialAdUnit
+adUnit = MediationInterstitialAdUnit(
+ activity,
+ configId,
+ AdUnitFormat.DISPLAY,
+ mediationUtils
+)
+
+// 4. Make a bid request
+adUnit?.fetchDemand { result ->
+ Log.d("Prebid", "Fetch demand result: $result")
+
+ // 5. Make an ad request
+ InterstitialAd.load(activity, adUnitId, request, object : InterstitialAdLoadCallback() {
+ override fun onAdLoaded(interstitial: InterstitialAd) {
+ interstitialAd = interstitial
+
+ // 6. Display the ad
+ interstitialAd?.show(activity)
+ }
+
+ override fun onAdFailedToLoad(error: LoadAdError) {
+ interstitialAd = null
+ }
+ })
+}
+```
+
+#### Step 1: Create AdRequest
+
+This step is totally the same as for original [AdMob integration](https://developers.google.com/admob/android/interstitial). You don't have to make any modifications here.
+
+#### Step 2: Create AdMobInterstitialMediationUtils
+
+The `AdMobInterstitialMediationUtils` is a helper class, wich performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to adapters.
+
+#### Step 3: Create MediationInterstitialAdUnit
+
+The `MediationInterstitialAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing the winning bid and targeting keywords to mediating SDKs.
+
+The **default** ad format for interstitial is **DISPLAY**. In order to make a `multiformat bid request`, set the respective values into the `adUnitFormats` parameter.
+
+```
+adUnit = MediationInterstitialAdUnit(
+ activity,
+ configId,
+ EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO),
+ mediationUtils
+ )
+```
+
+#### Step 4: Make a bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an ad reuest
+
+Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters.
+
+#### Step 6: Display an ad
+
+Once you receive the ad it will be ready for display. You can show interstitial right in the listener or later according to the app logic.
+
+
+## Rewarded API
+
+Integration example:
+
+``` kotlin
+// 1. Create AsRequest
+val extras = Bundle()
+val request = AdRequest
+ .Builder()
+ .addNetworkExtrasBundle(PrebidRewardedAdapter::class.java, extras)
+ .build()
+
+// 2. Create AdMobRewardedMediationUtils
+val mediationUtils = AdMobRewardedMediationUtils(extras)
+
+// 3. Create MediationRewardedVideoAdUnit
+adUnit = MediationRewardedVideoAdUnit(activity, configId, mediationUtils)
+
+// 4. Make a bid request
+adUnit?.fetchDemand { result ->
+ Log.d("Prebid", "Fetch demand result: $result")
+
+ // 5. Make an ad request
+ RewardedAd.load(activity, adUnitId, request, object : RewardedAdLoadCallback() {
+ override fun onAdLoaded(ad: RewardedAd) {
+ Log.d(TAG, "Ad was loaded.")
+ rewardedAd = ad
+
+ // 6. Display an ad
+ rewardedAd?.show(activity) { rewardItem ->
+ val rewardAmount = rewardItem.amount
+ val rewardType = rewardItem.type
+ Log.d(TAG, "User earned the reward ($rewardAmount, $rewardType)")
+ }
+ }
+
+ override fun onAdFailedToLoad(adError: LoadAdError) {
+ Log.e(TAG, adError.message)
+ rewardedAd = null
+ }
+ })
+}
+```
+
+#### Step 1: Create AdRequest
+
+This step is totally the same as for the original [AdMob integration](https://developers.google.com/admob/android/rewarded). You don't have to make any modifications here.
+
+#### Step 2: Create AdMobRewardedMediationUtils
+
+The `AdMobRewardedMediationUtils ` is a helper class, wich performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to adapters.
+
+#### Step 3: Create MediationRewardedVideoAdUnit
+
+The `MediationRewardedVideoAdUnit` is part of the prebid mediation API. This class is responsible for making bid request and managing the winning bid.
+
+#### Step 4: Make a bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an ad reuest
+
+Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters.
+
+#### Step 6: Display an ad
+
+Once you receive the ad it will be ready for display. You can show interstitial right in the listener or later according to the app logic.
+
+## Native API
+
+Integration example:
+
+```
+// 1. Create AdLoader and AdRequest
+val nativeAdOptions = NativeAdOptions
+ .Builder()
+ .build()
+
+val adLoader = AdLoader
+ .Builder(wrapper.context, adUnitId)
+ .forNativeAd { ad: NativeAd ->
+ nativeAd = ad
+ createCustomView(wrapper, nativeAd!!)
+ }
+ .withAdListener(object : AdListener() {
+ override fun onAdFailedToLoad(adError: LoadAdError) {
+ Log.e(TAG, "Error: ${adError.message}")
+ }
+ })
+ .withNativeAdOptions(nativeAdOptions)
+ .build()
+
+val extras = Bundle()
+val adRequest = AdRequest
+ .Builder()
+ .addCustomEventExtrasBundle(PrebidNativeAdapter::class.java, extras)
+ .build()
+
+// 2. Create Native AdUnit
+val nativeAdUnit = NativeAdUnit(configId)
+
+// 3. Configure NativeAdUnit
+configureNativeAdUnit(nativeAdUnit)
+
+// 4. Make a bid request
+nativeAdUnit.fetchDemand(extras) { resultCode ->
+ Log.d(TAG, "Fetch demand result: $resultCode")
+
+ // 5. Make an ad request
+ adLoader.loadAd(adRequest)
+}
+```
+
+
+#### Step 1: Create AdRequest
+
+Prepare the `AdLoader` and `AdRequest` objects before you make the bid request. They are needed for prebid mediation utils. Follow the [AdMob integration instructions](https://developers.google.com/admob/android/native/start) for this step.
+
+#### Step 2: Create NativeAdUnit
+
+The `NativeAdUnit` is responsible for making bid requests. Once the bid responce is received you can load an ad from AdMob.
+
+#### Step 3: Configure NativeAdUnit
+
+The bid request for native ad should have a descrition of expected assets. The full spec for the Native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the assets array and configuring the `NativeAdUnit`:
+
+``` kotlin
+private fun configureNativeAdUnit(nativeAdUnit: NativeAdUnit) {
+
+ // Configure Ad Unit
+ nativeAdUnit.setContextType(NativeAdUnit.CONTEXT_TYPE.SOCIAL_CENTRIC)
+ nativeAdUnit.setPlacementType(NativeAdUnit.PLACEMENTTYPE.CONTENT_FEED)
+ nativeAdUnit.setContextSubType(NativeAdUnit.CONTEXTSUBTYPE.GENERAL_SOCIAL)
+
+ // Create the list of required assets
+ val title = NativeTitleAsset()
+ title.setLength(90)
+ title.isRequired = true
+ nativeAdUnit.addAsset(title)
+
+ val icon = NativeImageAsset()
+ icon.imageType = NativeImageAsset.IMAGE_TYPE.ICON
+ icon.wMin = 20
+ icon.hMin = 20
+ icon.isRequired = true
+ nativeAdUnit.addAsset(icon)
+
+ val image = NativeImageAsset()
+ image.imageType = NativeImageAsset.IMAGE_TYPE.MAIN
+ image.hMin = 200
+ image.wMin = 200
+ image.isRequired = true
+ nativeAdUnit.addAsset(image)
+
+ val data = NativeDataAsset()
+ data.len = 90
+ data.dataType = NativeDataAsset.DATA_TYPE.SPONSORED
+ data.isRequired = true
+ nativeAdUnit.addAsset(data)
+
+ val body = NativeDataAsset()
+ body.isRequired = true
+ body.dataType = NativeDataAsset.DATA_TYPE.DESC
+ nativeAdUnit.addAsset(body)
+
+ val cta = NativeDataAsset()
+ cta.isRequired = true
+ cta.dataType = NativeDataAsset.DATA_TYPE.CTATEXT
+ nativeAdUnit.addAsset(cta)
+
+ // Create the list of required event trackers
+ val methods: ArrayList = ArrayList()
+ methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.IMAGE)
+ methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.JS)
+ try {
+ val tracker = NativeEventTracker(NativeEventTracker.EVENT_TYPE.IMPRESSION, methods)
+ nativeAdUnit.addEventTracker(tracker)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+}
+```
+
+#### Step 4: Make a bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: make an ad request
+
+Now just load a native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/android/native/start). Everything else will be handled by GMA SDK and prebid adapters.
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-gam-native.md b/prebid-mobile/modules/rendering/android-sdk-integration-gam-native.md
new file mode 100644
index 0000000000..4bfe7bdc01
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration-gam-native.md
@@ -0,0 +1,166 @@
+---
+
+layout: page_v2
+title: Google Ad Manager Integration - Native
+description: Examples of integration native ads with GAM
+sidebarType: 2
+
+---
+
+# GAM: Native Ads Integration
+
+## Native Ads
+
+The general integration scenario requires these steps from publishers:
+
+1. Prepare the ad layout.
+2. Create Native Ad Unit and appropriate GAM ad loader.
+3. Configure the Native Ad unit using [NativeAdConfiguration](rendering-native-ad-configuration.html).
+ * Provide the list of **Native Assets** representing the ad's structure.
+ * Tune other general properties of the ad.
+4. Make a bid request.
+5. Prepare publisherAdRequest using `GamUtils.prepare`
+6. After receiving response from GAM - check if prebid has won and find native ad using `GamUtils`
+7. Bind the winner data from the native ad response with the layout.
+
+``` kotlin
+val builder = AdManagerAdRequest.Builder()
+val publisherAdRequest = builder.build()
+nativeAdUnit?.fetchDemand { result ->
+ val fetchDemandResult = result.fetchDemandResult
+ if (fetchDemandResult != FetchDemandResult.SUCCESS) {
+ loadGam(publisherAdRequest)
+ return@fetchDemand
+ }
+
+ GamUtils.prepare(publisherAdRequest, result)
+ loadGam(publisherAdRequest)
+}
+```
+
+**NOTE:** `loadGam` method is creating GAM adLoader and executing `loadAd(publisherAdRequest)`.
+
+
+Example of handling NativeAd response (the same applies to Custom):
+
+``` kotlin
+private fun handleNativeAd(nativeAd: NativeAd) {
+ if (GamUtils.didPrebidWin(nativeAd)) {
+ GamUtils.findNativeAd(nativeAd) {
+ inflateViewContentWithPrebid(it)
+ }
+ }
+ else {
+ inflateViewContentWithNative(nativeAd)
+ }
+}
+```
+
+## Native Styles
+
+[See Native Ads Guideline page](rendering-native-guidelines.html) for more details about SDK integration and supported ad types.
+
+Integration Example:
+
+``` kotlin
+// 1. Create banner custom event handler for GAM ad server.
+val eventHandler = GamBannerEventHandler(requireContext(), GAM_AD_UNIT, GAM_AD_SIZE)
+
+// 2. Create a bannerView instance and provide GAM event handler
+bannerView = BannerView(requireContext(), configId, eventHandler)
+// (Optional) set an event listener
+bannerView?.setBannerListener(this)
+
+// 3. Provide NativeAdConfiguration
+val nativeAdConfiguration = createNativeAdConfiguration()
+bannerView?.setNativeAdConfiguration(nativeAdConfiguration)
+
+// Add bannerView to your viewContainer
+viewContainer?.addView(bannerView)
+
+// 4. Execute ad loading
+bannerView?.loadAd()
+```
+
+#### Step 1: Create Event Handler
+
+GAM's event handlers are special containers that wrap GAM Ad Views and help to manage collaboration between GAM and Prebid views.
+
+**Important:** you should create and use a unique event handler for each ad view.
+
+To create the event handler you should provide a GAM Ad Unit Id and the list of available sizes for this ad unit.
+
+**Note:** There is a helper function `convertGamAdSize` in GamBannerEventHandler to help you convert GAM AdSize into Prebid AdSize.
+
+
+#### Step 2: Create Ad View
+
+**BannerView** - is a view that will display the particular ad. It should be added to the UI. To create it you should provide:
+
+- **configId** - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- **eventHandler** - the instance of the banner event handler
+
+Also, you should add the instance of `BannerView` to the UI.
+
+#### Step 3: Create and provide NativeAdConfiguration
+
+NativeAdConfiguration creation example:
+
+``` kotlin
+private fun createNativeAdConfiguration(): NativeAdConfiguration {
+ val nativeAdConfiguration = NativeAdConfiguration()
+ nativeAdConfiguration.contextType = NativeAdConfiguration.ContextType.SOCIAL_CENTRIC
+ nativeAdConfiguration.placementType = NativeAdConfiguration.PlacementType.CONTENT_FEED
+ nativeAdConfiguration.contextSubType = NativeAdConfiguration.ContextSubType.GENERAL_SOCIAL
+
+ val methods = ArrayList()
+ methods.add(NativeEventTracker.EventTrackingMethod.IMAGE)
+ methods.add(NativeEventTracker.EventTrackingMethod.JS)
+ val eventTracker = NativeEventTracker(NativeEventTracker.EventType.IMPRESSION, methods)
+ nativeAdConfiguration.addTracker(eventTracker)
+
+ val assetTitle = NativeAssetTitle()
+ assetTitle.len = 90
+ assetTitle.isRequired = true
+ nativeAdConfiguration.addAsset(assetTitle)
+
+ val assetIcon = NativeAssetImage()
+ assetIcon.type = NativeAssetImage.ImageType.ICON
+ assetIcon.wMin = 20
+ assetIcon.hMin = 20
+ assetIcon.isRequired = true
+ nativeAdConfiguration.addAsset(assetIcon)
+
+ val assetImage = NativeAssetImage()
+ assetImage.hMin = 20
+ assetImage.wMin = 200
+ assetImage.isRequired = true
+ nativeAdConfiguration.addAsset(assetImage)
+
+ val assetData = NativeAssetData()
+ assetData.len = 90
+ assetData.type = NativeAssetData.DataType.SPONSORED
+ assetData.isRequired = true
+ nativeAdConfiguration.addAsset(assetData)
+
+ val assetBody = NativeAssetData()
+ assetBody.isRequired = true
+ assetBody.type = NativeAssetData.DataType.DESC
+ nativeAdConfiguration.addAsset(assetBody)
+
+ val assetCta = NativeAssetData()
+ assetCta.isRequired = true
+ assetCta.type = NativeAssetData.DataType.CTA_TEXT
+ nativeAdConfiguration.addAsset(assetCta)
+
+ nativeAdConfiguration.nativeStylesCreative = nativeStylesCreative
+
+ return nativeAdConfiguration
+}
+```
+
+See more NativeAdConfiguration options [here](rendering-native-ad-configuration.html).
+
+#### Step 4: Load the Ad
+
+Call the `loadAd()` method to start an In-App Bidding flow.
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md
new file mode 100644
index 0000000000..636fb73f79
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md
@@ -0,0 +1,330 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering GAM Line Item Setup
+description: Prebid Mobile Rendering Modules GAM line item setup
+sidebarType: 2
+
+---
+
+# Google Ad Manager Integration
+
+The integration of Prebid Rendering API with Google Ad Manager (GAM) assumes that publisher has an account on GAM and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app project.
+
+
+If you do not have GAM SDK in the app yet, refer the the [Google Integration Documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start).
+
+Prebid Rendering API was tested with **GAM SDK 20.4.0**.
+
+
+## GAM Integration Overview
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-GAM.png)
+
+**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid.
+
+**Step 3** Prebid Rendering Module via GAM Event Handler sets up the targeting keywords into the GAM's ad unit.
+
+**Step 4** GMA SDK makes an ad request. GAM returns the winned line item.
+
+**Step 5** Basing on the ad response Prebid GAM Event Handler defines which line item has won on the GAM - the Prebid's one or another ad source on GAM.
+
+**Step 6** The winner is displayed in the app with the respective rendering engine.
+
+Prebid Rendering API supports these ad formats:
+
+- Display Banner
+- Video Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+
+[//]: # (- Native)
+[//]: # (- Native Styles)
+
+They can be integrated using these API categories.
+
+- [**Banner API**](#banner-api) - for *Display Banner* and *Outstream Video*
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+
+[//]: # (- [**Native API**](android-sdk-integration-gam-native.html) - for *Native Ads*)
+
+
+## Init Prebid Rendering Module
+
+To start running bid requests you have to set the Prebid Server **Host** and **Account Id** and then initilize the SDK with application context. The best place for this is the `onCreate()` method of your Application class.
+
+```
+PrebidMobile.setBidServerHost(HOST)
+PrebidMobile.setAccountId(YOUR_ACCOUNT_ID)
+
+// Init SDK
+PrebidMobile.setApplicationContext(this)
+```
+
+> **NOTE:** The account ID is an identifier of the **Stored Request**.
+
+### Event Handlers
+
+GAM Event Handlers is a set of classes that wrap the GAM Ad Units and manage them respectively to the In-App Bidding flow. These classes are provided in the form of library that could be added to the app via Gradle:
+
+Root build.gradle
+
+```
+allprojects {
+ repositories {
+ ...
+ mavenCentral()
+ ...
+ }
+}
+```
+
+App module build.gradle:
+
+```
+implementation('org.prebid:prebid-mobile-sdk-gam-event-handlers:x.x.x')
+```
+
+
+## Banner API
+
+To integrate the banner ad you need to implement three easy steps:
+
+
+``` kotlin
+// 1. Create banner custom event handler for GAM ad server.
+val eventHandler = GamBannerEventHandler(requireContext(), GAM_AD_UNIT, GAM_AD_SIZE)
+
+// 2. Create a bannerView instance and provide GAM event handler
+bannerView = BannerView(requireContext(), configId, eventHandler)
+// (Optional) set an event listener
+bannerView?.setBannerListener(this)
+
+// Add bannerView to your viewContainer
+viewContainer?.addView(bannerView)
+
+// 3. Execute ad loading
+bannerView?.loadAd()
+```
+
+#### Step 1: Create Event Handler
+
+GAM's event handlers are special containers that wrap GAM Ad Views and help to manage collaboration between GAM and Prebid views.
+
+**Important:** you should create and use a unique event handler for each ad view.
+
+To create the event handler you should provide a GAM Ad Unit Id and the list of available sizes for this ad unit.
+
+#### Step 2: Create Ad View
+
+**BannerView** - is a view that will display the particular ad. It should be added to the UI. To create it you should provide:
+
+- **configId** - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- **eventHandler** - the instance of the banner event handler
+
+Also, you should add the instance of `BannerView` to the UI.
+
+And assign the listeners for processing ad events.
+
+#### Step 3: Load the Ad
+
+Simply call the `loadAd()` method to start [In-App Bidding](../android-in-app-bidding-getting-started.html) flow. The In-App Bidding SDK starts the bidding process right away.
+
+### Outstream Video
+
+For **Outstream Video** you also need to specify video placement type of the expected ad:
+
+``` kotlin
+bannerView.videoPlacementType = PlacementType.IN_BANNER // or any other available type
+```
+
+### Migration from the original API
+
+GAM setup:
+1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications.
+2. Create new GAM ad unit.
+3. Setup new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach.
+
+Integration:
+1. Replace the `AdManagerAdView` with `BannerView` in the UI.
+3. Implement the interface `BannerViewListener`.
+4. Remove usage of `AdManagerAdView`, `AdManagerAdRequest`, and implementation of the `AdListener`.
+5. Remove original `BannerAdUnit`.
+6. Follow the instructions to integrate [Banner API](#banner-api).
+
+
+## Interstitial API
+
+To integrate interstitial ad you need to implement four easy steps:
+
+
+``` kotlin
+// 1. Create interstitial custom event handler for GAM ad server.
+val eventHandler = GamInterstitialEventHandler(requireContext(), gamAdUnit)
+
+// 2. Create interstitialAdUnit instance and provide GAM event handler
+interstitialAdUnit = InterstitialAdUnit(requireContext(), configId, minSizePercentage, eventHandler)
+// (Optional) set an event listener
+interstitialAdUnit?.setInterstitialAdUnitListener(this)
+
+// 3. Execute ad load
+interstitialAdUnit?.loadAd()
+
+//....
+
+// 4. After ad is loaded you can execute `show` to trigger ad display
+interstitialAdUnit?.show()
+
+```
+
+The **default** ad format for interstitial is **DISPLAY**. In order to make a `multiformat bid request`, set the respective values into the `adUnitFormats` parameter.
+
+```
+interstitialAdUnit = InterstitialAdUnit(
+ requireContext(),
+ configId,
+ EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO),
+ eventHandler)
+```
+
+
+#### Step 1: Create Event Handler
+
+GAM's event handlers are special containers that wrap the GAM Ad Views and help to manage collaboration between GAM and Prebid views.
+
+**Important:** you should create and use a unique event handler for each ad view.
+
+To create an event handler you should provide a GAM Ad Unit.
+
+#### Step 2: Create Interstitial Ad Unit
+
+**InterstitialAdUnit** - is an object that will load and display the particular ad. To create it you should provide:
+
+- **configId** - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- **minSizePercentage** - specifies the minimum width and height percent an ad may occupy of a deviceâs real estate.
+- **eventHandler** - the instance of the interstitial event handler
+
+Also, you can assign the listeners for processing ad events.
+
+> **NOTE:** minSizePercentage - plays an important role in a bidding process for display ads. If provided space is not enough demand partners won't respond with the bids.
+
+
+#### Step 3: Load the Ad
+
+Simply call the `loadAd()` method to start [In-App Bidding](../android-in-app-bidding-getting-started.html) flow. The ad unit will load an ad and will wait for explicit instructions to display the Interstitial Ad.
+
+
+#### Step 4: Show the Ad when it is ready
+
+
+The most convenient way to determine if the interstitial ad is ready for displaying is to listen to the particular listener method:
+
+``` kotlin
+override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) {
+//Ad is ready for display
+}
+```
+
+### Migration from the original API
+
+GAM setup:
+1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications.
+2. Create new GAM ad unit.
+3. Setup new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach.
+
+Integration:
+1. Replace the `AdManagerInterstitialAd` with `InterstitialRenderingAdUnit`.
+3. Implement the interface `InterstitialEventListener`.
+4. Remove usage of `AdManagerInterstitialAd`, `AdManagerAdRequest`.
+5. Remove original `InterstitialAdUnit`.
+6. Follow the instructions to integrate [Interstitial API](#interstitial-api).
+
+
+## Rewarded API
+
+To display an Rewarded Ad need to implement four easy steps:
+
+
+``` kotlin
+// 1. Create rewarded custom event handler for GAM ad server.
+val eventHandler = GamRewardedEventHandler(requireActivity(), gamAdUnitId)
+
+// 2. Create rewardedAdUnit instance and provide GAM event handler
+rewardedAdUnit = RewardedAdUnit(requireContext(), configId, eventHandler)
+
+// (Optional) set an event listener
+rewardedAdUnit?.setRewardedAdUnitListener(this)
+
+// 3. Execute ad load
+rewardedAdUnit?.loadAd()
+
+//...
+
+// 4. After ad is loaded you can execute `show` to trigger ad display
+rewardedAdUnit?.show()
+```
+
+The way of displaying the **Rewarded Ad** is totally the same as for the Interstitial Ad. You can customize a kind of ad:
+
+
+To be notified when user earns a reward - implement `RewardedAdUnitListener` interface:
+
+``` kotlin
+ fun onUserEarnedReward(rewardedAdUnit: RewardedAdUnit)
+```
+
+The actual reward object is stored in the `RewardedAdUnit`:
+
+``` kotlin
+val reward = rewardedAdUnit.getUserReward()
+```
+
+#### Step 1: Create Event Handler
+
+GAM's event handlers are special containers that wrap the GAM Ad Views and help to manage collaboration between GAM and Prebid views.
+
+**Important:** you should create and use a unique event handler for each ad view.
+
+To create an event handler you should provide a GAM Ad Unit.
+
+
+#### Step 2: Create Rewarded Ad Unit
+
+**RewardedAdUnit** - is an object that will load and display the particular ad. To create it you should provide
+
+- **configId** - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- **eventHandler** - the instance of rewarded event handler
+
+Also, you can assign the listener for processing ad events.
+
+
+#### Step 3: Load the Ad
+
+Simply call the `loadAd()` method to start an In-App Bidding flow. The ad unit will load an ad and will wait for explicit instructions to display the Rewarded Ad.
+
+
+#### Step 4: Show the Ad when it is ready
+
+
+The most convenient way to determine if the ad is ready for displaying is to listen for particular listener method:
+
+``` kotlin
+override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) {
+//Ad is ready for display
+}
+```
+
+### Migration from the original API
+
+GAM setup:
+1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications.
+2. Create new GAM ad unit.
+3. Setup new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach.
+
+Integration:
+1. Replace the `RewardedAd` with `RewardedAdUnit`.
+2. Implement the interface `RewardedAdUnitListener`.
+3. Remove original `RewardedVideoAdUnit`.
+4. Follow the instructions to integrate [Rewarded API](#rewarded-api).
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-max.md b/prebid-mobile/modules/rendering/android-sdk-integration-max.md
new file mode 100644
index 0000000000..612ed65eb6
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration-max.md
@@ -0,0 +1,347 @@
+---
+layout: page_v2
+title: AppLovin MAX Integration
+description: Integration of Prebid Rendering module whith AppLovin MAX
+sidebarType: 2
+---
+
+# AppLovin MAX Integration
+
+The integration of Prebid Mobile with AppLovin MAX assumes that publisher has MAX account and has already integrated the AppLovin MAX SDK into the app.
+
+See the [AppLovin MAX Documentation](https://dash.applovin.com/documentation/mediation/android/getting-started/integration) for the MAX integration details.
+
+## MAX Integration Overview
+
+![Rendering with MAX](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-max.png)
+
+**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid.
+
+**Step 3** MAX SDK makes an ad request. MAX returns the waterfall with respective placements.
+
+**Step 4** For each prebid's placement, the MAX SDK sequentially instantiates an adapter.
+
+**Step 5** The adapter verifies the targeting keywords of the winning bid and the custom properties of the given placement. If they match the adapter will render the winning bid. Otherwise, adpater will fail with "no ad" immediately and the next placement will instantiate the same adapter but for another custom properties.
+
+Prebid Mobile supports these ad formats:
+
+- Display Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+- Native
+
+They can be integrated using these API categories:
+
+- [**Banner API**](#banner-api) - for *Display* Banner
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+- [**Native API**](#native-ads) - for *Native Ads*
+
+## Init Prebid Rendering Module
+
+To start running bid requests you have to set the Prebid Server **Host** and **Account Id** and then initilize the SDK with application context. The best place for this is the `onCreate()` method of your Application class.
+
+```
+PrebidMobile.setBidServerHost(HOST)
+PrebidMobile.setAccountId(YOUR_ACCOUNT_ID)
+
+// Init SDK
+PrebidMobile.setApplicationContext(this)
+```
+
+> **NOTE:** The account ID is an identifier of the **Stored Request**.
+
+### Prebid Adapters
+
+To integrate Prebid Adapters just add the following lines into your build.gradle files:
+
+Root build.gradle
+
+```
+allprojects {
+ repositories {
+ ...
+ mavenCentral()
+ ...
+ }
+}
+```
+
+App module build.gradle:
+
+```
+implementation('org.prebid:prebid-mobile-sdk-max-adapters:x.x.x')
+```
+
+## Banner API
+
+Integration example:
+
+``` kotlin
+// 1. Create MaxAdView
+adView = MaxAdView(adUnitId, requireContext())
+adView?.setListener(createListener())
+
+// 2. Create MaxMediationBannerUtils
+val mediationUtils = MaxMediationBannerUtils(adView)
+
+// 3. Create MediationBannerAdUnit
+adUnit = MediationBannerAdUnit(
+ requireContext(),
+ configId,
+ AdSize(width, height),
+ mediationUtils
+)
+
+// 4. Make a bid request
+adUnit?.fetchDemand {
+
+ // 5. Make an ad request to MAX
+ adView?.loadAd()
+}
+```
+
+#### Step 1: Create MaxAdView
+
+This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/android/getting-started/banners#loading-and-showing-banners-programmatically). You don't have to make any modifications here.
+
+
+#### Step 2: Create MaxMediationBannerUtils
+
+The `MaxMediationBannerUtils` is a helper class, wich performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationBannerAdUnit
+
+The `MediationBannerAdUnit` is a part of Prebid mediation API. This class is responsible for making bid request and providing the winning bid and targeting keywords to mediating SDKs.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular MAX's ad request. Everything else will be handled by prebid adapters.
+
+## Interstitial API
+
+Integration example:
+
+``` kotlin
+// 1. Create MaxInterstitialAd
+maxInterstitialAd = MaxInterstitialAd(adUnitId, activity)
+maxInterstitialAd?.setListener(createListener())
+
+// 2. Create MaxMediationInterstitialUtils
+val mediationUtils = MaxMediationInterstitialUtils(maxInterstitialAd)
+
+// 3. Create MediationInterstitialAdUnit
+adUnit = MediationInterstitialAdUnit(
+ activity,
+ configId,
+ EnumSet.of(AdUnitFormat.DISPLAY),
+ mediationUtils
+ )
+
+// 4. Make a bid request
+adUnit?.fetchDemand {
+
+ // 5. Make an ad request to MAX
+ maxInterstitialAd?.loadAd()
+}
+
+```
+
+The **default** ad format for interstitial is **DISPLAY**. In order to make a `multiformat bid request`, set the respective values into the `adUnitFormats` parameter.
+
+```
+adUnit = MediationInterstitialAdUnit(
+ activity,
+ configId,
+ EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO),
+ mediationUtils
+ )
+```
+
+#### Step 1: Create MaxInterstitialAd
+
+This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/android/getting-started/interstitials). You don't have to make any modifications here.
+
+
+#### Step 2: Create MaxMediationInterstitialUtils
+
+The `MaxMediationInterstitialUtils` is a helper class, wich performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationInterstitialAdUnit
+
+The `MediationInterstitialAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid to the mediating SDKs.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular MAX's ad request. Everything else will be handled by GMA SDK and prebid adapters.
+
+#### Steps 6: Display an ad
+
+Once you receive the ad it will be ready for display. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/interstitials#showing-an-interstitial-ad) about how to do it.
+
+## Rewarded API
+
+Integration example:
+
+``` swift
+// 1. Get an instance of MaxRewardedAd
+maxRewardedAd = MaxRewardedAd.getInstance(adUnitId, activity)
+maxRewardedAd?.setListener(createListener())
+
+// 2. Create MaxMediationRewardedUtils
+val mediationUtils = MaxMediationRewardedUtils(maxRewardedAd)
+
+// 3. Create MediationRewardedVideoAdUnit
+adUnit = MediationRewardedVideoAdUnit(
+ activity,
+ configId,
+ mediationUtils
+ )
+
+// 4. Make a bid request
+adUnit?.fetchDemand {
+
+ // 5. Make an ad request to MAX
+ maxRewardedAd?.loadAd()
+}
+```
+
+The way of displaying the rewarded ad is the same as for the Interstitial Ad.
+
+To be notified when user earns a reward follow the [MAX intructions](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads#accessing-the-amount-and-currency-for-a-rewarded-ad).
+
+#### Step 1: Get an instance of MaxRewardedAd
+
+This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads). You don't have to make any modifications here.
+
+#### Step 2: Create MaxMediationRewardedUtils
+
+The `MaxMediationRewardedUtils` is a helper class, wich performs certain utilty work for the `MediationRewardedVideoAdUnit`, like passing the targeting keywords to the adapters.
+
+#### Step 3: Create MediationRewardedVideoAdUnit
+
+The `MediationRewardeVideoAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular MAX's ad request. Everything else will be handled by GMA SDK and prebid adapters.
+
+#### Steps 6: Display an ad
+
+Once the rewarded ad is recieved you can display it. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/rewarded-ads#showing-a-rewarded-ad) for the details.
+
+## Native Ads
+
+Integration example:
+
+```
+// 1. Create MaxNativeAdLoader
+nativeAdLoader = MaxNativeAdLoader(adUnitId, requireActivity())
+nativeAdLoader.setNativeAdListener(createNativeAdListener(viewContainer))
+nativeAdLoader.setRevenueListener(createRevenueListener())
+
+// 2. Create and configure MediationNativeAdUnit
+nativeAdUnit = NativeAdUnit(configId)
+
+nativeAdUnit.setContextType(NativeAdUnit.CONTEXT_TYPE.SOCIAL_CENTRIC)
+nativeAdUnit.setPlacementType(NativeAdUnit.PLACEMENTTYPE.CONTENT_FEED)
+nativeAdUnit.setContextSubType(NativeAdUnit.CONTEXTSUBTYPE.GENERAL_SOCIAL)
+
+// 3. Set up assets for bid request
+// See the code below
+
+// 4. Set up event tracker for bid request
+// See the code below
+
+// 5. Make a bid request
+nativeAdUnit.fetchDemand(nativeAdLoader) {
+// 6. Make an ad request to MAX
+ self?.nativeAdLoader?.loadAd(into: self?.createNativeAdView())
+}
+```
+
+#### Step 1: Create MaxNativeAdLoader
+
+Prepare the `MaxNativeAdLoader` object before you make a bid request. It will be needed for prebid mediation utils.
+
+#### Step 2: Create and configure NativeAdUnit
+
+The `NativeAdUnit` class is responsible for making a bid request and providing a winning bid and targeting keywords. Fot the better targetting you should provide additional properties like `conteaxtType` and `placemantType`.
+
+#### Step 3: Set up assets for bid request
+
+The bid request for native ads should have the description of expected assets. The full spec for the native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the assets array:
+
+```
+val title = NativeTitleAsset()
+title.setLength(90)
+title.isRequired = true
+nativeAdUnit.addAsset(title)
+
+val icon = NativeImageAsset(20, 20, 20, 20)
+icon.imageType = NativeImageAsset.IMAGE_TYPE.ICON
+icon.isRequired = true
+nativeAdUnit.addAsset(icon)
+
+val image = NativeImageAsset(200, 200, 200, 200)
+image.imageType = NativeImageAsset.IMAGE_TYPE.MAIN
+image.isRequired = true
+nativeAdUnit.addAsset(image)
+
+val data = NativeDataAsset()
+data.len = 90
+data.dataType = NativeDataAsset.DATA_TYPE.SPONSORED
+data.isRequired = true
+nativeAdUnit.addAsset(data)
+
+val body = NativeDataAsset()
+body.isRequired = true
+body.dataType = NativeDataAsset.DATA_TYPE.DESC
+nativeAdUnit.addAsset(body)
+
+val cta = NativeDataAsset()
+cta.isRequired = true
+cta.dataType = NativeDataAsset.DATA_TYPE.CTATEXT
+nativeAdUnit.addAsset(cta)
+```
+
+#### Step 4: Set up event tracker for bid request
+
+The bid request for mative ads may have a descrition of expected event trackers. The full spec for the Native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the event trackers array:
+
+```
+val methods: ArrayList = ArrayList()
+methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.IMAGE)
+methods.add(NativeEventTracker.EVENT_TRACKING_METHOD.JS)
+try {
+ val tracker = NativeEventTracker(NativeEventTracker.EVENT_TYPE.IMPRESSION, methods)
+ nativeAdUnit.addEventTracker(tracker)
+} catch (e: Exception) {
+ e.printStackTrace()
+}
+```
+
+#### Step 5: Make a bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 6: Load Native ad
+
+Now just load a native ad from MAX according to the [MAX instructions](https://dash.applovin.com/documentation/mediation/android/getting-started/native-manual#load-the-native-ad).
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb-native.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb-native.md
new file mode 100644
index 0000000000..fe371eb36e
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb-native.md
@@ -0,0 +1,159 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Pure In-App Bidding Native Ads Integration
+description: Integration of native ads for pure In-App Bidding scenario
+sidebarType: 2
+
+---
+
+# Prebid Rendering: Native Ads Integration
+
+## Native Ads
+
+The general integration scenario requires these steps from publishers:
+
+1. Prepare the ad layout.
+2. Create Native Ad Unit.
+3. Configure the Native Ad unit using [NativeAdConfiguration](rendering-native-ad-configuration.html).
+ * Provide the list of **[Native Assets](rendering-native-guidelines.html#components)** representing the ad's structure.
+ * Tune other general properties of the ad.
+4. Make a bid request.
+5. Extract NativeAd using `NativeUtils.findNativeAd`
+7. Bind the data from the native ad with the layout.
+
+``` kotlin
+nativeAdUnit?.fetchDemand {
+ if (it.fetchDemandResult != FetchDemandResult.SUCCESS) {
+ return@fetchDemand
+ }
+ NativeUtils.findNativeAd(it) { nativeAd ->
+ if (nativeAd == null) {
+ return@findNativeAd
+ }
+ inflateViewContentWithPrebid(nativeAd)
+ }
+}
+```
+
+## Native Styles
+
+[See Native Ads Guidelines page](rendering-native-guidelines.html) for more details about SDK integration and supported ad types.
+
+To display an ad using Native Styles you'll need to implement these easy steps:
+
+``` kotlin
+// 1. Create an Ad View
+bannerView = BannerView(requireContext(), configId, adSize)
+bannerView?.setBannerListener(this)
+
+// 2. Provide NativeAdConfiguration
+val nativeAdConfiguration = createNativeAdConfiguration()
+bannerView?.setNativeAdConfiguration(nativeAdConfiguration)
+
+// Add view to viewContainer
+viewContainer?.addView(bannerView)
+
+// 3. Load ad
+bannerView?.loadAd()
+```
+
+#### Step 1: Create Ad View
+
+In the Pure In-App Bidding scenario you just need to initialize the Banner Ad View using correct properties:
+
+- **configId** - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- **size** - the size of the ad unit which will be used in the bid request.
+
+#### Step 2: Create and provide NativeAdConfiguration
+
+NativeAdConfiguration creation example:
+
+``` kotlin
+private fun createNativeAdConfiguration(): NativeAdConfiguration {
+ val nativeAdConfiguration = NativeAdConfiguration()
+ nativeAdConfiguration.contextType = NativeAdConfiguration.ContextType.SOCIAL_CENTRIC
+ nativeAdConfiguration.placementType = NativeAdConfiguration.PlacementType.CONTENT_FEED
+ nativeAdConfiguration.contextSubType = NativeAdConfiguration.ContextSubType.GENERAL_SOCIAL
+
+ val methods = ArrayList()
+ methods.add(NativeEventTracker.EventTrackingMethod.IMAGE)
+ methods.add(NativeEventTracker.EventTrackingMethod.JS)
+ val eventTracker = NativeEventTracker(NativeEventTracker.EventType.IMPRESSION, methods)
+ nativeAdConfiguration.addTracker(eventTracker)
+
+ val assetTitle = NativeAssetTitle()
+ assetTitle.len = 90
+ assetTitle.isRequired = true
+ nativeAdConfiguration.addAsset(assetTitle)
+
+ val assetIcon = NativeAssetImage()
+ assetIcon.type = NativeAssetImage.ImageType.ICON
+ assetIcon.wMin = 20
+ assetIcon.hMin = 20
+ assetIcon.isRequired = true
+ nativeAdConfiguration.addAsset(assetIcon)
+
+ val assetImage = NativeAssetImage()
+ assetImage.hMin = 20
+ assetImage.wMin = 200
+ assetImage.isRequired = true
+ nativeAdConfiguration.addAsset(assetImage)
+
+ val assetData = NativeAssetData()
+ assetData.len = 90
+ assetData.type = NativeAssetData.DataType.SPONSORED
+ assetData.isRequired = true
+ nativeAdConfiguration.addAsset(assetData)
+
+ val assetBody = NativeAssetData()
+ assetBody.isRequired = true
+ assetBody.type = NativeAssetData.DataType.DESC
+ nativeAdConfiguration.addAsset(assetBody)
+
+ val assetCta = NativeAssetData()
+ assetCta.isRequired = true
+ assetCta.type = NativeAssetData.DataType.CTA_TEXT
+ nativeAdConfiguration.addAsset(assetCta)
+
+ nativeAdConfiguration.nativeStylesCreative = nativeStylesCreative
+
+ return nativeAdConfiguration
+}
+```
+
+Native Styles creative example:
+
+``` html
+
+
+
+```
+
+See more NativeAdConfiguration options [here](rendering-native-ad-configuration.html).
+
+**IMPORTANT:**
+
+You should add HTML and CSS to define your native ad template with universal creative and provide it via NativeAdConfiguration.
+
+#### Step 3: Load the Ad
+
+Call `loadAd()` and SDK will:
+
+- make bid request to Prebid server
+- render the winning bid on display
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md
new file mode 100644
index 0000000000..ad10e372a0
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md
@@ -0,0 +1,186 @@
+---
+
+layout: page_v2
+title: Custom or No mediation
+description: Integration of Prebid SDK withou primaty Ad Server
+sidebarType: 2
+
+---
+
+# Custom Integration
+
+## Table of Contents
+
+- [Overview of Rendering API](#mobile-api)
+- [Banner](#banner-api)
+- [Interstitial](#interstitial-api)
+- [Rewarded](#rewarded-api)
+
+[//]: # (- [Native](android-sdk-integration-pb-native.html))
+
+## Overview of Rendering API
+
+The integration and usage of the Rendering API are similar to any other Ad SDK. It sends the bid requests to the Prebid Server and renders the winning bid.
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-Pure-Prebid.png)
+
+Prebid's Rendering API provides the ability to integrate these ad formats:
+
+- Display Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+- Outstream Video
+
+[//]: # (- [Native](android-sdk-integration-pb-native.html))
+
+The Rendering API ad formats are accessible through the following API classes:
+
+- **Banner API** - for **Display** and **Video** Banners
+- **Interstitial API** - for **Display** and **Video** Interstitials
+- **Rewarded API** - for **Rewarded Video**
+
+### Init Prebid Rendering Module
+
+To start running bid requests you have to set the Prebid Server **Host** and **Account Id** and then initilize the SDK with application context. The best place for this is the `onCreate()` method of your Application class.
+
+```
+PrebidMobile.setBidServerHost(HOST)
+PrebidMobile.setAccountId(YOUR_ACCOUNT_ID)
+
+// Init SDK
+PrebidMobile.setApplicationContext(this)
+```
+
+> **NOTE:** The account ID is an identifier of the **Stored Request**.
+
+### Banner API
+
+Integration example:
+
+
+``` kotlin
+// 1. Create an Ad View
+bannerView = BannerView(requireContext(), configId, adSize)
+bannerView?.setBannerListener(this)
+
+// Add view to viewContainer
+viewContainer?.addView(bannerView)
+
+// 2. Load ad
+bannerView?.loadAd()
+```
+
+#### Step 1: Create Ad View
+
+Initialize the `BannerAdView` with properties:
+
+- `configId` - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- `size` - the size of the ad unit which will be used in the bid request.
+
+#### Step 2: Load the Ad
+
+Call `loadAd()` and SDK will:
+
+- make bid request to Prebid
+- render the winning bid on display
+
+#### Outstream Video
+
+For **Banner Video** you will also need to specify the `bannerView.videoPlacementType`:
+
+``` kotlin
+bannerView.videoPlacementType = PlacementType.IN_BANNER // or any other available type
+```
+
+### Interstitial API
+
+Integration example:
+
+``` kotlin
+// 1. Create an Interstitial Ad Unit
+interstitialAdUnit = InterstitialAdUnit(requireContext(), configId, minSizePercentage)
+interstitialAdUnit?.setInterstitialAdUnitListener(this)
+
+// 2. Load Ad
+interstitialAdUnit?.loadAd()
+// .....
+
+// 3. Show the ad
+interstitialAdUnit?.show()
+```
+
+The **default** ad format for interstitial is **DISPLAY**. In order to make a `multiformat bid request`, set the respective values into the `adUnitFormats` parameter.
+
+```
+interstitialAdUnit = InterstitialAdUnit(
+ requireContext(),
+ configId,
+ EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO))
+```
+
+#### Step 1: Create an Ad Unit
+
+Initialize the `InterstitialAdUnit ` with properties:
+
+- `configId` - an ID of a [Stored Impression](/prebid-server/features/pbs-storedreqs.html) on the Prebid server
+- `minSizePercentage` - specifies the minimum width and height percent an ad may occupy of a deviceâs real estate.
+
+You can also assign the listener for processing ad events.
+
+> **NOTE:** the `minSizePercentage` - plays an important role in a bidding process for display ads. If provided space is not enough demand partners won't respond with the bids.
+
+#### Step 2: Load the Ad
+
+Call the `loadAd()` method which will make a request to Prebid server.
+
+
+#### Step 3: Show the Ad when it is ready
+
+Wait until the ad is loaded and present it to the user in any suitable time.
+
+``` kotlin
+override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) {
+ //Ad is ready for display
+}
+```
+
+### Rewarded API
+
+Integration example:
+
+``` kotlin
+// 1. Create an Ad Unit
+rewardedAdUnit = RewardedAdUnit(requireContext(), configId)
+rewardedAdUnit?.setRewardedAdUnitListener(this)
+
+// 2. Execute ad load
+rewardedAdUnit?.loadAd()
+
+/// .......
+
+// After ad is loaded you can execute `show` to trigger ad display
+rewardedAdUnit?.show()
+```
+
+#### Step 1: Create Rewarded Ad Unit
+
+Create the `RewardedAdUnit` object with parameters:
+
+- `adUnitId` - an ID of Stored Impression on the Prebid server.
+
+#### Step 2: Load the Ad
+
+Call the `loadAd()` method which will make a request to Prebid server.
+
+
+#### Step 3: Show the Ad when it is ready
+
+
+Wait until the ad is loaded and present it to the user in any suitable time.
+
+``` kotlin
+override fun onAdLoaded(rewardedAdUnit: RewardedAdUnit) {
+//Ad is ready for display
+}
+```
diff --git a/prebid-mobile/modules/rendering/android-sdk-integration.md b/prebid-mobile/modules/rendering/android-sdk-integration.md
new file mode 100644
index 0000000000..bc0573ad96
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-integration.md
@@ -0,0 +1,81 @@
+---
+
+layout: page_v2
+title: Integrating the Android SDK
+description: Prebid Android Rendering SDK Integration
+sidebarType: 2
+
+---
+
+# Integrating the Android SDK with your project
+
+## Gradle Integration
+
+
+To add the dependency, open your project and update the app moduleâs build.gradle to have the following repositories and dependencies:
+
+```
+allprojects {
+ repositories {
+ ...
+ google()
+ mavenCentral()
+ ...
+ }
+}
+
+// ...
+
+dependencies {
+ ...
+ implementation('org.prebid:prebid-mobile-sdk:2.0.0')
+ ...
+}
+```
+
+## Updating your Android manifest
+
+
+Before you start, you need to integrate the SDK by updating your Android manifest.
+
+1. Open your AndroidManifest.xml and add the following permissions and activity declarations according to the bundle you are integrating.
+
+``` xml
+
+
+
+
+
+```
+
+ **Notes:**
+
+ - `ACCESS_COARSE_LOCATION` or `ACCESS_FINE_LOCATION` will
+ automatically allow the device to send user location for
+ targeting, which can help increase revenue by increasing the
+ value of impressions to buyers.
+ - `WRITE_EXTERNAL_STORAGE` is optional and only required for MRAID
+ 2.0 storePicture ads.
+
+2. For *banner and interstitial ads only*, include the following custom activities (even though you won't instantiate them directly). This is not necessary for video interstitial ads.
+
+ Custom Activities:
+
+``` xml
+
+```
+
+**NOTE**
+>Interstitial ads are implemented in a dialog. For proper interstitial workflow it is recommended to use a separate Activity with `configChanges` attribute specified to avoid any issues which may occur on orientation change.
+> See above example with `configChanges` attribute.
+
+3. Add this tag to your `` to use Google Play Services:
+
+ ``` xml
+
+```
diff --git a/prebid-mobile/modules/rendering/android-sdk-parameters.md b/prebid-mobile/modules/rendering/android-sdk-parameters.md
new file mode 100644
index 0000000000..c32c11e1f6
--- /dev/null
+++ b/prebid-mobile/modules/rendering/android-sdk-parameters.md
@@ -0,0 +1,81 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# Parameters
+
+The tables below list the methods and properties that the Prebid Rendering API allows to customize.
+The more actual info about the user, the app, and the device you provide the more chances to win an impression.
+
+Please strictly follow the recommendations in the below tables and provide all â **Required** and **Highly Recommended** values.
+
+
+1. [Targeting](#targeting)
+2. [PrebidRenderingSettings](#prebidrenderingsettings)
+
+## Targeting
+
+{: .table .table-bordered .table-striped }
+
+| **Parameter** | **Method** | Description | Required?|
+| -------------------------- | ------------------------- | ------------------------------------------------------------ | -------- |
+| age | `setUserAge` | Age of the user in years. For example: `35` | â Highly Recommended |
+| buyerid | `setBuyerId` | Buyer-specific ID for the user as mapped by the exchange for the buyer. | Optional |
+| crr | `setCarrier` | Mobile carrier - Defined by the Mobile Country Code (MCC) and Mobile Network Code (MNC), using the format: -. For example: `"310-410"` | Optional |
+| customdata | `setUserCustomData` | Optional feature to pass bidder data that was set in the exchangeâs cookie. The string must be in base85 cookie safe characters and be in any format. Proper JSON encoding must be used to include âescapedâ quotation marks. | Optional |
+| dma | `setDma` | A designated market are. For US locations, indicates the end-user's Designated Market Area. For example: dma=803. | Optional |
+| ext | `setUserExt` | Placeholder for exchange-specific extensions to OpenRTB. | Optional |
+| gen | `setUserGender` | The gender of the user (Male, Female, Other, Unknown). For example: `Gender.FEMALE` | â Highly Recommended |
+| inc | `setUserAnnualIncomeInUs` | Annual income of the user in US dollars. For example: `55000`| â Highly Recommended |
+| ip | `setDeviceIpAddress` | The IP address of the carrier gateway. If this is not present, Prebid Rendering retrieves it from the request header. For example: `"192.168.0.1"` | â Highly Recommended |
+| keywords | `setUserKeywords` | Comma separated list of keywords, interests, or intent. | Optional |
+| lat, lon | `setUserLatLng` | Location of the userâs home base defined by a provided longitude and latitude. It's highly recommended to provide Geo data to improve the request.| Optional |
+| publisher | `setPublisherName` | Publisher name (may be aliased at the publisherâs request).| Recommended if available |
+| url/storeurl | `setAppStoreMarketUrl` | The URL for the mobile application in Google Play. That field is required in the request. **For example:**` https://play.google.com/store/apps/details?id=com.outfit7.talkingtom`. | â Required |
+| xid | `setUserId` | ID of the user within the app. For example: `"24601"` | â Highly Recommended |
+
+## How to set user parameters
+
+You can use `Targeting` to pass ad call request parameters.
+
+``` java
+// Set user parameters to enrich ad request data.
+// Please see Targeting for the userKeys and the APIs available.
+Targeting.setUserKeywords("socialNetworking");
+Targeting.setUserAge(18);
+Targeting.setUserAnnualIncomeInUs(50000);
+
+// Set parameters.
+// Targeting.setCustomParameters(Hashtable params)
+// Targeting.setParameters(Hashtable params)
+// clear parameters
+// Targeting.clearParameters()
+// Targeting.clearParameter(String key)
+```
+
+## Custom key-value parameters
+
+You can submit values through `Targeting` for the extended (`c.xxx`) ad-call
+parameters.
+
+{: .table .table-bordered .table-striped }
+
+| **Parameter** | **Method** | **Description** |
+| ----------------------- | ------------------- | ------------------------------------------------------------ |
+| custom parameter | setCustomParameter | A custom user parameter auto-prepended with c.. You should provide the plain name of the parameter, such as xxx, which will be changed to c.xxx when sent. |
+| custom parameters | setCustomParameters | Custom user parameters, which consist of a dictionary of name-value parameter pairs, where each param name will be automatically prepended with c.. |
+
+## PrebidRenderingSettings
+
+{: .table .table-bordered .table-striped }
+
+| **Field** | **Description** | **Default** |
+| ----------------------- | ------------------------------------------------------------ | ----------- |
+| defaultAutoRefreshDelay | Controls the initial value of `autoRefreshDelay` for all newly created BannerAdViews in seconds. | 60 |
+| logLevel | Controls the type of messages of the internal logger. Options are: - DEBUG - this is the noisiest level. - ERROR - WARN - NONE | NONE |
+| sendMRAIDSupportParams | If `true`, the SDK sends "`af=3,5`", indicating support for MRAID. | true |
diff --git a/prebid-mobile/modules/rendering/ios-sdk-Integration.md b/prebid-mobile/modules/rendering/ios-sdk-Integration.md
new file mode 100644
index 0000000000..eb7083258d
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-Integration.md
@@ -0,0 +1,57 @@
+---
+
+layout: page_v2
+title: Integrating the Android SDK
+description: Prebid Android Rendering SDK Integration
+sidebarType: 2
+
+---
+
+# Code Integration for iOS
+
+
+## CocoaPods integration
+
+Starting with v2.0.0 the Rendering API is a part of Prebid Mobile SDK. Add the following item into your podfile to integrate it:
+
+```
+pod 'PrebidMobile'
+```
+
+If you need to integrate Prebid with GAM, AdMob or AppLovin MAX add these pods respectively
+
+```
+# + Google Ad Manager (optional)
+pod 'PrebidMobileGAMEventHandlers'
+
+# + AdMob (optional)
+pod 'PrebidMobileAdMobAdapters'
+
+# + MAX (optional)
+pod 'PrebidMobileMAXAdapters'
+```
+
+
+## Init Prebid Rendering
+
+The best place for initialization is the `application:didFinishLaunchingWithOptions` method. Import the SDK first:
+
+```
+import PrebidMobile
+```
+
+Then set the predefined or costom Prebid Server **host** and provide the **Prebid Account ID**.
+
+```
+Prebid.shared.prebidServerHost = HOST
+Prebid.shared.prebidServerAccountId = YOUR_ACCOUNT_ID
+```
+
+And initialize the SDK:
+
+```
+Prebid.initializeSDK()
+```
+
+
+
diff --git a/prebid-mobile/modules/rendering/ios-sdk-customization-controls.md b/prebid-mobile/modules/rendering/ios-sdk-customization-controls.md
new file mode 100644
index 0000000000..4a3e951d8d
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-customization-controls.md
@@ -0,0 +1,72 @@
+---
+
+layout: page_v2
+title: Ad Experience Controls
+description: Approaches for changing the ad expirience
+sidebarType: 2
+
+---
+
+# Ad Experience Controls
+
+Prebid SDK provides an API way to customize its behaviour.
+
+> NOTE: In the nearest future the Server Side Configuration will be supported as well. Follow this [feature request](https://github.com/prebid/prebid-server/issues/2186) for the details.
+
+
+## Rendering Controls
+
+The following properties allow to customize the rendering of Video Interstitial Ads.
+
+### Max Video Duration
+
+The `videoParameters.maxDuration` indicates the maximum available playback time in seconds.
+If the value in the **Duration** tag is bigger than the given value SDK will fail to load ad, providing a respective error message.
+
+### Application Muted
+
+The `isMuted` property indicates whether the ad should run playback with sound or not.
+Default value - **false**.
+
+### Close Button Area
+
+The `closeButtonArea` property indicates the percent of device screen which the close button should occupy. The possible values are from **0** to **1**.
+
+### Close Button Position
+
+The `closeButtonPosition` property indicates the position of the close button on the screen. The possible values are **TopLeft** and **TopRight**. The default value is **TopRight**.
+
+The example:
+
+![Close Button Position - Top Right](/assets/images/prebid-mobile/modules/rendering/ad-experience-ios-close-button-possition-top-left.png){:width="250px"}
+
+### Skip Button Area
+
+The `skipButtonArea` property indicates the percent of device screen which the skip button should occupy. The possible values are from **0** to **1**.
+
+### Skip Button Position
+
+The `skipButtonPosition` property indicates the position of the close button on the screen. The possible values are **TopLeft** and **TopRight**. The default value is **TopLeft**.
+
+The example:
+
+![Close Button Position - Top Right](/assets/images/prebid-mobile/modules/rendering/ad-experience-ios-skip-button-possition-top-left.png){:width="250px"}
+
+### Skip Delay
+
+The `skipDelay` property indicates the number of seconds which should be passed from the start of playback until the skip or close button should be shown. The default value is **10**.
+
+The code sample:
+
+``` swift
+interstitialController = InterstitialRenderingAdUnit(configID: prebidConfigId,
+ minSizePercentage: CGSize(width: 30, height: 30))
+interstitialController?.delegate = self
+interstitialController?.videoParameters.maxDuration = SingleContainerInt(integerLiteral: 30)
+interstitialController?.closeButtonArea = 0.1
+interstitialController?.skipDelay = 5
+interstitialController?.skipButtonArea = 0.1
+interstitialController?.skipButtonPosition = .topRight
+interstitialController?.closeButtonPosition = .topRight
+```
+
diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md
new file mode 100644
index 0000000000..e9b233a256
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md
@@ -0,0 +1,428 @@
+---
+layout: page_v2
+title: Google Ad Manager Integration
+description: Integration of Prebid Rendering module whith Google Ad Manager
+sidebarType: 2
+---
+
+# AdMob Integration
+
+The integration of Prebid Mobile with Google AdMob assumes that publisher has an AdMob account and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app.
+
+See the [Google Integration Documentation](https://developers.google.com/admob/ios/quick-start) for the AdMob integration details.
+
+
+{: .alert.alert-warning :}
+**Warning:** The `GADMobileAds.sharedInstance().start()` should be called in the adapters bundle, otherwise, GMA SDK won't load the ads with error: `adView:didFailToReceiveAdWithError: SDK tried to perform a networking task before being initialized.`
+
+To avoid the error add the following line to your app right after initialization of GMA SDK:
+
+```
+GAMUtils.shared.initializeGAM()
+```
+
+Prebid is integrated into the AdMob monetization via adapters.
+
+## AdMob Integration Overview
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-admob.png)
+
+**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid.
+
+**Step 3** GMA SDK makes an ad request. AdMob returns the mediation chain with respective ad sources.
+
+**Step 4** For each prebid's ad source, the GMA SDK sequentially instantiates an adapter.
+
+**Step 5** The adapter verifies the targeting keywords of the winning bid and the server properties of the given ad source. If they match adapter will render the winning bid. Otherwise, it will fail with "no ad" immediately and the next ad source will instantiate the same adapter but for another set of server parpams.
+
+Prebid Mobile supports these ad formats:
+
+- Display Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+- Native
+
+They can be integrated using these API categories:
+
+- [**Banner API**](#banner-api) - for *Display* Banner
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+- [**Native API**](#native-ads) - for *Native Ads*
+
+
+## Banner API
+
+Integration example:
+
+``` swift
+// 1. Create GADRequest and GADBannerView
+gadRequest = GADRequest()
+
+gadBanner = GADBannerView(adSize: size)
+gadBanner.delegate = self
+gadBanner.rootViewController = self
+
+gadBanner.adUnitID = adUnitId
+
+// 2. Create AdMobMediationBannerUtils
+mediationDelegate = AdMobMediationBannerUtils(gadRequest: gadRequest,
+ bannerView: gadBanner)
+
+// 3. Create MediationBannerAdUnit
+prebidAdMobMediaitonAdUnit = MediationBannerAdUnit(configID: configID,
+ size: CGSize(width: 320, height: 50),
+ mediationDelegate: mediationDelegate)
+
+// 4. Make a bid request
+prebidAdMobMediaitonAdUnit.fetchDemand { [weak self] result in
+
+ // 5. Store the winning bid in the GADRequest extras
+ // You must provide a winning bid via extras to the GADRequest here.
+ // Prebid SDK can't do it internally.
+ // Otherwise, the Prebid adapter won't be able to retrieve and render the winning bid.
+ let extras = GADCustomEventExtras()
+ extras.setExtras(self?.mediationDelegate.getEventExtras(),
+ forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel)
+
+ self?.gadRequest.register(extras)
+
+ // 6. Make an ad request to AdMob
+ self?.gadBanner.load(self?.gadRequest)
+}
+```
+
+#### Step 1: Create GADRequest and GADBannerView
+
+This step is totally the same as for original [AdMob integration](https://developers.google.com/admob/ios/banner). You don't have to make any modifications here.
+
+
+#### Step 2: Create AdMobMediationBannerUtils
+
+The `AdMobMediationBannerUtils` is a helper class, wich performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationBannerAdUnit
+
+The `MediationBannerAdUnit` is part of Prebid mediation API. This class is responsible for making bid request and providing the winning bid and targeting keywords to mediating SDKs.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 5: Store the winning bid in the GADRequest extras
+
+GMA SDK doesn't provide extras to the adapter which were set not in the app scope.
+
+That is why you must add the code for dispatching the winning bid to the adapters. In the most cases you will just need to copy and paste the following lines inside the completion closure of the `fetchDemand()` method:
+
+```
+let extras = GADCustomEventExtras()
+
+extras.setExtras(self?.mediationDelegate.getEventExtras(),
+ forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel)
+
+self?.gadRequest.register(extras)
+```
+Everything
+Make sure that you use the proper label for extras - `AdMobConstants.PrebidAdMobEventExtrasLabel`. Prebid adapters will extract the winnig bid by this key.
+
+#### Step 6: Make an Ad Reuest
+
+Now you should make a regular AdMob's ad request. Everything else will be handled by prebid adapters.
+
+## Interstitial API
+
+Integration example:
+
+``` swift
+// 1. Create GADRequest
+gadRequest = GADRequest()
+
+// 2. Create AdMobMediationInterstitialUtils
+mediationDelegate = AdMobMediationInterstitialUtils(gadRequest: self.gadRequest)
+
+// 3. Create MediationInterstitialAdUnit
+admobAdUnit = MediationInterstitialAdUnit(configId: configID,
+ mediationDelegate: mediationDelegate!)
+
+// 4. Make a bid request
+admobAdUnit?.fetchDemand(completion: { [weak self]result in
+
+ // 5. Store the winning bid in the GADRequest extras
+ // You must provide a winning bid via extras to the GADRequest here.
+ // Prebid SDK can't do it internally.
+ // Otherwise, the Prebid adapter won't be able to retrieve and render the winning bid.
+ let extras = GADCustomEventExtras()
+ let prebidExtras = self?.mediationDelegate!.getEventExtras()
+ extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel)
+
+ self?.gadRequest.register(extras)
+
+ // 6. Make an ad request to AdMob
+ GADInterstitialAd.load(withAdUnitID: adUnitID, request: self?.gadRequest) { [weak self] ad, error in
+ guard let self = self else { return }
+ if let error = error {
+ PBMLog.error(error.localizedDescription)
+ return
+ }
+
+ // 7. Present the interstitial ad
+ self.interstitial = ad
+ self.interstitial?.fullScreenContentDelegate = self
+ self.interstitial?.present(fromRootViewController: self)
+ }
+})
+```
+
+The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property.
+
+``` swift
+// Make bid request for video ad
+adUnit?.adFormats = [.video]
+
+// Make bid request for both video amd disply ads
+adUnit?.adFormats = [.video, .display]
+
+// Make bid request for disply ad (default behaviour)
+adUnit?.adFormats = [.display]
+
+```
+
+
+#### Step 1: Create GADRequest
+
+This step is totally the same as for original [AdMob integration](https://developers.google.com/admob/ios/interstitial#swift). You don't have to make any modifications here.
+
+
+#### Step 2: Create AdMobMediationInterstitialUtils
+
+The `AdMobMediationInterstitialUtils` is a helper class, wich performs certain utilty work for the `MediationInterstitialAdUnit`, like passing the targeting keywords to adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationInterstitialAdUnit
+
+The `MediationInterstitialAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid to the mediating SDKs.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 5: Store the winning bid in the GADRequest extras
+
+GMA SDK doesn't provide extras to the adapter which were set not in the app scope.
+
+That is why you must add the code for dispatching the winning bid to the adapters. In the most cases you will just need to copy and paste the following lines inside the completion closure of the `fetchDemand()` method:
+
+
+```
+let extras = GADCustomEventExtras()
+let prebidExtras = self?.mediationDelegate!.getEventExtras()
+extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel)
+
+self?.gadRequest.register(extras)
+```
+
+Make sure that you use the proper label for extras - `AdMobConstants.PrebidAdMobEventExtrasLabel`. Prebid adapters will extract the winnig bid by this key.
+
+#### Step 6: Make an Ad Reuest
+
+Now you should make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters.
+
+#### Steps 7: Display an ad
+
+Once you receive the ad it will be ready for display. Folow the [AdMob instructions](https://developers.google.com/admob/ios/interstitial#swift) about how to do it.
+
+## Rewarded API
+
+Integration example:
+
+``` swift
+// 1. Create GADRequest
+let request = GADRequest()
+
+// 2. Create AdMobMediationInterstitialUtils
+let mediationDelegate = AdMobMediationRewardedUtils(gadRequest: request)
+
+// 3. Create MediationInterstitialAdUnit
+admobRewardedAdUnit = MediationRewardedAdUnit(configId: "12f58bc2-b664-4672-8d19-638bcc96fd5c", mediationDelegate: mediationDelegate)
+
+// 4. Make a bid request
+admobRewardedAdUnit.fetchDemand { [weak self] result in
+ guard let self = self else { return }
+
+ // 5. Make an ad request to AdMob
+ GADRewardedAd.load(withAdUnitID: self.admobPrebidAdUnitId, request: request) { [weak self] ad, error in
+ guard let self = self else { return }
+ if let error = error {
+ PBMLog.error(error.localizedDescription)
+ return
+ }
+
+ // 6. Present the interstitial ad
+ self.gadRewardedAd = ad
+ self.gadRewardedAd?.fullScreenContentDelegate = self
+ DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
+ self.gadRewardedAd?.present(fromRootViewController: self, userDidEarnRewardHandler: {
+ print("Reward user")
+ })
+ }
+ }
+}
+```
+
+The way of displaying the rewarded ad is totally the same as for the Interstitial Ad.
+
+To be notified when user earns a reward follow the [AdMob intructions](https://developers.google.com/admob/ios/rewarded#show_the_ad).
+
+#### Step 1: Create GADRequest
+
+This step is totally the same as for original [AdMob integration](https://developers.google.com/admob/ios/rewarded). You don't have to make any modifications here.
+
+
+#### Step 2: Create MediationRewardedAdUnit
+
+The `AdMobMediationRewardedUtils` is a helper class, wich performs certain utilty work for the `MediationRewardedAdUnit`, like passing the targeting keywords to the adapters.
+
+#### Step 3: Create MediationInterstitialAdUnit
+
+The `MediationRewardedAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters.
+
+#### Steps 6: Display an ad
+
+Once the rewarded ad is recieved you can display it. Folow the [AdMob instructions](https://developers.google.com/admob/ios/rewarded#swift) for the details.
+
+## Native Ads
+
+{: .alert.alert-warning :}
+**Warning:** If you use Native Ads you **must** integrate AdMob Adapters via the source files instead of cocoapods integration or standalone framework. The integration using framework leads to [runtime errors](https://github.com/prebid/prebid-mobile-ios/issues/516) related to the type casting.
+
+In order to integrate AdMob adapters just add the adapters' source files to your app project.
+
+Integration example:
+
+``` swift
+// 1. Create GAD Request
+gadRequest = GADRequest()
+
+// 2. Create AdMobMediationNativeUtils
+mediationDelegate = AdMobMediationNativeUtils(gadRequest: gadRequest)
+
+// 3. Create and configure MediationNativeAdUnit
+nativeAdUnit = MediationNativeAdUnit(configId: prebidConfigId,
+ mediationDelegate: mediationDelegate!)
+
+nativeAdUnit.setContextType(ContextType.Social)
+nativeAdUnit.setPlacementType(PlacementType.FeedContent)
+nativeAdUnit.setContextSubType(ContextSubType.Social)
+
+// 4. Set up assets for bid request
+nativeAdUnit.addNativeAssets(nativeAssets)
+
+// 5. Set up event tracker for bid request
+nativeAdUnit.addEventTracker(eventTrackers)
+
+// 5. Make a bid request
+nativeAdUnit.fetchDemand { [weak self] result in
+ guard let self = self else { return }
+
+ // 6. Store the winning bid in the GADRequest extras
+ // You must provide a winning bid via extras to the GADRequest here.
+ // Prebid SDK can't do it internally.
+ // Otherwise, the Prebid adapter won't be able to retrieve and render the winning bid
+ let extras = GADCustomEventExtras()
+ let prebidExtras = self.mediationDelegate?.getEventExtras()
+ extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel)
+ self.gadRequest.register(extras)
+
+ // 7. Load AdMob Native ad
+ self.adLoader = GADAdLoader(adUnitID: self.adMobAdUnitId!,
+ rootViewController: self.rootController,
+ adTypes: [ .native ],
+ options: nil)
+
+ self.adLoader?.delegate = self
+
+ // 8. Make an ad request
+ self.adLoader?.load(self.gadRequest)
+}
+```
+
+#### Step 1: Create GAD Request
+
+Prepare the `GADRequest` object before you make a bid request. It will be needed for prebid mediation utils.
+
+#### Step 2: Create AdMobMediationNativeUtils
+
+The `AdMobMediationNativeUtils` is a helper class, wich performs certain utilty work for `MediationNativeAdUnit`, like passing the targeting keywords to adapters and checking the visibility of the ad view.
+
+#### Step 3: Create and configure MediationNativeAdUnit
+
+The `MediationNativeAdUnit` is part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters. Fot the better targetting you should provide additional properties like `conteaxtType` and `placemantType`.
+
+#### Step 4: Set up assets for bid request
+
+The bid request for native ads should have the description of expected assets. The full spec for the native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the assets array:
+
+```
+let image = NativeAssetImage(minimumWidth: 200, minimumHeight: 50, required: true)
+image.type = ImageAsset.Main
+
+let icon = NativeAssetImage(minimumWidth: 20, minimumHeight: 20, required: true)
+icon.type = ImageAsset.Icon
+
+let title = NativeAssetTitle(length: 90, required: true)
+
+let body = NativeAssetData(type: DataAsset.description, required: true)
+
+let cta = NativeAssetData(type: DataAsset.ctatext, required: true)
+
+let sponsored = NativeAssetData(type: DataAsset.sponsored, required: true)
+
+return [icon, title, image, body, cta, sponsored]
+```
+
+#### Step 5: Set up event tracker for bid request
+
+The bid request for mative ads may have a descrition of expected event trackers. The full spec for the Native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the event trackers array:
+
+```
+let eventTrackers = [
+ NativeEventTracker(event: EventType.Impression,
+ methods: [EventTracking.Image,EventTracking.js])
+]
+```
+
+#### Step 6: Make a bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 7: Store the winning bid in the GADRequest extras
+
+GMA SDK doesn't provide extras to the adapter if they were set not in the app scope.
+
+That is why you must add the code for dispatching the winning bid to the adapters. In the most cases you will just need to copy and paste the following lines inside the completion closure of the `fetchDemand()` method:
+
+```
+let extras = GADCustomEventExtras()
+let prebidExtras = self?.mediationDelegate!.getEventExtras()
+extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel)
+
+self?.gadRequest.register(extras)
+```
+
+Make sure that you use the proper label for extras - `AdMobConstants.PrebidAdMobEventExtrasLabel`. Prebid adapters will extract the winnig bid by this key.
+
+#### Step 8: Load AdMob Native ad
+
+Now just load a native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/ios/native/start).
diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam-native.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam-native.md
new file mode 100644
index 0000000000..c8a8a53402
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam-native.md
@@ -0,0 +1,180 @@
+---
+
+layout: page_v2
+title: Native Ads Integration
+description: Integration of Prebid Rendering module whith Google Ad Manager for Native Ads
+sidebarType: 2
+---
+
+# GAM: Native Ads Integration
+
+## Unified Native Ads
+
+The general integration scenario requires these steps from publishers:
+
+1. Prepare the ad layout.
+2. Create Native Ad Unit and appropriate GAM ad loader.
+3. Configure the Native Ad unit using [NativeAdConfiguration](rendering-native-ad-configuration.md).
+ * Provide the list of [Native Assets](../../info-modules/rendering-native-guidelines#components) representing the ad's structure.
+ * Tune other general properties of the ad.
+4. Make a bid request.
+5. Prepare publisherAdRequest using `GAMUtils.shared.prepareRequest`
+6. After receiving response from GAM - check if prebid has won and find native ad using `GAMUtils`
+7. Bind the winner data from the native ad response with the layout.
+
+``` swift
+func loadAd() {
+ guard let nativeAdConfig = nativeAdConfig else {
+ return
+ }
+ adUnit = NativeAdUnit(configID: prebidconfigID, nativeAdConfiguration: nativeAdConfig)
+
+ adUnit?.fetchDemand { [weak self] demandResponseInfo in
+ guard let self = self else {
+ return
+ }
+
+ let dfpRequest = GAMRequest()
+ GAMUtils.shared.prepareRequest(dfpRequest, demandResponseInfo: demandResponseInfo)
+
+ self.adLoader = GADAdLoader(adUnitID: self.gamAdUnitId,
+ rootViewController: self.rootController,
+ adTypes: self.adTypes,
+ options: [])
+
+ self.adLoader?.delegate = self
+ self.adLoader?.load(dfpRequest)
+ }
+}
+```
+
+Example of handling NativeAd response (the same applies to Custom Native Ads):
+
+``` swift
+func adLoader(_ adLoader: GADAdLoader, didReceive nativeAd: GADNativeAd) {
+ unifiedAdRequestSuccessful.isEnabled = true
+ customTemplateAd = nil
+
+ let nativeAdDetectionListener = NativeAdDetectionListener { [weak self] prebidNativeAd in
+ guard let self = self else {
+ return
+ }
+ self.nativeAdLoadedButton.isEnabled = true
+ self.nativeAdViewBox.renderNativeAd(prebidNativeAd)
+ self.nativeAdViewBox.registerViews(prebidNativeAd)
+ self.theNativeAd = prebidNativeAd // Note: RETAIN! or the tracking will not occur!
+ prebidNativeAd.trackingDelegate = self
+ prebidNativeAd.uiDelegate = self
+ } onPrimaryAdWin: { [weak self] in
+ guard let self = self else {
+ return
+ }
+ self.unifiedAdWinButton.isEnabled = true
+
+ self.nativeAdView?.removeFromSuperview()
+
+ guard
+ let nibObjects = Bundle.main.loadNibNamed("UnifiedNativeAdView", owner: nil, options: nil),
+ let adView = nibObjects.first as? UnifiedNativeAdView
+ else {
+ assert(false, "Could not load nib file for adView")
+ }
+
+ self.setAdView(adView)
+
+ adView.renderUnifiedNativeAd(nativeAd)
+ } onNativeAdInvalid: { [weak self] error in
+ self?.nativeAdInvalidButton.isEnabled = true
+ }
+
+ GAMUtils.shared.findNativeAd(for: nativeAd,
+ nativeAdDetectionListener:nativeAdDetectionListener)
+}
+```
+
+## Native Styles
+
+The Native Styles ads are integrated with Baner API.
+
+Integration Example:
+
+``` swift
+// 1. Create an Event Handler
+let eventHandler = BannerEventHandler(adUnitID: GAM_AD_UNIT_ID,
+ validGADAdSizes: [NSValueFromGADAdSize(adSize)])
+
+// 2. Create a Banner View
+let banner = BannerView(configID: CONFIG_ID,
+ eventHandler: eventHandler)
+banner.delegate = self
+
+// 3. Setup Native Ad Configuration
+banner.nativeAdConfig = NativeAdConfiguration(testConfigWithAssets: assets)
+
+// 4. Load an Ad
+banner.loadAd()
+```
+
+#### Step 1: Create Event Handler
+
+To create the event handler you should provide a GAM Ad Unit Id and the list of available sizes for this ad unit.
+
+#### Step 2: Create Ad View
+
+**BannerView** - is a view that will display the particular ad. It should be added to the UI. To create it you should provide:
+
+- **configID** - an ID of Stored Impression on the Prebid server
+- **eventHandler** - the instance of the banner event handler
+
+Also, you should add the instance of `BannerView` to the UI.
+
+#### Step 3: Create and provide Native Assets
+
+To make a proper bid request publishers should provide the needed assets to the NativeAdConfiguration class. Each asset describes the UI element of the ad according to the [OpenRTB standarts](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+``` swift
+let assets = [
+ {
+ let title = NativeAssetTitle(length: 90)
+ title.required = true
+ return title
+ }(),
+ {
+ let icon = NativeAssetImage()
+ icon.widthMin = 50
+ icon.heightMin = 50
+ icon.required = true
+ icon.imageType = NSNumber(value: PBMImageAssetType.icon.rawValue)
+ return icon
+ }(),
+ {
+ let image = NativeAssetImage()
+ image.widthMin = 150
+ image.heightMin = 50
+ image.required = true
+ image.imageType = NSNumber(value: PBMImageAssetType.main.rawValue)
+ return image
+ }(),
+ {
+ let desc = NativeAssetData(dataType: .desc)
+ desc.required = true
+ return desc
+ }(),
+ {
+ let cta = NativeAssetData(dataType: .ctaText)
+ cta.required = true
+ return cta
+ }(),
+ {
+ let sponsored = NativeAssetData(dataType: .sponsored)
+ sponsored.required = true
+ return sponsored
+ }(),
+]
+```
+
+See the full description of NativeAdConfiguration options [here](rendering-native-ad-configuration.md).
+
+#### Step 4: Load the Ad
+
+Call the `loadAd()` method in order to make bid request and render the winning bid.
\ No newline at end of file
diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md
new file mode 100644
index 0000000000..92d3840d45
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md
@@ -0,0 +1,305 @@
+---
+layout: page_v2
+title: Google Ad Manager Integration
+description: Integration of Prebid Rendering module whith Google Ad Manager
+sidebarType: 2
+---
+
+# Google Ad Manager Integration
+
+The integration of Prebid Rendering API with Google Ad Manager (GAM) assumes that publisher has an account on GAM and has already integrated the Google Mobile Ads SDK (GMA SDK) into the app project.
+
+If you do not have GMA SDK in the app yet, refer the the [Google Integration Documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/quick-start).
+
+{: .alert.alert-warning :}
+**Warning:** GMA SDK is a closed library that sometimes works in an unexpected way. The `GADMobileAds.sharedInstance().start()` should be called in all bundles where it is used. Otherwise, GMA SDK won't load the ads with error: `adView:didFailToReceiveAdWithError: SDK tried to perform a networking task before being initialized.`
+
+To avoid the error add the following line to your app right after initialization of GMA SDK:
+
+```
+GAMUtils.shared.initializeGAM()
+```
+
+
+## GAM Integration Overview
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-GAM.png)
+
+**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid.
+
+**Step 3** Prebid SDK using Prebid GAM Event Handler sets up the targeting keywords into the GAM's ad unit.
+
+**Step 4** GMA SDK makes an ad request. GAM returns the winner of the waterfall.
+
+**Step 5** Basing on the ad response Prebid GAM Event Handler decides who has won on the GAM - the Prebid bid or another ad source on GAM.
+
+**Step 6** The winner is displayed in the App with the respective rendering engine. The winning bid will be renderd by Prebid SDK. An other ad will be rendered by GMA SDK. The GAM Event Handler manages this process.
+
+Prebid Rendering API supports these ad formats:
+
+- Display Banner
+- Video Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+
+[//]: # (- Native)
+[//]: # (- Native Styles)
+
+They can be integrated using these API categories:
+
+- [**Banner API**](#banner-api) - for *Display* and *Video* Banner
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+
+[//]: # (- [**Native API**](android-sdk-integration-gam-native.html) - for *Native Ads*)
+
+
+## Banner API
+
+Integration example:
+
+``` swift
+// 1. Create an Event Handler
+let eventHandler = GAMBannerEventHandler(adUnitID: GAM_AD_UNIT_ID,
+ validGADAdSizes: [NSValueFromGADAdSize(adSize)])
+
+// 2. Create a Banner View
+let banner = BannerView(configID: CONFIG_ID,
+ eventHandler: eventHandler)
+
+banner.delegate = self
+
+addBannerToUI(banner: banner)
+
+// 3. Load an Ad
+banner.loadAd()
+```
+
+#### Step 1: Create Event Handler
+
+To create the `GAMBannerEventHandler ` you should provide:
+
+- a **GAM Ad Unit Id**
+- the list of available **sizes** for this ad unit.
+
+
+#### Step 2: Create Ad View
+
+`BannerView` - is a view that will display the particular ad. It should be added to the UI. To create it you should provide:
+
+- `configID` - an ID of Stored Impression on the Prebid server
+- `eventHandler` - the instance of the banner event handler
+
+Also, you should add the instance of `BannerView` to the UI.
+
+#### Step 3: Load the Ad
+
+Call the method `loadAd()` which will:
+
+- make a bid request to Prebid Server.
+- render the winning bid on display.
+
+### Banner Video
+
+For **Banner Video** you also need to specify the ad format:
+
+``` swift
+banner.adFormat = .video
+```
+
+And all the rest code will be the same as for integration of Display Banner.
+
+### Migration from the original API
+
+GAM setup:
+
+1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications.
+2. Create new GAM ad unit.
+3. Setup new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach.
+
+Integration:
+
+1. Replace the `GAMBannerView` with `BannerView` in the UI.
+2. Implement the protocol `BannerViewDelegate` in the View Controller.
+3. Remove usage of `GAMBannerView`, `GAMRequest`, and implementation of the `GADBannerViewDelegate`.
+4. Remove original `BannerAdUnit`.
+5. Follow the instructions to integrate [Banner API](#banner-api).
+
+## Interstitial API
+
+Integration example:
+
+``` swift
+// 1. Create Event Handler
+let eventHandler = GAMInterstitialEventHandler(adUnitID: GAM_AD_UNIT_ID)
+
+// 2. Create Interstitial Ad Unit
+interstitial = InterstitialRenderingAdUnit (configID: CONFIG_ID,
+ minSizePercentage: CGSize(width: 30, height: 30),
+ eventHandler: eventHandler)
+
+interstitial.delegate = self
+
+// 3. Load an Ad
+interstitial.loadAd()
+
+/// .......
+
+// 4. Show Ad
+if interstitial.isReady {
+ interstitial.show(from: self)
+}
+
+```
+
+The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property.
+
+``` swift
+// Make bid request for video ad
+adUnit?.adFormats = [.video]
+
+// Make bid request for both video amd disply ads
+adUnit?.adFormats = [.video, .display]
+
+// Make bid request for disply ad (default behaviour)
+adUnit?.adFormats = [.display]
+
+```
+
+
+#### Step 1: Create Event Handler
+
+To create an event handler you should provide a **GAM Ad Unit**.
+
+#### Step 2: Create Interstitial Ad Unit
+
+Initialize the `InterstitialRenderingAdUnit` with properties:
+
+- `configID` - an ID of Stored Impression on the Prebid server
+- `minSizePercentage` - specifies the minimum width and height percent an ad may occupy of a deviceâs real estate.
+- `eventHandler` - the instance of the interstitial event handler
+
+> **NOTE:** the `minSizePercentage` - plays an important role in a bidding process for display ads. If provided space is not enough demand partners won't respond with the bids.
+
+
+#### Step 3: Load the Ad
+
+Call the method `loadAd()` which will make a bid request to Prebid Server.
+
+#### Step 4: Show the Ad when it is ready
+
+Wait for the ad to and show it to the user in any suitable time.
+
+
+``` swift
+// MARK: InterstitialRenderingAdUnitDelegate
+
+func interstitialDidReceiveAd(_ interstitial: InterstitialAdUnit) {
+ // Now the ad is ready for display
+}
+```
+
+### Migration from the original API
+
+GAM setup:
+
+1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications.
+2. Create new GAM ad unit.
+3. Setup new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach.
+
+Integration:
+
+1. Replace the `GAMInterstitialAd` with `InterstitialRenderingAdUnit` in the View Controller.
+2. Implement the protocol `InterstitialAdUnitDelegate` in the View Controller.
+3. Remove usage of `GAMInterstitialAd`, `GAMRequest`.
+4. Remove original `InterstitialAdUnit`.
+5. Follow the instructions to integrate [Interstitial API](#interstitial-api).
+
+
+## Rewarded API
+
+Integration example:
+
+``` swift
+ // 1. Create an Event Handler
+let eventHandler = GAMRewardedEventHandler(adUnitID: GAM_AD_UNIT_ID)
+
+// 2. Create an Ad Unit
+rewardedAd = RewardedAdUnit(configID: CONFIG_ID,
+ eventHandler: eventHandler)
+
+rewardedAd.delegate = self
+
+// 3. Load an Ad
+rewardedAd.loadAd()
+
+/// .......
+
+// 4. Display Ad
+if rewardedAd.isReady {
+ rewardedAd.show(from: self)
+}
+
+```
+
+The way of displaying the Rewarded Ad is totally the same as for the Interstitial Ad.
+
+To be notified when user earns a reward - implement the method of `RewardedAdUnitDelegate`:
+
+``` swift
+- (void)rewardedAdUserDidEarnReward:(RewardedAdUnit *)rewardedAd;
+```
+
+The actual reward object is stored in the `RewardedAdUnit`:
+
+```
+if let reward = rewardedAd.reward as? GADAdReward {
+ // ...
+}
+```
+
+#### Step 1: Create Event Handler
+
+To create an event handler you should provide a **GAM Ad Unit ID**.
+
+#### Step 2: Create Rewarded Ad Unit
+
+Create the `RewardedAdUnit` object with parameters:
+
+- `configID` - an ID of Stored Impression on the Prebid server
+- `eventHandler` - the instance of rewarded event handler
+
+#### Step 3: Load the Ad
+
+Call the `loadAd()` method which will make a bid request to Prebid server.
+
+#### Step 4: Show the Ad when it is ready
+
+Wait for the ad to load and show it to the user in any suitable time.
+
+
+``` swift
+// MARK: RewardedAdUnitDelegate
+
+func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) {
+ // Now the ad is ready for display
+}
+```
+
+### Migration from the original API
+
+GAM setup:
+
+1. Leave the original order and ad units as is. They are not relevant for the rendering approach but they will serve ads for released applications.
+2. Create new GAM ad unit.
+3. Setup new [GAM Order](rendering-gam-line-item-setup.html) for rendering approach.
+
+Integration:
+
+1. Replace the `GADRewardedAd` with `RewardedAdUnit` in the View Controller.
+2. Implement the protocol `RewardedAdUnitDelegate` in the View Controller.
+3. Remove usage of `GAMRequest`.
+4. Remove original `RewardedVideoAdUnit`.
+5. Follow the instructions to integrate [Rewarded API](#rewarded-api).
+Ă
\ No newline at end of file
diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md
new file mode 100644
index 0000000000..f7f7ffe155
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md
@@ -0,0 +1,300 @@
+---
+layout: page_v2
+title: AppLovin MAX Integration
+description: Integration of Prebid Rendering module whith AppLovin MAX
+sidebarType: 2
+---
+
+# AppLovin MAX Integration
+
+The integration of Prebid Mobile with AppLovin MAX assumes that publisher has MAX account and has already integrated the AppLovin MAX SDK into the app.
+
+See the [AppLovin MAX Documentation](https://dash.applovin.com/documentation/mediation/ios/getting-started/integration) for the MAX integration details.
+
+## MAX Integration Overview
+
+![Rendering with AppLovin MAX as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/prebid-in-app-bidding-overview-max.png)
+
+**Steps 1-2** Prebid SDK makes a bid request. Prebid server runs an auction and returns the winning bid.
+
+**Step 3** MAX SDK makes an ad request. MAX returns the waterfall with respective placements.
+
+**Step 4** For each prebid's placement, the MAX SDK sequentially instantiates an adapter.
+
+**Step 5** The adapter verifies the targeting keywords of the winning bid and the custom properties of the given placement. If they match the adapter will render the winning bid. Otherwise, adpater will fail with "no ad" immediately and the next placement will instantiate the same adapter but for another custom properties.
+
+Prebid Mobile supports these ad formats:
+
+- Display Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+- Native
+
+They can be integrated using these API categories:
+
+- [**Banner API**](#banner-api) - for *Display* Banner
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+- [**Native API**](#native-ads) - for *Native Ads*
+
+
+## Banner API
+
+Integration example:
+
+``` swift
+// 1. Create MAAdView
+adBannerView = MAAdView(adUnitIdentifier: maxAdUnitId)
+adBannerView?.delegate = self
+
+// 2. Create MAXMediationBannerUtils
+mediationDelegate = MAXMediationBannerUtils(adView: adBannerView!)
+
+// 3. Create MediationBannerAdUnit
+adUnit = MediationBannerAdUnit(configID: prebidConfigId,
+ size: adUnitSize,
+ mediationDelegate: mediationDelegate!)
+
+// 4. Make a bid request
+adUnit?.fetchDemand { [weak self] result in
+
+ // 5. Make an ad request to MAX
+ self?.adBannerView.loadAd()
+}
+```
+
+#### Step 1: Create MAAdView
+
+This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/banners#loading-a-banner). You don't have to make any modifications here.
+
+
+#### Step 2: Create MAXMediationBannerUtils
+
+The `MAXMediationBannerUtils ` is a helper class, wich performs certain utilty work for the `MediationBannerAdUnit`, like passing the targeting keywords to the adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationBannerAdUnit
+
+The `MediationBannerAdUnit` is a part of Prebid mediation API. This class is responsible for making bid request and providing the winning bid and targeting keywords to mediating SDKs.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular MAX's ad request. Everything else will be handled by prebid adapters.
+
+## Interstitial API
+
+Integration example:
+
+``` swift
+// 1. Create MAInterstitialAd
+interstitial = MAInterstitialAd(adUnitIdentifier: maxAdUnitId)
+interstitial.delegate = self
+
+// 2. Create MAXMediationInterstitialUtils
+mediationDelegate = MAXMediationInterstitialUtils(interstitialAd: interstitial!)
+
+// 3. Create MediationInterstitialAdUnit
+adUnit = MediationInterstitialAdUnit(configId: prebidConfigId,
+ minSizePercentage: CGSize(width: 30, height: 30),
+ mediationDelegate: mediationDelegate!)
+
+// 4. Make a bid request
+adUnit?.fetchDemand { [weak self] result in
+ guard let self = self else { return }
+
+ guard result == .prebidDemandFetchSuccess else {
+ self.fetchDemandFailedButton.isEnabled = true
+ return
+ }
+
+ // 5. Make an ad request to MAX
+ self.interstitial?.load()
+})
+```
+
+The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property.
+
+``` swift
+// Make bid request for video ad
+adUnit?.adFormats = [.video]
+
+// Make bid request for both video amd disply ads
+adUnit?.adFormats = [.video, .display]
+
+// Make bid request for disply ad (default behaviour)
+adUnit?.adFormats = [.display]
+
+```
+
+#### Step 1: Create MAInterstitialAd
+
+This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/interstitials). You don't have to make any modifications here.
+
+
+#### Step 2: Create MAXMediationInterstitialUtils
+
+The `MAXMediationInterstitialUtils` is a helper class, wich performs certain utilty work for the `MediationInterstitialAdUnit `, like passing the targeting keywords to the adapters and checking the visibility of the ad view.
+
+#### Step 3: Create MediationInterstitialAdUnit
+
+The `MediationInterstitialAdUnit` is a part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid to the mediating SDKs.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular MAX's ad request. Everything else will be handled by GMA SDK and prebid adapters.
+
+#### Steps 6: Display an ad
+
+Once you receive the ad it will be ready for display. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/interstitials#showing-an-interstitial-ad) about how to do it.
+
+## Rewarded API
+
+Integration example:
+
+``` swift
+// 1. Get an instance of MARewardedAd
+rewarded = MARewardedAd.shared(withAdUnitIdentifier: maxAdUnitId)
+rewarded.delegate = self
+
+// 2. Create MAXMediationRewardedUtils
+mediationDelegate = MAXMediationRewardedUtils(rewardedAd: rewarded!)
+
+// 3. Create MediationRewardedAdUnit
+adUnit = MediationRewardedAdUnit(configId: prebidConfigId, mediationDelegate: mediationDelegate!)
+
+// 4. Make a bid request
+adUnit?.fetchDemand { [weak self] result in
+ guard let self = self else { return }
+
+ // 5. Make an ad request to MAX
+ self.rewarded?.load()
+}
+```
+
+The way of displaying the rewarded ad is totally the same as for the Interstitial Ad.
+
+To be notified when user earns a reward follow the [MAX intructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads#loading-a-rewarded-ad).
+
+#### Step 1: Get an instance of MARewardedAd
+
+This step is totally the same as for original [MAX integration](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads). You don't have to make any modifications here.
+
+
+#### Step 2: Create MAXMediationRewardedUtils
+
+The `MAXMediationRewardedUtils` is a helper class, wich performs certain utilty work for the `MediationRewardedAdUnit`, like passing the targeting keywords to the adapters.
+
+#### Step 3: Create MediationRewardedAdUnit
+
+The `MediationRewardedAdUnit` is a part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters.
+
+#### Step 4: Make bid request
+
+The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler.
+
+#### Step 5: Make an Ad Reuest
+
+Now you should make a regular MAX's ad request. Everything else will be handled by GMA SDK and prebid adapters.
+
+#### Steps 6: Display an ad
+
+Once the rewarded ad is recieved you can display it. Folow the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/rewarded-ads#showing-a-rewarded-ad) for the details.
+
+## Native Ads
+
+Integration example:
+
+``` swift
+// 1. Create MANativeAdLoader
+nativeAdLoader = MANativeAdLoader(adUnitIdentifier: maxAdUnitId)
+nativeAdLoader?.nativeAdDelegate = self
+
+// 2. Create MAXMediationNativeUtils
+mediationDelegate = MAXMediationNativeUtils(nativeAdLoader: nativeAdLoader!)
+
+// 3. Create and configure MediationNativeAdUnit
+nativeAdUnit = MediationNativeAdUnit(configId: prebidConfigId,
+ mediationDelegate: mediationDelegate!)
+
+nativeAdUnit.setContextType(ContextType.Social)
+nativeAdUnit.setPlacementType(PlacementType.FeedContent)
+nativeAdUnit.setContextSubType(ContextSubType.Social)
+
+// 4. Set up assets for bid request
+nativeAdUnit.addNativeAssets(nativeAssets)
+
+// 5. Set up event tracker for bid request
+nativeAdUnit.addEventTracker(eventTrackers)
+
+// 6. Make a bid request
+nativeAdUnit.fetchDemand { [weak self] result in
+
+ // 7. Make an ad request to MAX
+ self?.nativeAdLoader?.loadAd(into: self?.createNativeAdView())
+}
+```
+
+#### Step 1: Create MANativeAdLoader
+
+Prepare the `MANativeAdLoader` object before you make a bid request. It will be needed for prebid mediation utils.
+
+#### Step 2: Create MAXMediationNativeUtils
+
+The `MAXMediationNativeUtils` is a helper class, wich performs certain utilty work for `MediationNativeAdUnit`, like passing the targeting keywords to adapters and checking the visibility of the ad view.
+
+#### Step 3: Create and configure MediationNativeAdUnit
+
+The `MediationNativeAdUnit` is a part of the prebid mediation API. This class is responsible for making a bid request and providing a winning bid and targeting keywords to the adapters. Fot the better targetting you should provide additional properties like `conteaxtType` and `placemantType`.
+
+#### Step 4: Set up assets for bid request
+
+The bid request for native ads should have the description of expected assets. The full spec for the native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the assets array:
+
+```
+let image = NativeAssetImage(minimumWidth: 200, minimumHeight: 50, required: true)
+image.type = ImageAsset.Main
+
+let icon = NativeAssetImage(minimumWidth: 20, minimumHeight: 20, required: true)
+icon.type = ImageAsset.Icon
+
+let title = NativeAssetTitle(length: 90, required: true)
+
+let body = NativeAssetData(type: DataAsset.description, required: true)
+
+let cta = NativeAssetData(type: DataAsset.ctatext, required: true)
+
+let sponsored = NativeAssetData(type: DataAsset.sponsored, required: true)
+
+return [icon, title, image, body, cta, sponsored]
+```
+
+#### Step 5: Set up event tracker for bid request
+
+The bid request for mative ads may have a descrition of expected event trackers. The full spec for the Native template you can find in the [Native Ad Specification from IAB](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+The example of creating the event trackers array:
+
+```
+let eventTrackers = [
+ NativeEventTracker(event: EventType.Impression,
+ methods: [EventTracking.Image,EventTracking.js])
+]
+```
+
+#### Step 6: Make a bid request
+
+The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler.
+
+#### Step 7: Load Native ad
+
+Now just load a native ad from MAX according to the [MAX instructions](https://dash.applovin.com/documentation/mediation/ios/getting-started/native-manual#load-the-native-ad).
diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb-native.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb-native.md
new file mode 100644
index 0000000000..1e21555af7
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb-native.md
@@ -0,0 +1,174 @@
+---
+
+layout: page_v2
+title: Native Ads Integration
+description: Integration of Prebid SDK without Primary Ad Server SDK
+sidebarType: 2
+
+---
+
+# Native Ads Integration
+
+## Unified Native Ads
+
+The general integration scenario requires these steps from publishers:
+
+1. Prepare the ad layout.
+2. Create Native Ad Unit.
+3. Configure the Native Ad unit using [NativeAdConfiguration](rendering-native-ad-configuration.html).
+ * Provide the list of [Native Assets](rendering-native-guidelines.html#components) representing the ad's structure.
+ * Tune other general properties of the ad.
+4. Make a bid request.
+5. Extract NativeAd using `NativeUtils.findNativeAd`
+7. Bind the data from the native ad with the layout.
+
+
+``` swift
+func loadAd() {
+ guard let nativeAdConfig = nativeAdConfig else {
+ return
+ }
+ adUnit = NativeAdUnit(configID: prebidConfigId, nativeAdConfiguration: nativeAdConfig)
+
+ adUnit?.fetchDemand { [weak self] demandResponseInfo in
+ guard let self = self,
+ demandResponseInfo.fetchDemandResult == .ok else {
+ return
+ }
+
+ demandResponseInfo.getNativeAd { [weak self] nativeAd in
+ guard let self = self,
+ let nativeAd = nativeAd else {
+ return
+ }
+
+ self?.renderNativeAd(nativeAd)
+
+ self.theNativeAd = nativeAd // Note: RETAIN! or the tracking will not occur!
+ nativeAd.trackingDelegate = self
+ nativeAd.uiDelegate = self
+
+ if let _ = nativeAd.videoAd?.mediaData {
+ self.nativeAdViewBox?.mediaViewDelegate = self
+ self.setupMediaPlaybackTrackers(isVisible: true)
+ }
+ }
+ }
+}
+```
+
+## Native Styles
+
+[See Native Ads Guidelines page](rendering-native-guidelines.html) for more details about SDK integration and supported ad types.
+
+To display an ad using Native Styles you'll need to implement these easy steps:
+
+``` swift
+// 1. Create an Ad View
+let banner = BannerView(configId: CONFIG_ID,
+ adSize: adSize)
+
+banner.delegate = self
+
+// 2. Set the Native Ad Configurations
+let nativeAdConfig = NativeAdConfiguration(testConfigWithAssets: assets)
+nativeAdConfig.nativeStylesCreative = nativeStylesCreative
+
+banner.nativeStylesCreative = nativeAdConfig
+
+// 3. Load an Ad
+banner.loadAd()
+```
+
+#### Step 1: Create Ad View
+
+In the Pure In-App Bidding scenario you just need to initialize the Banner Ad View using correct properties:
+
+- **configID** - an ID of Stored Impression on the Apollo server.
+- **size** - the size of the ad unit which will be used in the bid request.
+
+
+{% capture warning_note %}
+You should add HTML and CSS to define your native ad template with universal creative and provide it via the nativeStylesCreative property of NativeAdConfiguration.
+{% endcapture %}
+{% include /alerts/alert_important.html content=warning_note %}
+
+#### Step 2: Create and provide Native Assets
+
+To make a proper bid request publishers should provide the needed assets to the NativeAdConfiguration class. Each asset describes the UI element of the ad according to the [OpenRTB standarts](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf).
+
+``` swift
+let assets = [
+ {
+ let title = NativeAssetTitle(length: 90)
+ title.required = true
+ return title
+ }(),
+ {
+ let icon = NativeAssetImage()
+ icon.widthMin = 50
+ icon.heightMin = 50
+ icon.required = true
+ icon.imageType = NSNumber(value: ImageAssetType.icon.rawValue)
+ return icon
+ }(),
+ {
+ let image = NativeAssetImage()
+ image.widthMin = 150
+ image.heightMin = 50
+ image.required = true
+ image.imageType = NSNumber(value: ImageAssetType.main.rawValue)
+ return image
+ }(),
+ {
+ let desc = NativeAssetData(dataType: .desc)
+ desc.required = true
+ return desc
+ }(),
+ {
+ let cta = NativeAssetData(dataType: .ctaText)
+ cta.required = true
+ return cta
+ }(),
+ {
+ let sponsored = NativeAssetData(dataType: .sponsored)
+ sponsored.required = true
+ return sponsored
+ }(),
+]
+```
+
+Native Styles creative example:
+
+``` html
+
+
+
+```
+
+
+See the full description of NativeAdConfiguration options [here](rendering-native-ad-configuration.html).
+
+#### Step 3: Load the Ad
+
+Call `loadAd()` and SDK will:
+
+- make a bid request to Prebid server
+- render the winning bid on display
+
+
diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md
new file mode 100644
index 0000000000..dbed9cf9e1
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md
@@ -0,0 +1,187 @@
+---
+
+layout: page_v2
+title: Custom or No mediation
+description: Integration of Prebid SDK without Primary Ad Server SDK
+sidebarType: 2
+
+---
+
+# Custom Bidding Integration
+
+## Table of Contents
+
+- [Mobile API](#mobile-api)
+- [Banner](#banner-api)
+- [Interstitial](#interstitial-api)
+- [Rewarded](#rewarded-api)
+
+## Mobile API
+
+The integration and usage of the Rendering API are similar to any other Ad SDK. It sends the bid requests to the Prebid Server and renders the winning bid.
+
+![In-App Bidding with Prebid](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-Pure-Prebid.png)
+
+Prebid supports rendering of these ad formats:
+
+- Display Banner
+- Display Interstitial
+- Video Interstitial
+- Rewarded Video
+- Outstream Video
+
+[//]: # (- Native)
+
+They can be integrated using these API categories:
+
+- [**Banner API**](#banner-api) - for *Display* and *Video* Banners
+- [**Interstitial API**](#interstitial-api) - for *Display* and *Video* Interstitials
+- [**Rewarded API**](#rewarded-api) - for *Rewarded Video*
+
+[//]: # (- [**Native API**](ios-sdk-integration-pb-native.html) - for *Native Ads*)
+
+### Banner API
+
+Integration example:
+
+``` swift
+// 1. Create an Ad View
+let banner = BannerView(frame: CGRect(origin: .zero, size: adSize),
+ configID: CONFIG_ID,
+ adSize: adSize)
+
+banner.delegate = self
+
+// 2. Load an Ad
+banner.loadAd()
+```
+
+#### Step 1: Create Ad View
+
+Initialize the `BannerAdView` with properties:
+
+- `frame` - the frame rectangle for the view
+- `configID` - an ID of the Stored Impression on the Prebid Server
+- `size` - the size of the ad unit which will be used in the bid request.
+
+#### Step 2: Load the Ad
+
+Call the method `loadAd()` which will:
+
+- make a bid request to the Prebid Server.
+- render the winning bid on display.
+
+#### Outstream Video
+
+For **Banner Video** you also need to specify the ad format:
+
+``` swift
+banner.adFormat = .video
+```
+
+### Interstitial API
+
+Integration example:
+
+``` swift
+// 1. Create an Interstitial Ad Unit
+interstitial = InterstitialRenderingAdUnit(configID: CONFIG_ID,
+ minSizePercentage: CGSize(width: 30, height: 30))
+
+interstitial.delegate = self
+
+// 2. Load an Ad
+interstitial.loadAd()
+
+// .....
+
+// 3. Show An Ad
+if interstitial.isReady {
+ interstitial.show(from: self)
+}
+
+```
+
+The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property.
+
+``` swift
+// Make bid request for video ad
+adUnit?.adFormats = [.video]
+
+// Make bid request for both video amd disply ads
+adUnit?.adFormats = [.video, .display]
+
+// Make bid request for disply ad (default behaviour)
+adUnit?.adFormats = [.display]
+
+```
+
+#### Step 1: Create an Ad Unit
+
+
+Initialize the Interstitial Ad Unit with properties:
+
+- `configID` - an ID of Stored Impression on the Prebid Server
+- `minSizePercentage` - specifies the minimum width and height percent an ad may occupy of a deviceâs real estate.
+
+> **NOTE:** minSizePercentage - plays an important role in a bidding process for display ads. If provided space is not enough demand partners won't respond with the bids.
+
+#### Step 2: Load the Ad
+
+Call the method `loadAd()` which will make a bid request to Prebid server.
+
+
+#### Step 3: Show the Ad when it is ready
+
+Wait until the ad will be loaded and present it to the user in any suitable time.
+
+``` swift
+// MARK: InterstitialRenderingAdUnitDelegate
+
+func interstitialDidReceiveAd(_ interstitial: InterstitialRenderingAdUnit) {
+ // Now the ad is ready for display
+}
+```
+
+### Rewarded API
+
+Integration example:
+
+``` swift
+// 1. Create an Ad Unit
+rewardedAd = RewardedAdUnit(configID: CONFIG_ID)
+rewardedAd.delegate = self
+
+// 2. Load an Ad
+rewardedAd.loadAd()
+
+/// .......
+
+// 3. Display the Ad
+if rewardedAd.isReady {
+ rewardedAd.show(from: self)
+}
+```
+
+
+#### Step 1: Create Rewarded Ad Unit
+
+Create the `RewardedAdUnit` object with parameter:
+
+- **configID** - an ID of Stored Impression on the Prebid Server
+
+#### Step 2: Load the Ad
+
+Call the `loadAd()` method which will make a bid request to Prebid server.
+
+#### Step 3: Show the Ad when it is ready
+
+Wait until the ad will be loaded and present it to the user in any suitable time.
+
+``` swift
+// MARK: RewardedAdUnitDelegate
+
+func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) {
+ // Now the ad is ready for display
+}
+```
\ No newline at end of file
diff --git a/prebid-mobile/modules/rendering/ios-sdk-parameters.md b/prebid-mobile/modules/rendering/ios-sdk-parameters.md
new file mode 100644
index 0000000000..a4c6f0e0fe
--- /dev/null
+++ b/prebid-mobile/modules/rendering/ios-sdk-parameters.md
@@ -0,0 +1,88 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# Request parameters
+
+The tables below list methods and properties that the Rendering Module allows to customize in order to enrich the bid requests with actual data. The more info is provided about the user, the app, and the device the more chances to win a bid.
+
+Please strictly follow the recommendations in the below tables and provide all â **Required** and **Highly Recommended** values.
+
+
+1. [PrebidRenderingTargeting Properties](#prebidrenderingtargeting-variables)
+1. [PrebidRenderingTargeting Methods](#prebidrenderingtargeting-methods)
+1. [PrebidRenderingConfig](#prebidrenderingconfig)
+
+## PrebidRenderingTargeting proeprties
+
+{: .table .table-bordered .table-striped }
+
+| **Variable** | **Description** | **Required?** |
+| -------------------- | ---------------- | ------------------------------------------------------------ | ------------------------ |
+| appStoreMarketURL | Stores URL for the mobile application. For example: `"https://itunes.apple.com/us/app/your-app/id123456789"` | â Required |
+|contentUrl | This is the deep-link URL for the app screen that is displaying the ad. This can be an iOS universal link. | â Highly Recommended |
+|publisherName| App's publisher's name. | â Highly Recommended |
+| userAge | User's age in years. For example: `35` | â Highly Recommended |
+| coppa | Flag indicating if this request is subject to the COPPA regulations established by the USA FTC, where 0 = no, 1 = yes | â Highly Recommended |
+| userAnnualIncomeInUS | User's annual income in US dollars. For example: `55000` | â Highly Recommended |
+| userGender | User's gender (Male, Female, Other, Unknown). For example: `GenderFemale` | â Highly Recommended |
+|userGenderDescription| String representation of the user's gender, where âMâ = male, âFâ = female, âOâ = known to be other (i.e., omitted is unknown) | |
+| userID | ID of the user within the app. For example: `"24601"` | â Highly Recommended |
+| buyerUID | Buyer-specific ID for the user as mapped by the exchange for the buyer. | â Highly Recommended |
+| userEthnicity | User's ethnicity (African American, Asian, Hispanic, White, Other). For example: `EthnicityAsian` | Recommended if available |
+| userMaritalStatus | User's marital status (Single, Married, Divorced, Unknown). For example: `MaritalStatusDivorced` | Recommended if available |
+| networkType | Network connection type of the user (offline, wifi, or cell).For example: `NetworkTypeWifi` | â Required |
+| IP | The IP address of the carrier gateway. If this is not present, Prebid retrieves it from the request header. For example: `"192.168.0.1"` | â Highly Recommended |
+| carrier | Mobile carrier - Defined by the Mobile Country Code (MCC) and Mobile Network Code (MNC), using the format: -. For example: `"310-410"` | Optional |
+| DMA | For US locations, indicates the user's Designated Market Area. For example: `"803"` | Optional |
+| keywords | Comma separated list of keywords, interests, or intent | Optional |
+| userCustomData| Optional feature to pass bidder the data that was set in the exchangeâs cookie. The string must be in base85 cookie safe characters and be in any format. Proper JSON encoding must be used to include âescapedâ quotation marks. | Optional |
+|userExt| Placeholder for exchange-specific extensions to OpenRTB. | Optional |
+
+The code sample:
+
+``` swift
+let targeting = PrebidRenderingTargeting.shared
+targeting.userGender = .male
+targeting.userAge = 99
+targeting.userAnnualIncomeInUS = 9999
+targeting.setLatitude(123.0, longitude: 456.0)
+```
+
+
+## PrebidRenderingTargeting methods
+
+{: .table .table-bordered .table-striped }
+
+| **Method** | **Description** |
+| ---------------------------------------- | ------------------------------------------------------------ |
+| addCustomParam:@"val1" withName:@"key1" | Adds the custom parameters. The name will be auto-prepended with `c.` to avoid collisions. Example: `addCustomParam:@"73" withName:@"temperature"` |
+| setCustomParams:@["key1":@"val1"] | Adds a dictionary of name-value parameter pairs, where each parameter name will be prepended with `c.` to avoid name collisions. Example: `setCustomParams:@["key1":@"val1"]` |
+| addParam:@"val1" withName:@"key1" | Adds a new `param` by name and sets its value. If an ad call parameter doesn't exist in this SDK, you can set it manually using this method. Example: `addParam:@"73" withName:@"temperature"` |
+| setLatitude:latitude longitude:longitude | Sets the latitude and longitude of a geographic location. Latitude from -90.0 to +90.0, where negative is south. Longitude from -180.0 to +180.0, where negative is west. |
+| resetUserAge; | Sets the User Age to 0 |
+| resetUserAnnualIncomeInUS; | Sets the userAnnualIncomeInUS to 0 |
+
+## PrebidRenderingConfig
+
+{: .table .table-bordered .table-striped }
+
+| **Method** | **Description** | **Default** |
+| -------------------------------------- | ------------------------------------------------------------ | ----------- |
+| creativeFactoryTimeout | Controls how long in seconds each creative has to load before it is considered a failure. | 3 |
+| creativeFactoryTimeoutPreRenderContent | Controls how long (in seconds) the video and display interstitial creative has to completely pre-render before it is considered a failure. | 30 |
+| useInternalClickthroughBrowser | Controls whether to use in-app browser or the Safari app for displaying ad click-through content. | true |
+| logLevel | Controls the verbosity of PrebidRenderingModule's internal logger. Options are (from most to least noisy): - .info - .warn - .error - .none | .info |
+| debugLogFileEnabled | If `true`, the output of PrebidRenderingModule's internal logger is written to a text file. This can be helpful for debugging. | false |
+
+The code sample:
+
+``` swift
+PrebidRenderingConfig.shared.creativeFactoryTimeout = 5.0
+```
+
diff --git a/prebid-mobile/modules/rendering/modules-rendering.md b/prebid-mobile/modules/rendering/modules-rendering.md
new file mode 100644
index 0000000000..c3bab7685a
--- /dev/null
+++ b/prebid-mobile/modules/rendering/modules-rendering.md
@@ -0,0 +1,120 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# Prebid Mobile Rendering
+
+Prebid Mobile has added a rendering module (currently in open beta) which provides an API for rendering display and video media types independently of the current core feature set and interfaces. The API enables Prebid Mobile to have full ownership of the Web view selected for rendering and will pass any associated ad markup to the controlled view. This new functionality enables publishers to have improved control of features such as Open Measurement, MRAID, SKAdNetwork. This same functionality is available for rendering video (VAST) creatives through an internal video player.
+
+The **rendering API** is available on iOS and Android starting with the `1.13.0-beta1` version.
+
+Starting with `1.14.0-beta1` Prebid mobile supports integration with **AdMob**.
+
+Starting with `2.0.0` Prebid mobile supports integration with **AppLovin MAX**.
+
+## Benefits
+
+Prebid SDK rendering offers the following benefits:
+
+- **Monetization without an Ad Server**: Publishers who do not have a direct sales force or have no need for an ad server can still access Prebid's mobile demand stack. Publishers will be able to render ads directly without relying on any 3rd party SDKs.
+- **Reduced ad delivery latency**: The rendering module enables Prebid SDK to render ads immediately when demand is returned from Prebid Server or when receiving the render signal from an ad server. The render process should vastly reduce ad delivery speeds.
+- **Less infrastructure**: The rendering API does not rely on Prebid Server's Cache server, reducing the cost and utility of Prebid Server Cache.
+- **Less discrepancy**: Having control of the rendering process provides the potential to reduce discrepancy by having ads instantly available (less http calls, less infrastructure, less setup). This control enables the publisher to follow open and transparent industry standards or even potentially custom requirements from buyers.
+- **Framework support**: Full support of SKAdNetworks and similar frameworks
+- **MRAID 3.0 support**
+- **Flexible Ad Measurement**: Controlling the rendering and Open Measurement process allows publishers to potentially configure any measurement provider in a transparent and open source process. Prebid SDK will eventually be IAB Open Measurement certified.
+- **Community driven**: Being a part of Prebid, there is the ability to add features not readily or easily available either through the Ad Server or other SDKs
+
+## Potential Features
+
+This set of features are not supported in the current release but are designated for future implementation.
+
+- **Multiformat Ad Unit**: The rendering module will enable Prebid SDK to display any bid format in the given inventory regardless of Primary Ad Server capabilities.
+- **Support of Custom Ad Servers**: The rendering module will work with any ad server not just GAM and MoPub.
+- **Rendering Delegation**: The module will potentially delegate rendering of the winning bid to the Demand Partner SDK if it is required for special creatives.
+
+## How It Works
+
+Rendering API supports two integration scenarios:
+
+* **Custom or No mediation** when no Primay Ad Server is used. The SDK renders the winning bid immediately when it is available.
+* **Using a Primary Ad Server** Prebid SDK detects when a Prebid line item wins on the ad server and renders the cached bid in the owned Web view or Video view.
+
+In both scenarios, Prebid SDK leverages Prebid Server for demand. Below are the processes for both In-App and Primary Ad Server modes:
+
+### Custom In-App Bidding
+
+![In-App Rendering](/assets/images/prebid-mobile/modules/rendering/Prebid-In-App-Bidding-Overview-Pure-Prebid.png)
+
+1. The Prebid SDK sends the bid request to the Prebid Server
+1. Prebid Server runs the header bidding auction among preconfigured demand partners
+1. Prebid Server responses with the winning bid
+1. The rendering module renders the winning bid
+
+### Prebid Rendering Module with Primary Ad Server
+
+![Rendering with Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/In-App-Bidding-Integration.png)
+
+1. The rendering module sends the bid request to the Prebid server.
+1. Prebid server runs the header bidding auction among preconfigured demand partners.
+1. Prebid Server responds with the winning bid that contains targeting keywords.
+1. The rendering module sets up the targeting keywords of the winning bid into the ad unit of the primary ad server SDK.
+1. The primary ad server SDK sends the ad request to the primary ad server.
+1. The primary ad server responds with an ad or mediation chain.
+1. The winning ad meta information is passed to the rendering module.
+1. Depending on the ad response, the rendering module renders the winning bid or allows the primary ad server SDK to show its own winning ad.
+
+## Supported Ad Formats
+
+Prebid Mobile rendering supports the following ad formats:
+
+* Display Banner
+* Video Banner
+* Display Interstitial
+* Video Interstitial
+* Rewarded Video
+
+## Integration Scenarios
+
+### Android
+
+Follow these steps to integrate the rendering API:
+
+1. If integrating into an ad server, create line items specific for rendering (line items for rendering API are unique and do not coincide with the standard Prebid SDK line items):
+ * [GAM](rendering-gam-line-item-setup.html)
+ * [AdMob](rendering-admob-line-item-setup.html)
+ * [MAX](rendering-max-line-item-setup.html)
+1. [Integrate Prebid SDK](android-sdk-integration.html) into your project.
+1. Add prebid's ad units to your app respectively to the monetization scenario:
+ * [Custom in-app bidding](android-sdk-integration-pb.html) integration without primary ad server.
+ * In-app bidding using [Google Ad Manager (GAM)](android-sdk-integration-gam.html) as a primary ad server
+ * In-app bidding using [AdMob](android-sdk-integration-admob) as a primary ad server.
+ * In-app bidding using [AppLovin MAX](android-sdk-integration-max.html) as a primary ad server.
+
+1. Actualize the [integration and targeting](android-sdk-parameters.html) properties.
+
+### iOS
+
+Follow these steps to integrate the rendering API:
+
+1. If integrating into an ad server, create line items specific for rendering (line items are uniqe for the Rendering Module and do not cooicide with the standard Prebid SDK line items):
+ * [GAM](rendering-gam-line-item-setup.html)
+ * [AdMob](rendering-admob-line-item-setup.html)
+ * [MAX](rendering-max-line-item-setup.html)
+1. [Integrate Prebid SDK](ios-sdk-integration.html).
+1. Add prebid's ad units to your app respectively to the monetization scenario:
+ * [Custom in-app bidding](ios-sdk-integration-pb.html) integration without a primary ad server.
+ * In-app bidding using [Google Ad Manager (GAM)](ios-sdk-integration-gam.html) as a primary ad server.
+ * In-app bidding using [AdMob](ios-sdk-integration-gam.html) as a primary ad server.
+ * In-app bidding using [AppLovin MAX](ios-sdk-integration-max.html) as a primary ad server.
+ 1. Actualize the [integration and targeting](ios-sdk-parameters.html) properties.
+
+## Additional refences
+
+- [Deep Links Support](rendering-deeplinkplus.html)
+- [Impression Tracking](rendering-impression-tracking.html)
diff --git a/prebid-mobile/modules/rendering/rendering-admob-line-item-setup.md b/prebid-mobile/modules/rendering/rendering-admob-line-item-setup.md
new file mode 100644
index 0000000000..6f4ee870df
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-admob-line-item-setup.md
@@ -0,0 +1,94 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# AdMob Setup
+
+
+## Mediation Group Setup
+
+### Step 1: Create Mediation Group
+
+In your AdMob account go to `Mediation` and click on `Create Mediation Group`:
+
+
+
+Choose one of the ad formats:
+
+- Banner
+- Interstitial
+- Native Advanced
+- Rewarded interstitial
+
+Choose a platform - iOS or Android.
+
+Press `CONTINUE`. Then set the name for the mediation group and other properties:
+
+
+
+Press `ADD AD UNITS` and select the target items in the modal dialog:
+
+
+
+Press `DONE`. And move to the next step.
+
+
+### Step 2: Add Custom Events
+
+
+
+
+Now you have to add custom events for possible bid prices. Follow the [price granularity](https://docs.prebid.org/prebid-mobile/adops-price-granularity.html#prebid-mobile-price-granularity) guide to determine how many entries you need.
+
+Press `ADD CUSTOM EVENT`:
+
+
+
+Set the `Label` and `eCPM` for the custom event. Press `CONTINUE`.
+
+
+
+The fields in this dialog are critical for the proper integration:
+
+- `Class Name` is a name of respective adapter.
+ - Banner:
+ - iOS: `PrebidAdMobBannerAdapter`
+ - Android: `org.prebid.mobile.admob.PrebidBannerAdapter`
+ - Interstitial Display:
+ - iOS: `PrebidAdMobInterstitialAdapter`
+ - Android: `org.prebid.mobile.admob.PrebidInterstitialAdapter`
+ - Interstitial Video:
+ - iOS: `PrebidAdMobVideoInterstitialAdapter`
+ - Android: `org.prebid.mobile.admob.PrebidInterstitialAdapter`
+ - Rewarded:
+ - iOS: `PrebidAdMobRewardedVideoAdapter `
+ - Android: `org.prebid.mobile.admob.PrebidRewardedAdapter`
+ - Native:
+ - iOS: `PrebidAdMobNativeAdapter `
+ - Android: `org.prebid.mobile.admob.PrebidNativeAdapter`
+- `Parameter` is a keywords for the current ad source. **Important**: make sure that the price of the ad source is the same as the price in this keyword. For example:
+
+```
+{"hb_pb":"0.10"}
+```
+
+Prebid SDK will compare the keywords in the winning bids with keywords provided in the `Parameter` fields.
+
+{: .alert.alert-warning :}
+The adapter will render the winning bid only if the bid's targeting keywords contain `all` keywords from the Parameter field.
+
+
+Press `DONE` and repeat the adding of the custom events for all needed prices.
+
+
+
+Once you add all needed custom events - press `DONE`. The Mediation Group is ready to serve the prebid demand to your app.
+
+
+
+
diff --git a/prebid-mobile/modules/rendering/rendering-deeplinkplus.md b/prebid-mobile/modules/rendering/rendering-deeplinkplus.md
new file mode 100644
index 0000000000..0a95c02cb3
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-deeplinkplus.md
@@ -0,0 +1,76 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# Deep Link+
+
+Prebid Rendering Module supports the premium standard for retargeting campaigns - [DeepLink+](https://developers.mopub.com/dsps/ad-formats/deep-linking/)
+
+## Advantages over traditional mobile deep-linking functionality
+
+Technology has traditionally failed in providing the ideal user experience â as processing traditional deep-links requires opening up blank browser windows, redirecting users multiple times, and sometimes breaking down completely. Additionally, buyers would lack analytics around when primary URLs worked versus when fallback URLs were required.
+
+Deep Link+ provides a premium user experience while letting advertisers scale retargeting campaigns with accurate analytics.
+
+The new deeplinking format enables buyers to submit:
+
+ * primary URL
+ * fallback URL
+ * primary tracking URL
+ * fallback tracking URL
+
+And since Deep Link+ is built into the SDK, there is no need to pop up browser windows and re-directs that deteriorate the user experience.
+
+## Support
+
+The schema is supported for both kinds of ads - video and display.
+
+The JSTag integration is not supported yet.
+
+
+## How it works
+
+
+DSPs should rely on the SDK version in the bid request:
+```
+"displaymanagerver": "4.11.0"
+```
+
+Starting with version 4.11.0 Android SDK supports deeplink+
+
+To leverage the retargeting campaigns buyers use a specific scheme as click URL in the ad response. That URL describes the deep-linking and failover logic:
+
+```
+deeplink+://navigate?
+ primaryUrl=PRIMARY_DEEPLINK&
+ primaryTrackingUrl=PRIMARY_TRACKER&
+ fallbackUrl=FALLBACK_URL
+ &fallbackTrackingUrl=FALLBACK_TRACKER
+```
+
+The only required parameter is `primaryUrl` and if there are no other parameters, the deeplink+ would be handled as standard deeplink URL: doing nothing if the app is missing.
+
+The `fallbackUrl` can be any supported URI type (e.g., http, traditional deeplink) except for another Deep Link+ URL. To specify multiple tracker URLs (primary or fallback), buyers simply need to repeat the tracker key with any desired tracker URLs. The `primaryTrackingURL` is triggered if the deeplink is successful (which occurs after the user clicks).
+
+For example, below is a Deep Link+ URL whose primary target is the Twitter app, with two (2) primary tracker URLs, a fallback URL directing the user to Twitterâs mobile website if the primary deeplink fails and zero (0) fallback tracker URLs:
+
+```
+deeplink+://navigate?
+ primaryUrl=twitter%3A%2F%2Ftimeline&
+ primaryTrackingUrl=http%3A%2F%2Fmopub.com%2Fclicktracking&
+ primaryTrackingUrl=http%3A%2F%2Fmopub.com%2Fmopubtracking&
+ fallbackUrl=http%3A%2F%2Fmobile.twitter.com
+```
+
+The SDK will process this scheme regarding to the standard.
+
+## Integration tips
+
+**Publishers**: No action required for full-featured support of the ads with DeepLink+ schema. All work is performed by the SDK.
+
+**Buyers**: Must insert the deeplink+ scheme into creative or provide it via redirect for the regular clickthrough URL.
diff --git a/prebid-mobile/modules/rendering/rendering-gam-line-item-setup.md b/prebid-mobile/modules/rendering/rendering-gam-line-item-setup.md
new file mode 100644
index 0000000000..8d076a3502
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-gam-line-item-setup.md
@@ -0,0 +1,206 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering GAM Line Item Setup
+description: Prebid Mobile Rendering Modules GAM line item setup
+sidebarType: 2
+
+---
+
+# Google Ad Manager Setup
+
+## Step 1: Create New Order
+
+
+
+
+## Step 2: Create Line Item
+
+To integrate the Prebid demand you have to create a Line Items with a specific price and targeting keywords.
+
+> Even though a Line Item can be named in any way, we strongly recommend to use the price or targeting keyword in the name. It will help to navigate through hundreds of them.
+
+### Select Type
+
+Create a Line Item depending on the type of expected creative kind:
+
+* **Display** - for the Banner, HTML Interstitial
+* **Video and Audio** - for the Video Interstitial, Rewarded Video, and Outstream Video ads.
+
+
+
+Set sizes respectively to expected creatives.
+
+### Select Price
+
+The Line Item price should be chosen according to the price granularity policy.
+
+
+
+### Set Targeting Keywords
+
+The **Custom targeting** property should contain a special keyword with the price of winning bid. The same as a Rate of the Line Item.
+
+
+
+## Step 3: Prepare Prebid Creative
+
+### Display Banner, Video Banner, Display Interstitial, Video Interstitial.
+
+The Prebid SDK integrates with GAM basing on [App Events](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#app_events) feature, almost for all ad formats. That means that creative should contain a special tag that will be processed by Prebid's GAM Event Handlers.
+
+If GAM Event Handler receives the `PrebidAppEvent` event it will render the winning bid. Otherwise the control will be passed to the GAM Ad View and it will render the received creative.
+
+``` html
+
+
+```
+
+
+
+### Rewarded Video
+
+Prebid rendering for Rewarded video ads is based on the [OnAdMetadataChangedListener](https://developers.google.com/android/reference/com/google/android/gms/ads/rewarded/OnAdMetadataChangedListener). So you need to set up a special VAST tag in the creative.
+
+``` js
+https://cdn.jsdelivr.net/npm/prebid-universal-creative/dist/prebid-mobile-rewarded-vast.xml
+```
+
+
+
+If GAM Event Handler receives the tag's info it will render the winning bid. Otherwise the control will be passed to the GAM Ad View and it will render the received creative.
+
+
\ No newline at end of file
diff --git a/prebid-mobile/modules/rendering/rendering-impression-tracking.md b/prebid-mobile/modules/rendering/rendering-impression-tracking.md
new file mode 100644
index 0000000000..868bf3c075
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-impression-tracking.md
@@ -0,0 +1,58 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# Impression Tracking
+
+## Responsibilities
+
+The impression tracking depends on a certain integration approach.
+
+In case of GAM or MoPub integration when the Ad Server ad wins - the impression will be tracked according to the policy of the certain Primary Ad Server SDK that will handle the rendering.
+
+If Prebid ad wins on the Primary Ad Server Auction, the impression tracking will depend on particular integration kind:
+
+* **GAM** impression will be tracked only for banner ads since it allows [manual impression counting](https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner#manual_impression_counting). Rendering Module is not able to track impressions for GAM Interstitial or Rewarded ads.
+* **MoPub** impression will be tracked as stated in the MoPub policies since the rendering part is performed according to the Mediation feature.
+* **Pure In-App Bidding** impression pixels for Open Measurement and VAST will be tracked according to the [In-App Bidding Impression](#in-app-bidding-impression) policies of the SDK.
+
+
+## In-App Bidding Impression
+
+Prebid Rendering Module tracks the impression pixel as stated in a definition of **render impression** from [Mobile Application Advertising Measurement Guidelines](http://mediaratingcouncil.org/Mobile%20In-App%20Measurement%20Guidelines%20(MMTF%20Final%20v1.1).pdf):
+
+
+> **Ad Impression**: A measurement of responses from an ad delivery system to an ad request from the user's device, which is filtered for invalid traffic and is recorded at a point as late as possible in the process of delivery of the creative material to the user's device. The ad must be loaded and at minimum begin to render in order to count it as a valid ad impression. Measurement of begin to render should include logical components necessary to display the ad, but does not necessarily include logical elements that are not essential (such as other tracking elements).
+>
+> In the context of the guidance above, âloadedâ means the logical creative file has been transmitted and received at the client-side (user device) and ârenderâ refers to the process of painting the creative file or adding it to any portion of the Document Object Model.
+
+The impression pixel is triggered when at least 1 pixel of the creative appears on the screen.
+This rule is applied to all tracking pixels display, video, Open Measurement.
+
+## MRAID
+
+### MRAID 2.0 Creative
+
+SDK broadcasts the `mraid.viewableChange()` event when the ad becomes rendered. It means that for proper impression tracking with MRAID the creative's code for tracking impression must depend on `mraid.isViewable()`. For example:
+
+
+``` javascript
+if ( mraid.viewableChangeEventWasDetected() )
+ if( mraid.isViewable() == true)
+ fireMyImpressionTrackers();
+ else if ( mraid.isViewable() == false)
+ doNothing();
+```
+
+Otherwise the impression tracking would be inconsistent with Prebid Rendering SDK approach.
+
+### MRAID 3.0 Creative
+
+For the ads that support the MRAID 3, the impression tracking code should be rather dependent on `exposureChange()` function. Since it provides much more information about the viewability of an Ad Container, the impression tracking could be much more accurate and correspond to the MRC and IAB guidelines.
+
+However, the IAB strongly recommends not to use the MRAID facilities to track impressions. The best practice is to use the **Open Measurement** framework which is supported by SDK as well.
\ No newline at end of file
diff --git a/prebid-mobile/modules/rendering/rendering-max-line-item-setup.md b/prebid-mobile/modules/rendering/rendering-max-line-item-setup.md
new file mode 100644
index 0000000000..7b9780fa1d
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-max-line-item-setup.md
@@ -0,0 +1,51 @@
+---
+
+layout: page_v2
+title: Prebid Mobile Rendering Modules
+description: Prebid Mobile Rendering Modules architecture
+sidebarType: 2
+
+---
+
+# AppLovin MAX Setup
+
+## Custom Network Setup
+
+In your MAX account go to `Mediation` -> `Manage` -> `Networks` and click `Click here to add a Custom Network`. Then create an **SDK** custom network with the following adapter names:
+
+
+
+
+
+iOS adapter:
+```
+PrebidMAXMediationAdapter
+```
+
+Android Adapter:
+```
+com.applovin.mediation.adapters.PrebidMaxMediationAdapter
+```
+
+
+## Add Placements
+
+
+Now you have to add placements for Prebid Custom Network into the respective ad unit's waterfall.
+
+Create or choose an existing Ad Unit. Go the the `Custom Networks & Deals` section. Chose the Prebid's custom network that you created at the previous step. Change the status to active and add placements following the [price granularity](https://docs.prebid.org/prebid-mobile/adops-price-granularity.html#prebid-mobile-price-granularity) guide to determine how many entries you need.
+
+
+
+
+Make sure that the `Custom Parameters` field contain expecting targetting keywords of the winning bid:
+
+```
+{"hb_pb":"0.10"}
+```
+
+{: .alert.alert-warning :}
+The adapter will render the winning bid only if the bid's targeting keywords contain `all` keywords from the `Custom Parameters` field.
+
+
+
diff --git a/prebid-mobile/modules/rendering/rendering-native-ad-configuration.md b/prebid-mobile/modules/rendering/rendering-native-ad-configuration.md
new file mode 100644
index 0000000000..b75d9e1a91
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-native-ad-configuration.md
@@ -0,0 +1,122 @@
+---
+
+layout: page_v2
+title: Native Ad Configuration
+description: Properties and structure of native ads
+sidebarType: 2
+
+---
+
+# Native Ad Configuration
+
+
+The `NativeAdConfiguration` class provides an ability to set *assets*, *event trackers* and other *OpenRTB parameters* required for Native Ads.
+
+## Parameters
+
+{: .table .table-bordered .table-striped }
+
+| Property | Default | Required | Description |
+|:---------------|:--------|:------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| context | Undefined | recommended | The context in which the ad appears |
+| contextsubtype | Undefined | optional | A more detailed context in which the ad appears |
+| plcmttype | Undefined | recommended | The design/format/layout of the ad unit being offered |
+| seq | - | optional | 0 for the first ad, 1 for the second ad, and so on. Note this would generally NOT be used in combination with plcmtcnt - either you are auctioning multiple identical placements (in which case plcmtcnt>1, seq=0) or you are holding separate auctions for distinct items in the feed (in which case plcmtcnt=1, seq=>=1) |
+| assets | - | required | An array of Asset Objects. |
+| eventtrackers | - | optional | Specifies what type of event tracking is supported |
+| privacy | false | recommended | Set to 1 when the native ad supports buyer-specific privacy notice. Set to 0 when the native ad doesnât support custom privacy links or if support is unknown |
+| ext | - | optional | This object is a placeholder that may contain custom JSON |
+
+> **Note:** `plcmtcnt`, `aurlsupport` and `durlsupport` OpenRTB fields are not supported
+
+## Event Trackers
+
+`NativeEventTracker` class is used to set up the `eventtrackers` field for the Native bid request respectively to the OpenRTB docs.
+
+The event tracker object specifies the kinds of events the bidder can request to be tracked in the bid response, and which types of tracking are available for each event type.
+
+### Event Trackers Properties
+
+{: .table .table-bordered .table-striped }
+
+| Name | Description |
+|:---------------------|:-------------------------------------------------------------|
+| eventType | Type of event available for tracking |
+| eventTrackingMethods | Array of the types of tracking available for the given event |
+| ext | The custom extension available to the publisher |
+
+
+### Event Trackers Enums
+
+#### NativeEventType
+
+{: .table .table-bordered .table-striped }
+
+| Name | ID | Description |
+|:-----------------|:-----|:-------------------------------------------------------------------------------|
+| Impression | 1 | Impression |
+| MRC50 | 2 | Visible impression using MRC definition at 50% in view for 1second |
+| MRC100 | 3 | 100% in view for 1 second (ie GroupM standard) |
+| Video50 | 4 | Visible impression for video using MRC definition at 50% in view for 2 seconds |
+| ExchangeSpecific | 500+ | Exchange specific |
+
+#### NativeEventTrackingMethod
+
+{: .table .table-bordered .table-striped }
+
+| Name | ID | Description |
+|:-------|:-----|:------------------------------------------------------------------------------------------------------------------------------------------|
+| Image | 1 | Image-pixel tracking - URL provided will be inserted as a 1x1 pixel at the time of the event |
+| JS | 2 | Javascript-based tracking - URL provided will be inserted as a js tag at the time of the event |
+| ExchangeSpecific | 500+ | Could include custom measurement companies such as moat, double verify, IAS, etc - in this case additional elements will often be passed |
+
+
+## Enums
+
+### NativeContextType
+
+{: .table .table-bordered .table-striped }
+
+| Name | ID | Description |
+|:----------------|:-----|:---------------------------------------------------------------------------------------------|
+| Undefined | 0 | Unset |
+| ContentCentric | 1 | Content-centric context such as news feed, article, image gallery, video gallery, or similar |
+| SocialCentric | 2 | Social-centric context such as social network feed, email, chat, or similar |
+| Product | 3 | Product context such as product listings, details, recommendations, reviews, or similar |
+| ExchangeSpecific| 500+ | To be defined by the exchange |
+
+### NativeContextSubtype
+
+> **NOTE**: SubType should only be combined with the primary context type as indicated (ie for a context type of 1, only context subtypes that start with 1 are valid).
+
+{: .table .table-bordered .table-striped }
+
+| Name | ID | Description |
+|:---------------------|:-----|:---------------------------------------------------------------------------------------------|
+| Undefined | 0 | Unset|
+| GeneralOrMixed | 10 | General or mixed content |
+| Article | 11 | Primarily article content (which of course could include images, etc as part of the article) |
+| Video | 12 | Primarily video content |
+| Audio | 13 | Primarily audio content |
+| Image | 14 | Primarily image content |
+| UserGenerated | 15 | User-generated content - forums, comments, etc |
+| Social | 20 | General social content such as a general social network |
+| Email | 21 | Primarily email content |
+| Chat | 22 | Primarily chat/IM content |
+| SellingProducts | 30 | Content focused on selling products, whether digital or physical |
+| ApplicationStore | 31 | Application store/marketplace |
+| ProductReview | 32 | Product reviews site primarily (which may sell product secondarily) |
+| ExchangeSpecific | 500+ | To be defined by the exchange |
+
+### NativePlacementType
+
+{: .table .table-bordered .table-striped }
+
+| Name | ID | Description |
+|:----------------------|:-----|:-------------------------------------------------------------------------------------------------------------------------------|
+| Undefined | 0 ||
+| FeedGridListing | 1 | In the feed of content - for example as an item inside the organic feed/grid/listing/carousel |
+| AtomicUnit | 2 | In the atomic unit of the content - IE in the article page or single image page |
+| OutsideCoreContent | 3 | Outside the core content - for example in the ads section on the right rail, as a banner-style placement near the content, etc |
+| RecommendationWidget | 4 | Recommendation widget, most commonly presented below the article content |
+| ExchangeSpecific | 500+ | To be defined by the exchange |
diff --git a/prebid-mobile/modules/rendering/rendering-native-guidelines.md b/prebid-mobile/modules/rendering/rendering-native-guidelines.md
new file mode 100644
index 0000000000..4c589e694d
--- /dev/null
+++ b/prebid-mobile/modules/rendering/rendering-native-guidelines.md
@@ -0,0 +1,74 @@
+---
+
+layout: page_v2
+title: Native Ads Guidelines
+description: The best practices for implementing native ads
+sidebarType: 2
+
+---
+
+# Native Ads Guidelines
+
+## Getting Started
+
+The Prebid Rendering Module implements the [OpenRTB Specification](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf) for the native ads.
+
+The general integration scenario requires these steps from publishers:
+
+1. Prepare the ad layout:
+ * HTML and CSS for the Native Styles format.
+ * Native components for the Unified Ads format.
+1. Configure the Native Ad using [NativeAdConfiguration](rendering-native-ad-configuration.html).
+ * Provide the list of [Native Assets](#components) representing the ad's structure.
+ * Tune other general properties of the ad.
+1. Make a bid request.
+1. **OPTIONAL** Bind the data from the bid response with the layout, if it is needed for the particular integration.
+
+### Unified Native Ads
+
+The general integration scenario requires these steps from publishers:
+
+1. Prepare the ad layout using the native components in the codebase of the app.
+2. Create Native Ad Unit.
+3. Configure the Native Ad unit using [NativeAdConfiguration](rendering-native-ad-configuration.html).
+ * Provide the list of [Native Assets](#components) representing the ad's structure.
+ * Tune other general properties of the ad.
+4. Make a bid request.
+5. Find the winning native ad using `GAMUtils.shared.findNativeAd` or `MoPubUtils.findNativeAd`.
+6. Bind the data from the native ad response with the layout.
+
+### Native Styles
+
+The Prebid Rendering Module supports the original prebid's approach for rendering [native ads](https://docs.prebid.org/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.html). It is similar to the Google's Native Styles ad format. In this case publisher should preare the layout of the ad using HTML and CSS and add the universal creative to the ad code.
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Native-Styles-Primary-Ad-Server.png)
+
+1. Prebid Rendering Module sends the bid request.
+2. Prebid server runs the header bidding auction among preconfigured demand partners.
+3. In-App Bidding SDK sets up the targeting keywords of the winning bid to the ad unit of Primary Ad Server SDK.
+4. Primary Ad Server SDK sends the ad request to the Ad Server. If Prebid's line item wins the ad response will contain **Prebid Universal Creative** and **Ad Layout**.
+5. The received creative will be rendered in the Web View of Primary Ad Server SDK.
+
+The ad will be rendered in the web view. The rendering engine will be the prebid's universal creative. It will load the winning bid from the prebid cache and substitute assets into the ad markup. For the more detailed info visit the Prebid's instructions about [How Native Ads Work](https://docs.prebid.org/dev-docs/show-native-ads.html#how-native-ads-work).
+
+In order to prepare the valid layout folow the instructions in the Prebid docs for [Mobile in general](https://docs.prebid.org/prebid-mobile/adops-native-setup.html) and for [Google Ad Manager](https://docs.prebid.org/adops/setting-up-prebid-native-in-dfp.html).
+
+In the case of integration of Native Styles ads without Primary Ad Server publishers should provide the Ad Layout to the SDK. And the winning bid will be rendered right after receiving it from Prebid.
+
+![Rendering with GAM as the Primary Ad Server](/assets/images/prebid-mobile/modules/rendering/Native-Styles-Prebid.png)
+
+1. Setup layout for the Native Styles ad.
+2. Prebid Rendering Module sends the bid request.
+3. Prebid server runs the header bidding auction among preconfigured demand partners.
+3. The received creative will be rendered in the Web View of Prebid Rendering Module.
+
+## Components
+
+The Prebid Rendering Module supports all Native Ad components proclaimed by the OpenRTB specification: **title**, **image**, **video**, **data**.
+
+We strongly recommend to follow the industry best practices and requirements, especially in the case of integration with Primary Ad Server:
+
+* [OpenRTB Specification](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf)
+* [The Native Advertizing Playbook](https://www.iab.com/wp-content/uploads/2015/06/IAB-Native-Advertising-Playbook2.pdf)
+* [Google Guidelines](https://support.google.com/admanager/answer/6075370)
+* [MoPub Guidelines](https://developers.mopub.com/publishers/best-practices/native-ads/)
diff --git a/prebid-mobile/pbm-api/android/code-integration-android.md b/prebid-mobile/pbm-api/android/code-integration-android.md
index cae4ee0f81..b61db1d2d6 100644
--- a/prebid-mobile/pbm-api/android/code-integration-android.md
+++ b/prebid-mobile/pbm-api/android/code-integration-android.md
@@ -10,24 +10,29 @@ sidebarType: 2
# Code Integration for Android
-Get started with Prebid Mobile by creating a [Prebid Server account]({{site.github.url}}/prebid-mobile/prebid-mobile-pbs.html). Once your account is set up include the Prebid Mobile SDK in your app by either using Maven or by [cloning the repo](https://github.com/prebid/prebid-mobile-android) and using our included script to build the SDK.
+Get started with Prebid Mobile by getting access to a [Prebid Server](/prebid-mobile/prebid-mobile-pbs.html). Once your account is set up include the Prebid Mobile SDK in your app by either using Maven or by [cloning the repo](https://github.com/prebid/prebid-mobile-android) and using our included script to build the SDK.
### Include with Maven
If you are not familar with using Maven for build management visit the [Maven website](https://maven.apache.org/index.html).
-To include the Prebid Mobile SDK simply add this line to your gradle dependencies:
+To include the Prebid Mobile SDK simply add this line to your gradle dependencies to get the lastest stable release:
```
-implementation 'org.prebid:prebid-mobile-sdk:[1,2)'
+implementation 'org.prebid:prebid-mobile-sdk:1.12.2'
```
-If you wish to explicitly state the lastest stable release, please use the following:
+{% capture warning_note %}
+Prebid is going to release beta versions of SDK from time to time. So if you don't want to update to beta versions - avoid Maven's range notation for the dependency versions.
+If you still use the range notation like this:
```
-implementation 'org.prebid:prebid-mobile-sdk:1.3'
+implementation 'org.prebid:prebid-mobile-sdk:[1,2)'
```
+please change it to the strict version. {% endcapture %}
+{% include /alerts/alert_warning.html content=warning_note %}
+
### Build framework from source
@@ -67,6 +72,20 @@ For details on creating the specific ad units and additional parameters and meth
[Banner Ad Unit](/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html)
[Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html)
+#### Using Asset Ids with In-App Native Ad Units
+
+Setting this option to `true`, in your instance of Prebid Mobile, enables you to add an id for each asset in the assets array. The default setting is `false`
+
+**Kotlin**
+```
+PrebidMobile.assignNativeAssetID(true)
+```
+
+**Java**
+```
+PrebidMobile.assignNativeAssetID(true);
+```
+
### Resize ad slot
Prebid recommends app developers to resize ads slots to the Prebid rendering ad size using native code due to an unresolved bug in the Google Mobile Ads SDK (described [here](https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!category-topic/google-admob-ads-sdk/ios/648jzAP2EQY)) where render failures can occur with 3rd party creatives (such as Prebid Universal Creative) using size overrides.
diff --git a/prebid-mobile/pbm-api/android/pbm-adunit-android.md b/prebid-mobile/pbm-api/android/pbm-adunit-android.md
index 121b7e7761..216ec73a8b 100755
--- a/prebid-mobile/pbm-api/android/pbm-adunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-adunit-android.md
@@ -23,12 +23,12 @@ The `AdUnit` object is an abstract object that cannot be instantiated. Use the [
**Parameters**
-- `configId`: String containing the Prebid Server configuration ID.
+- `configId`: String containing the Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
- `adType`: `BANNER` or `INTERSITIAL`. This value will be set by the object based on which type of ad unit object you create.
**Properties**
-- `configId`: Prebid Server configuration ID.
+- `configId`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
- `adType`: `BANNER` or `INTERSITIAL`.
- `periodMillis`: Integer defining the refresh time in milliseconds. Default = 0, meaning no auto refresh.
- `keywords`: ArrayList containing keys and values.
@@ -104,7 +104,9 @@ private void loadMPRewardedVideo() {
}
```
+### setAppContent
+Provides targeting information for the `app.content` field of the bid request. Parameter is an `ContentObject` wich provides all respective fields.
### setAutoRefreshPeriodMillis
@@ -255,6 +257,42 @@ Clear all key-value combinations from the Prebid Mobile ad unit.
none
+### UserData
+
+The following methods enable adding `user.data[]` objects into the bid request:
+
+```
+public void addUserData(DataObject dataObject)
+```
+
+```
+public ArrayList getUserData()
+```
+
+```
+public void clearUserData()
+```
+
+### App Content Data
+
+In order to set the `app.contnent.data[]` objects use the `getAppContent()` first and then one of the respective methods of the `ContentObject` class:
+
+```
+public void addData(@NonNull DataObject dataObject)
+```
+
+```
+public ArrayList getDataList()
+```
+
+```
+public void setDataList(@NonNull ArrayList dataObjects)
+```
+
+```
+public void clearDataList()
+```
+
## Example
```
diff --git a/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md b/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md
index e48b1378aa..6c2199e327 100755
--- a/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md
@@ -19,11 +19,11 @@ Use the `BannerAdUnit` object to create and configure a banner ad unit in your a
### BannerAdUnit
-Create a new Banner Ad Unit associated with a Prebid Server configuration ID and a banner size.
+Create a new Banner Ad Unit associated with a Prebid Server 'configuration ID' and a banner size.
**Parameters**
-- `configId`: String; Prebid Server configuration ID.
+- `configId`: String; Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
- `width`: Integer; Width of the ad unit.
- `height`: Integer; Height of the ad unit.
diff --git a/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.md b/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.md
index 35bbb34ff7..05e7f978b1 100755
--- a/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.md
@@ -29,7 +29,7 @@ Prebid Server will send the eligible size list to each bidder to solicit a bid.
**Parameters**
-`configId`: Prebid Server configuration ID.
+`configId`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
`minWidthPerc`: Optional parameter to specify the minimum width percent an ad may occuy of a device's real estate. Support in SDK version 1.2+
diff --git a/prebid-mobile/pbm-api/android/pbm-native-inapp-android.md b/prebid-mobile/pbm-api/android/pbm-native-inapp-android.md
index 73313bb13f..cae9002fa8 100644
--- a/prebid-mobile/pbm-api/android/pbm-native-inapp-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-native-inapp-android.md
@@ -28,6 +28,10 @@ The cached assets might expire. If this occurs the publisher will receive a noti
{% include alerts/alert_important.html content=importantNote %}
+{% capture importantNote %}
+Starting with the `1.14.0-beta1` version the converting of the native ad template to the ad objects is changed to match the IAB specs. See this [issue](https://github.com/prebid/prebid-mobile-ios/issues/494) for the details. If you update SDK from the previous version - verify the native ads integration before the release.
+{% endcapture %}
+
## Ad Ops Setup
These instructions will enable you to create a creative template in either Google Ad Manager or MoPub that can then be applied to native ads in your app.
@@ -110,7 +114,7 @@ The `PrebidNativeAdListener` interface provides three methods to handle the disp
**onPrebidNativeNotFound**
- Use this method when a Prebid Native is not found in the server returned response. The ad should be displayed as a regular AdUnit type.
+ Use this method when a Prebid Native ad is not found in the server returned response. The ad should be displayed as a regular AdUnit type.
**onPrebidNativeNotValid**
@@ -122,6 +126,20 @@ The `PrebidNativeAdListener` interface provides three methods to handle the disp
An object representing the `PrebidNativeAd` to be displayed.
+#### Using Asset Ids with In-App Native Ad Units
+
+Setting this option to `true`, in your instance of Prebid Mobile, enables you to add an id for each asset in the assets array. The default setting is `false`
+
+**Kotlin**
+```
+PrebidMobile.assignNativeAssetID(true)
+```
+
+**Java**
+```
+PrebidMobile.assignNativeAssetID(true);
+```
+
##### Methods
*registerView*
diff --git a/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md b/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md
index f73d087b18..71c9f9939f 100644
--- a/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md
@@ -23,7 +23,7 @@ See [AdUnit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) for additio
**Parameters**
-`configId (String)`: Prebid Server configuration ID.
+`configId (String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
## Examples
diff --git a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md
index cd857e9ad4..6a25b808c5 100755
--- a/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-targeting-params-android.md
@@ -114,9 +114,9 @@ TargetingParams.setStoreUrl(storeUrl);
```
-### Open Measurment SDK (OMSDK)
+### Open Measurement SDK (OMSDK)
-OMSDK is designed to facilitate 3rd party viewability and verification measurement for ads served in mobile app enviroments. Prebid SDK will provide the signaling component to Bid Adapters, by way of Prebid Server, indicating the impression is elligible for OMSDK support. Prebid SDK does not currently integrate with OMSDK itself, instead it will rely on a publisher ad server to render viewability and verification measurement code.
+OMSDK is designed to facilitate 3rd party viewability and verification measurement for ads served in mobile app enviroments. Prebid SDK will provide the signaling component to Bid Adapters, by way of Prebid Server, indicating the impression is eligible for OMSDK support. Prebid SDK does not currently integrate with OMSDK itself, instead it will rely on a publisher ad server to render viewability and verification measurement code.
There three components to signaling support for OMSDK:
* Partner Name
@@ -168,9 +168,10 @@ Example:
BannerAdUnit bannerAdUnit = new BannerAdUnit("PREBID_SERVER_CONFIGURATION_ID", 300, 250);
bannerAdUnit.setUserKeyword("my_key", "my_value");
BannerBaseAdUnit.Parameters parameters = new BannerBaseAdUnit.Parameters();
-parameters.setApi(Arrays.asList(new Signals.Api(6, 7)));
+parameters.setApi(Arrays.asList(new Signals.Api(7)));
```
+Note that the OMID value for imp.banner/video/native.api field should be 7, as defined by the IAB in the [OMSDK v1.2 document](https://s3-us-west-2.amazonaws.com/omsdk-files/docs/Open+Measurement+SDK+Onboarding_version_1.2.pdf).
### Inventory (Context) Keywords
@@ -212,7 +213,7 @@ Data is broken up into two different data types:
* Global scope
* Ad Unit grain
- The below first party user and inventory context will apply to all ad units. For ad unit level first party data, refer to [First Partay Data section in the Ad Unit](pbm-adunit-android#first-party-data) page.
+ The below first party user and inventory context will apply to all ad units. For ad unit level first party data, refer to [First Party Data section in the Ad Unit](pbm-adunit-android#first-party-data) page.
### First Party User Data
User specic data is passed in the global scope (i.e. applicable to all ad units).
diff --git a/prebid-mobile/pbm-api/android/pbm-video-instream-android.md b/prebid-mobile/pbm-api/android/pbm-video-instream-android.md
index 60d0c8e655..6cf32ad0a5 100644
--- a/prebid-mobile/pbm-api/android/pbm-video-instream-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-video-instream-android.md
@@ -29,7 +29,7 @@ VideoAdUnit("configID", width, height, VideoAdUnit.PlacementType.placement);
```
**Parameters**
-* `configId`: String; Prebid Server configuration ID.
+* `configId`: String; Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
* `width`: Integer; Width of the video player.
* `height`: Integer; Height of the video player.
* `placement` (DEPRECATED FIELD) Enumeration. Possible values:
diff --git a/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md b/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md
index dd08df289a..6428c3fa89 100755
--- a/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-video-rewarded-adunit-android.md
@@ -30,7 +30,7 @@ RewardedVideoAdUnit("configId");
**Parameters**
-`configId`: String; Prebid Server configuration ID.
+`configId`: String; Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
### Paramaters
diff --git a/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md b/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md
index 47378cdcdb..d44eb8b16d 100755
--- a/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-videointerstitialadunit-android.md
@@ -32,7 +32,7 @@ VideoInterstitialAdUnit("configId");
**Parameters**
-`configId`: String; Prebid Server configuration ID.
+`configId`: String; Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
### Paramaters
diff --git a/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md b/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md
index 28b47e6f70..634e8feb22 100755
--- a/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md
+++ b/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md
@@ -30,7 +30,7 @@ VideoAdUnit("configID", width, height, VideoAdUnit.PlacementType.placement); //p
**Parameters**
-* `configId`: String; Prebid Server configuration ID.
+* `configId`: String; Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
* `width`: Integer; Width of the video player.
* `height`: Integer; Height of the video player.
* `placement` (DEPRECATED FIELD) Enumeration. Possible values:
diff --git a/prebid-mobile/pbm-api/android/prebidmobile-object-android.md b/prebid-mobile/pbm-api/android/prebidmobile-object-android.md
index 97bd8bc04a..751850a1a7 100755
--- a/prebid-mobile/pbm-api/android/prebidmobile-object-android.md
+++ b/prebid-mobile/pbm-api/android/prebidmobile-object-android.md
@@ -131,6 +131,19 @@ none
boolean isShareGeoLocation()
```
+### setCustomHeaders
+
+The following methods enable the customization of the HTTP call to the Prebid server:
+
+```
+public static void setCustomHeaders(HashMap customHeaders)
+```
+
+You can also inspect the current custon headers using:
+
+```
+public static HashMap getCustomHeaders()
+```
### setApplicationContext
diff --git a/prebid-mobile/pbm-api/ios/code-integration-ios.md b/prebid-mobile/pbm-api/ios/code-integration-ios.md
index a817247d97..dca08a5f04 100644
--- a/prebid-mobile/pbm-api/ios/code-integration-ios.md
+++ b/prebid-mobile/pbm-api/ios/code-integration-ios.md
@@ -16,7 +16,9 @@ Get started with Prebid Mobile by creating a [Prebid Server account]({{site.gith
- TOC
{:toc}
-### Include with Cocoapods
+## Package Managers
+
+### Cocoapods
If you are not familar with using Cocoapods for dependency management visit their [getting started page](https://guides.cocoapods.org/using/getting-started.html). Once you have your `podfile` setup, include the following:
@@ -28,54 +30,61 @@ target 'MyAmazingApp' do
end
```
-### Include with Carthage
+Run the following commands:
+
+1. Install CocoaPods
+1. Run `pod install`
+1. Add Prebid pod into `Podfile`, specify version if nedded
+1. Run `pod update`
+1. Use the `.xcworkspace` file which was generated by CocoaPods
+
+### Carthage
If you are not familiar with the Carthage package builder, please refere to the project [github page](https://github.com/Carthage/Carthage) for more details.
-Since Prebid SDK architecture supports a multi-module feature for future enhancements, that currently use the same module name for every schema, please use CarthageBuild.sh script to build a necessary binary.
+1. Install Carthage
+2. Add `github prebid/prebid-mobile-ios` to your `Cartfile`.
+3. Run `carthage update`.
+4. Drag <[module_name]({{site.baseurl}}/prebid-mobile/modules/modules-overview.html)>.framework from `Carthage/Build` to `General -> Linked Frameworks and Libraries`
-There are two shared schemes available ([issue #239](https://github.com/prebid/prebid-mobile-ios/issues/239)):
-- PrebidMobile
-- PrebidMobileCore
-Follow the next steps:
+### XCFramework
-1. Add PrebidSDK dependency into Cartfile. Release notes
-```
-github "prebid/prebid-mobile-ios" == 1.5
-```
-2. Update Carthage
-```
-carthage update
-```
+1. Clone the project and run buildPrebidMobile.sh script from `scripts` folder
+2. Drag XC<[module_name]({{site.baseurl}}/prebid-mobile/modules/modules-overview.html)>.xcframework(e.g. XCPrebidMobile.xcframework) from `generated/output` directory into your project. Make sure Copy items if needed is selected.
+3. Go to your Xcode projectâs `General -> Frameworks, Libraries, and Embedded Content` settings. Use `Embed & Sign` for dynamic and `Do Not Embed` for static linking
+
+
+### Swift PM
+If you are not familiar with the Swift Package Manager, please refere to the project [github page](https://github.com/apple/swift-package-manager) for more details.
+
+1. Add Prebid dependency `File -> Swift Packages -> Add Package Dependency...`
+2. Select desired version, branch or commit
+3. Select Prebid [module]({{site.baseurl}}/prebid-mobile/modules/modules-overview.html)
3. Build the specific schema `CarthageBuild.sh`
-
+
**Variant 1**
-
+
- Run CarthageBuild.sh script from Cartfile folder. The path should be:
`.../Carthage/Checkouts/prebid-mobile-ios/scripts/CarthageBuild.sh`
-
+
- Enter Schema name (PrebidMobile or PrebidMobileCore)
- If you run CarthageBuild.sh and see Permission denied use:
`chmod +x `
-
+
**Variant 2**
-
+
- Open `PrebidMobile.xcodeproj` at `.../Carthage/Checkouts/prebid-mobile-ios/PrebidMobile.xcodeproj` using Xcode
-
+
- Manage Schemes -> Check Shared checkbox for a necessary schema
-
+
- run `carthage build prebid-mobile-ios`
4. Integrate the binary into your project
-
-
You can find the schema name in the build PrebidSDK framework inside Info.plist with `PrebidMobileName` key
-
-
### Build framework from source
Build Prebid Mobile from source code. After [cloning the repo](https://github.com/prebid/prebid-mobile-ios), use Terminal or another command line tool, change to the root directory and run:
@@ -85,15 +94,12 @@ Build Prebid Mobile from source code. After [cloning the repo](https://github.co
```
This will output the PrebidMobile.framework.
-### Setup Prebid Server Account
-
-In order to conduct header bidding within your app you will need a Prebid Server hosted account. There are two options available for publishers:
-
-1. The simplest option is to sign up for a hosted solution. Several [Prebid.org members](https://prebid.org/product-suite/managed-services/) provide hosting packages.
+### Setup Prebid Server
-2. Implement your own Prebid Server solution. You will need to [download](https://github.com/prebid/prebid-server) the source code from Github. The repository has [full instructions](https://github.com/prebid/prebid-server/tree/master/docs/developers) for configuring, deploying, and testing your implementation.
+In order to conduct header bidding within your app you will need a Prebid Server hosted account. There are two options available for publishers described at [Getting Started with Prebid Mobile](/prebid-mobile/prebid-mobile-pbs.html).
-Once you have a Prebid Server account, you will need to add your account credentials to the app.
+Once you have a Prebid Server, you will add 'account' info to the app. For
+example, if you're using the AppNexus Prebid Server:
```
@@ -101,6 +107,15 @@ Prebid.shared.prebidServerAccountId = @"YOUR_ACCOUNT_ID";
Prebid.shared.prebidServerHost = PrebidHostAppnexus;
```
+{: .alert.alert-info :}
+Note that in actuality, the "account ID" is just the name of the "top-level"
+stored request as described on the [Prebid Server Stored Request](/prebid-server/features/pbs-storedreqs.html) page. By convention, most Prebid Server host companies define the top level stored request ID as the
+account ID they assign to the publisher. This is a convenient convention since
+publishers generally set the same timeout and price granularity across all
+apps. But it may not be the case for your
+Prebid Server host company, so please check with them. If you're hosting your own
+Prebid Server, this value can be whatever value you wish, not necessarily an account ID.
+
If you have opted to host your own Prebid Server solution you will need to store the url to the server in your app.
@@ -141,6 +156,20 @@ For details on creating the specific ad units and additional parameters and meth
[Banner Ad Unit](/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html)
[Interstitial Ad Unit](/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html)
+#### Using Asset Ids with In-App Native Ad Units
+
+Setting this option to `true`, in your instance of Prebid Mobile, enables you to add an id for each asset in the assets array. The default setting is `false`
+
+**Swift**
+```
+Prebid.shared.shouldAssignNativeAssetID = true
+```
+
+**Objective C**
+```
+[Prebid shared].shouldAssignNativeAssetID = YES;
+```
+
### Resize ad slot
Prebid recommends app developers to resize ads slots to the Prebid rendering ad size using native code due to an unresolved bug in the Google Mobile Ads SDK (described [here](https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!category-topic/google-admob-ads-sdk/ios/648jzAP2EQY)) where render failures can occur with 3rd party creatives (such as Prebid Universal Creative) using size overrides.
@@ -149,7 +178,8 @@ Prebid recommends app developers to resize ads slots to the Prebid rendering ad
Failure to resize rendering Prebid ads can cause revenue loss under certain conditions. For this reason, we advise using the below resize function in all scenarios. {% endcapture %}
{% include /alerts/alert_warning.html content=warning_note %}
-*SWIFT*
+**Swift**
+
```swift
func adViewDidReceiveAd(_ bannerView: GADBannerView) {
@@ -168,12 +198,11 @@ func adViewDidReceiveAd(_ bannerView: GADBannerView) {
})
}
+```
+**Objective-C**
- ```
-
-*Objective C*
- ```objective_c
+```objective_c
-(void) adViewDidReceiveAd:(GADBannerView *)bannerView {
NSLog(@"Ad received");
[AdViewUtils findPrebidCreativeSize:bannerView
@@ -187,7 +216,7 @@ func adViewDidReceiveAd(_ bannerView: GADBannerView) {
NSLog(@"error: %@", error);
}];
}
- ```
+```
## Further Reading
diff --git a/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md
index 3c688d4fb5..92513cc1a1 100755
--- a/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md
@@ -27,7 +27,7 @@ Create a new Banner Ad Unit or Interstitial Ad Unit with a Prebid Server configu
**Parameters**
-`configId`: String containing the Prebid Server configuration ID.
+`configId`: String containing the Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
`size:`: CGSize conatining width and height of the AdUnit.
@@ -193,12 +193,60 @@ func removeContextKeyword(_ element: String)
func clearContextKeywords()
```
+### App Content
+The `ContentObject` alows you to provide more details about content whithin the app. All proeprties provided to the `ContentObject` will be sent in the `app.content` field of the bid request.
+```
+func setAppContent(_ appContent: ContentObject)
+```
+
+```
+func getAppContent() -> ContentObject?
+```
+
+```
+func clearAppContent()
+```
+
+### App Content Data
+
+Using the following methods you can add `app.content.data` objects to the bid requests.
+
+```
+func addAppContentData(_ dataObjects: [ContentDataObject])
+```
+
+```
+func removeAppContentData(_ dataObject: ContentDataObject)
+```
+
+```
+func clearAppContentData()
+```
+
+### User Data
+
+Using the following methods you can add `user.data` objects to the bid requests.
+
+```
+func getUserData() -> [PBMORTBContentData]?
+```
+```
+func addUserData(_ userDataObjects: [PBMORTBContentData])
+```
+
+```
+func removeUserData(_ userDataObject: PBMORTBContentData)
+```
+
+```
+func clearUserData()
+```
### Data Object
-The Data object is free form data (also known as First Party Data)supplied by the publisher to provide additional targeting of the user or inventory context, used primarily for striking PMP (Private MarketPlace) deals with Advertisers. Data supplied in the data parameters are typically not sent to DSPs whereas information sent in non-data objects (i.e. `setYearOfBirth`, `setGender`, etc.) will be. Access to FPD can be limited to a supplied set of Prebid bidders via an access control list.
+The Data object is free form data (also known as First Party Data) supplied by the publisher to provide additional targeting of the user or inventory context, used primarily for striking PMP (Private MarketPlace) deals with Advertisers. Data supplied in the data parameters are typically not sent to DSPs whereas information sent in non-data objects (i.e. `setYearOfBirth`, `setGender`, etc.) will be. Access to FPD can be limited to a supplied set of Prebid bidders via an access control list.
Data is broken up into two different data types:
* User
@@ -207,7 +255,7 @@ Data is broken up into two different data types:
* Global scope
* Ad Unit grain
- The below first party inventory context will apply to the specic ad unit the data object is applied to. For global user or inventory context level first party data, refer to [first party data section of the Targeting](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html#first-party-data) page.
+The first party inventory context below will apply to the specic ad unit the data object is applied to. For global user or inventory context level first party data, refer to [first party data section of the Targeting](/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html#first-party-data) page.
#### addContextData
```
diff --git a/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md
index 5f64545276..e537596409 100755
--- a/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md
@@ -25,7 +25,7 @@ See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for
**Parameters**
-`configId (String)`: Prebid Server configuration ID.
+`configId (String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
`size (CGSize)`: Width and height of the banner.
@@ -70,7 +70,7 @@ let bannerUnit = BannerAdUnit(configId: "6ace8c7d-88c0-4623-8117-75bc3f0a2e45",
**Add additional ad sizes**
```
-bannerUnit.addAdditionalSizes(sizes: CGSize(width: 320, height: 50))
+bannerUnit.addAdditionalSize(sizes: [CGSize(width: 320, height: 50), CGSize(width: 300, height: 250)])
```
Once a BannerAdUnit is created use Google Mobile Ads or MoPub to retrieve and display creatives.
diff --git a/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.md
index 428d549eec..3e891d2b8d 100755
--- a/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.md
@@ -30,7 +30,7 @@ BannerInterstitialAdUnit(configId: String, minWidthPerc: Int, minHeightPerc: Int
**Parameters**
-`configId`: Prebid Server configuration ID.
+`configId`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
`minWidthPerc`: Optional parameter to specify the minimum width percent an ad may occuy of a device's real estate. Support in SDK version 1.2+
diff --git a/prebid-mobile/pbm-api/ios/pbm-code-integration-ios.md b/prebid-mobile/pbm-api/ios/pbm-code-integration-ios.md
index 6de803a46e..a103962e7f 100644
--- a/prebid-mobile/pbm-api/ios/pbm-code-integration-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-code-integration-ios.md
@@ -187,7 +187,7 @@ Create the ad units and add sizes for banner ad units. Replace `PREBID-SERVER-
Prebid.shared.prebidServerAccountId = "`PREBID-SERVER-ACCOUNT-ID"
Prebid.shared.shareGeoLocation = true
-let bannerUnit = BannerAdUnit(configId: "PREBID-SERVER-CONFIGURATION-ID", size: CGSize(width: 300, height: 250))
+let bannerUnit = BannerAdUnit(configId: "PREBID-SERVER-IMPLEVEL-STOREDREQUEST-ID", size: CGSize(width: 300, height: 250))
bannerUnit.setAutoRefreshMillis(time: 35000)
```
**Google Ad Manager Example**
diff --git a/prebid-mobile/pbm-api/ios/pbm-native-inapp-ios.md b/prebid-mobile/pbm-api/ios/pbm-native-inapp-ios.md
index ac8e593117..51a8673e37 100644
--- a/prebid-mobile/pbm-api/ios/pbm-native-inapp-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-native-inapp-ios.md
@@ -28,6 +28,12 @@ The cached assets might expire. If this occurs the publisher will receive a noti
{% include alerts/alert_important.html content=importantNote %}
+{% capture importantNote %}
+Starting with the `1.14.0-beta1` version converting the native ad template to the ad objects is changed to match the IAB specs. See this [issue](https://github.com/prebid/prebid-mobile-ios/issues/494) for the details. If you update SDK from the previous version - verify the native ads integration before the release.
+{% endcapture %}
+
+{% include alerts/alert_important.html content=importantNote %}
+
## Ad Ops Setup
These instructions will enable you to create a creative template in either Google Ad Manager or MoPub that can then be applied to native ads in your app.
@@ -58,7 +64,7 @@ These instructions will enable you to create a creative template in either Googl
| isPrebid | 1 |
| hb_cache_id_local | %%PATTERN:hb_cache_id_local%% |
-9. Now create Prebid line items with price priority and a display ad type that are targeting `hb_pb key-values`. Associate the creative you added in steps 4 thru 8 (making sure to choose your native format as expected creatives on the line item) to the ad unit you created in the second step.
+9. Create Prebid line items with price priority and a display ad type that is targeting `hb_pb key-values`. Associate the creative you added in steps 4 thru 8 (making sure to choose your native format as expected creatives on the line item) to the ad unit you created in the second step.
### MoPub
@@ -122,6 +128,19 @@ The `NativeAdDelegate` protocol provides three methods to handle the display and
An object representing the `NativeAd` to be displayed.
+#### Using Asset Ids with In-App Native Ad Units
+
+Setting this option to `true`, in your instance of Prebid Mobile, enables you to add an id for each asset in the assets array. The default setting is `false`
+
+**Swift**
+```
+Prebid.shared.shouldAssignNativeAssetID = true
+```
+
+**Objective C**
+```
+[Prebid shared].shouldAssignNativeAssetID = YES;
+```
##### Methods
*registerViews*
diff --git a/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md
index 4b56d569cd..3d69e27686 100644
--- a/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md
@@ -23,7 +23,7 @@ See [AdUnit](/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for additional para
**Parameters**
-`configId (String)`: Prebid Server configuration ID.
+`configId (String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
## Examples
diff --git a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md
index 414d830d01..6fbb28f752 100644
--- a/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-targeting-ios.md
@@ -151,9 +151,9 @@ Targeting.shared.itunesID
Targeting.shared.itunesID = itunesID
```
-### Open Measurment SDK (OMSDK)
+### Open Measurement SDK (OMSDK)
-OMSDK is designed to facilitate 3rd party viewability and verification measurement for ads served in mobile app enviroments. Prebid SDK will provide the signaling component to Bid Adapters, by way of Prebid Server, indicating the impression is elligible for OMSDK support. Prebid SDK does not currently integrate with OMSDK itself, instead it will rely on a publisher ad server to render viewability and verification measurement code.
+OMSDK is designed to facilitate 3rd party viewability and verification measurement for ads served in mobile app enviroments. Prebid SDK will provide the signaling component to Bid Adapters, by way of Prebid Server, indicating the impression is eligible for OMSDK support. Prebid SDK does not currently integrate with OMSDK itself, instead it will rely on a publisher ad server to render viewability and verification measurement code.
There three components to signaling support for OMSDK:
* Partner Name
@@ -219,7 +219,7 @@ parameters.api = [Signals.Api(7)]
adUnit.setParameters(parameters);
```
-
+Note that the OMID value for imp.banner/video/native.api field should be 7, as defined by the IAB in the [OMSDK v1.2 document](https://s3-us-west-2.amazonaws.com/omsdk-files/docs/Open+Measurement+SDK+Onboarding_version_1.2.pdf).
## Inventory (Context) Keywords
@@ -278,7 +278,7 @@ Data is broken up into two different data types:
* Global scope
* Ad Unit grain
- The below first party user and inventory context will apply to all ad units. For ad unit level first party data, refer to [First Partay Data section in the Ad Unit](pbm-adunit-ios#first-party-data) page.
+ The below first party user and inventory context will apply to all ad units. For ad unit level first party data, refer to [First Party Data section in the Ad Unit](pbm-adunit-ios#first-party-data) page.
### First Party User Data
diff --git a/prebid-mobile/pbm-api/ios/pbm-video-instream-ios.md b/prebid-mobile/pbm-api/ios/pbm-video-instream-ios.md
index c2591172de..239fb9cbf4 100644
--- a/prebid-mobile/pbm-api/ios/pbm-video-instream-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-video-instream-ios.md
@@ -30,7 +30,7 @@ Video instream is only supported with Google Ad Manager.
**Parameters**
- `configId(String)`: Prebid Server configuration ID.
+ `configId(String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
`size(CGSize)`: Width and height of the video ad unit.
diff --git a/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md
index d1be426cc1..c7572a5431 100755
--- a/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-video-rewarded-adunit-ios.md
@@ -17,11 +17,11 @@ Create a new Video Rewarded Ad Unit associated with a Prebid Server configuratio
**Parameters**
-`configId(String)`: Prebid Server configuration ID.
+`configId(String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
-# Paramaters
+# Parameters
Parameters is a sub class of RewardedVideoAdUnit.Create new Parameters class to define the parameters of the video ad unit. Parameters contain the OpenRTB video attributes.
diff --git a/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md
index 385bac77d3..fd0f201ee9 100755
--- a/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-videointerstitialadunit-ios.md
@@ -17,10 +17,10 @@ Video Insterstital is only supported with Google Ad Manager.
**Parameters**
-`configId(String)`: Prebid Server configuration ID.
+`configId(String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
-# Paramaters
+# Parameters
Parameters is a sub class of VideoInterstitialAdUnit.Create new Parameters class to define the parameters of the video ad unit. Parameters contain the OpenRTB video attributes.
diff --git a/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md
index f5379e6be3..bd673ce00b 100755
--- a/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md
+++ b/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md
@@ -30,7 +30,7 @@ See [AdUnit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) for
**Parameters**
-`configId(String)`: Prebid Server configuration ID.
+`configId(String)`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html).
`size(CGSize)`: Width and height of the video ad unit.
@@ -61,7 +61,7 @@ OpenRTB Placement Type represented as an enumeration of values:
* inFeed is transformed into OpenRTB value 4 to bid adapters
-### Paramaters
+### Parameters
Parameters is a sub class of videoAdUnit. Create new Parameters class to define the parameters of the video ad unit. Parameters contain the OpenRTB video attributes.
diff --git a/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md b/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md
index a00812968f..58d76b786d 100644
--- a/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md
+++ b/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md
@@ -8,6 +8,7 @@ sidebarType: 2
---
# Prebid: NSObject
+
{: .notoc}
The Prebid class is a singleton that enables the user to apply global settings.
@@ -17,11 +18,7 @@ The Prebid class is a singleton that enables the user to apply global settings.
---
-## Object
-
-### Prebid
-
-**Properties**
+## Properties
`prebidServerAccountId`: String containing the Prebid Server account ID.
@@ -72,6 +69,10 @@ var timeoutMillis: Int
var storedAuctionResponse: String
```
+## Methods
+
+### Stored Response
+
`addStoredBidResponse`: Function containing two properties:
* `bidder`: Bidder name as defined by Prebid Server bid adapter of type string.
@@ -94,8 +95,19 @@ func clearStoredBidResponses()
pbsDebug = BOOL
```
+### Custom headers
-## Examples
+The following methods enables the customization of the HTTP call to the prebid server:
+
+```
+func addCustomHeader(name: String, value: String)
+```
+
+```
+func clearCustomHeaders()
+```
+
+# Examples
*SWIFT*
```swift
@@ -166,8 +178,7 @@ Prebid.shared.pbsDebug = true;
```
-
-## Related Topics
+# Related Topics
- [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html)
- [Banner Ad Unit](/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html)
diff --git a/prebid-mobile/prebid-mobile-pbs.md b/prebid-mobile/prebid-mobile-pbs.md
index 64cf7dd104..c80971c8cf 100644
--- a/prebid-mobile/prebid-mobile-pbs.md
+++ b/prebid-mobile/prebid-mobile-pbs.md
@@ -31,13 +31,24 @@ Before you begin using Prebid Mobile in your apps, you need to prepare your end-
### Implement Your Own Prebid Server Host
-Prebid Server is an open source project. This allows you to host your own implementation of Prebid Server, though it's not as easy as downloading Prebid.js, because it needs to be hosted. The source code is available under the [Prebid organization on GitHub](https://github.com/prebid/prebid-server). There's also a [Java version of Prebid Server](https://github.com/prebid/prebid-server-java).
+Prebid Server is an open source project. This allows you to host your own implementation of Prebid Server, though it's not as easy as downloading Prebid.js, because it needs to be hosted. The source code is available for [Prebid-Server GoLang](https://github.com/prebid/prebid-server) and [Prebid Server-Java](https://github.com/prebid/prebid-server-java).
-See the [Prebid Server docs on GitHub](https://github.com/prebid/prebid-server/tree/master/docs/developers) for more information on setting up your own server host.
+See the [Prebid Server documentation](/prebid-server/overview/prebid-server-overview.html) for more information on [setting up your own server host](/prebid-server/hosting/pbs-hosting.html).
+
+### A Note on 'Accounts'
+
+Several pages and examples in the mobile documentation refer to entering
+your "Prebid Server Account ID".
+
+In actuality, an âaccount IDâ is just the name of the âtop-levelâ stored request as described on the [Prebid Server Stored Request page](/prebid-server/features/pbs-storedreqs.html).
+By convention, most Prebid Server host companies define the top level stored request ID as the account ID they assign to the publisher.
+This is a convenient convention since publishers generally set the same timeout and price granularity across all apps.
+But it may not be the case for your Prebid Server host company, so please check with them.
+If youâre hosting your own Prebid Server, this value can be whatever value you wish, not necessarily an account ID.
## Configure Prebid Server
-After you've registered with your chosen Prebid Server host, you need to create at least one Prebid Server bidder configuration. Each configuration contains a list of bidders and their parameters. The configuration will be in the form of a JSON structure, similar to this:
+After you've registered with your chosen Prebid Server host, you need to create at least one Prebid Server bidder configuration in a [stored request](/prebid-server/features/pbs-storedreqs.html). Each stored request configuration contains a list of bidders and their parameters. The configuration will be in the form of a JSON structure, similar to this:
```
[
@@ -50,7 +61,10 @@ After you've registered with your chosen Prebid Server host, you need to create
]
```
-The preceding is an example structure using AppNexus as the bidder. The parameters you need to set differ for each bidder. See [Bidder Parameters]({{site.github.url}}/prebid-server/developers/add-new-bidder-go.html) for a full list of parameters for available Prebid Server bidders.
+The preceding is an example "impression-level stored request" using AppNexus as the bidder. The parameters you need to set differ for each bidder. See [Bidder Parameters](/prebid-server/developers/add-new-bidder-go.html) for a full list of parameters for available Prebid Server bidders.
+
+Each block of JSON like this is called a "stored request" and gets an ID called a "stored request ID". This ID is then programmed into an adslot using the iOS or Android SDKs. Doing it this way allows the publisher to change bidders and parameters without
+having to change the app.
## Developers - Using the SDK
@@ -66,7 +80,6 @@ After you have the SDK installed, register ad units with the Prebid Mobile frame
Ad ops users configure the primary ad server with Prebid Mobile line items targeted to key/values.
- [Set Up Line Items for Google Ad Manager]({{site.github.url}}/prebid-mobile/adops-line-item-setup-dfp.html)
-- [Set Up Line Items for MoPub]({{site.github.url}}/prebid-mobile/adops-line-item-setup-mopub.html)
## Additional Information
diff --git a/prebid-server/developers/add-a-module-java.md b/prebid-server/developers/add-a-module-java.md
new file mode 100644
index 0000000000..a021a96ca4
--- /dev/null
+++ b/prebid-server/developers/add-a-module-java.md
@@ -0,0 +1,229 @@
+---
+layout: page_v2
+sidebarType: 5
+title: Prebid Server | Developers | Adding a Java Module
+
+---
+
+# Prebid Server - Adding a Java Module
+{: .no_toc}
+
+* TOC
+{:toc }
+
+## Overview
+
+This document details how to make a module for PBS-Java.
+
+You will want to be familiar with the following background information:
+
+- the [module overview](/prebid-server/developers/add-a-module.html)
+- the [PBS-Java Modularity Tech Spec](https://docs.google.com/document/d/1VP_pi7L5Iy3ikHMbtC2_rD5RZTVSc3OkTWKvtRS5x5Y/edit#heading=h.oklyk2bogkx4)
+
+### Coding standards
+
+The moduleâs code style should correspond to the [PBS-Java project code style](https://github.com/prebid/prebid-server-java/blob/master/docs/code-style.md).
+
+## Module Directory Layout
+
+The Prebid Server repository contains a maven submodule called `all-modules` located in the `extra/modules` folder. It includes all available PBS modules. So, in order to add a new module, fork the repository and create a folder with the desired name inside the modules folder with the following structure:
+
+```
++- prebid-server-java/
+ +- extra/
+ +- modules/
+ +- YOUR_MODULE_NAME/
+ +- pom.xml <- POM of your module
+ +- pom.xml <- POM of all included modules
+```
+
+A benefit of open sourcing your module in this way is that it can use the parent `all-modules` as a maven dependency. It simplifies management of the PBS-Core and other commonly used dependencies and you will be confident that it works well with the current version of Prebid Server.
+
+### Your module's build file
+
+Here's a partial example of your module-specific `pom.xml` file:
+
+```
+
+
+
+ org.prebid.server.hooks.modules
+ all-modules
+ PREBID_SERVER_VERSION
+
+
+ YOUR_MODULE_ARTIFACT_ID
+
+ YOUR_MODULE_TEXTUAL_NAME
+ YOUR_MODULE_DESCRIPTION
+
+```
+
+where:
+- PREBID_SERVER_VERSION is the current version of Prebid Server. The release team will update this value for all modules with each release, but you need to set it to the version of PBS that you're developing with.
+- YOUR_MODULE_ARTIFACT_ID is the name of your module JAR file without version and extension. e.g. ortb2-blocking
+- YOUR_MODULE_TEXTUAL_NAME is unique within the space of all other modules. e.g. instead of naming a module "blocking", a better name would be "ortb2blocking".
+
+### Add your module to the add-modules build file
+
+Add your module within `extra/modules/pom.xml` in the "modules" section:
+
+```
+
+ ...
+ YOUR_MODULE_ARTIFACT_ID
+
+```
+
+### Your directory layout
+
+The structure of your module source code inside the modules directory must have a standard maven-compatible structure:
+
+```
++- src/
+ +- main/
+ +- java/ <- source code
+ +- org.prebid.server.* <- The package path needs to include "org.prebid.server"
+ +- resources/ <- required resources
+ +- test/
+ +- java/ <- tests
+ +- resources/ <- required test resources
++- pom.xml <- POM of your module
++- README.md <- documentation
+```
+
+## Module Code
+
+The quick start is to take a look in two places:
+- the [ortb2-blocking module](https://github.com/prebid/prebid-server-java/tree/master/extra/modules/ortb2-blocking)
+- the [module test cases](https://github.com/prebid/prebid-server-java/tree/master/src/test/java/org/prebid/server/it/hooks)
+
+### Adding module documentation
+It is required to add a "README.md" file to the root of your module folder. Recommended this file contains the description of what the implemented module does, links to external documentation and includes maintainer contact info (email, slack, etc).
+
+The documentation must also live on the docs.prebid.org site. Please add a markdown file to https://github.com/prebid/prebid.github.io/tree/master/prebid-server/pbs-modules
+
+### Hook Interfaces
+
+The Prebid server processing workflow is divided into serveal 'stages' where module authors can code agaist a specific function signature called a 'hook'.
+
+The Prebid Server host company will define which modules to run in which order by setting up a configuration defining which hooks run, and which can run in parallel.
+
+The supported stages are described in the [general module overview](/prebid-server/developers/add-a-module.html#2-understand-the-endpoints-and-stages) and in PBS-Core source code at the "org.prebid.server.hooks" package.
+
+These are the available hooks that can be implemented in a module:
+
+- org.prebid.server.hooks.v1.entrypoint.EntrypointHook
+- org.prebid.server.hooks.v1.auction.RawAuctionRequestHook
+- org.prebid.server.hooks.v1.auction.ProcessedAuctionRequestHook
+- org.prebid.server.hooks.v1.bidder.BidderRequestHook
+- org.prebid.server.hooks.v1.bidder.RawBidderResponseHook
+- org.prebid.server.hooks.v1.bidder.ProcessedBidderResponseHook
+- org.prebid.server.hooks.v1.auction.AuctionResponseHook
+
+In a module it is not necessary to implement all mentioned interfaces but only one (or several) required by your functionality.
+
+Each hook interface internally extends org.prebid.server.hooks.v1.Hook basic interface with methods should be implemented:
+- `code()` - returns module code.
+- `call(...)` - returns result of hook invocation.
+
+### Examples
+
+1) To **update** the request in the `RawAuctionRequestHook` you would return:
+```
+Future.succeededFuture(
+ InvocationResultImpl.builder()
+ .status(InvocationStatus.success)
+ .action(InvocationAction.update)
+ .payloadUpdate(payload ->
+ AuctionRequestPayloadImpl.of(payload.bidRequest().toBuilder()
+ .id("updated request ID")
+ .build()))
+ .build()
+);
+```
+
+Please note that the `InvocationStatus` is only considered when the status is set to `InvocationStatus.success`. That means the `payloadUpdate` is only applied with `InvocationStatus.success` **and** `InvocationAction.update`
+
+2) To **reject** the request in the `RawAuctionRequestHook` you would return:
+```
+Future.succeededFuture(
+ InvocationResultImpl.rejected(âThe rejection reasonâ)
+);
+```
+
+3) To supply [analytics tags](/prebid-server/developers/module-atags.html) in the `RawAuctionRequestHook` you would return:
+```
+Future.succeededFuture(
+ InvocationResultImpl.builder()
+ ...
+ .analyticsTags(TagsImpl.of(
+ Collections.singletonList(ActivityImpl.of(
+ "device-id",
+ "success",
+ Collections.singletonList(ResultImpl.of(
+ "success",
+ mapper.mapper().createObjectNode()
+ .put("some-field", "some-value"),
+ AppliedToImpl.builder()
+ .impIds(Collections.singletonList("impId1"))
+ .request(true)
+ .build()))))))
+ ...
+ .build()
+);
+```
+
+More test implementations for each hook can be found in unit-tests at https://github.com/prebid/prebid-server-java/tree/master/src/test/java/org/prebid/server/it/hooks folder.
+
+### Applying results asynchronously
+
+Please note method call() returns a Future object. This means it wonât apply changes immediately but rather when PBS-Core executes it in org.prebid.server.hooks.execution.GroupExecutor#executeHook method.
+
+### Do not block the main thread
+
+Prebid Server Java uses Vert.x in its core, so developers need to keep an eye on blocking the main thread. See the [Vert.x documentation](https://vertx.io/docs/vertx-core/java/#_dont_block_me).
+
+Thus, for any kind of blocking operations it is recommended to use a Vert.x built-in (for example, io.vertx.core.http.HttpClient) or even better - PBS wrapper components (for example, org.prebid.server.vertx.http.HttpClient).
+
+To see how to proceed with async operations, please see similar PBS-Core functionality, for example Currency Conversion Service implementation (class âorg.prebid.server.currency.CurrencyConversionServiceâ).
+
+### Configuration
+
+It's possible to define default module configuration which can be read by the module at PBS startup. Please see the [Configuration](https://docs.google.com/document/d/1VP_pi7L5Iy3ikHMbtC2_rD5RZTVSc3OkTWKvtRS5x5Y/edit#heading=h.mh3urph3k1mk) section of the technical specification.
+
+### Testing
+
+Unit tests are required. Each implemented hook must be at least 90% covered by unit tests.
+
+### How to build and install a module
+
+Read about the bunding of modules with PBS in the [bundling section](https://docs.google.com/document/d/1VP_pi7L5Iy3ikHMbtC2_rD5RZTVSc3OkTWKvtRS5x5Y/edit#heading=h.o8dv0neoq4xm) of the technical specification.
+
+## Analytics Adapters and Modules
+
+Each module can inject analytics tags into the request as described in the analytics tags section.
+
+Analytics adapters can receive these tags in a parameter that's been added to the Auction/AMP endpoints. The org.prebid.server.analytics.model.AuctionEvent event object which includes AuctionContext with HookExecutionContext inside.
+
+To get analytics tag you need to go into:
+
+```
+AuctionEvent
+ -> AuctionContext
+ -> HookExecutionContext
+ -> stageOutcomes (select stage)
+ -> groups (iterate through groups)
+ -> hooks (go through hooks and find interested one)
+ -> analyticsTags
+```
+
+The AnalyticsTags object has activities with collection of org.prebid.server.hooks.v1.analytics.Result objects inside. Each Result has the values() method which returns com.fasterxml.jackson.databind.node.ObjectNode.
+
+It depends on the particular module implementation how to parse their analytics tags, since the internal structure is custom and depends on the module. Therefore, analytics modules that want to report on specific behavior need to be coded to know about that module. See the ortb2blocking module for an example of what analytics tags may be available.
+
+
+## Further Reading
+
+- [PBS Module Overview](/prebid-server/developers/add-a-module.html)
+- [PBS Module Analytics Tags Conventions](/prebid-server/developers/module-atags.html)
diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md
new file mode 100644
index 0000000000..502adf870e
--- /dev/null
+++ b/prebid-server/developers/add-a-module.md
@@ -0,0 +1,190 @@
+---
+layout: page_v2
+sidebarType: 5
+title: Prebid Server | Developers | Adding a Module
+
+---
+
+# Prebid Server - Adding a Module
+{: .no_toc}
+
+This document guides you through the process of developing a module for host companies to plug into their instance of Prebid Server.
+We encourage you to look at existing modules for working examples. You can also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new).
+
+{: .alert.alert-info :}
+Modules are currently only supported in [PBS-Java](https://github.com/prebid/prebid-server-java).
+
+
+* TOC
+{:toc }
+
+## Overview
+
+The ability to add optional modules in [Prebid.js](/prebid/prebidjs.html) has been widely used,
+with dozens of interesting features forming a healthy ecosystem of vendor choice that's good for publishers and the industry.
+
+Prebid Server (Java) supports a rich module interface that
+allows anyone to contribute functionality at predefined places
+along the request pipeline. Here's the general development process:
+
+1. The module writer designs the feature, then optionally posts it as an [issue](https://github.com/prebid/prebid-server/issues) for community feedback.
+1. They then code the module and unit tests and write user documentation.
+1. Code, tests, and documentation are submitted to the Prebid Server team for review.
+1. Once accepted, Prebid Server Host companies may choose to activate the new module for their publishers.
+1. Publishers can utilize the feature, doing any required account setup described in the module documentation.
+
+The first module written was the ORTB2 Blocking module. Example ideas for future modules include creative validation and traffic quality.
+If you have an idea for a module that's not feasible (e.g. a new endpoint), open [an issue](https://github.com/prebid/prebid-server/issues) with a detailed description of what you're looking to do.
+
+### Terminology
+
+- **PBS**: short for **P**re**b**id **S**erver
+- **PBS-core**: The inner workings of Prebid Server -- not part of a module, bid adpater, or analytics adapter
+- **PBS-Java**: the Java version of Prebid Server
+- **PBS-Go**: the Go-Lang version of Prebid Server
+- **Host Company**: the entity running the PBS cluster, e.g. one of the ones on [this list](https://prebid.org/product-suite/managed-services/).
+- **Module**: a coherent feature set that plugs into Prebid Server with its own configuration.
+- **Stage**: a place in the Prebid Server process flow from which a module can be invoked.
+- **Hook**: a function in the module code that executes at a given stage with a particular function signature.
+- **Endpoint**: an externally-visible service that responds to web requests. e.g. /openrtb2/auction, /cookie-sync.
+- **Analytics Tags**: a mechanism for a module to inform other modules of what it has encountered or changed.
+
+## Planning Your Module
+
+### 1. Review the Module Rules
+
+There are a number of things modules are not allowed to do
+without disclosing prominently on their documentation. Please review
+the [Module Rules](/dev-docs/module-rules.html) page. Here are some highlights:
+
+- a module can't add pixels to the creative without disclosure
+- every module must obey privacy regulations: GDPR, CCPA, COPPA
+- modules cannot create new bids. That is reserved for bid adapters.
+- modules must be configurable to make data available to all bidders. i.e. you can't make a module that works always and forever with just one bidder without prominent disclosure.
+
+### 2. Understand the Endpoints and Stages
+
+Here's a description of the Stages of a PBS request that modules can tap into for each supported endpoint:
+
+{: .table .table-bordered .table-striped }
+| Stage | Description | Endpoints | Example Use Cases |
+|-------------+-------------+-------+-----|
+| Entrypoint | Hook functions can see the raw request before PBS has processed or validated anything | auction, amp, video | A/B testing of account parameters, Alternate account validation, AMP pre-processing |
+| Raw Auction Request | Validations have been done, but no enrichments | auction, amp, video | A/B testing of StoredRequests, Advanced device detection, Traffic Quality |
+| Processed Auction Request | Any stored requests have been merged in and all PBS enrichments are done | auction, amp, video | Inject First Party Data, Channel determination, Bid floors, Bidder optimization |
+| Bidder Request | The request has been customized for a particular 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 | auction, amp, video | Response validations |
+| Processed Bidder Response | PBS has done its own validations on an individual bidder's response | auction, amp, video | Advanced CPM adjustments, Custom VAST macros |
+| Auction Response | Last step before the response goes back to the client | auction, amp, video | Inject ad server targeting, alternate auction winner logic |
+
+### 3. Figure out which Stages You're going to Hook Into
+
+A module may be comprised of:
+
+- init and hook functions that are called by Prebid Server
+- internal functions and state
+- optional external connections to data sources or other services
+
+Some modules may plug into only one endpoint and one stage of processing. Others may coordinate activity across multiple stages. For example,
+this diagram illustrates the design of a module that's configured to plug into two stages of
+the processing workflow:
+
+![Prebid Server Modularity Architecture](/assets/images/prebid-server/module-example.png){:class="pb-xlg-img"}
+
+### 4. Module Hook Actions: Read, Change and/or Reject
+
+There are a few basic ways a module's hook function can respond to PBS-core:
+
+- inspect the request/response
+- change the request by adding a new field to the request/response or updating an existing field
+- instruct PBS-core to reject the request or response entirely
+
+The amount of time your module takes to perform its actions will be limited
+by PBS-core. For example, if a creative validation module needs to 'phone home'
+to analyze the bid creative, it will have a tight window of a few milliseconds
+to get the response and apply it. Your documentation can request how long
+the module needs, but keep in mind that PBS host companies may not use your
+module if it leads to an increased rate in header bidding timeouts.
+
+### 5. Determine what Should be Configurable
+
+There are two sources of configuration for each module:
+
+#### 5.1. Initialization Config
+
+When Prebid Server starts up, it can be configured to initialize
+modules supported by the Host Company. This start up config should contain
+values that are constant across requests. e.g.:
+
+- URLs for external services
+- host-company specific settings like cache sizes, installation ID, global timeout, other defaults
+
+Values in this config can only change with a bounce of Prebid Server.
+
+#### 5.2. Runtime Config
+
+For each user request, modules can have account-specific
+configuration stored in the account-config data source. This configuration
+is used to store parameters that could vary for different publishers
+utilizing this PBS instance. e.g.:
+
+- publisher account ID
+- application config (e.g. 'blocked advertisers')
+- publisher timeout override
+
+### 6. Consider Storage Needs
+
+If your module will require state of some sort beyond configurtaion, you'll have to provide instructions
+to the PBS host company. Examples:
+
+- a module could require a No-SQL endpoint that's populated at init and refreshed periodically
+- modules may require a local SQL DB populated with application data
+- some modules may require access to local disk to read a security certificate
+
+### 7. Think about Analytics Tags
+
+Analytics Tags (aka 'ATags') are a log mechanism provided by PBS-core to inform downstream
+modules about what's happened in the request so far. Use of the Analytics Tag structure
+is completely optional, but there may be application or reporting reasons for sharing
+the results. Examples:
+
+- The [ORTB2 Blocking module](/prebid-server/pbs-modules/ortb2-blocking.html) creates ATags informing analytics adapters that
+a bid response was inspected and/or blocked for violating a publisher-defined
+rule like advertiser domains. This data can be used to alert the analytics users
+that a given bidder is losing bid opportunities by not adhering to the auction parameters.
+- A bid optimization module could inform analytics how many times it dropped a bidder from an auction for various reasons. e.g. "dropped this bidder X% of the time due to geographic reasons, Y% of the time due to session length.
+
+See the [Module Analytics Tag Conventions](/prebid-server/developers/module-atags.html) for more specific details
+about how to format ATags.
+
+### 8. Write the Code, Config, and Unit Tests
+
+The details of the implementation depend on the platform.
+
+- PBS-Java: see [Adding a PBS-Java module](/prebid-server/developers/add-a-module-java.html)
+- PBS-Go: TBD
+
+Other rules for open source PBS pull request:
+
+- Unit test coverage must exceed 90%.
+- A maintainer email address must be provided and be a group, not an individual. e.g. "support@example.com rather than jsmith@example.com
+
+### 9. Write the Module Documentation
+
+Fork the [documentation repo](https://github.com/prebid/prebid.github.io) and
+create a file in /prebid-server/pbs-modules. You can start by copying one of the existing files. It should contain:
+
+- A description of the module functionality: why people might be interested in using it.
+- Prerequisites: any necessary account activation, other required modules, etc.
+- Configuration: both init and runtime
+- Analytics Tag support
+- Privacy Support: disclose whether the module has user privacy implications and support for GDPR, CCPA, etc.
+
+### 10. Submit the Pull Requests
+
+When everthing checks out on your dev environment, submit the PRs for review.
+
+## Further Reading
+
+- [Prebid Server Module List](/prebid-server/pbs-modules/index.html)
+- [PBS Module Analytics Tags Conventions](/prebid-server/developers/module-atags.html)
diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md
index 7cfc39e2f7..0f21de1090 100644
--- a/prebid-server/developers/add-new-bidder-go.md
+++ b/prebid-server/developers/add-new-bidder-go.md
@@ -13,7 +13,7 @@ Thank you for contributing a bid adapter to the open source Prebid Server projec
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 also ask us questions by [submitting a GitHub issue](https://github.com/prebid/prebid-server/issues/new).
{: .alert.alert-info :}
-**NOTE:** 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).
+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
@@ -29,15 +29,15 @@ An OpenRTB 2.5 Bid Request contains one or more Impressions, each representing a
### Choose A Name
-You will need to choose a unique name for your bid adapter. Names should be written in lower case and may not contain special characters or emoji. If you already have a Prebid.js bid adapter, we encourage you to use the same name with the same bidder parameters. You may not name your adapter `all`, `context`, `data`, `general`, `prebid`, or `skadn` as those have special meaning in various contexts. Existing bid adapter names are [maintained here](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders.go#L37).
+You will need to choose a unique name for your bid adapter. Names should be written in lower case and may not contain special characters or emoji. If you already have a Prebid.js bid adapter, we encourage you to use the same name with the same bidder parameters. You may not name your adapter `all`, `context`, `data`, `general`, `prebid`, `skadn` or `tid` as those have special meaning in various contexts. Existing bid adapter names are [maintained here](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders.go#L37).
-We ask that the first 6 letters of the name you choose be unique among the existing bid adapters. This consideration helps with generating targeting keys for use by some ad exchanges, such as Google Ad Manager. There's no need to manually check, as this constraint is enforced by the [`TestBidderUniquenessGatekeeping`](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders_test.go#L61) test.
+We ask that the first 6 letters of the name you choose be unique among the existing bid adapters. This consideration helps with generating targeting keys for use by some ad exchanges, such as Google Ad Manager. There's no need to manually check, as this constraint is enforced by the [`TestBidderUniquenessGatekeeping`](https://github.com/prebid/prebid-server/blob/master/openrtb_ext/bidders_validate_test.go#L45) test.
Throughout the rest of this document, substitute `{bidder}` with the name you've chosen.
### Respect The Rules
-We are proud to run the Prebid Server project as a transparent and trustworthy header bidding solution. You are expected to follow our community's [code of conduct](https://docs.prebid.org/wrapper_code_of_conduct.html) and [module rules](https://docs.prebid.org/dev-docs/module-rules.html) when creating your adapter and when interacting with others through issues, code reviews, and discussions.
+We are proud to run the Prebid Server project as a transparent and trustworthy header bidding solution. You are expected to follow our community's [code of conduct](https://prebid.org/code-of-conduct/) and [module rules](/dev-docs/module-rules.html) when creating your adapter and when interacting with others through issues, code reviews, and discussions.
**Please take the time to read our rules in full.** Below is a summary of some of the rules which apply to your Prebid Server bid adapter:
- Adapters must not modify bids from demand partners, except to either change the bid from gross to net or from one currency to another.
@@ -48,9 +48,9 @@ We are proud to run the Prebid Server project as a transparent and trustworthy h
- Adapters must annotate the bid response with the proper media type, ideally based on the response from the bidding server.
{: .alert.alert-warning :}
-Failure to follow the rules will lead to delays in approving your adapter for inclusion in Prebid Server. 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).
+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).
-### Ongoing Support and Maintenance
+### Support and Maintenance
You are expected to provide support and maintenance for the code you contribute to Prebid Server as part of your bid adapter. We ask that you proactively update your adapter when your bidding server introduces new features or breaking changes.
@@ -60,18 +60,18 @@ Please be attentive in reading and responding to emails and [GitHub issues](http
## Create Your Adapter
-Prebid Server bid adapters consist of several components: bidder info, bidder parameters, adapter code, user sync code, registration with the core framework, and default configuration values. This chapter will guide you though each component.
+Prebid Server bid adapters consist of several components: bidder info, bidder parameters, adapter code, registration with the core framework, and default configuration values. This document will guide you though each component.
-Please refer to [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance, but understand that our adapter interfaces and coding style evolve over time. Please prefer the examples in this document over differences you may find in code.
+Please refer to [existing bid adapters](https://github.com/prebid/prebid-server/tree/master/adapters) for working examples and practical guidance, but understand that our adapter interfaces and coding style evolve over time. The examples in this document have precedence over differences you may find in an existing bid adapter.
Our project is written in the [Go programming language](https://golang.org/). We understand not everyone has prior experience writing Go code. Please try your best and we'll respectfully steer you in the right direction during the review process.
{: .alert.alert-info :}
-Please do not ignore errors from method calls made in your bid adapter code. Even if it's seemingly impossible for an error to occur, such as from `json.Marshal`, it's still possible under the high throughput multi-threaded nature of Prebid Server.
+**Please do not ignore errors from method calls made in your bid adapter code.** Even if it's seemingly impossible for an error to occur, such as from `json.Marshal`, it's still possible under the high throughput multi-threaded nature of Prebid Server.
### Bidder Info
-Let's begin with your adapter's bidder information YAML file. This file is required and contains your maintainer email address, your [GDPR Global Vendor List (GVL) id](https://iabeurope.eu/vendor-list-tcf-v2-0/), specifies the ad formats your adapter will accept, and allows you to opt-out of video impression tracking.
+Let's begin with your adapter's bidder information YAML file. This file is required and contains your bid adapter's maintainer email address, [GDPR Global Vendor List (GVL) ID](https://iabeurope.eu/vendor-list-tcf-v2-0/), supported ad formats, user sync endpoints, and allows you to opt-out of video impression tracking.
Create a file with the path `static/bidder-info/{bidder}.yaml` and begin with the following template:
@@ -93,6 +93,10 @@ capabilities:
- video
- audio
- native
+userSync:
+ redirect:
+ url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
```
Modify this template for your bid adapter:
@@ -100,6 +104,7 @@ Modify this template for your bid adapter:
- 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/vendor-list-tcf-v2-0/), or remove this line entirely if your bidding server is not registered with IAB Europe.
- Change the `modifyingVastXmlAllowed` value to `false` if you'd like to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015), or remove this line entirely if your adapter doesn't support VAST video ads.
- Remove the `capabilities` (app/site) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support.
+- 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.
Example: Website with banner ads only.
@@ -112,6 +117,10 @@ capabilities:
site:
mediaTypes:
- banner
+userSync:
+ redirect:
+ url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
```
@@ -125,6 +134,10 @@ capabilities:
site:
mediaTypes:
- banner
+userSync:
+ redirect:
+ url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
```
@@ -145,22 +158,71 @@ capabilities:
mediaTypes:
- banner
- video
+userSync:
+ redirect:
+ url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
```
+#### User Sync Configuration
+
+Prebid Server offers a federated [user sync](https://docs.prebid.org/prebid-server/developers/pbs-cookie-sync.html) process to store user ids from multiple bidders in a single cookie under the host's domain. You may add support for your bid adapter by configuring iframe and/or redirect endpoints.
+
+The Bidder Info template above demonstrates configuration of a `redirect` user sync. The `url` points to an endpoint on your bidding server which will honor the privacy policies, replace the `userMacro` in the redirect url with the user's tracking id, and respond with an HTTP 302 redirect to that url. You may also specify an `iframe` endpoint which will return an HTML document to be rendered in an `iframe` on the user's device and use JavaScript to perform the redirect. You may omit the `{%raw%}{{.GDPR}}{%endraw%}`, `{%raw%}{{.GDPRConsent}}{%endraw%}`, and/or `{%raw%}{{.USPrivacy}}{%endraw%}` macros if they are not applicable to your legal situation.
+
+If both `iframe` and `redirect` endpoints are provided, the `iframe` endpoint will be used by default.
+
+```yaml
+userSync:
+ iframe:
+ url: https://foo.com/iframe/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
+ redirect:
+ url: https://foo.com/redirect/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
+```
+
+If your bid adapter supports user sync and doesn't have a good default endpoint, you may optionally specify a `supports` array with the items `iframe` and/or `redirect` to inform Prebid Server hosts. Hosts will receive a warning on startup if a bid adapter supports user sync and isn't configured. Expect hosts to contact you at the maintainer email address for instructions.
+
+```yaml
+userSync:
+ # foo supports user syncing, but requires configuration by the host. contact this
+ # bidder directly at the email address in this file to ask about enabling user sync.
+ supports:
+ - iframe
+ - redirect
+```
+
+Each user sync is assigned a case-sensitive `key`, defaulting to your bidder name. You may use a different `key` value, but we discourage doing so except for when multiple bidders share the same bidding server. You might encounter this use case for built-in aliases or for multiple bidders implementing different protocols for the same bidding server. Only one bid adapter may specify endpoints when using a shared key, or Prebid Server will fail to startup due to the ambiguity.
+
+```yaml
+foo.yaml
+--------
+userSync:
+ redirect:
+ url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: $UID
+
+bar.yaml
+--------
+userSync:
+ key: foo
+```
+
### Bidder Parameters
-Your bid adapter might require extra information from the publisher to form a request to your bidding server. The bidder parameters JSON Schema codifies this information to allow Prebid Server to verify requests and to provide an API for third party configuration systems.
+Your bid adapter might require extra information from the publisher to form a request to your bidding server. The bidder parameters JSON Schema codifies this information to allow Prebid Server to verify requests and to provide an API for configuration systems.
Publishers will provide extra information using an OpenRTB 2.5 Bid Request Extension, preferably at `request.imp[].ext.prebid.bidder.{bidder}` but also supported at `request.imp[].ext.{bidder}`. Prebid Server will validate the publisher information based on your schema and relocate the data to `request.imp[].ext.bidder`, regardless of your bidder name or the publisher's chosen location.
-We request that you do not duplicate information that is already present in the [OpenRTB 2.5 Bid Request specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=13) 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.5 Bid Request standard of `request.imp[].video`.
+We request you do not duplicate information already present in the [OpenRTB 2.5 Bid Request specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=13) 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.5 Bid Request standard of `request.imp[].video`.
{: .alert.alert-warning :}
-**ENDPOINT NOTE:** You may not use an endpoint domain as a 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 use an endpoint domain as a 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://spacetelescope.github.io/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).
+Create a file with the path `static/bidder-params/{bidder}.json` and use [JSON Schema](https://spacetelescope.github.io/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).
Let's start with this example which defines one required `placementId` string parameter:
@@ -183,7 +245,9 @@ Let's start with this example which defines one required `placementId` string pa
```
We encourage you to utilize the full features of [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) to narrowly define your bidder parameter data types. If you copy and paste these examples, please remember to change the `title` and `description` to refer to your bidder name instead of our fictional Foo example.
-When choosing your parameter names, please consider aligning with the OpenRTB 2.5 standard by using lower case letters without camel casing or special characters.
+When choosing your parameter names, please consider aligning with the OpenRTB 2.5 standard by using lower case letters without camel casing or special characters.
+
+Properties in [JSON Schema](https://spacetelescope.github.io/understanding-json-schema/) are case sensitive. If you choose to specify multiple properties differing only by case for compatibility, we ask that you include the word 'preferred' in one of the descriptions to give a hint to third party configuration systems.
In addition to the examples listed below, please refer to [existing bidder parameter files](https://github.com/prebid/prebid-server/tree/master/static/bidder-params) for guidance.
@@ -234,7 +298,7 @@ In addition to the examples listed below, please refer to [existing bidder param
"title": "Foo Adapter Params",
"description": "A schema which validates params accepted by the Foo adapter",
"type": "object",
-
+
"properties": {
"token": {
"type": "string",
@@ -280,18 +344,47 @@ In addition to the examples listed below, please refer to [existing bidder param
}
```
+
+
+ Example: Multiple properties differing only by case.
+
+```json
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Foo Adapter Params",
+ "description": "A schema which validates params accepted by the Foo adapter",
+ "type": "object",
+
+ "properties": {
+ "partnerid": {
+ "type": "string",
+ "description": "Partner ID, preferred."
+ },
+ "partnerID": {
+ "secret": "string",
+ "description": "Partner ID"
+ }
+ },
+
+ "oneOf": [
+ { "required": ["partnerid"] },
+ { "required": ["partnerID"] }
+ ]
+}
+```
+
### Bidder Parameters Code
{: .alert.alert-info :}
-You can skip this step if your adapter has no bidder parameters.
+You can skip this section if your adapter has no bidder parameters.
-If you've defined bidder parameters for your adapter, you also need to represent your bidder parameters in code. The core framework uses the JSON Schema file for validation, but your adapter code needs a data structure to support JSON unmarshalling / deserialization. These data structures are organized in a shared path using a standard naming convention, which also serves as documentation of all adapter parameters.
+If you defined bidder parameters for your adapter, you also need to represent your bidder parameters in code. The core framework uses the JSON Schema file for validation, but your adapter code needs a data structure to support JSON unmarshalling / deserialization. These data structures are organized in a shared path using a standard naming convention, which also serves as documentation of all adapter parameters.
Create a file with the path `openrtb_ext/imp_{bidder}.go` containing an exported (must start with an upper case letter) data structure named `ImpExt{Bidder}`. All required and optional bidder parameters from the JSON Schema should be represented as fields.
-For example, this is what the bidder parameter code looks like for the example we used in the previous section:
+For example, this is what the bidder parameter code looks like for the Foo example we used in the previous section:
```go
package openrtb_ext
@@ -301,7 +394,7 @@ type ImpExtFoo struct {
}
```
-Please follow [Go's standard naming convention](https://golang.org/doc/effective_go.html) for the field names (particularly for acronyms) and use `` `json:...` `` attributes to specify the JSON name, matching exactly what you defined in the bidder parameters JSON Schema. Please keep in mind that JSON is case sensitive.
+Please follow [Go's standard naming convention](https://golang.org/doc/effective_go.html) for the field names (particularly for acronyms) and use `` `json:...` `` attributes to specify the JSON name, matching exactly what you defined in the bidder parameters JSON Schema.
### Adapter Code
@@ -326,7 +419,7 @@ import (
"fmt"
"net/http"
- "github.com/mxmCherry/openrtb"
+ "github.com/mxmCherry/openrtb/v15/openrtb2"
"github.com/prebid/prebid-server/adapters"
"github.com/prebid/prebid-server/config"
"github.com/prebid/prebid-server/errortypes"
@@ -345,7 +438,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters
return bidder, nil
}
-func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
requestJSON, err := json.Marshal(request)
if err != nil {
return nil, []error{err}
@@ -356,15 +449,15 @@ func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapter
Uri: a.endpoint,
Body: requestJSON,
}
-
+
return []*adapters.RequestData{requestData}, nil
}
-func (a *adapter) MakeBids(request *openrtb.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
if responseData.StatusCode == http.StatusNoContent {
return nil, nil
}
-
+
if responseData.StatusCode == http.StatusBadRequest {
err := &errortypes.BadInput{
Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.",
@@ -379,18 +472,17 @@ func (a *adapter) MakeBids(request *openrtb.BidRequest, requestData *adapters.Re
return nil, []error{err}
}
- var response openrtb.BidResponse
+ var response openrtb2.BidResponse
if err := json.Unmarshal(responseData.Body, &response); err != nil {
return nil, []error{err}
}
-
+
bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
bidResponse.Currency = response.Cur
for _, seatBid := range response.SeatBid {
- for _, bid := range seatBid.Bid {
- bid := bid // pin https://github.com/kyoh86/scopelint#whats-this
+ for i, bid := range seatBid.Bid {
b := &adapters.TypedBid{
- Bid: &bid,
+ Bid: &seatBid.Bid[i],
BidType: getMediaTypeForBid(bid),
}
bidResponse.Bids = append(bidResponse.Bids, b)
@@ -408,17 +500,17 @@ This method may be called multiple times if the host has configured aliases of y
The first argument, `bidderName`, is the name of the bidder being built. This may be the bidder name you've chosen or it may be an alias. Most adapters don't make use of the `bidderName`, but its provided by the core framework for situations where the adapter might need to do something special for aliases.
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 domains or dynamic paths.
-- `config.ExtraAdapterInfo` 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 `Builder` method is expected to return an error if either the `config.Endpoint` or the `config.ExtraAdapterInfo` values are invalid or cannot be parsed. Errors will be surfaced to the host during application startup as a fatal error.
+The `Builder` method is expected to return an error if either the `config.Endpoint` or the `config.ExtraAdapterInfo` values are invalid or cannot be parsed. Errors will be surfaced to the host during application startup as a fatal error.
Example: Builder using endpoint macros.
```go
type adapter struct {
- endpointTemplate template.Template
+ endpointTemplate *template.Template
}
// Builder builds a new instance of the Foo adapter for the given bidder with the given config.
@@ -427,9 +519,9 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters
if err != nil {
return nil, fmt.Errorf("unable to parse endpoint url template: %v", err)
}
-
+
bidder := &adapter{
- endpointTemplate: *template,
+ endpointTemplate: template,
}
return bidder, nil
}
@@ -450,7 +542,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters
if err != nil {
return nil, err
}
-
+
bidder := &adapter{
endpoint: config.Endpoint,
token: info.token,
@@ -484,9 +576,9 @@ func buildDefaultExtraInfo() extraInfo {
The `MakeRequests` method is responsible for returning none, one, or many HTTP requests to be sent to your bidding server. Bid adapters are forbidden from directly initiating any form of network communication and must entirely rely upon the core framework. This allows the core framework to optimize outgoing connections using a managed pool and record networking metrics. The return type `adapters.RequestData` allows your adapter to specify the HTTP method, url, body, and headers.
-This method is called once by the core framework for bid requests which have at least one valid Impression for your adapter. Impressions not configured for your adapter will be removed and are not accessible.
+This method is called once by the core framework for bid requests which have at least one valid Impression for your adapter. Impressions not configured for your adapter are not accessible.
-The first argument, `request`, is the OpenRTB 2.5 Bid Request object. Extension information is stored as `json.RawMessage` byte arrays and must be unmarshalled and/or marshalled to be read and/or mutated. It is *critical* to understand that the `request` object contains pointers to shared memory. If your adapter needs to alter any data referenced by a pointer then you *must* first make a shallow copy. The only exception is for `request.Imp` and its elements, as these are already shallow copies. The exact same instance of the `request` object is also passed to the `MakeBids` method, so please be careful when mutating. It's safe to assume that `request.Imp[]` always contains at least one element and that the `request.Imp[].ext.bidder` was successfully validated by your bidder parameter JSON Schema.
+The first argument, `request`, is the OpenRTB 2.5 Bid Request object. Extension information is stored as `json.RawMessage` byte arrays and must be unmarshalled and/or marshalled to be read and/or mutated. It is *critical* to understand that the `request` object contains pointers to shared memory. If your adapter needs to alter any data referenced by a pointer then you *must* first make a shallow copy. The only exception is for `request.Imp` and its elements, as these are already shallow copies. The exact same instance of the `request` object is also passed to the `MakeBids` method, so please be careful when mutating. It's safe to assume that `request.Imp[]` always contains at least one element and that the `request.Imp[].ext.bidder` was successfully validated per your bidder parameter JSON Schema.
Example: Mutating banner shared memory (make a copy).
@@ -504,33 +596,37 @@ 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. For now, this just includes `requestInfo.PbsEntryPoint` which is commonly used to determine if the request is for AMP or Long Form Video Ad Pods. This object will be expanded in the future to also include currency conversion and extension unmarshalling helper methods.
+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.
-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. Neither slices may contain `nil` elements.
+
+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.
{: .alert.alert-info :}
HTTP calls to your bidding server will automatically prefer GZIP compression. You should not specify it yourself using headers. You don't have to worry about decompressing the response in `MakeBids` either, as that will be taken care of automatically.
-An Impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the Impression into multiple calls and merge the responses.
+##### Impression Splitting
-
- Example: Impression splitting.
+An Impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the Impression into multiple calls and merge the responses.
```go
-func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapters.ExtraRequestInfo) (*adapters.RequestData, []error) {
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) (*adapters.RequestData, []error) {
var requests []*adapters.RequestData
var errors []error
-
+
requestCopy := *request
for _, imp := range request.Imp {
- requestCopy.Imp = []openrtb.Imp{imp}
+ requestCopy.Imp = []openrtb2.Imp{imp}
requestJSON, err := json.Marshal(request)
if err != nil {
errors = append(errors, err)
continue
}
-
+
requestData := &adapters.RequestData{
Method: "POST",
Uri: a.endpoint,
@@ -541,12 +637,58 @@ func (a *adapter) MakeRequests(request *openrtb.BidRequest, requestInfo *adapter
return requests, errors
}
```
+
+##### Currency
+
+Prebid Server is a global product that is currency agnostic. Publishers may ask for bids in any currency. It's totally fine if your bidding endpoint only supports a single currency, but your adapter needs to deal with it. This section will describe how to do so.
+
+Here are 3 key points to consider:
+
+1. If your endpoint only bids in a particular currency, then your adapter must not blindly forward the openrtb to your endpoint. You should instead set $.cur to your server's required currency.
+2. Your adapter must label bid responses properly with the response currency. i.e. if you only bid in USD, then your adapter must set USD as the response currency. PBS will convert to the publisher's requested currency as needed. See the [currency feature](/prebid-server/features/pbs-currency.html) for more info.
+3. You should be aware that floors can be defined in any currency. If your bidding service supports floors, but only in a particular currency, then you must read use the `requestInfo.ConvertCurrency` function before sending $.imp[].bidfloor and $.imp[].bidfloorcur to your endpoint.
+
+
+ Example: Currency conversion needed for bid floor values in impressions.
+
+```go
+func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) (*adapters.RequestData, []error) {
+
+ for _, imp := range request.Imp {
+ // Check if imp comes with bid floor amount defined in a foreign currency
+ if imp.BidFloor > 0 && imp.BidFloorCur != "" && strings.ToUpper(imp.BidFloorCur) != "USD" {
+
+ // Convert to US dollars
+ convertedValue, err := reqInfo.ConvertCurrency(imp.BidFloor, imp.BidFloorCur, "USD")
+ if err != nil {
+ return nil, []error{err}
+ }
+
+ // Update after conversion. All imp elements inside request.Imp are shallow copies
+ // therefore, their non-pointer values are not shared memory and are safe to modify.
+ imp.BidFloorCur = "USD"
+ imp.BidFloor = convertedValue
+ }
+ }
+
+ requestJSON, err := json.Marshal(request)
+ if err != nil {
+ return nil, []error{err}
+ }
+
+ requestData := &adapters.RequestData{
+ Method: "POST",
+ Uri: a.endpoint,
+ Body: requestJSON,
+ }
+
+ return []*adapters.RequestData{requestData}, nil
+}
+```
-If your bidding server supports multiple currencies, please be sure to pass through the `request.cur` field. If your bidding server only bids in a single currency, such as USD or EUR, that's fine. Prebid Server will convert your bid to the request currency if you include it in the bid response, otherwise we assume USD and conversion will not occur.
-
-Please ensure you forward the bid floor (`request.imp[].bidfloor`) and bid floor currency (`request.imp[].bidfloorcur`) values to your bidding server for enforcement. You'll soon have access to currency conversion helper methods if your endpoint only supports floors in a single currency.
+##### Common Data
There are a several values of a bid that publishers expect to be populated. Some are defined by the OpenRTB 2.5 specification and some are defined by Prebid conventions.
@@ -557,9 +699,10 @@ There are a several values of a bid that publishers expect to be populated. Some
| COPPA | OpenRTB | `request.regs.ext.us_privacy` The publisher is specifying the Children's Online Privacy Protection flag.
| Currency | OpenRTB |`request.cur` The publisher is specifying the desired bid currency. The Prebid Server default is USD.
| [Debug](https://github.com/prebid/prebid-server/issues/745) | Prebid | `request.ext.prebid.debug` The publisher is requesting verbose debugging information from Prebid Server.
+| [Request-Defined currency conversion rates](https://docs.prebid.org/prebid-server/features/pbs-currency.html) | Prebid | `request.ext.prebid.currency` The publisher decides to prioritize its own custom currency conversion rates over Prebid Server's currency conversion rates. If a currency rate is not found in `request.ext.prebid.currency`, Prebid Server's rates will be used unless `usepbsrates` is set to `false`. If missing, `usepbsrates` defaults to true.
| [First Party Data (FPD)](https://docs.prebid.org/prebid-server/features/pbs-fpd.html)| Prebid | `request.imp[].ext.context.data.*`, `request.app.ext.data.*`, `request.site.ext.data.*`, `request.user.ext.data.*` The publisher may provide first party data (e.g. keywords).
| GDPR | OpenRTB | `request.regs.ext.gdpr`, `request.user.ext.consent` The publisher is specifying the European General Data Protection Regulation flag and TCF consent string.
-| Site or App | OpenRTB | `request.site`, `request.app` The publisher will provide either the site or app, but not both, representing the client's device.
+| Site or App | OpenRTB | `request.site`, `request.app` The publisher will provide either the site or app, but not both, representing the client's device.
| Supply Chain | OpenRTB | `request.source.ext.schain` The publisher's declaration of all parties who are selling or reselling the bid request.
| Test | OpenRTB | `request.test` The publisher is sending non-production traffic which also enables verbose debugging information from Prebid Server.
| Video | OpenRTB | `request.imp[].video` The publisher is specifying video ad requirements or preferences.
@@ -571,18 +714,20 @@ For simplicity, adapters are expected to make net-price bids (e.g. "If this ad w
The `MakeBids` method is responsible for parsing the bidding server's response and mapping it to the [OpenRTB 2.5 Bid Response object model](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32).
-This method is called for each response received from your bidding server within the bidding window (`request.tmax`). If there are no requests or if all requests time out, the `MakeBids` method will not be called.
+This method is called for each response received from your bidding server within the bidding time window (`request.tmax`). If there are no requests or if all requests time out, the `MakeBids` method will not be called.
-{: .alert.alert-info :}
+{: .alert.alert-warning :}
It's *imperative* to include all required information in the response for your bid to be accepted. Please avoid common mistakes, such as not specifying the bid currency and not properly detecting the media type from the bidding server response.
The first argument, `request`, is the exact same OpenRTB 2.5 Bid Request object provided to (and potentially mutated by) the `MakeRequests` method. The information in the `request` may be useful when detecting the media type.
The second argument, `requestData`, is the exact same `adapters.RequestData` object returned by the `MakeRequests` method. It's rare for adapters to make use of this information, but it's provided for potential edge cases.
-The third argument, `responseData`, is the HTTP response received from your bidding server and contains the status code, body, and headers. If your bidding server replies with a GZIP encoded body, it will be automatically decompressed.
+The third argument, `responseData`, is the HTTP response received from your bidding server and contains the status code, body, and headers. If your bidding server replies with a GZIP encoded body, it will be automatically decompressed.
-The `MakeBids` method is expected to return an `adapters.BidderResponse` object with one or more bids mapped from your bidding server's response. This may be as simple as decorating an OpenRTB 2.5 Bid Response with a some Prebid Server metadata (such as the media type) or more complicated mapping logic depending on your server's response format.
+The `MakeBids` method is expected to return an `adapters.BidderResponse` object with one or more bids mapped from your bidding server's response. This may be as simple as decorating an OpenRTB 2.5 Bid Response with some Prebid Server metadata (such as the media type) or more complicated mapping logic depending on your server's response format.
+
+##### Object Model
Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32) documentation to fully understand the response object model and expectations. We've summarized some common fields below. Data which is listed as required is enforced by the core framework and cannot be omitted.
@@ -591,12 +736,12 @@ Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-conte
| - | - | -
| `.Currency` | Required | [3-letter ISO 4217 code](https://www.iso.org/iso-4217-currency-codes.html) defining the currency of the bid. The Prebid Server default is USD.
| `.Bids[].BidType` | Required | Prebid Server defined value identifying the media type as `banner`, `video`, `audio`, or `native`. Should be mapped from the bidding server response.
-| `.Bids[].Bid.ADomain` | Optional | Advertiser domain for block list checking.
-| `.Bids[].Bid.AdM` | Optional | Ad markup to serve if the bid wins. May be HTML, Native, or VAST/VMAP formats. You should resolve any AUCTION_PRICE macros.
| `.Bids[].Bid.CrID` | Required | Unique id of the creative.
| `.Bids[].Bid.ID` | Required | Bidder generated id to assist with logging and tracking.
| `.Bids[].Bid.ImpID` | Required | ID of the corresponding bid request Impression. Prebid Server validates the id is actually found in the bid request.
| `.Bids[].Bid.Price` | Required | Net price CPM of the bid, not gross price. Publishers can correct for gross price bids by setting Bid Adjustments to account for fees. We recommend the most granular price a bidder can provide.
+| `.Bids[].Bid.ADomain` | Optional | Advertiser domain for block list checking.
+| `.Bids[].Bid.AdM` | Optional | Ad markup to serve if the bid wins. May be HTML, Native, or VAST/VMAP formats. You should resolve any AUCTION_PRICE macros.
| `.Bids[].Bid.W` | Optional | Width of the creative in pixels.
| `.Bids[].Bid.H` | Optional | Height of the creative in pixels.
| `.Bids[].Bid.Ext` | Optional | Embedded JSON containing Prebid metadata (see below) or custom information.
@@ -604,22 +749,25 @@ Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-conte
{: .alert.alert-info :}
We recommend resolving creative OpenRTB macros in your adapter. Otherwise, AUCTION_PRICE will eventually get resolved by the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative), but by then the bid price will be in the ad server currency and quantized by the price granularity.
-If you'd like to support Long Form Video Ad Pods, then you'll need to provide the followings information:
+If you'd like to support [Long Form Video Ad Pods](/dev-docs/modules/adpod.html)s, then you'll need to provide the followings information:
{: .table .table-bordered .table-striped }
| BidderResponse Path | Description
| - | -
-| `.Bids[].BidVideo.PrimaryCategory` | Category for the bid. Should be able to be translated to the primary ad server format.
-| `.Bids[].Bid.Cat` | Category for the bid. Should be able to be translated to the primary ad server format.
+| `.Bids[].BidVideo.PrimaryCategory` | Category for the bid in the taxonomy used by the ad server. Will be passed through without translation.
+| `.Bids[].Bid.Cat` | IAB category for the bid which may be translated to the taxonomy used by the ad server.
| `.Bids[].BidVideo.Duration` | Length of the video in integer seconds.
| `.Bids[].DealPriority` | Deal tier integer value. Defaults to 0.
{: .alert.alert-info :}
Either `.Bids[].BidVideo.PrimaryCategory` or `.Bids[].Bid.Cat` should be provided.
-Prebid has historically struggled with sharing granular bid response data with publishers, analytics, and reporting systems. To address this, we've introduced a standard object model. We encourage adapters to provide as much information as possible in the bid response.
+
+##### Metadata
+
+Prebid has introduced a standard object model for sharing granular bid response data with publishers, analytics, and reporting systems. We encourage adapters to provide as much information as possible in the bid response.
{: .alert.alert-danger :}
-Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for AdvertiserDomains and MediaType. We recommend making sure your adapter sets these values or Prebid.js may throw out the bid.
+Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for bid.ADomain and MediaType. We recommend making sure your adapter sets these values or Prebid.js may throw out the bid.
{: .table .table-bordered .table-striped }
| Path | Description
@@ -630,13 +778,13 @@ Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for Adve
| `.AgencyName` | Bidder-specific agency name.
| `.AdvertiserID` | Bidder-specific advertiser id.
| `.AdvertiserName` | Bidder-specific advertiser name.
-| `.AdvertiserDomains` | Advertiser domains for the landing page(s). Should match `.Bids[].Bid.ADomain`.
| `.BrandID` | Bidder-specific brand id for advertisers with multiple brands.
| `.BrandName` | Bidder-specific brand name.
-| `.dchain` | Demand Chain Object.
+| `.DemandSource` | Bidder-specific demand source. Some adapters may functionally serve multiple SSPs or exchanges, and this specifies which.
+| `.DChain` | Demand chain object.
| `.PrimaryCategoryID` | Primary IAB category id.
| `.SecondaryCategoryIDs` | Secondary IAB category ids.
-| `.MediaType` | Either `banner`, `audio`, `video`, or `native`. Should match `.Bids[].BidType`.
+| `.MediaType` | Either `banner`, `audio`, `video`, or `native`. This is used in the scenario where a bidder responds with a mediatype different than the stated type. e.g. native when the impression is for a banner. One use case is to help publishers determine whether the creative should be wrapped in a safeframe.
@@ -644,83 +792,46 @@ Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for Adve
Example: Setting metadata.
```go
-func (a *adapter) MakeBids(request *openrtb.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
+func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
...
for _, seatBid := range response.SeatBid {
- for _, bid := range seatBid.Bid {
- bid := bid // pin https://github.com/kyoh86/scopelint#whats-this
+ for i, bid := range seatBid.Bid {
b := &adapters.TypedBid{
- Bid: &bid,
+ Bid: &seatBid.Bid[i],
BidType: getMediaTypeForBid(bid),
- }
-
- if meta, err := buildMeta(b); err != nil {
- errs = append(errs, metaErr)
- } else {
- b.Bid.Ext = meta
- bidResponse.Bids = append(bidResponse.Bids, b)
+ BidMeta: getBidMeta(bid),
}
}
...
}
-func buildMeta(bid *adapters.TypedBid) (json.RawMessage, error) {
- metaExt := openrtb_ext.ExtBidPrebid {
- Meta: &openrtb_ext.ExtBidPrebidMeta {
- NetworkID: 1,
- NetworkName: "Some Network Name",
- AgencyID: 2,
- AgencyName: "Some Agency Name",
- AdvertiserID: 3,
- AdvertiserName: "Some Advertiser Name",
- AdvertiserDomains: bid.ADomain,
- dchain: bid.ext.dchain,
- BrandID: 4,
- BrandName: "Some Brand Name",
- PrimaryCategoryID: "IAB-1",
- SecondaryCategoryIDs: []string{"IAB-2", "IAB-3"},
- MediaType: b.BidType,
- }
+func getBidMeta(bid *adapters.TypedBid) *openrtb_ext.ExtBidPrebidMeta {
+ // Not all fields are required. This example includes all fields for
+ // demonstration purposes.
+ return &openrtb_ext.ExtBidPrebidMeta {
+ NetworkID: 1,
+ NetworkName: "Some Network Name",
+ AgencyID: 2,
+ AgencyName: "Some Agency Name",
+ AdvertiserID: 3,
+ AdvertiserName: "Some Advertiser Name",
+ AdvertiserDomains: []string{"Some Domain"},
+ DemandSource: "Some Demand Source",
+ DChain: json.RawMessage(`{Some Demand Chain JSON}`),
+ BrandID: 4,
+ BrandName: "Some Brand Name",
+ PrimaryCategoryID: "IAB-1",
+ SecondaryCategoryIDs: []string{"IAB-2", "IAB-3"},
+ MediaType: "banner",
}
- return json.Marshal(meta)
}
```
-### Create A User Syncer (Optional)
-
-Prebid Server offers a federated [user sync solution](https://docs.prebid.org/prebid-server/developers/pbs-cookie-sync.html) to store user ids in a single cookie under the host's domain. You may add support with a relatively small amount of code if your bidding server supports this protocol.
-
-Create a file with the path `adatpers/{bidder}/usersync.go` using the following template:
-
-```go
-package {bidder}
-
-import (
- "text/template"
-
- "github.com/prebid/prebid-server/adapters"
- "github.com/prebid/prebid-server/usersync"
-)
-
-func NewSyncer(template *template.Template) usersync.Usersyncer {
- return adapters.NewSyncer("{bidder}", template, adapters.SyncTypeRedirect)
-}
-```
-
-The heavy lifting is handled by the `adapters.NewSyncer` method. You just need to provide a few arguments:
-
-{: .table .table-bordered .table-striped }
-| Argument | Description
-| - | -
-| `familyName` | Name used for storing your user sync id within the federated cookie. Please keep this the same as your bidder name.
-| `urlTemplate` | Pass through the `template` argument.
-| `syncType` | Type of user sync supported by your bidding server. The valid options are `SyncTypeRedirect` and `SyncTypeIframe`.
-
### Register With The Core
-Prebid Server does not use reflection or any other automagic technology to recognize your new bid adapter. You must manually register it with the core framework.
+Prebid Server does not use reflection or any other automated technology to recognize your new bid adapter. You must manually register it with the core framework.
{: .alert.alert-info :}
You will need to add an `import` statement for your bid adapter package in these files. Modern code editors such as Visual Studio Code and JetBrain's GoLand will automatically do that for you.
@@ -745,7 +856,7 @@ const (
func CoreBidderNames() []BidderName {
return []BidderName{
...
- Bidder{Bidder},
+ Bidder{Bidder},
...
}
}
@@ -763,20 +874,9 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder {
}
```
-If you have a user syncer, edit the file `usersync/usersyncers/syncer.go` to include it in the syncer map.
-
-```go
-func NewSyncerMap(cfg *config.Configuration) map[openrtb_ext.BidderName]usersync.Usersyncer {
- syncers := make(map[openrtb_ext.BidderName]usersync.Usersyncer, len(cfg.Adapters))
- ...
- insertIntoMap(cfg, syncers, openrtb_ext.Bidder{Bidder}, {bidder}.NewSyncer)
- ...
-}
-```
-
### Set Adapter Defaults
-Lastly, you need to provide default settings for your bid adapter. You can decide if you'd like your bid adapter to be enabled out of the box, and if so, you'll need to provide a default endpoint and default extra adapter info if applicable. If your bid adapter requires host specific information to function properly, such as a security token or host account, then it's best to leave the adapter disabled.
+You need to provide default settings for your bid adapter. You can decide if you'd like your bid adapter to be enabled out of the box, and if so, you'll need to provide a default endpoint and default extra adapter info (if applicable). If your bid adapter requires host specific information to function properly, such as a security token or host account, then it's best to leave the adapter disabled.
{: .alert.alert-warning :}
**HOST SPECIFIC INFO:** The default endpoint must not be specific to any particular host, such as Xandr/AppNexus. We may ask you about suspicious looking ids during the review process. Please reach out to individual hosts if you need to set specialized configuration.
@@ -789,7 +889,7 @@ Edit the file `config/config.go` to register your default endpoint within the `S
func SetupViper(v *viper.Viper, filename string) {
...
v.SetDefault("adapters.{bidder}.endpoint", "https://your.url/any/path")
- v.SetDefault("adapters.{bidder}.extra_info", `{"your": "extra info"}`)
+ v.SetDefault("adapters.{bidder}.extra_info", `{"your": "extra info"}`)
...
}
```
@@ -806,76 +906,9 @@ func SetupViper(v *viper.Viper, filename string) {
}
```
-### Set User Syncer Defaults
-
-If you implemented a user syncer, you'll need to provide a default endpoint. Edit the file `config/config.go` to alphabetically register your user syncer in the `setDerivedDefaults` method:
-
-```go
-func (cfg *Configuration) setDerivedDefaults() {
- ...
- setDefaultUsersync(cfg.Adapters, openrtb_ext.Bidder{Bidder}, "https://your.url/sync?r="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3D{bidder}%26gdpr%3D{%raw%}{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}{%endraw%}%26uid%3D%5BUUID%5D")
- ...
-}
-```
-
-If you don't have a good default, please add a comment instead.
-
-```go
-func (cfg *Configuration) setDerivedDefaults() {
- ...
- // openrtb_ext.Bidder{Bidder} doesn't have a good default.
- ...
-}
-```
-
-
-Yes, you're right. That url value is quite complicated. You can find further details in our [user sync documentation](https://docs.prebid.org/prebid-server/developers/pbs-cookie-sync.html).
-
-The user sync endpoint is composed of two main parts, the url of your user syncer and a redirect back to Prebid Server. The url of your user syncer is responsible for reading the user id from the client's cookie and redirecting to Prebid Server with a user id macro resolved.
-
-The url of your user syncer can make use of the following privacy policy macros which will be resolved by Prebid Server before sending the url to your server:
-- `{%raw%}{{.USPrivacy}}{%endraw%}`: Client's CCPA consent string.
-- `{%raw%}{{.GDPR}}{%endraw%}`: Client's GDPR TCF enforcement flag.
-- `{%raw%}{{.GDPRConsent}}{%endraw%}`: Client's GDPR TCF consent string.
-
-
- Example: Bidding server url with no macros.
-
-```go
-"https://your.url/sync?r="
-```
-
-
-
- Example: Bidding server url with CCPA privacy consent.
-
-```go
-"https://your.url/sync?usp={%raw%}{{.USPrivacy}}{%endraw%}&r="
-```
-
-
-
-The redirect url for Prebid Server must follow this format:
-```
-{host}/setuid?bidder={bidder}&gdpr={%raw%}{{.GDPR}}&gdpr_consent={{.GDPRConsent}}{%endraw%}&uid=[UUID]
-```
-
-{: .table .table-bordered .table-striped }
-| Token | Description
-| - | -
-| `{host}` | Placeholder for the Prebid Server host url. In code, you would substitute it with `url.QueryEscape(externalURL)`.
-| `{bidder}` | Placeholder for the name of your bid adapter.
-| `[UUID]` | Macro defined by your user sync server which will be replaced with the user's id.
-
-The final value of the redirect url is encoded for safe use within a query string:
-
-```
-{host}%2Fsetuid%3Fbidder%3D{bidder}%26gdpr%3D{%raw%}{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}{%endraw%}%26uid%3D%5BUUID%5D
-```
-
## Test Your Adapter
-This chapter will guide you through the creation of automated unit tests to cover your bid adapter code, bidder parameters JSON Schema, and user sync code. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command:
+This section will guide you through the creation of automated unit tests to cover your bid adapter code and bidder parameters JSON Schema. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command:
```bash
./validate.sh --nofmt --cov --race 10
@@ -883,7 +916,7 @@ This chapter will guide you through the creation of automated unit tests to cove
### Adapter Code Tests
-Bid requests and server responses can be quite verbose. To avoid large blobs of text embedded within test code, we've created a framework for bid adapters which use a JSON body and/or a url. If your bidding server uses another payload format, such as XML, you're on your own.
+Bid requests and server responses can be quite verbose. To avoid large blobs of text embedded within test code, we've created a framework for bid adapters which use a JSON body and/or a url to send a bid request. We require the use of our test framework as it includes checks to ensure no changes are made to shared memory.
We strive for as much test coverage as possible, but recognize that some code paths are impractical to simulate and rarely occur. You do not need to test the error conditions for `json.Marshal` calls, for template parse errors within `MakeRequests` or `MakeBids`, or for `url.Parse` calls. Following this guidance usually results in a coverage rate of around 90% - 95%, although we don't enforce a specific threshold.
@@ -894,7 +927,7 @@ package {bidder}
import (
"testing"
-
+
"github.com/prebid/prebid-server/adapters/adapterstest"
"github.com/prebid/prebid-server/config"
"github.com/prebid/prebid-server/openrtb_ext"
@@ -903,11 +936,11 @@ import (
func TestJsonSamples(t *testing.T) {
bidder, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{
Endpoint: "http://whatever.url"})
-
+
if buildErr != nil {
t.Fatalf("Builder returned unexpected error %v", buildErr)
}
-
+
adapterstest.RunJSONBidderTest(t, "{bidder}test", bidder)
}
```
@@ -962,7 +995,7 @@ The format of a JSON test is as follows:
The `mockBidRequest`, `httpCalls`, and `expectedBidResponses` fields are required. The `expectedMakeRequestsErrors` and `expectedMakeBidsErrors` may be omitted if there are no expected errors. We provide a `literal` and `regex` mode for testing error values. We often use the `regex` mode to handle error messages produced by the core Go framework which changed between recent releases.
-To make everyone's life easier, please use a JSON 'prettifier' to apply standard formatting to your test files. We recommend the use of Visual Studio Code's [Beautify](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify) extension.
+Please use a JSON 'prettifier' to apply standard formatting to your test files. We recommend the use of Visual Studio Code's [Beautify](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify) extension.
### Builder Tests
@@ -974,7 +1007,7 @@ If your adapter supports template parsing, we recommend adding this failure test
func TestEndpointTemplateMalformed(t *testing.T) {
_, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{
Endpoint: "{%raw%}{{Malformed}}{%endraw%}"})
-
+
assert.Error(t, buildErr)
}
```
@@ -987,7 +1020,7 @@ func TestBadConfig(t *testing.T) {
Endpoint: `http://it.doesnt.matter/bid`,
ExtraAdapterInfo: `{foo:42}`,
})
-
+
assert.Error(t, buildErr)
}
@@ -996,27 +1029,14 @@ func TestEmptyConfig(t *testing.T) {
Endpoint: `http://it.doesnt.matter/bid`,
ExtraAdapterInfo: ``,
})
-
+
bidder{Bidder} := bidder.(*adapter)
-
+
assert.NoError(t, buildErr)
assert.Empty(t, bidder{Bidder}.extraInfo.SomeInfo)
}
```
-### Adapter Race Condition Tests
-
-You must define race condition tests for each media type supported by your bid adapter. We don't expect bid adapters to run concurrent code. Rather, these tests attempt to verify your bid adapter doesn't modify shared memory. We use Go's [race detector](https://golang.org/doc/articles/race_detector.html) which is a great line of defense, but it may produce false negatives. It will not produce false positives, so please investigate further if these tests ever fail.
-
-Create a file with the path `adapters/{bidder}/{bidder}test/params/race/{mediaType}.json` for each `banner`, `video`, `audio`, and `native` media type supported by your adapter. Include all required and optional bidder parameters defined by your JSON Schema.
-
-Here's an example file using the same example JSON Schema from other chapters:
-```json
-{
- "placementId": "Some Placement"
-}
-```
-
### Bidder Parameter Tests
The bidder parameter JSON Schema files are considered a form of code and must be tested. Create a file with the path `adapters/{bidder}/params_test.go` using the following template:
@@ -1027,7 +1047,7 @@ package {bidder}
import (
"encoding/json"
"testing"
-
+
"github.com/prebid/prebid-server/openrtb_ext"
)
@@ -1036,7 +1056,7 @@ func TestValidParams(t *testing.T) {
if err != nil {
t.Fatalf("Failed to fetch the json schema. %v", err)
}
-
+
for _, p := range validParams {
if err := validator.Validate(openrtb_ext.Bidder{Bidder}, json.RawMessage(p)); err != nil {
t.Errorf("Schema rejected valid params: %s", p)
@@ -1049,7 +1069,7 @@ func TestInvalidParams(t *testing.T) {
if err != nil {
t.Fatalf("Failed to fetch the json schema. %v", err)
}
-
+
for _, p := range invalidParams {
if err := validator.Validate(openrtb_ext.Bidder{Bidder}, json.RawMessage(p)); err == nil {
t.Errorf("Schema allowed invalid params: %s", p)
@@ -1068,66 +1088,11 @@ var invalidParams = []string{
```
Please include tests for required fields, optional fields, conditional fields such as `oneOf`, regex filters, and data type mismatches. For example, if the field is defined as a string please include one invalid case for the wrong data type such as an integer in this example.
-You don't have to go crazy with combinatorials. We're looking for just enough test cases to build confidence.
-
-### User Syncer Tests
-
-{: .alert.alert-info :}
-Please skip to the end of this section if your adapter doesn't define a user syncer.
-
-We ask that you include a user syncer test to verify the basic mechanics of macro substitution. The `syncURL` should be the same value used in the `setDefaultUsersync` call with the `url.QueryEscape(externalURL)` code replaced with a simple hardcoded value such as `"host"`. Please keep the privacy policy values simple, as we're only testing substitution.
-
-Create a file with the path `adapters/{bidder}/usersync_test.go` using the following template:
-
-```go
-package {bidder}
-
-import (
- "testing"
- "text/template"
-
- "github.com/prebid/prebid-server/privacy"
- "github.com/prebid/prebid-server/privacy/ccpa"
- "github.com/prebid/prebid-server/privacy/gdpr"
- "github.com/stretchr/testify/assert"
-)
-
-func TestSyncer(t *testing.T) {
- syncURL := ""
- syncURLTemplate := template.Must(
- template.New("sync-template").Parse(syncURL),
- )
-
- syncer := NewSyncer(syncURLTemplate)
- syncInfo, err := syncer.GetUsersyncInfo(privacy.Policies{
- GDPR: gdpr.Policy{
- Signal: "A",
- Consent: "B",
- },
- CCPA: ccpa.Policy{
- Consent: "C",
- },
- })
-
- assert.NoError(t, err)
- assert.Equal(t, "", syncInfo.URL)
- assert.Equal(t, "redirect", syncInfo.Type)
-}
-```
-
-If you *DON'T* have a user syncer, edit the file `usersync/usersyncers/syncer_test.go` to exclude your bid adapter from user sync tests:
-
-```go
-adaptersWithoutSyncers := map[openrtb_ext.BidderName]bool{
- ...
- openrtb_ext.Bidder{Bidder}: true,
- ...
-}
-```
+There is no need to provide a combinatorial for every edge case possibility. We're looking for just enough test cases to build confidence.
### Manual End To End Tests
-We'll verify your adapter works correctly on a technical level during the code review, but you'll need to perform separate end-to-end testing:
+We'll verify your adapter works correctly on a technical level during the code review, but you'll need to perform manual end-to-end testing:
1. Build the project and start your server:
```bash
@@ -1171,20 +1136,22 @@ We'll verify your adapter works correctly on a technical level during the code r
}'
```
-If your bid adapters defines a user syncer, please perform end-to-end testing of the user sync process:
+### User Sync Testing
+
+If your bid adapter defines one or more user sync endpoints, you'll need to perform manual end-to-end testing of each endpoint using the following process:
-1. [Save a User ID](https://docs.prebid.org/prebid-server/endpoints/pbs-endpoint-setuid.html) using the `familyName` of your user syncer. This is likely the same as your bidder name.
+1. [Save a User ID](https://docs.prebid.org/prebid-server/endpoints/pbs-endpoint-setuid.html) using the `key` of your user sync endpoint. This should default to your bidder name and is case sensitive.
1. Run a test auction (see the curl example above) and verify in the debug response that the outgoing `request.ext.debug.httpcalls` calls includes the User ID you saved in step 1.
-It may be a bit tricky to track down the root cause of user sync errors. If you get stuck, please [submit a GitHub issue](https://github.com/prebid/prebid-server/issues/new) and we'll provide guidance.
+If you are having issues finding the root cause of user sync errors, please [submit a GitHub issue](https://github.com/prebid/prebid-server/issues/new) and we'll provide guidance.
## User Documentation
Human readable documentation for bid adapters is required in the separate [prebid.github.io](https://github.com/prebid/prebid.github.io) repository. We will not merge your bid adapter until you've at least opened a documentation PR and comment with a link to it.
-1. If you already have a Prebid.js bid adapter, update your existing bidder file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/modules to add the `pbs: true` variable in the header section. If your Prebid Server bidding parameters are different from your Prebid.js parameters, please include the differences in this document for publishers to be aware.
-1. If you don't have a Prebid.js bid adapter, create a new file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/modules using this template:
+1. If you already have a Prebid.js bid adapter, update your existing bidder file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders to add the `pbs: true` variable in the header section. If your Prebid Server bidding parameters are different from your Prebid.js parameters, please include the differences in this document for publishers to be aware.
+1. If you don't have a Prebid.js bid adapter, create a new file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders using this template:
```
---
@@ -1201,11 +1168,15 @@ dchain_supported: true/false
userId:
media_types: banner, video, audio, native
safeframes_ok: true/false
-bidder_supports_deals: true/false
+deals_supported: true/false
+floors_supported: true/false
+fpd_supported: true/false
pbjs: true/false
pbs: true/false
pbs_app_supported: true/false
prebid_member: true/false
+multiformat_supported: will-bid-on-any, will-bid-on-one, will-not-bid
+ortb_blocking_supported: true/partial/false
---
### Note:
@@ -1231,7 +1202,10 @@ Notes on the metadata fields:
- 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 `bidder_supports_deals: 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.
- If you're a member of Prebid.org, add `prebid_member: true`. Default is false.
@@ -1248,13 +1222,6 @@ Notes on the metadata fields:
- `adapters/{bidder}/{bidder}_test.go`
- `adapters/{bidder}/{bidder}test/exemplary/*.json`
- `adapters/{bidder}/{bidder}test/supplemental/*.json`
- - `adapters/{bidder}/{bidder}test/params/race/{mediaType}.json`
-- User Syncer - If You Have One
- - `adapters/{bidder}/usersync.go`
- - `adapters/{bidder}/usersync_test.go`
- - `usersync/usersyncers/syncer.go`
-- User Syncer - If You Don't
- - `usersync/usersyncers/syncer_test.go`
- Register With The Core
- `openrtb_ext/bidders.go`
- `exchange/adapter_builders.go`
@@ -1263,7 +1230,7 @@ Notes on the metadata fields:
## Contribute
-Whew! You're almost done. Thank you for taking the time to develop a Prebid Server bid adapter. When you're ready, [contribute](https://github.com/prebid/prebid-server/blob/master/docs/developers/contributing.md) your new bid adapter by opening a PR to the [PBS-Go GitHub repository](https://github.com/prebid/prebid-server) with the name "New Adapter: {Bidder}".
+Thank you for taking the time to develop a Prebid Server bid adapter. When you're ready, [contribute](https://github.com/prebid/prebid-server/blob/master/docs/developers/contributing.md) your new bid adapter by opening a PR to the [PBS-Go GitHub repository](https://github.com/prebid/prebid-server) with the name "New Adapter: {Bidder}".
{: .alert.alert-warning :}
You don't need to ask permission or open a GitHub issue before submitting an adapter.
diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md
index 692954b274..ff54c340ef 100644
--- a/prebid-server/developers/add-new-bidder-java.md
+++ b/prebid-server/developers/add-new-bidder-java.md
@@ -19,7 +19,7 @@ This document guides you through the process of developing a new bid adapter for
**NOTE:** 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.
-## Overview
+## Introduction
Bid adapters are responsible for translating an [OpenRTB 2.5 Bid Request](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=13) to your bidding server's protocol and mapping your server's response to an [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32).
@@ -29,7 +29,7 @@ An OpenRTB 2.5 Bid Request contains one or more Impressions, each representing a
### Choose A Name
-You will need to choose a unique name for your bid adapter. Names should be written in lower case and may not contain special characters or emoji. If you already have a Prebid.js bid adapter, we encourage you to use the same name with the same bidder parameters. You may not name your adapter `general`, `context`, or `prebid` as those have special meaning in various contexts. Existing bid adapter names are [maintained here](https://github.com/prebid/prebid-server-java/tree/master/src/main/java/org/prebid/server/bidder).
+You will need to choose a unique name for your bid adapter. Names should be written in lower case and may not contain special characters or emoji. If you already have a Prebid.js bid adapter, we encourage you to use the same name with the same bidder parameters. You may not name your adapter `all`, `context`, `data`, `general`, `prebid`, `skadn` or `tid` as those have special meaning in various contexts. Existing bid adapter names are [maintained here](https://github.com/prebid/prebid-server-java/tree/master/src/main/java/org/prebid/server/bidder).
We ask that the first 6 letters of the name you choose be unique among the existing bid adapters. This consideration helps with generating targeting keys for use by some ad exchanges, such as Google Ad Manager.
@@ -37,7 +37,7 @@ Throughout the rest of this document, substitute `{bidder}` with the name you've
### Respect The Rules
-We are proud to run the Prebid Server project as a transparent and trustworthy header bidding solution. You are expected to follow our community's [code of conduct](https://docs.prebid.org/wrapper_code_of_conduct.html) and [module rules](https://docs.prebid.org/dev-docs/module-rules.html) when creating your adapter and when interacting with others through issues, code reviews, and discussions.
+We are proud to run the Prebid Server project as a transparent and trustworthy header bidding solution. You are expected to follow our community's [code of conduct](https://prebid.org/code-of-conduct/) and [module rules](/dev-docs/module-rules.html) when creating your adapter and when interacting with others through issues, code reviews, and discussions.
**Please take the time to read our rules in full.** Below is a summary of some of the rules which apply to your Prebid Server bid adapter:
- Adapters must not modify bids from demand partners, except to either change the bid from gross to net or from one currency to another.
@@ -58,6 +58,10 @@ Occasionally, we'll introduce changes to the core framework as part of our ongoi
Please be attentive in reading and responding to emails and [GitHub issues](https://github.com/prebid/prebid-server-java/issues) from publishers, hosts, and Prebid.org project maintainers. If we receive complaints about your bid adapter and you do not respond to our communications, we may disable your adapter by default or remove it from the project entirely.
+## Generic Adapter
+
+Before creating your own bid adapter, consider looking into [generic adapter implementation](https://github.com/prebid/prebid-server-java/blob/master/src/main/java/org/prebid/server/bidder/GenericBidder.java). Its main purpose is to simplify testing of PBS. As this adapter just passes requests through without any additional manipulations with data, it can be used to test behaviour of PBS core logic. But, it can be also used as template for simple bid adapters or even for aliasing the very basic ones.
+
## Create Your Adapter
Prebid Server bid adapters consist of several components: bidder config yaml, bidder parameters, bid adapter code, configuration for framework and default configuration(.yaml) values. This chapter will guide you though each component.
@@ -78,13 +82,8 @@ Create a file with the path `static/bidder-info/{bidder}.yaml` and begin with th
```yaml
adapters:
yourBidderCode:
- enabled: false
endpoint: http://possible.endpoint
- pbs-enforces-gdpr: true
- pbs-enforces-ccpa: true
- modifying-vast-xml-allowed: true
- deprecated-names:
- aliases:
+ endpoint-compression: gzip (or none)
meta-info:
maintainer-email: maintainer@email.com
app-media-types:
@@ -109,10 +108,12 @@ adapters:
Modify this template for your bid adapter:
- 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 `modifyingVastXmlAllowed` value to `true` if you'd like to opt-in for video impression tracking.
-- Change the `enabled` value to `true` if you'd like to make your bid adapter enabled.
+- Change the `modifying-vast-xml-allowed` value to `false` if you'd like to opt out of video impression tracking. It defaults to `true`.
+- Change the `pbs-enforces-ccpa` to `false` if you'd like to disable ccpa enforcement. Defaults to `true`.
- Change the `vendor-id` value to id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/vendor-list-tcf-v2-0/). Leave this as `0` if you are not registered with IAB Europe.
+- Choose the `supported-vendors` constants: These constants should be unique. The list of existing vendor constants can be found [here](https://github.com/prebid/prebid-server-java/blob/master/src/main/java/org/prebid/server/bidder/ViewabilityVendors.java).
- Remove the `capabilities` (app/site) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support.
+- If your auction endpoint supports gzip compression, setting 'endpoint-compression' to 'gzip' will save on network fees.
- Change the `cookie-family-name` to the name which will be used for storing your user sync id within the federated cookie. Please keep this the same as your bidder name.
If you implemented a user syncer, you'll need to provide a default endpoint.
The user sync endpoint is composed of two main parts, the url of your user syncer and a redirect back(redirect-url) to Prebid Server. The url of your user syncer is responsible for reading the user id from the client's cookie and redirecting to Prebid Server with a user id macro resolved.
@@ -124,6 +125,25 @@ The url of your user syncer can make use of the following privacy policy macros
- Change the `usersync:type` value to `redirect` or `iframe` specific to your bidder.
+### Default bidder configuration
+
+Prebid Server has default configuration for common bidder properties, which can be overriden by bidders in their
+configurations.
+
+Default configuration:
+
+```yaml
+adapter-defaults:
+ enabled: false
+ pbs-enforces-ccpa: true
+ modifying-vast-xml-allowed: true
+```
+
+There are also some default properties which can't be overridden in adapter-defaults, but rather in particular adapter's config:
+- `aliases`: Defaults to empty
+- `deprecated-names`: Defaults to empty
+- `extra-info`: Defaults to empty
+
### Create bidder alias
If you want to add bidder that is an alias of existing bidder, you need just to update configuration of parent bidder:
@@ -131,12 +151,7 @@ Example of adding bidder alias:
```yaml
adapters:
yourBidderCode:
- enabled: false
- endpoint: http://possible.endpoint
- pbs-enforces-gdpr: true
- pbs-enforces-ccpa: true
- modifying-vast-xml-allowed: true
- deprecated-names:
+ ...
aliases:
yourBidderAlias:
endpoint: http://possible.alias/endpoint
@@ -148,26 +163,6 @@ adapters:
- video
usersync:
cookie-family-name: yourBidderCode
- meta-info:
- maintainer-email: maintainer@email.com
- app-media-types:
- - banner
- - video
- - audio
- - native
- site-media-types:
- - banner
- - video
- - audio
- - native
- supported-vendors:
- vendor-id: your_vendor_id
- usersync:
- url: your_bid_adapter_usersync_url
- redirect-url: /setuid?bidder=yourBidderCode&gdpr={%raw%}{{gdpr}}{%endraw%}&gdpr_consent={%raw%}{{gdpr_consent}}{%endraw%}&us_privacy={%raw%}{{us_privacy}}{%endraw%}
- cookie-family-name: yourBidderCode
- type: redirect
- support-cors: false
```
Aliases are configured by adding child configuration object at `adapters.yourBidderCode.aliases.yourBidderAlias`
@@ -350,7 +345,7 @@ Now it's time to write the bulk of 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.5 Bid Request to your bidding server's protocol and mapping your server's response to an OpenRTB 2.5 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).
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 `MakeRequests` method to create outgoing requests to your bidding server and the `MakeBids` method to create bid responses.
+- The `Bidder` interface consisting 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.5 protocol:
@@ -397,20 +392,20 @@ public class {bidder}Bidder implements Bidder {
@Override
public Result>> makeHttpRequests(BidRequest request) {
- return Result.of(Collections.singletonList(HttpRequest.builder()
+ return Result.withValue(HttpRequest.builder()
.method(HttpMethod.POST)
.uri(endpointUrl)
.headers(HttpUtil.headers())
.payload(request)
.body(mapper.encode(request))
- .build()), Collections.emptyList());
+ .build()));
}
@Override
public final Result> makeBids(HttpCall httpCall, BidRequest bidRequest) {
try {
final BidResponse bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), BidResponse.class);
- return Result.of(extractBids(httpCall.getRequest().getPayload(), bidResponse), Collections.emptyList());
+ return Result.withValues(extractBids(httpCall.getRequest().getPayload(), bidResponse));
} catch (DecodeException | PreBidException e) {
return Result.withError(BidderError.badServerResponse(e.getMessage()));
}
@@ -455,9 +450,9 @@ public class {bidder}Bidder implements Bidder {
```
-#### MakeRequests
+#### MakeHttpRequests
-The `MakeRequests` method is responsible for returning none, one, or many HTTP requests to be sent to your bidding server. Bid adapters are forbidden from directly initiating any form of network communication and must entirely rely upon the core framework. This allows the core framework to optimize outgoing connections using a managed pool and record networking metrics. The return type `adapters.RequestData` allows your adapter to specify the HTTP method, url, body, and headers.
+The `MakeHttpRequests` method is responsible for returning zero or more HTTP requests to be sent to your bidding server. Bid adapters are forbidden from directly initiating any form of network communication and must entirely rely upon the core framework. This allows the core framework to optimize outgoing connections using a managed pool and record networking metrics. The return type `adapters.RequestData` allows your adapter to specify the HTTP method, url, body, and headers.
This method is called once by the core framework for bid requests which have at least one valid Impression for your adapter. Impressions not configured for your adapter will be removed and are not accessible.
@@ -479,10 +474,7 @@ The argument, `request`, is the OpenRTB 2.5 Bid Request object. Extension inform
-The `MakeRequests` method is expected to return a `List` object representing the HTTP calls to be sent to your bidding server and a `List errors` for any issues encountered creating them. If there are no HTTP calls or if there are no errors, please use different methods in `Result` class specific to your case.
-
-{: .alert.alert-info :}
-HTTP calls to your bidding server will automatically prefer GZIP compression. You should not specify it yourself using headers. You don't have to worry about decompressing the response in `MakeBids` either, as that will be taken care of automatically.
+The `MakeHttpRequests` method is expected to return a `List` object representing the HTTP calls to be sent to your bidding server and a `List errors` for any issues encountered creating them. If there are no HTTP calls or if there are no errors, please use different methods in `Result` class specific to your case.
An Impression may define multiple sizes and/or multiple ad formats. If your bidding server limits requests to a single ad placement, size, or format, then your adapter will need to split the Impression into multiple calls and merge the responses.
@@ -514,7 +506,7 @@ If your bidding server supports multiple currencies, please be sure to pass thro
Please ensure you forward the bid floor (`request.imp[].bidfloor`) and bid floor currency (`request.imp[].bidfloorcur`) values to your bidding server for enforcement.
-There are a several values of a bid that publishers expect to be populated. Some are defined by the OpenRTB 2.5 specification and some are defined by Prebid conventions.
+There are a several values of a bid request that publishers may supply that your adapter and endpoint should be aware of. Some are defined by the OpenRTB 2.5 specification and some are defined by Prebid conventions:
{: .table .table-bordered .table-striped }
| Parameter | Definer | Path & Description
@@ -533,9 +525,22 @@ There are a several values of a bid that publishers expect to be populated. Some
| Video | OpenRTB | `request.imp[].video` The publisher is specifying video ad requirements or preferences.
| Rewarded inventory | OpenRTB | `request.imp[].ext.prebid.is_rewarded_inventory` Signal to indicate the inventory is rewarded.
+##### Request compression
+
+If you want your request body to be GZIP compressed, you should add `Content-Encoding` header with `gzip` value.
+
+ Example: Creating headers for gzip compressed request.
+```java
+private static MultiMap resolveHeaders() {
+ return HttpUtil.headers()
+ .add(HttpUtil.CONTENT_ENCODING_HEADER, HttpHeaderValues.GZIP);
+ }
+```
+
+
#### Response
-The `MakeBids` method is responsible for parsing the bidding server's response and mapping it to the [OpenRTB 2.5 Bid Response object model](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32).
+The `MakeBids` method in your adapter is responsible for parsing the bidding server's response and mapping it to the [OpenRTB 2.5 Bid Response object model](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=32).
This method is called for each response received from your bidding server within the bidding window (`request.tmax`). If there are no requests or if all requests time out, the `MakeBids` method will not be called.
@@ -563,7 +568,7 @@ Please review the entire [OpenRTB 2.5 Bid Response](https://www.iab.com/wp-conte
| `.Bids[].Bid.Price` | Required | Net price CPM of the bid, not gross price. Publishers can correct for gross price bids by setting Bid Adjustments to account for fees. We recommend the most granular price a bidder can provide.
| `.Bids[].Bid.W` | Optional | Width of the creative in pixels.
| `.Bids[].Bid.H` | Optional | Height of the creative in pixels.
-| `.Bids[].Bid.Ext` | Optional | Embedded JSON containing Prebid metadata (see below) or custom information.
+| `.Bids[].Bid.Ext.Prebid.Meta` | Optional | Embedded JSON containing Prebid metadata (see below) or custom information.
{: .alert.alert-info :}
We recommend resolving creative OpenRTB macros in your adapter. Otherwise, AUCTION_PRICE will eventually get resolved by the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative), but by then the bid price will be in the ad server currency and quantized by the price granularity.
@@ -581,57 +586,32 @@ If you'd like to support Long Form Video Ad Pods, then you'll need to provide th
{: .alert.alert-info :}
Either `.Bids[].BidVideo.PrimaryCategory` or `.Bids[].Bid.Cat` should be provided.
-Prebid has historically struggled with sharing granular bid response data with publishers, analytics, and reporting systems. To address this, we've introduced a standard object model. We encourage adapters to provide as much information as possible in the bid response.
+##### Metadata
+
+In order to share granular bid response data with publishers, analytics, and reporting systems, we've introduced a standard object model. We encourage adapters to provide as much information as possible in the bid response.
{: .alert.alert-danger :}
-Bid metadata will be *required* in Prebid.js 5.x+ release, specifically for AdvertiserDomains and MediaType. We recommend making sure your adapter sets these values or Prebid.js may throw out the bid.
+Bid metadata will be *required* in Prebid.js 5.X+ release, specifically for bid.ADomain and MediaType. We recommend making sure your adapter sets these values or Prebid.js may throw out the bid.
{: .table .table-bordered .table-striped }
| Path | Description |
| - | - |
+| `.DemandSource` | Bidder-specific demand source |
| `.NetworkID` | Bidder-specific network/DSP id |
| `.NetworkName` | Bidder-specific network/DSP name |
| `.AgencyID` | Bidder-specific agency id |
| `.AgencyName` | Bidder-specific agency name |
| `.AdvertiserID` | Bidder-specific advertiser id |
| `.AdvertiserName` | Bidder-specific advertiser name |
-| `.AdvertiserDomains` | Advertiser domains for the landing page(s). Should match `.Bids[].Bid.ADomain` |
| `.BrandID` | Bidder-specific brand id for advertisers with multiple brands |
| `.BrandName` | Bidder-specific brand name |
| `.dchain` | Demand Chain Object
| `.PrimaryCategoryID` | Primary IAB category id |
| `.SecondaryCategoryIDs` | Secondary IAB category ids |
-| `.MediaType` | Either `banner`, `audio`, `video`, or `native`. Should match `.Bids[].BidType` |
+| `.MediaType` | Either `banner`, `audio`, `video`, or `native`. This is used in the scenario where a bidder responds with a mediatype different than the stated type. e.g. native when the impression is for a banner. One use case is to help publishers determine whether the creative should be wrapped in a safeframe. |
-### Simple Bidder Creation
-Remember if your bidder does not have much specific logic beyond standard OpenRTB 2.5, you don't have to implement `Bidder`
-but could choose to extend OpenrtbBidder(where T is ImpExt type), which already implements Bidder and has a default implementation of different methods. You can override each of them with your own implementation as needed.
-
-Here is the list of methods in OpenrtbBidder which you can override:
-
-1) `void validateRequest(BidRequest bidRequest)`
- - A hook for bidder-specific request validation if any is required.
-
-
-2) `Imp modifyImp(Imp imp, T impExt)`
- - A hook for bidder-specific impression changes, impression validation and impression extension validation if any are required
-
-
-3) `void modifyRequest(BidRequest bidRequest, BidRequest.BidRequestBuilder requestBuilder, List> impsWithExts)`
- - A hook for any request changes other than Imps (although Impressions can be modified as well)
-
-
-4) `BidType getBidType(String impId, List imps)`
- - A hook for resolving bidder-specific bid type.
-
----
-Using this class(OpenrtbBidder), you can define whether the outgoing
-requests can contain multiple impressions (`RequestCreationStrategy.SINGLE_REQUEST`) or whether each each request should have only one impression (`RequestCreationStrategy.REQUEST_PER_IMP`). Pass this value to parent constructor as the second argument.
-
-Check the class file to find which methods are overridable.
-
### Create Config Class
Go to `org.prebid.server.spring.config.bidder` and create new class `Configuration{bidder}`
@@ -644,13 +624,9 @@ import org.prebid.server.bidder.BidderDeps;
import org.prebid.server.bidder.{bidder}.{bidder}Bidder;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.spring.config.bidder.model.BidderConfigurationProperties;
-import org.prebid.server.spring.config.bidder.model.UsersyncConfigurationProperties;
import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler;
-import org.prebid.server.spring.config.bidder.util.BidderInfoCreator;
import org.prebid.server.spring.config.bidder.util.UsersyncerCreator;
import org.prebid.server.spring.env.YamlPropertySourceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
@@ -664,18 +640,7 @@ import javax.validation.constraints.NotBlank;
public class {bidder}Configuration {
private static final String BIDDER_NAME = "{bidder}";
-
- @Value("${external-url}")
- @NotBlank
- private String externalUrl;
-
- @Autowired
- private JacksonMapper mapper;
-
- @Autowired
- @Qualifier("{bidder}ConfigurationProperties")
- private BidderConfigurationProperties configProperties;
-
+
@Bean("{bidder}ConfigurationProperties")
@ConfigurationProperties("adapters.{bidder}")
BidderConfigurationProperties configurationProperties() {
@@ -683,20 +648,29 @@ public class {bidder}Configuration {
}
@Bean
- BidderDeps {bidder}BidderDeps() {
- final UsersyncConfigurationProperties usersync = configProperties.getUsersync();
-
+ BidderDeps{bidder}BidderDeps(BidderConfigurationProperties {bidder}ConfigurationProperties,
+ @NotBlank @Value("${external-url}") String externalUrl,
+ JacksonMapper mapper) {
+
return BidderDepsAssembler.forBidder(BIDDER_NAME)
- .withConfig(configProperties)
- .bidderInfo(BidderInfoCreator.create(configProperties))
- .usersyncerCreator(UsersyncerCreator.create(usersync, externalUrl))
- .bidderCreator(() -> new {bidder}Bidder(configProperties.getEndpoint(), mapper))
+ .withConfig({bidder}ConfigurationProperties)
+ .usersyncerCreator(UsersyncerCreator.create(externalUrl))
+ .bidderCreator(config -> new {bidder}Bidder(config.getEndpoint(), mapper))
.assemble();
}
}
```
-### Converting Floor Prices (optional)
+### Currency
+
+Prebid Server is a global product that is currency agnostic. Publishers may ask for bids in any currency. It's totally fine if your bidding endpoint only supports a single currency, but your adapter needs to deal with it. This section will describe how to do so.
+
+Here are 3 key points to consider:
+
+1. If your endpoint only bids in a particular currency, then your adapter must not blindly forward the openrtb to your endpoint. You should instead set $.cur to your server's required currency.
+2. Your adapter must label bid responses properly with the response currency. i.e. if you only bid in USD, then your adapter must set USD as the response currency. PBS will convert to the publisher's requested currency as needed. See the [currency feature](/prebid-server/features/pbs-currency.html) for more info.
+3. You should be aware that floors can be defined in any currency. If your bidding service supports floors, but only in a particular currency, then you must read use the CurrencyConversionService before sending $.imp[].bidfloor and $.imp[].bidfloorcur to your endpoint.
+
If you need to convert floor prices from one currency into something your endpoint expects, you can use the convertCurrency function from CurrencyConversionService component.
1) Inject CurrencyConversionService to your {bidder}Configuration class and pass it to your bidder constructor.
@@ -752,6 +726,98 @@ public {bidder}Bidder(String endpointUrl, CurrencyConversionService currencyCon
+### Price Floors
+
+Prebid server manages the OpenRTB floors values (imp.bidfloor and imp.bidfloorcur) at the core level using the [Price Floors feature](/features/pbs-floors.html). Minimally, bid adapters are expected to read these values and pass them to the endpoint.
+
+However, as described in the feature documentation, some adapters may benefit from access to more granular values. The primary use case is for multi-format as [detailed in the document](/prebid-server/features/pbs-floors.html#bid-adapter-floor-interface). To implement this, you may use the overloaded `getFloor()` function which can use more specific values for certain fields.
+
+Here are the instructions:
+
+1) Inject `PriceFloorResolver` to your {bidder}Configuration class and pass it to your bidder constructor.
+
+```java
+BidderDeps {bidder}BidderDeps(BidderConfigurationProperties {bidder}ConfigurationProperties,
+ @NotBlank @Value("${external-url}") String externalUrl,
+ PriceFloorResolver floorResolver,
+ JacksonMapper mapper) {
+
+...
+
+.bidderCreator(() -> new {bidder}Bidder(configProperties.getEndpoint(), floorResolver, mapper))
+```
+
+2) Create an additional class variable `private final PriceFloorResolver floorResolver` and update constructor in your {bidder}Bidder class to set this variable.
+
+```java
+private final PriceFloorResolver floorResolver;
+private final String endpointUrl;
+private final JacksonMapper mapper;
+
+public {bidder}Bidder(String endpointUrl, PriceFloorResolver floorResolver, JacksonMapper mapper) {
+ this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl));
+ this.floorResolver = Objects.requireNonNull(floorResolver);
+ this.mapper = Objects.requireNonNull(mapper);
+ }
+```
+
+3) Use `floorResolver.resolve(BidRequest bidRequest,
+ PriceFloorRules floorRules,
+ Imp imp,
+ ImpMediaType mediaType,
+ Format format,
+ List warnings)` for resolving specific floor values in your {bidder}Bidder class.
+
+
+ Example: Updating bidFloor values.
+
+```java
+ private Imp makeImp(Imp imp, BidRequest bidRequest) {
+ final PriceFloorResult priceFloorResult = resolvePriceFloors(
+ bidRequest,
+ imp, // com.iab.openrtb.request.Imp
+ specificMediatype, // org.prebid.server.proto.openrtb.ext.request.ImpMediaType
+ specificFormat, // com.iab.openrtb.request.Format (size)
+ priceFloorsWarnings);
+
+ return imp.toBuilder()
+ .bidfloor(ObjectUtil.getIfNotNull(priceFloorResult, PriceFloorResult::getFloorValue))
+ .bidfloorcur(ObjectUtil.getIfNotNull(priceFloorResult, PriceFloorResult::getCurrency))
+ .build();
+ }
+
+ private PriceFloorResult resolvePriceFloors(BidRequest bidRequest,
+ Imp imp,
+ ImpMediaType mediaType,
+ Format format,
+ List warnings) {
+
+ return floorResolver.resolve(
+ bidRequest,
+ extractFloorRules(bidRequest),
+ imp,
+ mediaType,
+ format,
+ warnings);
+ }
+```
+
+
+4) Let the Price Floors feature know about the floors you're using. To do that, enrich BidderBid with `priceFloorInfo`
+
+```java
+private static BidderBid createBidderBid(Bid bid, Imp imp, BidType bidType, String currency) {
+
+ return BidderBid.builder()
+ .bid(bid)
+ .type(bidType)
+ .bidCurrency(currency)
+ .priceFloorInfo(imp != null ? PriceFloorInfo.of(imp.getBidfloor(), imp.getBidfloorcur()) : null)
+ .build();
+ }
+```
+
+
## Test Your Adapter
This chapter will guide you through the creation of automated unit and integration tests to cover your bid adapter code. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command:
@@ -770,25 +836,25 @@ Try to create models by using following methods specified to your case in your t
```java
private static BidRequest givenBidRequest(
- Function bidRequestCustomizer,
- Function impCustomizer) {
+ UnaryOperator bidRequestCustomizer,
+ UnaryOperator impCustomizer) {
return bidRequestCustomizer.apply(BidRequest.builder()
.imp(singletonList(givenImp(impCustomizer))))
.build();
}
- private static BidRequest givenBidRequest(Function impCustomizer) {
+ private static BidRequest givenBidRequest(UnaryOperator impCustomizer) {
return givenBidRequest(identity(), impCustomizer);
}
- private static Imp givenImp(Function impCustomizer) {
+ private static Imp givenImp(UnaryOperator impCustomizer) {
return impCustomizer.apply(Imp.builder()
.ext(mapper.valueToTree(ExtPrebid.of(null, ExtImp{bidder}.of(param, secondParam)))))
.build();
}
- private static BidResponse givenBidResponse(Function bidCustomizer) {
+ private static BidResponse givenBidResponse(UnaryOperator bidCustomizer) {
return BidResponse.builder()
.seatbid(singletonList(SeatBid.builder().bid(singletonList(bidCustomizer.apply(Bid.builder()).build()))
.build()))
@@ -808,7 +874,6 @@ Go to `test-application.properties` file and add folowing properties
```yaml
adapters.{bidder}.enabled=true
adapters.{bidder}.endpoint=http://localhost:8090/{bidder}-exchange
-adapters.{bidder}.pbs-enforces-gdpr=true
adapters.{bidder}.usersync.url=//{bidder}-usersync
```
@@ -1094,8 +1159,6 @@ import io.restassured.response.Response;
import org.json.JSONException;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.skyscreamer.jsonassert.JSONAssert;
-import org.skyscreamer.jsonassert.JSONCompareMode;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
@@ -1105,7 +1168,6 @@ import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
-import static io.restassured.RestAssured.given;
import static java.util.Collections.singletonList;
@RunWith(SpringRunner.class)
@@ -1115,8 +1177,6 @@ public class {bidder}Test extends IntegrationTest {
public void openrtb2AuctionShouldRespondWithBidsFrom{bidder}() throws IOException, JSONException {
// given
WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/{bidder}-exchange"))
- .withHeader("Accept", equalTo("application/json"))
- .withHeader("Content-Type", equalTo("application/json;charset=UTF-8"))
.withRequestBody(equalToJson(jsonFrom("openrtb2/{bidder}/test-{bidder}-bid-request.json")))
.willReturn(aResponse().withBody(jsonFrom("openrtb2/{bidder}/test-{bidder}-bid-response.json"))));
@@ -1126,22 +1186,11 @@ public class {bidder}Test extends IntegrationTest {
.willReturn(aResponse().withBody(jsonFrom("openrtb2/{bidder}/test-cache-{bidder}-response.json"))));
// when
- final Response response = given(SPEC)
- .header("Referer", "http://www.example.com")
- .header("X-Forwarded-For", "193.168.244.1")
- .header("User-Agent", "userAgent")
- .header("Origin", "http://www.example.com")
- // this uids cookie value stands for {"uids":{"{bidder}":"BTW-UID"}}
- .cookie("uids", "eyJ1aWRzIjp7ImJldHdlZW4iOiJCVFctVUlEIn19")
- .body(jsonFrom("openrtb2/{bidder}/test-auction-{bidder}-request.json"))
- .post("/openrtb2/auction");
+ final Response response = responseFor("openrtb2/{bidder}/test-auction-{bidder}-request.json",
+ Endpoint.OPENRTB2_AUCTION);
// then
- final String expectedAuctionResponse = openrtbAuctionResponseFrom(
- "openrtb2/{bidder}/test-auction-{bidder}-response.json",
- response, singletonList("{bidder}"));
-
- JSONAssert.assertEquals(expectedAuctionResponse, response.asString(), JSONCompareMode.NON_EXTENSIBLE);
+ assertJsonEquals("openrtb2/{bidder}/test-auction-{bidder}-response.json", response, singletonList("{bidder}"));
}
}
@@ -1164,8 +1213,8 @@ The next time you use `/openrtb2/auction`, the OpenRTB request sent to your Bidd
Human readable documentation for bid adapters is required in the separate [prebid.github.io](https://github.com/prebid/prebid.github.io) repository. We will not merge your bid adapter until you've at least opened a documentation PR and comment with a link to it.
-1. If you already have a Prebid.js bid adapter, update your existing bidder file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/modules to add the `pbs: true` variable in the header section. If your Prebid Server bidding parameters are different from your Prebid.js parameters, please include the differences in this document for publishers to be aware.
-1. If you don't have a Prebid.js bid adapter, create a new file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/modules using this template:
+1. If you already have a Prebid.js bid adapter, update your existing bidder file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders to add the `pbs: true` variable in the header section. If your Prebid Server bidding parameters are different from your Prebid.js parameters, please include the differences in this document for publishers to be aware.
+1. If you don't have a Prebid.js bid adapter, create a new file in https://github.com/prebid/prebid.github.io/tree/master/dev-docs/bidders using this template:
```
---
@@ -1182,11 +1231,15 @@ dchain_supported: true/false
userId:
media_types: banner, video, audio, native
safeframes_ok: true/false
-bidder_supports_deals: true/false
+deals_supported: true/false
+floors_supported: true/false
+fpd_supported: true/false
pbjs: true/false
pbs: true/false
pbs_app_supported: true/false
prebid_member: true/false
+multiformat_supported: will-bid-on-any, will-bid-on-one, will-not-bid
+ortb_blocking_supported: true/partial/false
---
### Note:
@@ -1212,7 +1265,10 @@ Notes on the metadata fields:
- 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 `bidder_supports_deals: 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.
- If you're a member of Prebid.org, add `prebid_member: true`. Default is false.
@@ -1226,8 +1282,8 @@ Notes on the metadata fields:
- Adapter Code
- `org/prebid/server/bidder/{bidder}/{bidder}Bidder.java`
- `org/prebid/server/bidder/{bidder}/{bidder}BidderTest.java` (test directory)
- - `org/prebid/server/it/{bidder}Test.java` (test directory)
- Integration test files
+ - `org/prebid/server/it/{bidder}Test.java` (test directory)
- `resources/org/prebid/server/it/openrtb2/{bidder}/test-auction-{bidder}-request.json` (test directory)
- `resources/org/prebid/server/it/openrtb2/{bidder}/test-auction-{bidder}-response.json` (test directory)
- `resources/org/prebid/server/it/openrtb2/{bidder}/test-{bidder}-bid-request.json` (test directory)
diff --git a/prebid-server/developers/module-atags.md b/prebid-server/developers/module-atags.md
new file mode 100644
index 0000000000..483e68af3d
--- /dev/null
+++ b/prebid-server/developers/module-atags.md
@@ -0,0 +1,233 @@
+---
+layout: page_v2
+sidebarType: 5
+title: Prebid Server | Developers | Module Analytics Tags Conventions
+sidebar_entry: /prebid-server/developers/add-a-module.html
+---
+
+# Prebid Server - Module Analytics Tags Conventions
+{: .no_toc}
+
+* TOC
+{:toc }
+
+## Overview
+
+Analytics Tags (aka âATagsâ) are a log mechanism provided by PBS-core to allow modules
+to inform analytics adapters about what happened in the request.
+Use of the Analytics Tag structure is completely optional. It's meant
+to be used when there are application or reporting reasons for sharing module results.
+See the [Prebid Server module overview](/prebid-server/developers/add-a-module.html) for background information.
+
+This document defines a convention aimed at allowing module developers to create
+consistent ATags that can be easily read by analytics adapters.
+
+![Prebid Server ATags](/assets/images/prebid-server/module-atags.png){:class="pb-xlg-img"}
+
+1. Modules may return a data structure containing ATags to PBS-Core.
+2. PBS-Core adds any ATags to the 'invocation context' data structure.
+3. Analytics modules have access to the invocation context.
+
+## Analytics Tag Conventions
+
+The general idea is that ATags are a list of module-specific "activities" that have these attributes:
+- activity name: should be unique within the context of this module. e.g. 'enrich-request'
+- an overall status
+- an array of specific results within the activity
+- within the results:
+ - status of each result
+ - scope of the result
+ - module-specific values for the result
+
+Here's an example from the [ORTB2 Blocking module](/prebid-server/pbs-modules/ortb2-blocking.html):
+
+```
+[{
+ // scenario: response from bidderA blocked on badv for imp=1
+ activities: [{
+ name: "enforce-blocking",
+ status: "success", // no errors from the module
+ results: [{
+ status: "success-block",
+ values: { // these are module-specific details about the result
+ "attributes": ["badv"],
+ "adomain": ["bad.com"]
+ },
+ appliedto: {
+ "bidder": "bidderA",
+ impids: ["1"]
+ }
+ },{
+ status: "success-allow",
+ // no details needed when the response isn't blocked
+ appliedto: {
+ "bidder": "bidderA",
+ "impids": ["2","3","4"]
+ }
+ }]
+ }]
+```
+
+The following table contains the field conventions.
+
+{: .table .table-bordered .table-striped }
+| ATag Attr | Required? | Description | Type |
+|---+---+---+---|
+| activities | yes | One or more activities carried out by the module. | array of objects |
+| activities .name | yes | Name of the activity. Must be documented and unique within the module. | string |
+| activities .status | yes | Did the module operate successfully? Values are "error" or "success". | string |
+| activities. results | no | Service-dependent details for what the service actually did. | array of objects |
+| activities. results. status | no | Detailed status for this specific action. Values: "error", "success-allow", "success-block", "success-modify" | string |
+| activities. results. values | no | service-specific details | object |
+| activities. results .appliedto | no | Which object(s) the service examined or modified. | object |
+| activities. results. appliedto. impids | no | The service examined these specific impression objects or bid responses corresponding to imp objects | array of strings |
+| activities. results. appliedto. bidders | no | The service examined these specific bidders within the request or response. | array of strings |
+| activities. results. appliedto. bidder | no | The service examined this specific bidder (singular) within the request or response. | string |
+| activities. results. appliedto. request | no | The service examined the entire openrtb request object. This is in case the module updated something not adunit-specific. | boolean |
+| activities. results. appliedto. response | no | The service examined the entire openrtb response object. This is in case the module updated something not adunit-specific. | boolean |
+
+
+## Designing Analytics Tags
+
+ATags are for reporting. Start by considering what the module's doing that consumers might want to display. Each processing stage the module operates in may be
+reported as a separate activity, or perhaps everything the module does is lumped
+as one activity.
+
+Once the activities are defined, determine what reportable metric would be useful. Examples:
+
+- percentage of impressions enriched
+- percentage of imps where a specific bidder was removed due to optimization
+- A/B testing data
+- percentage and value of bid responses that were rejected due to creative validations
+
+{: .alert.alert-info :}
+**Case study:** for the ORTB2 Blocking module, the requirement was to be able
+to report on what percentage of responses from each bidder were being thrown
+away due to blocking rules. This could have been done by defining a separate 'activity' for each of the 4 types of enforcement, but it was decided
+to just have one kind of activity ('enforce-blocking') and get the specific
+details as part of the 'value'. There was no requirement to report on the
+outbound part of what the module does, so no ATags are created for that part
+of the functionality.
+
+Once you know what reports are desired, figure out which activity 'results'
+are needed to generate those numbers.
+
+{: .alert.alert-info :}
+For the ORTB2 Blocking module, the numbers needed are how often a given
+bidder has a response compared to how often their responses are rejected.
+So overall the block rate is: successBlock divided by (successBlock + successAllow).
+
+## Document the Analytics Tags Produced
+
+Be sure to detail the results in your module documentation so that analytics adapters are
+aware of what they can look for.
+
+Let them know:
+- which activities your module supports
+- what kind of results to expect
+- whether the results objects have module-specific `values`
+
+## Parsing the Invocation Context
+
+If you're an analytics adapter, you will be given the entire PBS 'invocation context', which contains a wealth of information about the auction.
+
+In short, to get analytics tags, you'll need to parse this data structure:
+
+- Loop through stages[]
+ - If the stage has relevant info, loop through outcomes[]
+ - Outcomes.entity is a label describing the contents
+ - Loop through groups[]
+ - Loop through invocationresults[]
+ - if `hookid.modulecode` is relevant for your analytics, grab `analyticstags`
+
+Here's an example of the data structured as JSON, though the details
+of the actual object will differ in PBS-Java and PBS-Go.
+```
+ "stages": [
+ {
+ "stage": "raw-auction-request",
+ "outcomes": [
+ {
+ "entity": "bidrequest",
+ "executiontimemillis": 246,
+ "groups": [
+ {
+ "executiontimemillis": 190,
+ "invocationresults": [
+ {
+ "hookid": {
+ "modulecode": "MODULE1",
+ "hookimplcode": "HOOK_A"
+ },
+ "executiontimemillis": 123,
+ "status": "success",
+ "action": "update",
+ "debugmessages": [
+ "debug message"
+ ],
+ "analyticstags": {
+ "activities": [
+ {
+ "name": "device-id",
+ "status": "success",
+ "results": [
+ {
+ "status": "success",
+ "values": {
+ "some-field": "some-value"
+ },
+ "appliedto": {
+ "impids": [ "impId1" ]
+ }
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "hookid": {
+ "modulecode": "MODULE1",
+ "hookimplcode": "HOOK_B"
+ },
+ "status": "success",
+ "message": "inventory has no value",
+ "action": "reject"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "stage": "bidder-request",
+ "outcomes": [
+ {
+ "entity": "pubmatic", // entity is biddercode for some stages
+ "executiontimemillis": 246,
+ "groups": [
+ "invocationresults": {
+ "hookid": { ... }
+ "analyticstags": [{
+ ...
+ ]
+ }
+ ]
+ },
+ {
+ "entity": "adform",
+ "executiontimemillis": 246,
+ "groups": [...]
+ }
+ ]
+ }
+ ]
+```
+
+See the implementation guide for your platform for specific syntax.
+
+## Further Reading
+
+- [PBS Module Overview](/prebid-server/developers/add-a-module.html)
+- [PBS Module Implementation](/prebid-server/developers/add-a-module.html)
diff --git a/prebid-server/developers/pbs-cookie-sync.md b/prebid-server/developers/pbs-cookie-sync.md
index 5469f89994..d806607537 100644
--- a/prebid-server/developers/pbs-cookie-sync.md
+++ b/prebid-server/developers/pbs-cookie-sync.md
@@ -50,47 +50,59 @@ POST https://prebid-server.example.com/cookie_sync
3) When it receives the response, Prebid.js loops through each element of `bidder_status[]`, dropping a pixel for each `bidder_status[].usersync.url`.
-4) The bidder-specific endpoints read the users's cookie for the bidder's domain and respond with a redirect back to Prebid Server's [`/setuid` endpoint](/prebid-server/endpoints/pbs-endpoint-setuid.html)
+4) The bidder-specific endpoints read the users' cookie for the bidder's domain and respond with a redirect back to Prebid Server's [`/setuid` endpoint](/prebid-server/endpoints/pbs-endpoint-setuid.html)
-5) When the browser receives this redirect, it contacts Prebid Server, which will once again check the privacy settings and will update the `uids` cookie if allowed.
+5) When the browser receives this redirect, it contacts Prebid Server, which will once again check the privacy settings and if allowed, update the `uids` cookie.
### Setting the uids cookie from AMP
Cookie sync for AMP works in a way quite similar to Prebid.js.
-1) The Prebid Server hosting company places a modified version of the `load-cookie` script onto a CDN. This script is part of the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative/blob/master/src/cookieSync.js) repo.
-
-Note that the only two values currently valid for 'endpoint' are 'appnexus' and 'rubicon' -- other host companies should update their copy to include their endpoint.
+1) The Prebid Server hosting company places the [load-cookie.html](#manually-initiating-a-sync) file onto a CDN. This script is part of the [Prebid Universal Creative](https://github.com/prebid/prebid-universal-creative/blob/master/src/cookieSync.js) repo.
See [the AMP implementation guide](/dev-docs/show-prebid-ads-on-amp-pages.html#user-sync) for more information.
-2) The publisher places the 'load-cookie' script into the page:
+2) The publisher places the 'load-cookie' iframe into the page:
```
+ src="https://PROVIDED_BY_HOSTCOMPANY/load-cookie.html?source=amp&endpoint=HOSTCOMPANY&max_sync_count=5">
```
-Note: if the publisher has an AMP Consent Management Platform, they should use `load-cookie-with-consent.html`.
+{: .alert.alert-info :}
+If the publisher has an AMP Consent Management Platform, they should use `load-cookie-with-consent.html`.
3) At runtime, the `load-cookie` script just calls the Prebid Server /cookie_sync endpoint. The rest works the same as described for Prebid.js above.
+### Cooperative Syncing
+
+Prebid Server supports a 'Cooperative Syncing' mode where all enabled bidders may be returned in a sync request even if they aren't on this particular page. This allows bidders to get their IDs in place for the next page where they are utilized.
+
+Cooperative syncing can be configured at the host level. See the doc for [PBS-Java](https://github.com/prebid/prebid-server-java/blob/master/docs/config-app.md) and [PBS-Go](https://github.com/prebid/prebid-server/blob/master/config/usersync.go).
+
+This is how to control the coop syncing behavior from Prebid.js:
+```
+pbjs.setConfig({
+ s2sConfig: {
+ ...
+ coopSync: true,
+ userSyncLimit: 5
+ ...
+ }
+```
## Bidder Instructions for Building a Sync Endpoint
-Building a sync endpoint is optional -- mobile-only bidders don't benefit from
-ID syncing. But for browser-based bidding, ID syncing can help improve buyer bid rate. There are two main options a bidder can choose to support:
+Building a sync endpoint is optional -- there is no benefit from ID syncing for mobile-only bidders. For browser-based bidding, ID syncing can help improve buyer bid rate. There are two main options a bidder can choose to support:
- redirect: the client will drop an IMG tag into the page, then call the bidder's URL which needs to redirect to the Prebid Server /setuid endpoint.
- iframe: the client will drop an IFRAME tag into the page, then call the bidder's URL which responds with HTML and Javascript that calls the Prebid Server /setuid endpoint at some point.
-PBS-Java allows bidders to support both options.
-
Bidders must implement an endpoint under their domain which accepts an encoded URI for redirects. This URL should be able to accept privacy parameters:
- gdpr: if 0, declares this request isn't in GDPR scope. If 1, declares it is in scope. Otherwise indeterminate.
@@ -99,20 +111,24 @@ Bidders must implement an endpoint under their domain which accepts an encoded U
The specific attributes can differ for your endpoint. For instance, you could choose to receive gdprConsent rather than gdpr_consent.
-Here's an example that shows the privacy macros as coded into PBS-Go:
+Here's an example that shows the privacy macros as configured in PBS-Go:
```
-GET some-bidder-domain.com/usersync-url?gdpr={%raw%}{{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}{%endraw%}&redirectUri=prebid-server.example.com%2Fsetuid%3Fbidder%3Dsomebidder%26uid%3DYOURMACRO
+userSync:
+ redirect:
+ url: https://some-bidder-domain.com/usersync-url?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%}
+ userMacro: YOURMACRO
```
+
PBS-Java uses slightly different macros in the bidder config:
```
- usersync:
- url: https://some-bidder-domain.com/usersync-url?gdpr={%raw%}{{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}{%endraw%}&redirectUri=
- redirect-url: /setuid?bidder=acuityads&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&uid=YOURMACRO
+usersync:
+ url: https://some-bidder-domain.com/usersync-url?gdpr={%raw%}{{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}{%endraw%}&redirectUri=
+ redirect-url: /setuid?bidder=acuityads&gdpr={%raw%}{{gdpr}}{%endraw%}&gdpr_consent={%raw%}{{gdpr_consent}}{%endraw%}&us_privacy={%raw%}{{us_privacy}}{%endraw%}&uid=YOURMACRO
```
-In either case, the {%raw%}{{}}{%endraw%} macros are resolved by PBS.
+In either case, the {%raw%}{{...}}{%endraw%} macros are resolved by PBS.
-{: .alert.alert-info :}
-Important: The "YOURMACRO" string here needs to be whatever your sync endpoint will recognize and resolve to the user's ID from your domain. Some examples of macros that bidders use: $UID, ${UID}, $$visitor_cookie$$, ${DI_USER_ID}, etc. Every bidder has their own value here.
+{: .alert.alert-warning :}
+The "YOURMACRO" string here needs to be whatever your sync endpoint will recognize and resolve to the user's ID from your domain. Some examples of macros that bidders use: $UID, ${UID}, $$visitor_cookie$$, ${DI_USER_ID}, etc. Every bidder has their own value here.
Here's how this all comes together:
@@ -124,6 +140,39 @@ Here's how this all comes together:
Then the next time the client then calls `www.prebid-domain.com/openrtb2/auction`, the ID for `mybidder` will be available in the Cookie. Prebid Server will then stick this value into `request.user.buyeruid` in the OpenRTB request it sends to `mybidder`'s bid adapter.
+## Manually initiating a sync
+
+Where Prebid.js isn't present, like in the AMP scenario, the call to /cookie_sync doesn't happen automatically.
+If there are scenarios where Prebid.js isn't around to initiate the /cookie_sync call, publishers can choose to put an iframe on their page.
+Here's how you could invoke it with an iframe:
+
+```
+
+For full details on video ad unit parameters, see [Ad Unit Reference for Video]({{site.baseurl}}/dev-docs/adunit-reference.html#adunitmediatypesvideo)
+
In your ad unit you also need to define your list of bidders. For example, including AppNexus as a bidder would look something like this:
```
@@ -137,7 +139,7 @@ And this is where setups for instream and outstream diverge. Please follow one o
Be sure to note the setting for price granularity. You might need to set up a custom price granularity. (See âCustom CPM Bucket Sizingâ under [Price Granularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity). Or, if youâre monetizing both banner and video inventory with Prebid, you might need to define format-specific price granularity settings through [mediaTypePriceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-MediaType-Price-Granularity).
{: .alert.alert-info :}
-**Prebid Server** If youâre using Prebid Server, you also need to configure your server-to-server bidder adapters. See [Getting Started with Prebid Server]({{site.github.url}}/dev-docs/get-started-with-prebid-server.html#step-4-configure-s2s-bidder-adapters) for details and examples.
+**Prebid Server** If youâre using Prebid Server, you also need to configure your server-to-server bidder adapters. See [Getting Started with Prebid Server](/overview/prebid-server-overview.html).
### Examples
diff --git a/prebid-video/video-overview.md b/prebid-video/video-overview.md
index bb5370d960..6e03ace7a1 100644
--- a/prebid-video/video-overview.md
+++ b/prebid-video/video-overview.md
@@ -74,14 +74,17 @@ Prebid.js code loads within the page header and sends a bid request to each vide
2. **Demand partners respond.**
Demand partners respond with their respective bids, which may contain a video renderer. (Publishers are encouraged to associate their own video renderer with each outstream video ad unit to include video demand that was not returned with its own renderer.)
-3. **Prebid passes key-value targeting to ad server.**
+3. **Prebid.js may cache video bids.**
+If the configuration is set up, video bids are cached server-side and mapped to a unique cache ID. This may be used at render time. See [Notes on Prebid Cache](/dev-docs/show-video-with-a-dfp-video-tag.html#notes-on-prebid-cache) for details.)
+
+4. **Prebid passes key-value targeting to ad server.**
Prebid assigns a unique hb_adid to each video bid/renderer combination, and passes this ID to the ad server via key-value targeting (along with other standard Prebid key-value pairs). This ad ID serves the same role for outstream video ad units as it does for banner ad units.
-4. **Ad server chooses winning line item.**
+5. **Ad server chooses winning line item.**
The ad server chooses the winning line item. If a Prebid line item is selected, the Prebid creative is returned. The creative can be the standard call to `renderAd` or the Universal Creative.
-5. **Prebid renders the outstream video.**
-Prebid retrieves the winning outstream video bid and renderer from the ad ID (hb_adid). Prebid renders the outstream video into the banner slot.
+6. **Prebid renders the outstream video.**
+Prebid retrieves the winning outstream video bid and renderer from the ad ID (hb_adid). Prebid renders the outstream video into the banner slot. It is up to the rendering code to retrieve the VAST, which may have been returned fully-formed to the browser, or it may be just a URL where the VAST is cached that the renderer has to load.
### Long-form Video
diff --git a/prebid/native-implementation.md b/prebid/native-implementation.md
index a6da0c1307..9e4c8985ac 100644
--- a/prebid/native-implementation.md
+++ b/prebid/native-implementation.md
@@ -77,7 +77,7 @@ The Prebid.js AdUnit needs to defines a native mediatype object to tell bidders
| Attribute | Scope | Description | Example | Type |
| --- | --- | --- | --- | --- |
| sendTargetingKeys | optional | Defines whether or not to send the hb_native_ASSET targeting keys to the ad server. Defaults to `true` for now, though we recommend setting this to `false` and utilizing one of the ways to define a native template. | `false` | boolean |
-| adTemplate | optional | Used in the âAdUnit-Defined Creative Scenarioâ, this value controls the Native template right in the page. | See [example](#5-implementing-adunit-defined-creative) below. | escaped ES5 string |
+| adTemplate | optional | Used in the âAdUnit-Defined Creative Scenarioâ, this value controls the Native template right in the page. | See [example](#42-implementing-adunit-defined-template) below. | escaped ES5 string |
| rendererUrl | optional | Used in the âCustom Renderer Scenarioâ, this points to javascript code that will produce the Native template. | 'https://host/path.js' | string |
| type | optional | A âtypeâ is like a macro that defines a group of assets. The only value currently supported is âimageâ, which implies the following assets: image, title, sponsoredBy, clickUrl, body, icon, and cta. The first 4 are required attributes. | `image` | string |
| ASSETCODE. required | optional | Defines whether native bids must include this asset. Defaults to `false`. | `true` | boolean |
@@ -136,9 +136,9 @@ In the native template, simply access the custom value with the normal Prebid ##
## 4. Implementing the Native Template
-- If you want to manage your creative within the ad server (e.g. Google Ad Manager), follow the instructions for [AdServer-Defined Creative](#4-implementing-adserver-defined-creative).
-- If youâd prefer to manage your creative within the Prebid.js AdUnit, follow the instructions for [AdUnit-Defined Creative](#5-implementing-adunit-defined-creative)
-- If youâd prefer to manage your creative from a separate piece of JavaScript, follow the instructions for the [Custom Renderer](#6-implementing-the-custom-renderer-scenario).
+- If you want to manage your creative within the ad server (e.g. Google Ad Manager), follow the instructions for [AdServer-Defined Creative](#41-implementing-adserver-defined-template).
+- If youâd prefer to manage your creative within the Prebid.js AdUnit, follow the instructions for [AdUnit-Defined Creative](#42-implementing-adunit-defined-template)
+- If youâd prefer to manage your creative from a separate piece of JavaScript, follow the instructions for the [Custom Renderer](#43-implementing-the-custom-renderer-scenario).
### 4.1. Implementing AdServer-Defined Template
diff --git a/prebid/prebidjs.md b/prebid/prebidjs.md
index 224260da91..8dd597b47f 100644
--- a/prebid/prebidjs.md
+++ b/prebid/prebidjs.md
@@ -9,7 +9,7 @@ sidebarType: 1
# What is Prebid.js?
-Prebid.js is a feature-rich header bidding platform for the web, including more than 200 demand sources and 15 analytics adapters. It supports currency conversion, GDPR, common ID systems, and multiple ad servers.
+Prebid.js is a feature-rich header bidding platform for the web, including more than 300 demand sources and 50 analytics adapters. It supports currency conversion, GDPR, common ID systems, and multiple ad servers.
## How Does Prebid.js Work?
@@ -44,9 +44,9 @@ We want Prebid.js Core to be fast, fair, and open because it represents the head
The Prebid.js Adapters plug into Prebid.js Core and are meant to be interchangeable depending on who the publisher wants to work with. There are two types of adapters: bidder and analytics.
-Bidder Adapters are supposed to represent the SSPs & Exchanges you want to work with. There are currently over 200 bidder adapters. This set of working header bidding integrations is part of what makes Prebid.js so special. Each company maintains their own Prebid.js adapter to provide the freshest code for publishers, rather than a proprietary wrapper solution trying to reverse engineer another company's adapter. It's a win-win for everyone.
+Bidder Adapters are supposed to represent the SSPs & Exchanges you want to work with. There are currently over 300 bidder adapters. This set of working header bidding integrations is part of what makes Prebid.js so special. Each company maintains their own Prebid.js adapter to provide the freshest code for publishers, rather than a proprietary wrapper solution trying to reverse engineer another company's adapter. It's a win-win for everyone.
-Analytics adapters offer the ability to learn more about latency, revenues, bid rates, etc. Please see our [analytics page]({{site.github.url}}/dev-docs/integrate-with-the-prebid-analytics-api.html) for more information.
+Analytics adapters offer the ability to learn more about latency, revenues, bid rates, etc. Please see our [analytics page](/dev-docs/integrate-with-the-prebid-analytics-api.html) for more information.
## Prebid.js Modules
@@ -54,17 +54,17 @@ Prebid.js Modules also plug into the Prebid.js Core. They add functionality not
in the Core that not every publisher needs. Example modules:
+ GDPR support (the [consentManagement]({{site.baseurl}}/dev-docs/modules/consentManagement.html) module)
-+ currency conversion (the [currency]({{site.baseurl}}/dev-docs/modules/currency.html) module)
++ Currency conversion (the [currency]({{site.baseurl}}/dev-docs/modules/currency.html) module)
+ Server-to-server testing (the [s2sTest]({{site.baseurl}}/dev-docs/modules/s2sTesting.html) module)
-+ ... others
++ ... [many others](/dev-docs/modules/index.html)
## Cookies and Local Storage
-On behalf of publishers or third-parties, Prebid.js may set cookies or local storage in your browser. These are the first party cookies it can set on behalf of publishers, meaning that consent is not checked:
+On behalf of publishers or third-parties, Prebid.js may set cookies or local storage in your browser. These are the first party cookies it can set on behalf of publishers:
- prebid.cookieTest - used to verify whether other cookies should be set.
- _pbjs_userid_consent_data - used to make consent data conveniently available through various modules.
-All other cookies and local storage (including those set by Prebid.org-owned modules like [SharedId](/dev-docs/modules/userId.html#shared-id-user-id-submodule)) are subject to privacy regulations such as GDPR.
+All other cookies and local storage (including those set by Prebid.org-owned modules like [SharedId](/identity/sharedid.html) are subject to privacy regulations such as GDPR.
## Further Reading
diff --git a/prebid/prebidjsReleases.md b/prebid/prebidjsReleases.md
index 23b022efc7..8b567fae14 100644
--- a/prebid/prebidjsReleases.md
+++ b/prebid/prebidjsReleases.md
@@ -16,6 +16,18 @@ The table below is a summary of feature changes and important bug fixes in core
{: .table .table-bordered .table-striped }
| Release | Feature |
| --- | --- |
+| 7.0 | Cleanup of deprecated 'publisherDomain' and 'fpd' config. See the [PBJS 7 release notes](/dev-docs/pb7-notes.html) |
+| 6.0 | Removed transpiling for the MSIE 11 browser. [Blog post](https://prebid.org/blog/prebid-6-0-release/) |
+| 5.9 | Support numeric ad targeting keys |
+| 5.8 | [GPT Pre-Auction module](/dev-docs/modules/gpt-pre-auction.html) supports mcmEnabled flag |
+| 5.3 | add AD_RENDER_SUCCEEDED event |
+| 5.0 | See [Prebid.js 5.0 blog](https://prebid.org/blog/prebid-5-0-release/) |
+| 4.43 | Support [allowSendAllBidsTargetingKeys](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) option for control over which keys are sent to the ad server |
+| 4.41 | Support [suppressStaleRender](/dev-docs/publisher-api-reference/setConfig.html#auction-options) option |
+| 4.40 | First Party Data [enrichment](/dev-docs/modules/enrichmentFpdModule.html) and [validation](/dev-docs/modules/validationFpdModule.html) modules are introduced |
+| 4.39 | Prebid Core: removed size check on native icons and image assets |
+| 4.38 | PBS Bid Adapter allows stored impression configuration |
+| 4.37 | PBS bid adapter adds support for non-purpose1 consent domains |
| 4.36 | Introduced pbjs.installedModules array |
| 4.35 | Introduced pbjs.pbjs.getHighestUnusedBidResponseForAdUnitCode function |
| 4.34 | Bug fix: canBidderRegisterSync ignoring iframe sync disabled by default |
diff --git a/principles.md b/principles.md
index 7143451e65..a4a8bf8632 100644
--- a/principles.md
+++ b/principles.md
@@ -23,4 +23,4 @@ Prebid.org uses the following principles to guide how we develop [Prebid.js]({{s
## Further Reading
+ [What is Prebid?](/overview/intro.html)
-+ [Header Bidding Wrapper Code of Conduct]({{site.baseurl}}/wrapper_code_of_conduct.html)
++ [Header Bidding Wrapper Code of Conduct](https://prebid.org/code-of-conduct/)
diff --git a/tools/professor-prebid.md b/tools/professor-prebid.md
new file mode 100644
index 0000000000..ca68804bed
--- /dev/null
+++ b/tools/professor-prebid.md
@@ -0,0 +1,114 @@
+---
+layout: page_v2
+title: Professor Prebid
+description: Professor Prebid User Guide
+sidebarType: 8
+---
+
+# Professor Prebid User Guide
+
+## Introduction
+
+Professor Prebid is an open source Chrome extension to allow easy debugging and troubleshooting on publisher websites using Prebid.js.
+
+## Installation
+
+Simply visit the dedicated [Chrome Store link](https://chrome.google.com/webstore/detail/professor-prebid-v02/kdnllijdimhbledmfdbljampcdphcbdc) and click on `Add to Chrome`. Don't forget to pin it so you can have one-click access.
+
+Alternatively, if you want to compile it yourself and run locally, please clone Github's [repository](https://github.com/prebid/professor-prebid) and follow the instructions.
+
+## Usage
+
+Professor Prebid will automatically detect if the page has one or more Prebid instances. It Prebid is found, the extension's icon will display a badge like: ![alt_text](/assets/images/tools/professor-prebid-icon.png)
+
+Click on the icon to start interaction.
+
+### Features
+
+#### Adunits
+
+This is the default view and allows you to quickly check all the adunit codes available to Prebid, along with the associated media types and bidders.
+
+![Professor Prebid AdUnits screen](/assets/images/tools/professor-prebid-2.png)
+
+
+Each bidder entry is clickable, showing the associated input and bid response. You can easily copy a specific part of the JSON to the clipboard.
+
+![AdUnits screen bidders detail](/assets/images/tools/professor-prebid-3.png)
+
+
+Finally, you can also spot who is the winning bidder and whether its ad was rendered.
+![AdUnits screen winning bidder](/assets/images/tools/professor-prebid-4.png)
+
+#### Bids
+
+This screen allows you to verify and compare all the bids placed via Prebid.js and their metadata including:
+
+* Bid value
+* Bid currency
+* Response time
+* Adserver Targeting keywords
+
+![Professor Prebid bids screen](/assets/images/tools/professor-prebid-5.png)
+
+#### Timeline
+
+This view shows you the auction's main milestones:
+
+* Auction start timestamp
+* Bidders calling sequence and timestamp
+* Each bidder response time
+* Timeout threshold
+* Auction end timestamp
+
+![Professor Prebid timeline screen](/assets/images/tools/professor-prebid-6.png)
+
+Professor Prebid renders different timeline views using the auction id as key. This can happen if the publisher has an auto-refresh or manages each adunit independently.
+
+#### Config
+
+You will find here the main modules and their configuration:
+
+* Price Granularity: low/medium/high/auto/dense/custom
+* Bidder settings: calling order, timeout, âŠ
+* Prebid Server: id, bidders, endpoints, âŠ
+* CMP: Support different compliance frameworks (TCF, CCPA...), encoded consent string, decoded consent string
+* User ID modules
+
+![Professor Prebid config screen](/assets/images/tools/professor-prebid-7.png)
+
+#### User ID
+
+This view displays the configuration and the outcome of the different id providers found on page.
+
+![Professor Prebid user ID screen](/assets/images/tools/professor-prebid-8.png)
+
+#### Tools
+
+This tab provides advanced troubleshooting tools:
+
+* Shortcut to GAM console
+* Activation of Prebid Debug data on console
+* Bid filtering: allowlist of bidders
+* Bid CPM override
+* Adunit overlay: shows details about the winner over the creative on page
+
+![Professor Prebid tools screen](/assets/images/tools/professor-prebid-9.png)
+
+Here's an example of an overlay:
+
+![Overlay example](/assets/images/tools/professor-prebid-10.png)
+
+## How can I submit a feature request ?
+
+Please open an GitHub issue on [https://github.com/prebid/professor-prebid/issues](https://github.com/prebid/professor-prebid/issues).
+
+## How can I report a bug ?
+
+Please submit a GitHub issue on [https://github.com/prebid/professor-prebid/issues](https://github.com/prebid/professor-prebid/issues) providing as much details as possible:
+* Steps to reproduce the issue
+* Example of website where you face the issue
+* Professor Prebid version
+
+## Related Reading
+- [Prebid.js troubleshooting guide](/troubleshooting/troubleshooting-guide.html)
diff --git a/troubleshooting/pbs-troubleshooting.md b/troubleshooting/pbs-troubleshooting.md
index dba1eabb88..7258657589 100644
--- a/troubleshooting/pbs-troubleshooting.md
+++ b/troubleshooting/pbs-troubleshooting.md
@@ -19,7 +19,7 @@ There are several ways to get more debug info from Prebid Server.
If you're invoking Prebid Server directly, add one of these parameters to the OpenRTB:
- `"test":1`: This will inform bidders that this request should be treated as a test (non-billable), and provides additional debug information in the OpenRTB response.
-- `"debug":1`: Similar to `test`, but just adds debug info, without declaring the request non-billable.
+- `"ext.prebid.debug":true`: Similar to `test`, but just adds debug info, without declaring the request non-billable.
{% highlight bash %}
POST https://prebid-server.rubiconproject.com/openrtb2/auction
@@ -33,14 +33,24 @@ POST https://prebid-server.rubiconproject.com/openrtb2/auction
If you're invoking Prebid Server from Prebid.js, turn on the OpenRTB `test` flag from Prebid.js using one of these options:
-1) Add **?pbjs_debug=true** to the URL of the page.
+1) Add **?pbjs_debug=true** to the URL of the page. This will cause the pbsBidAdapter to send `ext.prebid.debug:true` to PBS, which will turn on additional debugging.
-2) Add the following `setConfig` to the page:
+2) Add the following `setConfig` to the page to get the same result:
{% highlight bash %}
pbjs.setConfig({"debug":true});
{% endhighlight %}
+3) If instead of ext.prebid.debug you would like to set the OpenRTB 2.5 'test' flag, you can set that using the 'ortb2' approach:
+
+{% highlight bash %}
+ pbjs.setConfig({
+ "ortb2": {
+ "test":1
+ }
+ });
+{% endhighlight %}
+
### Invoked from AMP
If you're invoking Prebid Server from AMP, you'll be unable to get debug info from the AMP page. However, you can capture the Prebid Server AMP call and append `&debug=1` to it:
@@ -134,7 +144,7 @@ hit these two URLs with the desired parameter values:
Then you can check server logs for output like:
```
-http-interaction : Requested URL: "/openrtb2/auction?debug=1", request body: "{ ... }"
+http-interaction : Requested URL: "/openrtb2/auction", request body: "{ ... }"
```
## Related Topics
diff --git a/troubleshooting/troubleshooting-guide.md b/troubleshooting/troubleshooting-guide.md
index 8254dd21a7..31f9970641 100644
--- a/troubleshooting/troubleshooting-guide.md
+++ b/troubleshooting/troubleshooting-guide.md
@@ -106,7 +106,7 @@ To see all of the winning bids, open your browser console and type `pbjs.getAllW
Keep in mind that any bid responses that come back after the [timeout you configured](/dev-docs/getting-started.html#set-the-ad-server-timeout) during setup will not be sent to the ad server.
{: .pb-alert .pb-alert-tip :}
-You can also print this data to the console in [table format](/dev-docs/troubleshooting-tips.html#see-all-bids-in-the-console) for easier reading.
+You can also print this data to the console in [table format](#see-all-bids-in-the-console) for easier reading.
## Modify bid responses for testing
@@ -114,7 +114,7 @@ You can also print this data to the console in [table format](/dev-docs/troubles
Using `pbjs.setConfig({debugging:{ ... }})` from the javascript console, it is possible to override and filter bids as they come in. When this type of debugging is enabled it will persist across page loads using `sessionStorage`.
{: .pb-alert .pb-alert-warning :}
-While this allows for easy testing of pages that immediately start auctions (most pages), it also means you need to remember to **deactivate debugging when you are done** (or clear your local storage / use incognito mode when testing). Also, note that this approach only _modifies_ existing bids. It cannot create bids for bidders that didn't bid.
+While this allows for easy testing of pages that immediately start auctions (most pages), it also means you need to remember to **deactivate debugging when you are done** (or clear your local storage / use incognito mode when testing). Also, note that this approach only _modifies_ existing bids. It cannot create bids for bidders that didn't bid; for that functionality, see the [debugging module](/dev-docs/modules/debugging.html).
```javascript
// Filtering bidders
@@ -182,7 +182,7 @@ Here's another scenario using the 'debugging' feature described in the previous
This section covers cases in which a particular server-side bidder doesn't always respond with a bid, or you want to try specific bid CPM values to verify line item setup.
-If you're using Prebid Server (i.e. the [s2sConfig](/dev-docs/publisher-api-reference/setconfig#setConfig-Server-to-Server) option), you can force it to respond with a particular canned response on any page by defining a storedAuctionResponse ID on the javascript console:
+If you're using Prebid Server (i.e. the [s2sConfig](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Server-to-Server) option), you can force it to respond with a particular canned response on any page by defining a storedAuctionResponse ID on the javascript console:
```javascript
javascript console> pbjs.setConfig({
@@ -217,12 +217,12 @@ Open your browser console and type `pbjs.getBidResponses();` to see a list of th
To see all of the winning bids, open your browser console and type [`pbjs.getAllWinningBids();`](/dev-docs/publisher-api-reference/getAllWinningBids.html).
{: .alert.alert-danger :}
-Keep in mind that any bid responses that come back after [the timeout you configured during setup]({{site.github.url}}/dev-docs/getting-started.html#set-the-ad-server-timeout) will not be sent to the ad server.
+Keep in mind that any bid responses that come back after [the timeout you configured during setup](/dev-docs/getting-started.html#set-the-ad-server-timeout) will not be sent to the ad server.
{: .alert.alert-success :}
-You can also [print this data to the console in table format]({{site.baseurl}}/dev-docs/troubleshooting-tips.html#see-all-bids-in-the-console) for easier reading.
+You can also [print this data to the console in table format](#see-all-bids-in-the-console) for easier reading.
-![pbjs.getBidResponses() in browser console]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/bids.png "pbjs.getBidResponses()"){: .pb-lg-img :}
+![pbjs.getBidResponses() in browser console](/assets/images/overview/prebid-troubleshooting-guide/bids.png "pbjs.getBidResponses()"){: .pb-lg-img :}
@@ -232,13 +232,13 @@ To print information about all of the bids that come in to the Console on any pa
Open the Chrome Dev Tools. In the **Sources** tab, next to **Content Scripts**, click the **>>** button and you can add **Snippets**:
-![View Snippets in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/01-view-snippets.png){: .pb-sm-img :}
+![View Snippets in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/01-view-snippets.png){: .pb-sm-img :}
Right-click to add a **New** snippet:
-![Add New Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/02-add-new-snippet.png){: .pb-sm-img :}
+![Add New Snippet in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/02-add-new-snippet.png){: .pb-sm-img :}
@@ -296,13 +296,13 @@ Paste in the following code using Control-V (or Command-V on Mac), and give the
Right-click the snippet and choose **Run**:
-![Run a Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/03-run-snippet.png){: .pb-sm-img :}
+![Run a Snippet in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/03-run-snippet.png){: .pb-sm-img :}
Check the output in Console to see the bids:
-![See Snippet Output in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/04-snippet-output.png){: .pb-sm-img :}
+![See Snippet Output in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/04-snippet-output.png){: .pb-sm-img :}
@@ -312,13 +312,13 @@ To print information about all of the winning bids that come in to the Console o
Open the Chrome Dev Tools. In the **Sources** tab, next to **Content Scripts**, click the **>>** button and you can add **Snippets**:
-![View Snippets in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/01-view-snippets.png){: .pb-sm-img :}
+![View Snippets in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/01-view-snippets.png){: .pb-sm-img :}
Right-click to add a **New** snippet:
-![Add New Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/02-add-new-snippet.png){: .pb-sm-img :}
+![Add New Snippet in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/02-add-new-snippet.png){: .pb-sm-img :}
@@ -351,13 +351,13 @@ if (output.length) {
Right-click the snippet and choose **Run**:
-![Run a Snippet in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/03-run-snippet.png){: .pb-sm-img :}
+![Run a Snippet in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/03-run-snippet.png){: .pb-sm-img :}
Check the output in Console to see the bids (note that this screenshot shows the output from "see all bids" but they're very similar):
-![See Snippet Output in Dev Tools]({{site.github.url}}/assets/images/dev-docs/troubleshooting-tips/04-snippet-output.png){: .pb-sm-img :}
+![See Snippet Output in Dev Tools](/assets/images/dev-docs/troubleshooting-tips/04-snippet-output.png){: .pb-sm-img :}
@@ -399,7 +399,7 @@ To make sure your ad server is set up correctly, answer the following questions:
+ **Is there other remnant inventory in the ad server with a higher CPM that is winning?** To test for this, you may want to use a test creative set up within a bidder partner that has a high CPM or create artificial demand with a [bidCPMadjustment](/dev-docs/publisher-api-reference/bidderSettings.html).
-+ **Have you set up all of the line items in the ad server to match the [setPriceGranularity setting]({{site.github.url}}/dev-docs/examples/custom-price-buckets.html) within Prebid.js?** All of the line items that correspond to your price granularity settings must be set up in your ad server. When there are gaps in the price granularity of your line item setup, bids will be reduced according to the size of the gap. For example, with [dense granularity](/dev-docs/publisher-api-reference/setConfig.html#denseGranularityBucket), a $3.32 bid will be sent to the ad server as $3.30.
++ **Have you set up all of the line items in the ad server to match the [setPriceGranularity setting](/dev-docs/examples/custom-price-buckets.html) within Prebid.js?** All of the line items that correspond to your price granularity settings must be set up in your ad server. When there are gaps in the price granularity of your line item setup, bids will be reduced according to the size of the gap. For example, with [dense granularity](/dev-docs/publisher-api-reference/setConfig.html#denseGranularityBucket), a $3.32 bid will be sent to the ad server as $3.30.
@@ -413,7 +413,7 @@ When a prebid line item wins the ad server's auction, a `renderAd` event will be
When this event is logged, it shows that Prebid.js has requested to render the ad from the winning bidder partner, and that this partner's bid has won both the Prebid and ad server auctions.
-![renderAd event in browser console]({{site.github.url}}/assets/images/overview/prebid-troubleshooting-guide/render-ad.png "renderAd event in browser console"){: .pb-lg-img :}
+![renderAd event in browser console](/assets/images/overview/prebid-troubleshooting-guide/render-ad.png "renderAd event in browser console"){: .pb-lg-img :}
@@ -425,7 +425,7 @@ The following parameters in the `bidResponse` object are common across all bidde
| Name | Type | Description | Example |
|----------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------|
| `bidder` | String | Unique bidder code used by ad server's line items to identify the bidder | `"appnexus"` |
-| `adId` | String | Unique identifier of a bid creative. Used by the line item's creative as in [this example]({{site.baseurl}}/adops/send-all-bids-adops.html#step-3-add-a-creative) | `"123"` |
+| `adId` | String | Unique identifier of a bid creative. Used by the line item's creative as in [this example](/adops/send-all-bids-adops.html#step-3-add-a-creative) | `"123"` |
| `pbLg` | String | Low granularity price bucket: $0.50 increment, capped at $5, floored to 2 decimal places (0.50, 1.00, 1.50, ..., 5.00) | `"1.50"` |
| `pbMg` | String | Medium granularity price bucket: 0.10 increment, capped at $20, floored to 2 decimal places (0.10, 0.20, ..., 19.90, 20.00) | `"1.60"` |
| `pbHg` | String | High granularity price bucket: 0.01 increment, capped at $20, floored to 2 decimal places (0.01, 0.02, ..., 19.99, 20.00) | `"1.61"` |
@@ -484,6 +484,10 @@ function auctionOptionsLogging() {
console.log(`Auction Options: Auction End! Timed Out! Bidders: ${Array.from(new Set(timedOutBidders.map(each => each.bidder))).join(',')} - ${auctionId}`);
})
+ pbjs.onEvent('bidderError', { error, bidderRequest } => {
+ console.log(`Auction Error: Bidder ${bidderRequest.bidderCode} responded with ${error.status} ${error.statusText} - ${bidderRequest.auctionId}`);
+ })
+
pbjs.onEvent('auctionEnd', auction => {
let auctionId = auction.bidderRequests.length > 0 ? auction.bidderRequests[0].auctionId : 0
let auctionStart = auction.bidderRequests.length > 0 ? auction.bidderRequests[0].auctionStart : 0
diff --git a/wrapper_code_of_conduct.md b/wrapper_code_of_conduct.md
index 28a23408f7..d9aa95dd42 100644
--- a/wrapper_code_of_conduct.md
+++ b/wrapper_code_of_conduct.md
@@ -8,85 +8,9 @@ sidebarType: 0
# Prebid.org Header Bidding Code of Conduct
{:.no_toc}
-Nov 17, 2020
+This page has moved to [https://prebid.org/code-of-conduct/](https://prebid.org/code-of-conduct/)!
-In order to encourage the development of quality products while maintaining a healthy open source community, Prebid.org members and contributors are expected to abide by technical guidelines based on the core values of the organization.
-
-* TOC
-{:toc}
-
-## Prebid.org Core Values
-
-The main objective of Prebid.org is to make great header bidding technology available for web publishers and mobile app developers. We believe great technology is:
-
-- **Efficient** - Products offered by Prebid.org should not burden a user device, the network, or a company server.
-- **Secure** - Prebid.org software should not open doors to security risks, including electronic attack, denial of service, fraud, or data leakage.
-- **Transparent** - Our products are built in the open with community review. Changes to Prebid software and modules must be open to inspection before and after release.
-- **Fair** - The Prebid.org platform doesnât favor any one entity over another. No entity can be favored over another in technical ordering or status as a default value. No entity can gain information about another entity without approval.
-- **Collaborative** - Human interactions in Prebid.org public forums and events must be courteous.
-- **Privacy Sensitive** - Our products are built for publishers to support usersâ privacy concerns and comply with industry standards.
-
-## Auction Principles
-
-The guidelines in this section apply to open source software written for the Prebid.org platform, or plugins designed to integrate into the Prebid.org platform.
-
-**Definitions:**
-
-- **Publisher**: the party who is integrating the header bidding technology into their page, app, video service, etc. They may integrate Prebid software on their own or through an approved agent.
-- **Publisher Agent**: a party who helps a Publisher integrate or install Prebid software.
-- **Auction Layer**: the part of the system that facilitates bids from demand partners being passed into the decisioning layer.
-- **Demand Partner**: any party that is willing to provide a price to be paid to the Publisher for a given impression, and is integrated into header bidding.
-- **Decisioning Layer**: the part of the system that decides the final winning bid.
-
-![Conduct](/assets/images/code-of-conduct-diagram.png){:class="pb-lg-img"}
-
-### Auction Logic
-
-1. The Auction Layer must not modify bids from Demand Partners unless specifically instructed to do so by configuration. For example, a Publisher might instruct the Auction Layer to:
- 1. Apply a modification that changes the bid from gross to net or;
- 1. Apply a modification that changes the bid from one currency to another;
- 1. Account for a consistent discrepancy;
- 1. Account for managed service fees;
- 1. Drop bids that do not meet the floor requirement
-1. The Auction Layer must provide equal opportunity for all Demand Partners to bid, either by randomizing the order in which they are called, or by requesting bids in the order specified by the publisher.
- 1. Publisher configuration may override which bidders take part in each auction.
- 1. This also specifically covers any situation where a Publisher Agent is also a Demand Partner or a Demand Partner is hosting the Auction Layer.
-1. The Auction Layer must send all demand returned within the configured timeout period to the Decisioning Layer.
-1. The Decisioning Layer must make the final choice of which bid wins unless configured to do otherwise.
-1. The Decisioning Layer can be determined by the Publisher, e.g. It could be an ad server or the same software that implements the Auction Layer, or a proxy server. If decisioning is done in Prebid software, it must conform to all other rules in this section.
-1. The Auction Layer should provide a mechanism or process for Publishers and Demand Partners to validate auction mechanics, including:
- 1. Confirmation that bid requests were sent to Demand Partners
- 1. Confirmation that bid responses were sent to the Decisioning Layer
- 1. Confirmation that the correct bid values were sent to the Decisioning Layer
- 1. Bid timing information such as which Demand Partners met the timeout period
-
-### Data and Transparency
-
-1. The Auction Layer must segregate demand data so there is no opportunity for Demand Partners to have access to other bids or bidder data.
-1. The Auction Layer must pass available bid request information to each configured demand partner, subject to Publisher configuration and privacy regulation controls.
-1. The Auction Layer must not collect and store Publisher or Demand Partner information (such as bid stream information, user information, and Publisher first party data) except in the following cases:
- 1. Passing information to Demand Partners or Analytics Adapters
- 1. Validating header bidding mechanics
- 1. Troubleshooting and diagnosing implementations
-1. The Auction Layer must not record, use, or sell Publisher or Demand Partner data except in accordance with the instructions of the Publisher and the Demand Partner.
-1. The Prebid ecosystem will endeavor to support industry standard privacy regulations, including allowing Publishers to transmit notice, consent, and opt-out state.
-1. Analytics Adapters must not utilize header bidding auction data outside of any agreement they reached with the Publisher.
-
-### User Experience
-
-1. The system should minimize the impact on the userâs web browsing experience.
-1. Users, Publishers and Advertisers deserve a reliable ad serving environment. Prebid software should facilitate data that helps determine if an impression is fraudulent or undisplayable for any reason.
-1. Publishers should be able to utilize Prebid software while adhering to their privacy policies.
-
-### Adapter Conduct
-
-Prebid software supports different types of âpluginâ modules, including for example bid adapters, analytics adapters, user ID modules, real-time-data modules, and others.
-
-1. Adapters of all types must follow all of the above guidelines and specific technical rules defined by the relevant Prebid committee.
- 1. Prebid.js and Prebid Server technical rules are defined by Prebid Module Rules.
-1. As technical rules may change over time, Prebid committees are empowered to force adapters to change specific behaviors as part of major milestone releases. The committees should strive to give the adapter community ample opportunity to weigh in on specific guidelines and ample time to make changes.
-
-## Information and Resources
+## Related Reading
- [Prebid.org Community Code of Conduct](https://prebid.org/code-of-conduct/#community)
- [Prebid.org Member Companies](https://prebid.org/membership/member-directory/)