From 5bb755dc5fd5f95e76b8457fb9ea283111761a9a Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 28 Feb 2023 12:27:31 -0500 Subject: [PATCH 001/564] PBS auction endpoint update (#4396) added ext.prebid.analytics --- .../endpoints/openrtb2/pbs-endpoint-auction.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index e290067c4c..adb9cd3f12 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1406,6 +1406,20 @@ PBS-core creates this block before sending to bid adapters. They receive additio             } ``` +##### Analytics Extension + +Some analytics adapters may support special flags that can be passed on ext.prebid.analytics. e.g. + +``` +ext.prebid: { + analytics: { + myanalyticsadapter: { + myflag: true + } + } +} +``` + #### OpenRTB Response Extensions ##### Bidder Response Times @@ -1663,6 +1677,7 @@ The Prebid SDK version comes from: | ext.prebid.pbs.endpoint | additional Prebid Server metadata | string | yes | | ext.prebid.floors | PBS floors data | object | no | | ext.prebid.returnallbidstatus | If true, PBS returns [ext.seatnonbid](#seat-non-bid) with details about bidders that didn't bid. | boolean | no | +| ext.prebid.analytics | Arguments that can be passed through to individual analytics adapters | object | no | | imp.ext.ae | If 1, signals bid adapters that Fledge auction config is accepted on the response. (ae stands for auction environment) | integer | yes | | app.ext.prebid.source | The client that created this ORTB. Normally "prebid-mobile" | string | yes | | app.ext.prebid.version | The version of the client that created this ORTB. e.g. "1.1" | string | yes | From e66c535164cbd16e399181af8d27eeda512ea5a8 Mon Sep 17 00:00:00 2001 From: Michele Nasti Date: Wed, 1 Mar 2023 20:38:58 +0100 Subject: [PATCH 002/564] Separate puc docs (#3645) * more details about ortb native * added a section for bid adapters * move paragraph up * wordsmithing * added link to ortb spec Co-authored-by: Muki Seiler * fixed link * Fix ad-unit-define creative link * fix native-implementation link * add clickUrlUnesc; add openrtb spec links * fixes * replace /dist/creative.js with hb_format.js replace native-render.js with native.js * put %%PATTERN:hb_format%% everywhere * fix examples that use renderAd in native * fix examples * mentioning hb_format directly * updated adops docs --------- Co-authored-by: Michele Nasti Co-authored-by: bretg Co-authored-by: Muki Seiler Co-authored-by: Filip Stamenkovic --- adops/adops-general-sbs.md | 3 +- adops/creative-considerations.md | 2 +- adops/gam-creative-banner-sbs.md | 6 ++-- adops/gam-native.md | 26 +++++++++-------- ...g-up-prebid-with-the-appnexus-ad-server.md | 2 +- dev-docs/show-prebid-ads-on-amp-pages.md | 4 +-- overview/prebid-universal-creative.md | 25 +++++++++++----- prebid/native-implementation.md | 29 ++++++++++--------- 8 files changed, 56 insertions(+), 41 deletions(-) diff --git a/adops/adops-general-sbs.md b/adops/adops-general-sbs.md index af21d97c37..80ed48e50b 100644 --- a/adops/adops-general-sbs.md +++ b/adops/adops-general-sbs.md @@ -131,7 +131,7 @@ We recommend using the [Prebid Universal Creative](/overview/prebid-universal-cr If you’re working with banner or outstream creatives, the HTML you’ll enter in the creatives will be similar to the following (utilizing whatever macro format is supported by your ad server): ``` - + + + + ``` @@ -164,7 +164,7 @@ p { The GAM creative is identical whether the template is defined in the AdUnit or the external render JavaScript. There are two key aspects of the native creative in this scenario: -1. Load the Prebid.js native rendering code. You can utilize the jsdelivr version of native-render.js or host your own copy. If you use the version hosted on jsdelivr, make sure to declare jsdelivr as an ad technology provider in GAM. Admin → EU User Consent → Declare ad technology providers +1. Load the Prebid.js native rendering code. You may utilize the jsdelivr version of native.js or host your own copy. If you use the version hosted on jsdelivr, make sure to declare jsdelivr as an ad technology provider in GAM. Admin → EU User Consent → Declare ad technology providers. 2. Invoke the Prebid.js native rendering function with an object containing the following attributes: - adid - Used to identify which Prebid.js creative holds the appropriate native assets. - pubUrl - The URL of the page, which is needed for the HTML postmessage call. @@ -172,19 +172,21 @@ The GAM creative is identical whether the template is defined in the AdUnit or t Example creative HTML: ``` - + ``` {: .alert.alert-warning :} -When using Send All Bids, use `pbNativeTagData.adId = "%%PATTERN:hb_adid_BIDDERCODE%%";` rather than `pbNativeTagData.adId = "%%PATTERN:hb_adid%%";` for each bidder’s creative, replacing `BIDDERCODE` with the actual bidder code, such as `%%PATTERN:hb_adid_BidderA%%`. +When using Send All Bids, use `ucTagData.adId = "%%PATTERN:hb_adid_BIDDERCODE%%";` rather than `ucTagData.adId = "%%PATTERN:hb_adid%%";` for each bidder’s creative, replacing `BIDDERCODE` with the actual bidder code, such as `%%PATTERN:hb_adid_BidderA%%`. The example CSS in the previous section applies here as well. @@ -202,7 +204,7 @@ Now that you've defined your native template you can create your native creative {:start="4"} 4. Under **Settings**, enter a **Name** for your creative. -5. Enter any value into the **Click-through URL** field; this value will be overwritten by the native asset values. Also, if you operate in Europe and are using the jsdelivr-hosted native-render.js, make sure you set jsdelivr as your ad technology provider. (See Step 6 below.) +5. Enter any value into the **Click-through URL** field; this value will be overwritten by the native asset values. Also, if you operate in Europe and are using the jsdelivr-hosted native.js, make sure you set jsdelivr as your ad technology provider. (See Step 6 below.) ![Native Creative](/assets/images/ad-ops/gam-sbs/gam-new-creative-part2.png){: .pb-md-img :} diff --git a/adops/setting-up-prebid-with-the-appnexus-ad-server.md b/adops/setting-up-prebid-with-the-appnexus-ad-server.md index 7f4bbd518b..607b0aac8e 100644 --- a/adops/setting-up-prebid-with-the-appnexus-ad-server.md +++ b/adops/setting-up-prebid-with-the-appnexus-ad-server.md @@ -78,7 +78,7 @@ Follow the creative setup instructions in [Add Creatives](https://docs.xandr.com ![New creative]({{ site.github.url }}/assets/images/ad-ops/appnexus-setup/prebid-creative-appnexus.png) {: .pb-lg-img :} {% highlight html %} - + + + +``` + +This loads the PUC from the Prebid-maintained location. Your managed +service provider may have a different location. + +## Features of the PUC ### What the PUC does for Web iframe Banners/Outstream 1. Simply calls the Prebid.js renderAd function diff --git a/prebid/native-implementation.md b/prebid/native-implementation.md index 8eb4ca89fb..e0f9077e60 100644 --- a/prebid/native-implementation.md +++ b/prebid/native-implementation.md @@ -66,7 +66,7 @@ This table summarizes how the 3 approaches work: | --- | --- |--- | --- | | Prebid.js | mediaTypes. native.sendTargetingKeys: false | sendTargetingKeys:false and mediaTypes.native.adTemplate contains ##macros## | sendTargetingKeys:false and mediaTypes.native.rendererUrl | | Ad Server Key Value Pairs | hb_adid | hb_adid | hb_adid | -| Ad Server | Native template loads native-render.js and calls renderNativeAd(). Uses Prebid ##macro## format. | Native creative loads native-render.js and calls renderNativeAd() with requestAllAssets: true | Native creative loads native-render.js and calls renderNativeAd(), with requestAllAssets:true | +| Ad Server | Native template loads native.js and calls renderNativeAd(). Uses Prebid ##macro## format. | Native creative loads native.js and calls renderNativeAd() with requestAllAssets: true | Native creative loads native.js and calls renderNativeAd(), with requestAllAssets:true | | Prebid Universal Creative | renderNativeAd resolves macros in the creative body and CSS. | renderNativeAd resolves ##macros## in adTemplate and CSS, appending the adTemplate to the creative body | renderNativeAd loads javascript from renderUrl, calls the renderAd function, appending the results to the creative body. | | Javascript rendering function | n/a | n/a | Receives the ortb response into `bid.ortb`, and the renderer is responsible for resolving any macro format and returning an HTML block. | @@ -184,7 +184,7 @@ Bid adapters will declare which custom assets they support in their documentatio {: .alert.alert-success :} -Note: The `native-render.js::renderNativeAd()` function must be called with `requestAllAssets: true`. +Note: The `native.js::renderNativeAd()` function must be called with `requestAllAssets: true`. In the native template, simply access the custom value with the normal Prebid `##macro##` format assuming `hb_native_asset_id_` as the prefix. For example, if your custom asset has `id: 7`: @@ -273,7 +273,7 @@ pbjs.addAdUnits({ There are three key aspects of the native template: 1. Build the creative with special Prebid.js macros, e.g. `##hb_native_asset_id_{id}##.` Note that macros can be placed in the body (HTML) and/or head (CSS) of the native creative. -2. Load the Prebid.js native rendering code. You may utilize the jsdelivr version of native-render.js or host your own copy. If you use the version hosted on jsdelivr, make sure any necessary ad server permissions are established. +2. Load the Prebid.js native rendering code. You may utilize the jsdelivr version of native.js or host your own copy. If you use the version hosted on jsdelivr, make sure any necessary ad server permissions are established. 3. Invoke the Prebid.js native rendering function with an object containing the following attributes: 1. adid - used to identify which Prebid.js creative holds the appropriate native assets 2. pubUrl - the URL of the page, which is needed for the HTML postmessage call @@ -289,7 +289,7 @@ Example creative HTML:
##hb_native_asset_id_3##
- + + + - - - {% endif %} + + + + diff --git a/_includes/video/pb-is-app.html b/_includes/video/pb-is-app.html index f7634cd822..3a48ac18d3 100644 --- a/_includes/video/pb-is-app.html +++ b/_includes/video/pb-is-app.html @@ -8,7 +8,10 @@ ### Downloading and Installing Prebid.js @@ -36,7 +38,9 @@ Optanon.InsertHtml('','vimeo2', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo2', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Ad Server Setup for Header Bidding @@ -47,7 +51,9 @@ Optanon.InsertHtml('','vimeo3', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo3', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Setup Google Ad Manager for Header Bidding @@ -58,7 +64,9 @@ Optanon.InsertHtml('','vimeo4', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo4', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Ad Units Array Setup @@ -69,7 +77,9 @@ Optanon.InsertHtml('','vimeo5', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo5', null, {deleteSelectorContent: true}, 'C0003'); + }) ## Troubleshooting @@ -82,7 +92,9 @@ Optanon.InsertHtml('','vimeo6', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo6', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Troubleshooting Ad Server: Size and Inventory @@ -93,7 +105,9 @@ Optanon.InsertHtml('','vimeo7', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo7', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Troubleshooting Ad Server: Line Item Rate and Priority @@ -104,7 +118,9 @@ Optanon.InsertHtml('','vimeo8', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo8', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Troubleshooting Header Bidding Calls @@ -115,7 +131,9 @@ Optanon.InsertHtml('','vimeo9', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo9', null, {deleteSelectorContent: true}, 'C0003'); + }) ## Prebid Video @@ -128,7 +146,9 @@ Optanon.InsertHtml('','vimeo10', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo10', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Prebid Video: Instream @@ -139,7 +159,9 @@ Optanon.InsertHtml('','vimeo11', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo11', null, {deleteSelectorContent: true}, 'C0003'); + }) ### Prebid Video: Outstream @@ -150,7 +172,9 @@ Optanon.InsertHtml('','vimeo12', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo12', null, {deleteSelectorContent: true}, 'C0003'); + }) diff --git a/videos/prebid-video.md b/videos/prebid-video.md index a72a458ebd..f6e1038cad 100644 --- a/videos/prebid-video.md +++ b/videos/prebid-video.md @@ -21,7 +21,9 @@ sidebarType: 4 ## Prebid Video: Instream @@ -32,7 +34,9 @@ Optanon.InsertHtml('','vimeo2', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo2', null, {deleteSelectorContent: true}, 'C0003'); + }) ## Prebid Video: Outstream @@ -43,6 +47,8 @@ Optanon.InsertHtml('','vimeo3', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo3', null, {deleteSelectorContent: true}, 'C0003'); + }) diff --git a/videos/setup.md b/videos/setup.md index 45ee54448c..60a3967685 100644 --- a/videos/setup.md +++ b/videos/setup.md @@ -21,7 +21,9 @@ sidebarType: 1

Header Bidding from AppNexus on Vimeo.

@@ -34,7 +36,9 @@ Optanon.InsertHtml('', 'vimeo2', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo2', null, {deleteSelectorContent: true}, 'C0003'); + })

Downloading and Installing Prebid.js from AppNexus on Vimeo.

@@ -47,7 +51,9 @@ Optanon.InsertHtml('', 'vimeo3', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo3', null, {deleteSelectorContent: true}, 'C0003'); + }) ## Setup Google Ad Manager for Header Bidding @@ -58,7 +64,9 @@ Optanon.InsertHtml('', 'vimeo4', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo4', null, {deleteSelectorContent: true}, 'C0003'); + })

Setup Google Ad Manager for Header Bidding from AppNexus on Vimeo.

@@ -71,7 +79,9 @@ Optanon.InsertHtml('', 'vimeo5', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo5', null, {deleteSelectorContent: true}, 'C0003'); + }) diff --git a/videos/troubleshooting.md b/videos/troubleshooting.md index 495c8d6156..d0c8dc157b 100644 --- a/videos/troubleshooting.md +++ b/videos/troubleshooting.md @@ -21,7 +21,9 @@ sidebarType: 1

Troubleshooting Header Bidding Configuration from AppNexus on Vimeo.

@@ -34,7 +36,9 @@ Optanon.InsertHtml('','vimeo2', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo2', null, {deleteSelectorContent: true}, 'C0003'); + }) ## Troubleshooting Ad Server: Line Item Rate and Priority @@ -45,7 +49,9 @@ Optanon.InsertHtml('','vimeo3', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo3', null, {deleteSelectorContent: true}, 'C0003'); + }) ## Troubleshooting Header Bidding Calls @@ -56,7 +62,9 @@ Optanon.InsertHtml('','vimeo4', null, {deleteSelectorContent: true}, 3); + window.onetrustLoaded.then(() => { + OneTrust.InsertHtml('', 'vimeo4', null, {deleteSelectorContent: true}, 'C0003'); + }) From 1191909e85f3f210b6f3d64b921f7d7777fe660f Mon Sep 17 00:00:00 2001 From: Erik Hummel Date: Thu, 30 Mar 2023 13:05:05 -0400 Subject: [PATCH 052/564] Documentation updates for March 2023 (#4444) * Documentation updates for March 2023 * typo fix * Update dev-docs/modules/userid-submodules/lotame.md fix curly quotes to normal quotes. Co-authored-by: Muki Seiler --------- Co-authored-by: Erik Hummel Co-authored-by: Muki Seiler --- dev-docs/modules/userid-submodules/lotame.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/dev-docs/modules/userid-submodules/lotame.md b/dev-docs/modules/userid-submodules/lotame.md index d2ecd784c4..858140afd2 100644 --- a/dev-docs/modules/userid-submodules/lotame.md +++ b/dev-docs/modules/userid-submodules/lotame.md @@ -10,23 +10,20 @@ useridmodule: lotamePanoramaIdSystem 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/). -**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). +If you have any questions about Panorama ID, please reach out by emailing [prebid@lotame.com](mailto:prebid@lotame.com). Add it to your Prebid.js package with: {: .alert.alert-info :} gulp build --modules=lotamePanoramaIdSystem -## Lotame Panorama ID Configuration +## Lotame Panorama ID Registration & Implementation -The Lotame Panorama ID module does not require any configuration parameters. It should work as-is provided that bidders use it in their adapters. +To get started, you will need to register with Lotame in order to receive your unique client ID for the userID module. You can [register here](https://www.cognitoforms.com/LotameSolutionsInc/PanoramaIDOfferingEnrollment) or contact [prebid@lotame.com](mailto:prebid@lotame.com) for any questions that you may have. -{: .alert.alert-info :} -NOTE: For optimal performance, the Lotame Panorama Id module should be called at every opportunity. It is best not to use `params.storage` with this module as the module has its own optimal caching mechanism. +Once you sign up, you will receive an email with your client ID and instructions for implementation. ## Lotame Panorama ID Example @@ -34,13 +31,21 @@ NOTE: For optimal performance, the Lotame Panorama Id module should be called at | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of the module | "lotamePanoramaId" | +| params | Required | Object | Configuration options for the Lotame Panorama ID Module | | + | params.clientId | Required | String | The Lotame Client ID provided as part of your registration as noted above | "1001" | {% highlight javascript %} pbjs.setConfig({ userSync: { userIds: [{ name: "lotamePanoramaId", + params: { + clientId: "1001" + } }] } }); {% endhighlight %} + +{: .alert.alert-info :} +NOTE: For optimal performance, the Lotame Panorama Id module should be called at every opportunity. It is best not to use params.storage with this module as the module has its own optimal caching mechanism. From 1a3e54dcdbf9c8e7f7b71c0055047ae1fe8a6877 Mon Sep 17 00:00:00 2001 From: MartianTribe Date: Mon, 3 Apr 2023 11:46:29 -0400 Subject: [PATCH 053/564] Update kargo.md --- dev-docs/bidders/kargo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md index 7b08665204..8c9c500288 100644 --- a/dev-docs/bidders/kargo.md +++ b/dev-docs/bidders/kargo.md @@ -10,8 +10,8 @@ gdpr_supported: true userIds: unifiedId usp_supported: true coppa_supported: false -schain_supported: false -dchain_supported: false +schain_supported: true +dchain_supported: true safeframes_ok: false deals_supported: true floors_supported: true From 9f864e797e3974cad1d3a81b5a8d035394a3b9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Besse?= Date: Mon, 3 Apr 2023 21:54:26 +0200 Subject: [PATCH 054/564] Adagio: Add documentation for splitKeyword and dataLayer params (#4430) * Add documentation for the splitKeyword and dl params * Update param from `dl` to `dataLayer` - Improve description, fix example.. * Adagio: Update description for dataLayer param --- dev-docs/bidders/adagio.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md index 5a56d69fd1..b4ea493b95 100644 --- a/dev-docs/bidders/adagio.md +++ b/dev-docs/bidders/adagio.md @@ -59,7 +59,6 @@ pbjs.bidderSettings = { **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 } - | Name | Scope | Description | Example | Type | | ----------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | -------- | | `organizationId` | required | Id of the Organization. Handed out by Adagio. | `'1010'` | `string` | @@ -70,7 +69,8 @@ pbjs.bidderSettings = { | `category`* | recommended | Category of the content displayed in the page.
- max length: 30
- max distinctives values: 50 | `'sport'` | `string` | | `video` | optional | OpenRTB video options object. All options will override ones defined in mediaTypes video.
Mandatory:
- api (your video player must at least support the value 2 and/or 7)
Highly recommended:
- playbackmethod | `{api: [2, 7], playbackmethod: [6], skip: 1, startdelay: 0}` | | `native` | optional | Partial OpenRTB Native 1.2 request object. Supported fields are:
- context
- plcmttype | `{context: 1, plcmttype: 2}` | `object` | - +| `splitKeyword` | optional | Keyword that can later be used in a split rule targeting to trigger the rule (especially for Direct Seats AB testing) | `'splitrule-one'` | `string` | +| `dataLayer` | optional | A set of arbitrary key-value pairs. This can be used to configure mappings. The keys and values must be strings. | `{placement: 'my-placement', siteid: 'my-siteid'}` | `object` | *These parameters will have its accentuated characters converted to their non-accentuated version: `é` => `e` From 9f75e904e9631626659a0e25300c13d4309cac5e Mon Sep 17 00:00:00 2001 From: Bernhard Pickenbrock Date: Tue, 4 Apr 2023 15:05:27 +0200 Subject: [PATCH 055/564] Smaato: Adapters that accept geolocation data from bid parameters should also accept it from ortb2.(device|user).geo (#9676) (#4455) --- dev-docs/bidders/smaato.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index eb7a66671b..89e5054c65 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -211,6 +211,8 @@ Publishers should use the `ortb2` method of setting First Party Data. The follow - ortb2.user.yob - ortb2.user.gender - ortb2.user.ext.eids +- ortb2.device.geo +- ortb2.device.ifa The IAB standard taxonomies are not supported. @@ -230,6 +232,13 @@ pbjs.setConfig({ keywords: "a,b", gender: "M", yob: 1984 + }, + device: { + ifa: "identifier", + geo: { + lat: 53.5488, + lon: 9.9872 + } } } }); From fb9936f421c022e36ed500a60d9435c7bc21596e Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Wed, 5 Apr 2023 13:16:16 -0300 Subject: [PATCH 056/564] [Video] Add example using Video Module with video.js (#4459) * adds examples for VM * builds * loads script tags * updates sidebar menu * removes jwplayer * updates displayed config to reflect programmatic one * requests bids based on onetrust --- _data/sidebar.yml | 8 + _includes/video/pb-vm-vjs.html | 27 ++ _layouts/video_sample.html | 2 + examples/video/index.md | 6 + .../videojs/video-module-videojs.html | 286 ++++++++++++++++++ 5 files changed, 329 insertions(+) create mode 100644 _includes/video/pb-vm-vjs.html create mode 100644 examples/video/instream/videoModule/videojs/video-module-videojs.html diff --git a/_data/sidebar.yml b/_data/sidebar.yml index b23317f0bc..8129f22992 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1275,6 +1275,14 @@ sectionTitle: subgroup: 2 +- sbSecId: 4 + title: 'Prebid Video Module: VideoJS' + link: /examples/video/instream/videoModule/videojs/video-module-videojs.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 2 + - sbSecId: 4 title: 'JW Player (Platform)' link: /examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html diff --git a/_includes/video/pb-vm-vjs.html b/_includes/video/pb-vm-vjs.html new file mode 100644 index 0000000000..d923784910 --- /dev/null +++ b/_includes/video/pb-vm-vjs.html @@ -0,0 +1,27 @@ + + + + + {% include head--common.html %} + + + + + + + + + + + + + + diff --git a/_layouts/video_sample.html b/_layouts/video_sample.html index e46677cc17..c62c9dad25 100644 --- a/_layouts/video_sample.html +++ b/_layouts/video_sample.html @@ -6,6 +6,8 @@ {% include /video/pb-is-sb.html %} {% elsif page.videoType == "pb-is-vjs" %} {% include /video/pb-is-vjs.html %} +{% elsif page.videoType == "pb-vm-vjs" %} + {% include /video/pb-vm-vjs.html %} {% elsif page.videoType == "pbs-br" %} {% include /video/pbs-br.html %} {% elsif page.videoType == "pbs-jw01" %} diff --git a/examples/video/index.md b/examples/video/index.md index 4faadf4926..67442d0e27 100644 --- a/examples/video/index.md +++ b/examples/video/index.md @@ -17,6 +17,12 @@ sidebarType: 4 The following examples are available: +## Prebid Video Module: Instream + +- [VideoJS](/examples/video/instream/videoModule/videojs/video-module-videojs.html) + +## Prebid Video Module: Outstream + ## Instream - [Brightcove](/examples/video/instream/brightcove/pb-ve-brightcove.html) diff --git a/examples/video/instream/videoModule/videojs/video-module-videojs.html b/examples/video/instream/videoModule/videojs/video-module-videojs.html new file mode 100644 index 0000000000..513ae2e53f --- /dev/null +++ b/examples/video/instream/videoModule/videojs/video-module-videojs.html @@ -0,0 +1,286 @@ +--- +layout: video_sample +title: Prebid Video Module | Instream Example with VideoJS Submodule +description: An example of an instream pre-roll ad using the Prebid.js Video Module and the VideoJS submodule. +videoType: pb-vm-vjs +isVideo: true +sidebarType: 4 +--- + + +
+
+
+

{{ page.title }}

+

{{page.description }}

+
+ +
+

(Sorry, video code examples aren't available with your cookie privacy settings.)

+

Cookie Settings


+
+ + +
+
+ +{% if jekyll.environment == "production" %} + +{% else %} + +{% endif %} + + + + From 5e28b9444cd8c0d67670c03f6de77bc54913d6b1 Mon Sep 17 00:00:00 2001 From: rajsidhunovatiq <79534312+rajsidhunovatiq@users.noreply.github.com> Date: Thu, 6 Apr 2023 18:12:54 +0100 Subject: [PATCH 057/564] update docs to make it easier for clients (#4452) --- dev-docs/modules/userid-submodules/novatiq.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/dev-docs/modules/userid-submodules/novatiq.md b/dev-docs/modules/userid-submodules/novatiq.md index 706e73e287..5d2cd2cdcf 100644 --- a/dev-docs/modules/userid-submodules/novatiq.md +++ b/dev-docs/modules/userid-submodules/novatiq.md @@ -23,14 +23,17 @@ pbjs.setConfig({ userSync: { userIds: [{ name: 'novatiq', + bidders: [ + `rubicon` + ], params: { // change to the Partner Number you received from Novatiq sourceid '1a3' } } }], - // 50ms maximum auction delay, applies to all userId modules - auctionDelay: 50 + // 1000ms maximum auction delay, applies to all userId modules + auctionDelay: 1000 } }); {% endhighlight %} @@ -42,7 +45,7 @@ pbjs.setConfig({ | --- | --- | --- | --- | --- | | 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.sourceid | Required (if applicable) | 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` | @@ -72,6 +75,9 @@ pbjs.setConfig({ userIds: [ { name: 'novatiq', + bidders: [ + `rubicon` + ], params: { // change to the Partner Number you received from Novatiq sourceid '1a3', @@ -85,8 +91,8 @@ pbjs.setConfig({ } } }], - // 50ms maximum auction delay, applies to all userId modules - auctionDelay: 50 + // 1000ms maximum auction delay, applies to all userId modules + auctionDelay: 1000 } }); {% endhighlight %} From 5d3370bfe25eecf37be921b44d7bd71dfc046d67 Mon Sep 17 00:00:00 2001 From: asurovenko-zeta <80847074+asurovenko-zeta@users.noreply.github.com> Date: Mon, 10 Apr 2023 18:00:50 +0200 Subject: [PATCH 058/564] ZetaGlobalSsp adapter: tagid in doc (#4470) Co-authored-by: Surovenko Alexey --- dev-docs/bidders/zeta_global_ssp.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/zeta_global_ssp.md b/dev-docs/bidders/zeta_global_ssp.md index a56068b4a2..6acb845a27 100644 --- a/dev-docs/bidders/zeta_global_ssp.md +++ b/dev-docs/bidders/zeta_global_ssp.md @@ -29,6 +29,7 @@ The Zeta Global SSP adapter requires setup and approval from the Zeta Global SSP |----------------------|----------|---------------------------------------------------------------------------------------------------------------------|--------------|-----------| | `sid` | required | Seller ID. The identifier associated with the seller or reseller account within the advertising system | `"sid123"` | `string` | | `shortname` | required | Publisher Name. The unique name associated with the seller or reseller account within the advertising system | `"pub_name"` | `string` | +| `tagid` | required | Identifier for specific ad placement or ad tag that was used to initiate the auction | `"123877"` | `string` | | `tags` | optional | The object containing set of Zeta's custom tags witch publisher have to supply | `tags: {}` | `object` | | `site` | optional | The object containing site data (See OpenRTB spec) | `site: {}` | `object` | | `app` | optional | The object containing app data (See OpenRTB spec) | `app: {}` | `object` | From f32dd2b435598447c05452973b13f73e98f330f5 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Mon, 10 Apr 2023 20:01:19 +0300 Subject: [PATCH 059/564] Adkernel: documenting adliveconnect alias (#4451) * Adkernel: documenting adliveconnect alias * Update adlive.md * Rename adlive.md to adliveconnect.md --- dev-docs/bidders/adliveconnect.md | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 dev-docs/bidders/adliveconnect.md diff --git a/dev-docs/bidders/adliveconnect.md b/dev-docs/bidders/adliveconnect.md new file mode 100644 index 0000000000..fd730d84e8 --- /dev/null +++ b/dev-docs/bidders/adliveconnect.md @@ -0,0 +1,34 @@ +--- +layout: bidder +title: Adliveconnect +description: Adliveconnect Bidder Adaptor +biddercode: adliveconnect +pbjs: true +pbs: false +media_types: banner, native, video +gdpr_supported: true +usp_supported: true +coppa_supported: true +pbs_app_supported: false +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note: + +The Adlive 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.adlive.io'` | `string` | +| `zoneId` | required | Zone Id | 30164 | `integer` | From 0f087273b90caa5638100990eb27e95835efb442 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 10 Apr 2023 10:23:36 -0700 Subject: [PATCH 060/564] PBJS: document new `storageAllowed` options (#4466) --- dev-docs/publisher-api-reference/bidderSettings.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dev-docs/publisher-api-reference/bidderSettings.md b/dev-docs/publisher-api-reference/bidderSettings.md index d7d9e8c308..2da634a29d 100644 --- a/dev-docs/publisher-api-reference/bidderSettings.md +++ b/dev-docs/publisher-api-reference/bidderSettings.md @@ -46,7 +46,7 @@ Some sample scenarios where publishers may wish to alter the default settings: | 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. | +| storageAllowed | standard or adapter-specific | 6.13.0 | true in 6.x, false after 7.0 | Allow use of cookies and/or 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. | @@ -262,7 +262,12 @@ either specific bid adapter(s) or all bid adapters the permission for these bids ##### 2.7. storageAllowed -This flag defines if the bid adapter can access browser cookies and local storage. +This setting defines if the bid adapter can access browser cookies or local storage. Allowed values are: + + - an array containing either `'html5'`, `'cookie'` or both to allow specific storage methods (e.g. `['cookie']` enables cookies but not local storage) + - `true` to allow any storage method; + - `false` to disable all storage. +
Default value is `true` in version 6.x
Default value is `false` in version 7.x From 2d2d1f685569aea674a38d0b1d55ef1b68f8e7f3 Mon Sep 17 00:00:00 2001 From: Nisar Thadathil Date: Tue, 11 Apr 2023 00:02:47 +0530 Subject: [PATCH 061/564] Updated documentation for Vidoomy Schain support (#4465) --- dev-docs/bidders/vidoomy.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/vidoomy.md b/dev-docs/bidders/vidoomy.md index 39599b4779..aba41d2353 100644 --- a/dev-docs/bidders/vidoomy.md +++ b/dev-docs/bidders/vidoomy.md @@ -11,6 +11,7 @@ usp_supported: true coppa_supported: true pbs: true sidebarType: 1 +schain_supported: true --- ### Note: From d4a52676dd53b1b7a215873e56d2565bf377fb35 Mon Sep 17 00:00:00 2001 From: abermanov-zeta <95416296+abermanov-zeta@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:53:03 +0200 Subject: [PATCH 062/564] Documentation: Zeta Global SSP Prebid Server Adapter. (#4464) --- dev-docs/bidders/zeta_global_ssp.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/zeta_global_ssp.md b/dev-docs/bidders/zeta_global_ssp.md index 6acb845a27..f38f2430f1 100644 --- a/dev-docs/bidders/zeta_global_ssp.md +++ b/dev-docs/bidders/zeta_global_ssp.md @@ -1,11 +1,12 @@ --- layout: bidder -title: Zeta Global Ssp -description: Zeta Global Ssp Prebid Bidder Adapter +title: Zeta Global SSP +description: Zeta Global SSP Prebid Bidder Adapter pbjs: true +pbs: true biddercode: zeta_global_ssp deals_supported: false -media_types: banner +media_types: banner, video gdpr_supported: true usp_supported: true coppa_supported: true @@ -24,6 +25,8 @@ The Zeta Global SSP adapter requires setup and approval from the Zeta Global SSP ### Bid Params +#### Prebid.js Bid Params + {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |----------------------|----------|---------------------------------------------------------------------------------------------------------------------|--------------|-----------| @@ -35,3 +38,9 @@ The Zeta Global SSP adapter requires setup and approval from the Zeta Global SSP | `app` | optional | The object containing app data (See OpenRTB spec) | `app: {}` | `object` | | `bidfloor` | optional | The minimum bid value desired | `0.2` | `float` | | `test` | optional | Flag which will induce a sample bid response when true; only set to true for testing purposes (1 = true, 0 = false) | `1` | `integer` | + + +#### Prebid Server Bid Params + +Prebid Server Adapter does not support any parameters. +You must get `sid` and `shortname` values from Zeta Global and use them instead of placeholders in the URL. From 5c5da95e504df5c38a0164872d5e746c38a6ab1b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Tue, 11 Apr 2023 18:51:53 +0200 Subject: [PATCH 063/564] add greenbids analytics documentation (#4427) * add greenbids analytics documentation * fix typo and allow download --- dev-docs/analytics/greenbids.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 dev-docs/analytics/greenbids.md diff --git a/dev-docs/analytics/greenbids.md b/dev-docs/analytics/greenbids.md new file mode 100644 index 0000000000..189726a355 --- /dev/null +++ b/dev-docs/analytics/greenbids.md @@ -0,0 +1,33 @@ +--- +layout: analytics +title: Greenbids +description: Greenbids Analytics Adapter +modulecode: greenbids +prebid_member: false +enable_download: true +--- + +#### Registration + +The Greenbids Analytics adapter requires setup and approval from the +Greenbids team. Please reach out to our team for more information [https://greenbids.ai](https://greenbids.ai). + +#### Analytics Options + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------| +| pbuid | required | The Greenbids Publisher ID | greenbids-publisher-1 | string | +| sampling | optional | sampling factor [0-1] (a value of 0.1 will filter 90% of the traffic) | 0.5 | float | + +### Example Configuration + +``` + pbjs.enableAnalytics({ + provider: 'greenbids', + options: { + pbuid: "greenbids-publisher-1" // please contact Greenbids to get a pbuid for yourself + sampling: 1.0 + } + }); +``` From db6a0e70c955e3eaa3ede8309ec681d45728fb2b Mon Sep 17 00:00:00 2001 From: Patrick Loughrey Date: Tue, 11 Apr 2023 12:56:07 -0400 Subject: [PATCH 064/564] Triplelift: Update video parameters requirement (#4478) * TL-34447 Add GPP Support to Prebid.org * TL-27059: Added pDMP documentation * Update triplelift.md * Triplelift: Update video params --------- Co-authored-by: bretg --- dev-docs/bidders/triplelift.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md index a3e0a76272..109444a6e3 100644 --- a/dev-docs/bidders/triplelift.md +++ b/dev-docs/bidders/triplelift.md @@ -70,6 +70,7 @@ See the [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.ht | Name | Scope | Description | Example | Type | |-----------------|------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------|----------| | `adUnit.mediaTypes.video.placement` | required | Instream: 1; Outstream: 3, 4, 5. | `3` | `int` | +| `adUnit.mediaTypes.video.playerSize` | required | Video player dimensions or size in pixels | `[640, 480]` | `integer array` | From 59c97c65ddaa3fd753d6d696600a3b3f96ef67ab Mon Sep 17 00:00:00 2001 From: dzhang-criteo <87757739+dzhang-criteo@users.noreply.github.com> Date: Thu, 13 Apr 2023 15:43:52 +0200 Subject: [PATCH 065/564] Criteo: update doc (#4480) Specify support of GPP --- dev-docs/bidders/criteo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md index 02509f0379..c26f00e223 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -17,6 +17,7 @@ gvl_id: 91 coppa_supported: true multiformat_supported: will-bid-on-any sidebarType: 1 +gpp_supported: true --- ### Notes From a70d08e4287b52c9466a327ab4ffdad75779d1fd Mon Sep 17 00:00:00 2001 From: SmartyAdman <59048845+SmartyAdman@users.noreply.github.com> Date: Fri, 14 Apr 2023 00:27:50 +0300 Subject: [PATCH 066/564] Adman Adapter: text edit only (#4483) * Add adman dev doc * Change params Params required by new adapter setup * Edit docs Fix naming, use quotes around example * adding quotes to string param * Update adman.md * tcf2_supported: true * Update adman.md add usp support * Add api param for prebid servr adapter * updates for prebid 5.0, and support uid2 * add Lotame Panorama ID * add idx (UserID Module) * edit schain_support --------- Co-authored-by: minoru katogi Co-authored-by: ADman Media Co-authored-by: bretg Co-authored-by: Aiholkin --- dev-docs/bidders/adman.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/adman.md b/dev-docs/bidders/adman.md index 4bb430f057..55e07ac664 100644 --- a/dev-docs/bidders/adman.md +++ b/dev-docs/bidders/adman.md @@ -7,6 +7,7 @@ pbs: true biddercode: adman gdpr_supported: true usp_supported: true +schain_supported: true media_types: banner, video, native userIds: uid2, lotamePanoramaId, idx sidebarType: 1 From 16f228cf15c5dbb044de6d723b0c399c7c118090 Mon Sep 17 00:00:00 2001 From: Samuel Adu Date: Fri, 14 Apr 2023 14:13:44 +0100 Subject: [PATCH 067/564] Updated documentation for Yahoo ConnectID UserID module (#4456) Co-authored-by: slimkrazy --- dev-docs/modules/userid-submodules/yahoo.md | 94 +++++++++------------ 1 file changed, 38 insertions(+), 56 deletions(-) diff --git a/dev-docs/modules/userid-submodules/yahoo.md b/dev-docs/modules/userid-submodules/yahoo.md index f6e86cb903..706988b73e 100644 --- a/dev-docs/modules/userid-submodules/yahoo.md +++ b/dev-docs/modules/userid-submodules/yahoo.md @@ -5,41 +5,30 @@ description: Yahoo ConnectID User ID sub-module useridmodule: connectIdSystem --- -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. +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 higher monetization while respecting user privacy via multiple controls. -## Honoring Privacy Choices - -Yahoo ConnectID provides multiple mechanisms for users to manage their privacy choices. Users can manage their choices via [ConnectID Control Portal](http://connectid.yahoo.com), on the [Yahoo Privacy Dashboard](https://legal.yahoo.com/us/en/yahoo/privacy/dashboard/index.html) and [NAI’s Audience Matched Opt Out page](https://optout.networkadvertising.org/optout/email). No further actions are required by Publishers as Yahoo will ensure that privacy choices selected by users via one of these methods are honored. We will automatically stop generating ConnectIDs for users who have opted-out. - -When desired, additional privacy control can be provided to your users. Within your privacy policy or website privacy settings, [Create an Easy Opt-in Opt-out Toggle](https://documentation.help.yahooinc.com/platform/SSP/Sellers/Integrate/Create-an-Easy-OptIn-Optout-Toggle.htm) for ConnectID. - -Finally, ConnectID follows all global privacy laws (such as the CCPA) and industry frameworks (such as NAI, DAA and IAB). Yahoo will auto-detect most privacy signals present on the page (including those set by prebid libraries) and not generate a ConnectID for users that have opted-out. +Add support for Yahoo ConnectID to your Prebid.js package using: +{: .alert.alert-info :} +gulp build --modules=userId,connectIdSystem ## Yahoo ConnectID Registration -A Yahoo supplied publisher specific pixel Id is required. Please reach out to your account manager for assistance with setup. - -Add support for Yahoo ConnectID to your Prebid.js package with: - -{: .alert.alert-info :} -gulp build --modules=userId,connectIdSystem +A Yahoo-supplied publisher-specific pixel ID is required. Reach out to [connectid.support@yahooinc.com](mailto:connectid.support@yahooinc.com) for assistance with setup. ## Yahoo ConnectID Configuration +Note: Parameters are case-sensitive. ConnectID is the proper name of our product, however, when used in code it is spelled as connect**I**d. Follow the example in the table below.
| Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | -| name | Required | String | The name of this module. | `'connectId'` | +| name | Required | String | The name of this module. | `"connectId"` | | params | Required | Object | Container of all module params. || -| params.pixelId | Required | Number | The Yahoo supplied publisher specific pixel Id | `8976` | -| params.he | Optional | String | The SHA-256 hashed user email address. One of either the `he` parameter or the `puid` parameter must be supplied. |`'ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4'`| -| params.puid | Optional | String | The publisher-supplied user identifier. One of either the `he` parameter or the `puid` parameter must be supplied. | `"P-975484817"` | -| 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.expires | Recommended | Integer | How long (in days) the user ID information will be stored. The recommended value is `15` | `15` | +| params.pixelId | Required | Number | +The Yahoo-supplied publisher-specific pixel ID. | `"0000"` | +| params.he | Optional | String | The SHA-256 hashed user email address which has been lowercased prior to hashing. Pass both `he` and `puid` params if present, otherwise pass either of the two that is available. |`"ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"`| +| params.puid | Optional | String | The publisher supplied user identifier such as a first-party cookie. Pass both `he` and `puid` params if present, otherwise pass either of the two that is available. | `"ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c5880dba3baf9c1da"` | {: .table .table-bordered .table-striped }
@@ -47,19 +36,15 @@ gulp build --modules=userId,connectIdSystem ## Yahoo ConnectID Examples ``` -// [Sample #1]: Using a hashed email. +// [Sample #1]: Using a hashed email only. + pbjs.setConfig({ userSync: { userIds: [{ name: "connectId", params: { - pixelId: 8976, + pixelId: "0000", he: "ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4" - }, - storage: { - type: "html5", - name: "connectId", - expires: 15 } }] } @@ -67,42 +52,39 @@ pbjs.setConfig({ ``` ``` -// [Sample #2]: Using a publisher-supplied user identifier. -pbjs.setConfig({ - userSync: { - userIds: [{ - name: "connectId", - params: { - pixelId: 8976, - puid: "P-975484817" - }, - storage: { - type: "html5", - name: "connectId", - expires: 15 - } - }] - } -}) -``` +// [Sample #2]: Using a hashed email and a publisher-supplied user identifier such as a first-party cookie. -``` -// [Sample #3]: Using a hashed email and a publisher-supplied user identifier. pbjs.setConfig({ userSync: { userIds: [{ name: "connectId", params: { - pixelId: 8976, + pixelId: "0000", he: "ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4", - puid: "P-975484817" - }, - storage: { - type: "html5", - name: "connectId", - expires: 15 + puid: "ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c580dba3baf9c1da" } }] } }) ``` + +## Honoring Privacy Choices + +Yahoo ConnectID provides multiple mechanisms for users to manage their privacy choices. Users can manage their choices via [ConnectID Control Portal](http://connectid.yahoo.com), on the [Yahoo Privacy Dashboard](https://legal.yahoo.com/us/en/yahoo/privacy/dashboard/index.html) and [NAI’s Audience Matched Opt Out page](https://optout.networkadvertising.org/optout/email). No further actions are required by Publishers as Yahoo will ensure that privacy choices selected by users via one of these methods are honored. We will automatically stop generating ConnectIDs for users who have opted-out. + +When desired, additional privacy control can be provided to your users. Within your privacy policy or website privacy settings, [Create an Easy Opt-in Opt-out Toggle](https://documentation.help.yahooinc.com/platform/SSP/Sellers/Integrate/Create-an-Easy-OptIn-Optout-Toggle.htm) for ConnectID. + +Finally, ConnectID follows all global privacy laws (such as the CCPA) and industry frameworks (such as NAI, DAA and IAB). Yahoo will auto-detect most privacy signals present on the page (including those set by Prebid libraries) and not generate a ConnectID for users that have opted-out. + +## Yahoo ConnectID Optional Parameters +Please note that the storage related parameters are optional. We recommend that you omit them, since ConnectID module is pre-configured with the most optimal storage parameters already. + +
+| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| storage | Optional | Object | Defines where and for how long the results of the call to get a user ID will be stored. | | +| storage.type | Optional | String | Defines where the resolved user ID will be stored (either `'cookie'` or `'html5'` local storage).| `'cookie'` | +| storage.name | Optional | String | The name of the cookie or html5 local storage where the resolved user ID will be stored. | `'connectId'` | +| storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `15` | +{: .table .table-bordered .table-striped } +
From f5cdf0cc7033458839265d26694958a6f6486124 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 14 Apr 2023 06:25:05 -0700 Subject: [PATCH 068/564] PBJS: document new option for RTD submodules (#4467) --- dev-docs/add-rtd-submodule.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/dev-docs/add-rtd-submodule.md b/dev-docs/add-rtd-submodule.md index 7ac56b2ad1..b2c118c06b 100644 --- a/dev-docs/add-rtd-submodule.md +++ b/dev-docs/add-rtd-submodule.md @@ -90,13 +90,14 @@ In order to let RTD-core know where to find the functions in your sub-module, cr | param name | type | Scope | Description | Params | | :------------ | :------------ | :------ | :------ | :------ | | name | string | required | must match the name provided by the publisher in the on-page config | n/a | -| init | function | required | defines the function that does any auction-level initialization required | config, userConsent | -| getTargetingData | function | optional | defines a function that provides ad server targeting data to RTD-core | adUnitArray, config, userConsent | -| getBidRequestData | function | optional | defines a function that provides bid request data to RTD-core | reqBidsConfigObj, callback, config, userConsent | -| onAuctionInitEvent | function | optional | listens to the AUCTION_INIT event and calls a sub-module function that lets it inspect and/or update the auction | auctionDetails, config, userConsent | -| onAuctionEndEvent | function |optional | listens to the AUCTION_END event and calls a sub-module function that lets it know when auction is done | auctionDetails, config, userConsent | -| onBidRequestEvent | function |optional | listens to the BID_REQUESTED event and calls a sub-module function that lets it know when a bid is about to be requested | bidRequest, config, userConsent | -| onBidResponseEvent | function |optional | listens to the BID_RESPONSE event and calls a sub-module function that lets it know when a bid response has been collected | bidResponse, config, userConsent | +| gvlid | number | optional | global vendor list ID for your submodule | n/a | +| init | function | required | defines the function that does any auction-level initialization required | config, userConsent | +| getTargetingData | function | optional | defines a function that provides ad server targeting data to RTD-core | adUnitArray, config, userConsent | +| getBidRequestData | function | optional | defines a function that provides bid request data to RTD-core | reqBidsConfigObj, callback, config, userConsent | +| onAuctionInitEvent | function | optional | listens to the AUCTION_INIT event and calls a sub-module function that lets it inspect and/or update the auction | auctionDetails, config, userConsent | +| onAuctionEndEvent | function |optional | listens to the AUCTION_END event and calls a sub-module function that lets it know when auction is done | auctionDetails, config, userConsent | +| onBidRequestEvent | function |optional | listens to the BID_REQUESTED event and calls a sub-module function that lets it know when a bid is about to be requested | bidRequest, config, userConsent | +| onBidResponseEvent | function |optional | listens to the BID_RESPONSE event and calls a sub-module function that lets it know when a bid response has been collected | bidResponse, config, userConsent | For example: {% highlight text %} From 43ddf51c6d8e192d48053ea356c94c5b4327f8bd Mon Sep 17 00:00:00 2001 From: Brett Bloxom <38990705+BrettBlox@users.noreply.github.com> Date: Fri, 14 Apr 2023 07:41:37 -0600 Subject: [PATCH 069/564] Updates documentation for concert gpp support (#2) (#4437) --- dev-docs/bidders/concert.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/concert.md b/dev-docs/bidders/concert.md index d9a45e8787..79a6bdbab2 100644 --- a/dev-docs/bidders/concert.md +++ b/dev-docs/bidders/concert.md @@ -8,6 +8,7 @@ biddercode: concert media_types: banner gdpr_supported: true usp_supported: true +gpp_supported: true sidebarType: 1 --- From 986885a050610b6a188f444cd69a5d21c4a136b7 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Fri, 14 Apr 2023 11:21:47 -0400 Subject: [PATCH 070/564] Update firstPartyData.md (#4468) --- features/firstPartyData.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/features/firstPartyData.md b/features/firstPartyData.md index bcca76f29c..02b8b2f1f8 100644 --- a/features/firstPartyData.md +++ b/features/firstPartyData.md @@ -75,15 +75,13 @@ pbjs.setConfig({ }] }, ext: { - data: { // fields that aren't part of openrtb 2.5 + data: { // fields that aren't part of openrtb 2.6 pageType: "article", category: "repair" } } }, user: { - yob: 1985, - gender: "m", keywords: "a,b", data: [{ name: "dataprovider.com", @@ -169,6 +167,30 @@ pbjs.addAdUnits({ }); {% endhighlight %} +Another case is [declaring rewarded](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/422eedb76e8730c89dcac75c7427c18cfa10e8c4/2.6.md?plain=1#L993). Here is how one might do that: + + +{% highlight js %} +pbjs.addAdUnits({ + code: "test-div-rewarded", + mediaTypes: { + banner: { + sizes: [[300,250]] + } + }, + ortb2Imp: { + rwdd: 1, + ext: { + data: { + pbadslot: "my-rewarded-rectangle", + adUnitSpecificAttribute: "123" + } + } + }, + ... +}); +{% endhighlight %} + You may also specify adUnit-specific transaction IDs using `ortb2Imp.ext.tid`, and Prebid will use them instead of generating random new ones. This is useful if you are auctioning the same slots through multiple header bidding libraries. Note: you must take care to not re-use the same transaction IDs across different ad units or auctions. Here's a simplified example passing a tid through the [requestBids](/dev-docs/publisher-api-reference/requestBids.html) function: {% highlight js %} From 56a37de05d24be7d64ffacd2e930213d44010f6d Mon Sep 17 00:00:00 2001 From: Gaudeamus Date: Fri, 14 Apr 2023 18:40:11 +0300 Subject: [PATCH 071/564] update mgid adapter adding support of user sync & ortb2 (#4463) Co-authored-by: gaudeamus --- dev-docs/bidders/mgid.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/dev-docs/bidders/mgid.md b/dev-docs/bidders/mgid.md index 8f76587903..d52a4baf94 100644 --- a/dev-docs/bidders/mgid.md +++ b/dev-docs/bidders/mgid.md @@ -7,7 +7,11 @@ pbs: true biddercode: mgid media_types: banner,native gdpr_supported: true +usp_supported: true gvl_id: 358 +floors_supported: true +ortb_blocking_supported: partial +multiformat_supported: will-bid-on-any sidebarType: 1 --- @@ -17,6 +21,7 @@ sidebarType: 1 - [Description](#description) - [Bid params](#bid-params) - [Test Parameters](#test-parameters) +- [User Sync](#user-sync)
@@ -114,3 +119,36 @@ var adUnits = [{ }] }]; ``` + + + +### User Sync + +Mgid recommends UserSync configuration to be enabled. Without it, Mgid adapter will not be able to perform user syncs, which lowers match rate and reduces monetization. + +For Prebid.js v1.15.0 and later: + +```javascript +pbjs.setConfig({ + userSync: { + filterSettings: { + iframe: { + bidders: '*', // '*' represents all bidders + filter: 'include' + } + } + } +}); +``` + +For Prebid.js v1.14.0 and before: + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + enabledBidders: ['mgid'] + }}); +``` + +Note: Combine the above configuration with any other UserSync configuration. Multiple setConfig() calls overwrite each other and only the last call for a given attribute will take effect. From 314a080fedf3aa2b4e691ab152bd06770eb290da Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Fri, 14 Apr 2023 12:14:01 -0700 Subject: [PATCH 072/564] documentation for batch video cache requests (#4453) --- dev-docs/publisher-api-reference/setConfig.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index 916815fcd4..eadf9a5fad 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -1204,6 +1204,8 @@ be retrieved. There are two different flows possible with Prebid.js around VAST | cache.timeout | no | number | Timeout (in milliseconds) for network requests to the cache | | cache.vasttrack | no | boolean | Passes additional data to the url, used for additional event tracking data. Defaults to `false`. | | cache.ignoreBidderCacheKey | no | boolean | If the bidder supplied their own cache key, setting this value to true adds a VAST wrapper around that URL, stores it in the cache defined by the `url` parameter, and replaces the original video cache key with the new one. This can dramatically simplify ad server setup because it means all VAST creatives reside behind a single URL. The tradeoff: this approach requires the video player to unwrap one extra level of VAST. Defaults to `false`. | +| cache.batchSize | no | number | Enables video cache requests to be batched by a specified amount (defaults to 1) instead of making a single request per each video. | +| cache.batchTimeout | no | number | Used in conjunction with `batchSize`, `batchTimeout` specifies how long to wait in milliseconds before sending a batch video cache request based on the value for `batchSize` (if present). A batch request will be made whether the `batchSize` amount was reached or the `batchTimeout` timer runs out. `batchTimeout` defaults to 0. | Here's an example of basic client-side caching. Substitute your Prebid Cache URL as needed: @@ -1250,6 +1252,25 @@ Setting the `vasttrack` parameter to `true` supplies the POST made to the `/vtra Prebid Server endpoint with a couple of additional parameters needed by the analytics system to join the event to the original auction request. +Optionally, `batchSize` and `batchTimeout` can be utlilized as illustrated with the example below: + +{% highlight js %} +pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache', + batchSize: 4, + batchTimeout: 50 + } +}); +{% endhighlight %} + +The example above states that a timer will be initialized and wait up to 50ms for 4 responses to have been collected and then will fire off one batch video cache request for all 4 responses. Note that the batch request will be made when the specified `batchSize` number is reached or with the number of responses that could be collected within the timeframe specified by the value for `batchTimeout`. + +If a batchSize is set to 2 and 5 video responses arrive (within the timeframe specified by `batchTimeout`), then three batch requests in total will be made: +1. Batch 1 will contain cache requests for 2 videos +2. Batch 2 will contain cache requests for 2 videos +3. Batch 3 will contain cache requests for 1 video + #### Instream tracking From 3d94d938b8c38499426854edb2fd92f94335d177 Mon Sep 17 00:00:00 2001 From: Elad Yosifon Date: Fri, 14 Apr 2023 23:02:43 +0300 Subject: [PATCH 073/564] Update KueezRTB and Kueez docs (#4461) * Update KueezRTB and Kueez docs * Update KueezRTB and Kueez docs --- dev-docs/bidders/kueez.md | 72 +++--------------------------------- dev-docs/bidders/kueezrtb.md | 40 +++++++++++++++++++- 2 files changed, 44 insertions(+), 68 deletions(-) diff --git a/dev-docs/bidders/kueez.md b/dev-docs/bidders/kueez.md index f782abee2b..033c909359 100644 --- a/dev-docs/bidders/kueez.md +++ b/dev-docs/bidders/kueez.md @@ -1,6 +1,6 @@ --- layout: bidder -title: Kueez +title: Kueez (Go To KueezRTB) description: Prebid Kueez Bidder Adapter multiformat_supported: will-bid-on-any pbjs: true @@ -15,69 +15,9 @@ fpd_supported: true sidebarType: 1 --- -### Note +### IMPORTANT NOTICE! +**TL;DR** +The `kueez` adapter is currently "on hold" in favor of `kueezrtb`. +Please contact your Account Manager/Executive for details. -The Kueez adapter requires setup and approval. Please reach out to prebid@kueez.com. - -### Bid Parameters - -#### Banner, Video - -{: .table .table-bordered .table-striped } -| Name | Scope | Type | Description | Example -| ---- | ----- | ---- | ----------- | ------- -| `org` | required | String | the organization Id provided by your Kueez representative | "test-org-id" -| `floorPrice` | optional | Number | Minimum price in USD. Misuse of this parameter can impact revenue | 1.5 -| `placementId` | optional | String | A unique placement identifier | "12345678" -| `testMode` | optional | Boolean | This activates the test mode | false - -## Example - ```javascript -var adUnits = [{ - code: 'banner-div', - mediaTypes: { - banner: { - sizes: [ - [300, 250], - [728, 90] - ] - } - }, - bids: [{ - bidder: 'kueez', - params: { - org: 'test-org-id', // Required - floorPrice: 1.2, // Optional - placementId: '12345678', // Optional - testMode: true // Optional - } - }] - }, - { - code: 'dfp-video-div', - sizes: [ - [640, 480] - ], - mediaTypes: { - video: { - playerSize: [ - [640, 480] - ], - context: 'instream' - } - }, - bids: [{ - bidder: 'kueez', - params: { - org: 'test-org-id', // Required - floorPrice: 1.50, // Optional - placementId: '12345678', // Optional - testMode: true // Optional - } - }] - } -]; -``` - -### Configuration -Kueez recommends setting UserSync by iframe for monetization. +Go To KueezRTB diff --git a/dev-docs/bidders/kueezrtb.md b/dev-docs/bidders/kueezrtb.md index 2ef4bc25ad..36e944d5e5 100644 --- a/dev-docs/bidders/kueezrtb.md +++ b/dev-docs/bidders/kueezrtb.md @@ -31,5 +31,41 @@ sidebarType: 1 |------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| | `cId` | required | The connection ID from KueezRTB. | `'562524b21b1c1f08117fc7f9'` | `string` | | `pId` | required | The publisher ID from KueezRTB. | `'59ac17c192832d0011283fe3'` | `string` | -| `bidFloor` | required | The minimum bid value desired. KueezRTB will not respond with bids lower than this value. | `0.90` | `float` | -| `subDomain`| optional | Sets the server subdomain, default: 'exchange'. | `'exchange'` | `string` | +| `bidFloor` | optional | The minimum bid value desired. KueezRTB will not respond with bids lower than this value. | `0.90` | `float` | + + +## Example + ```javascript +var adUnits = [{ + code: 'banner-div', + mediaTypes: { + banner: { + sizes: [ + [300, 250], + [728, 90] + ] + } + }, + bids: [{ + bidder: 'kueezrtb', + params: { + cId: '562524b21b1c1f08117fc7f9', // Required - PROVIDED DURING SETUP... + pId: '59ac17c192832d0011283fe3', // Required - PROVIDED DURING SETUP... + bidFloor: 1.23 // Optional + } + }] + } +]; + +// configure pbjs to enable user syncing +pbjs.setConfig({ + userSync: { + filterSettings: { + iframe: { + bidders: 'kueezrtb', + filter: 'include' + } + } + } +}); +``` \ No newline at end of file From 94bfc23351d74319eccc0cb819ac67bf082042f1 Mon Sep 17 00:00:00 2001 From: brushmate Date: Sat, 15 Apr 2023 19:58:47 +0200 Subject: [PATCH 074/564] Update Yieldab docs (#4484) --- dev-docs/bidders/yieldlab.md | 84 +++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 26 deletions(-) diff --git a/dev-docs/bidders/yieldlab.md b/dev-docs/bidders/yieldlab.md index f3335f6168..0532c1b051 100644 --- a/dev-docs/bidders/yieldlab.md +++ b/dev-docs/bidders/yieldlab.md @@ -27,35 +27,67 @@ sidebarType: 1 ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|----------------|----------|---------------------------------------------------------------------------------------|---------------------------------------------|----------| -| `adslotId` | required | Yieldlab Adslot ID | `'12345'` | `string` | -| `supplyId` | required | Yieldlab Supply ID. Please reach out to your account management for more information. | `'12345'` | `string` | -| `targeting` | optional | Key-Value Targeting | `{ 'key1': 'value1', 'key2': 'value2' }` | `object` | -| `extId` | optional | External Id | `'abc'` | `string` | +| Name | Scope | Description | Example | Type | +|----------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------|----------| +| `adslotId` | required | Yieldlab Adslot ID | `'12345'` | `string` | +| `supplyId` | required | Yieldlab Supply ID. Please reach out to your account management for more information. | `'12345'` | `string` | +| `targeting` | optional | Key-Value Targeting | `{ 'key1': 'value1', 'key2': 'value2' }` | `object` | +| `extId` | optional | External Id | `'abc'` | `string` | | `iabContent` | optional | Object of content information, see [IAB Content Object](#iab_content) for details. It will override the content object passed in [First Party Data](https://docs.prebid.org/features/firstPartyData.html) | `{ 'id': 'foo', 'title': 'bar' }` | `object` | -| `customParams` | optional | Custom parameters to append to the query string of the bidding endpoint. | `{ 'param': 'value1', 'param2': 'value2' }` | `object` | +| `customParams` | optional | Custom parameters to append to the query string of the bidding endpoint. | `{ 'param': 'value1', 'param2': 'value2' }` | `object` | - + #### IAB Content Object -Yieldlab supports passing the IAB content object in correspond to the OpenRTB Specifications. -The following attributes are supported, and all of them are optional. +Yieldlab supports passing the IAB content object according to section *3.2.16* +of the [OpenRTB 2.6 specification][openrtb-spec]. The following attributes are +supported, and all of them are optional: -{: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|----------------|----------|-----------------------------------------------------------------------------------------------|---------------------------------------------|------------------| -| `id` | optional | Id uniquely identifying the content | `'12345'` | `string` | -| `episode` | optional | Episode number | `'42'` | `string` | -| `title` | optional | Content title | `'some title'` | `string` | -| `series` | optional | Content series | `'some series'` | `string` | -| `season` | optional | Content season | `'s1'` | `string` | -| `artist` | optional | Artist credited with the content | `'John Doe'` | `string` | -| `genre` | optional | Genre that best describes the content | `'some genre'` | `string` | -| `isrc` | optional | International Standard Recording Code conforming to ISO3901 | `'CC-XXX-YY-NNNNN'` | `string` | -| `url` | optional | URL of the content, for buy-side contextualization or review | `'https://yieldlab.com'` | `string` | -| `cat` | optional | Array of IAB content categories that describe the content producer | `['IAB1-1', 'IAB1-2']` | `Array` | -| `context` | optional | Type of content - 1: video, 2: game, 3: music, 4: application, 5: text, 6: other, 7: unknown | `'7'` | `string` | -| `keywords` | optional | Array of keywords describing the content | `['k1', 'k2', 'k3']` | `Array` | -| `live` | optional | 0 = not live, 1 = content is live | `'0'` | `string` | +* `id` +* `episode` +* `title` +* `series` +* `season` +* `artist` +* `genre` +* `album` +* `isrc` +* `producer` + * `id` + * `name` + * `cattax` + * `cat` + * `domain` +* `url` +* `cattax` +* `cat` +* `prodq` +* `context` +* `contentrating` +* `userrating` +* `qagmediarating` +* `keywords` +* `livestream` +* `sourcerelationship` +* `len` +* `language` +* `embeddable` +* `data` + * `id` + * `name` + * `segment` + * `id` + * `name` + * `value` + * `ext` +* `network` + * `id` + * `name` + * `domain` +* `channel` + * `id` + * `name` + * `domain` + +[openrtb-spec]: https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf \ No newline at end of file From b5ff4e4c5872c5c3f524a86a36987d8f0c2cfb84 Mon Sep 17 00:00:00 2001 From: DridgerVE <33929311+DridgerVE@users.noreply.github.com> Date: Sat, 15 Apr 2023 21:03:04 +0300 Subject: [PATCH 075/564] Yandex adapter: add pbs support (#4479) --- dev-docs/bidders/yandex.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/yandex.md b/dev-docs/bidders/yandex.md index 9dac8bff08..86ad047eeb 100644 --- a/dev-docs/bidders/yandex.md +++ b/dev-docs/bidders/yandex.md @@ -3,8 +3,9 @@ layout: bidder title: Yandex description: Prebid Yandex Bidder Adapter pbjs: true +pbs: true biddercode: yandex -media_types: banner +media_types: banner, native sidebarType: 1 --- From 3c8cf8cf159989fad11a28a39fb3edd12b625672 Mon Sep 17 00:00:00 2001 From: Viktor Dreiling <34981284+3link@users.noreply.github.com> Date: Sat, 15 Apr 2023 21:48:50 +0200 Subject: [PATCH 076/564] Add information about EIDS support for attributes resolved by LI's user id module (#4477) * Add information about EIDS support for attributes resolved by LI's user id module * Better describe the case of returning multiple ids * Improve example * Fix typo * Be more precise * Clean-up * Improve wording resolved vs. requested * Add section * Adjust section's title * Wording * Add an example * Remove duplication * Polish text --------- Co-authored-by: Viktor Dreiling --- .../modules/userid-submodules/liveintent.md | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index e06e309e9c..8f0cc8dbdf 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -47,15 +47,56 @@ The first-party cookie generation and identity resolution functionality is provi The LiveIntent ID sub-module follows the standard Prebid.js initialization based on the GDPR consumer opt-out choices. With regard to CCPA, the LiveConnect JS receives a us_privacy string from the Prebid US Privacy Consent Management Module and respects opt-outs. -## Resolving uid2 +## Configuring requested attributes -Attributes other than the nonID can be requested using the requestedAttributesOverrides configuration option. +Attributes other than the nonID can be requested using the `requestedAttributesOverrides` configuration option. -One attribute that requires special mention here is 'uid2'. If this attribute is resolved by the id module -it will be exposed in the same format as from the Unified ID 2.0 userid module. If both the LiveIntent module -and the uid2 module manage to resolve an uid2, the one from the uid2 module will be used. -Enabling this option in addition to the uid2 module is an easy way to increase your uid2 resolution rates. -Example configuration to enable uid2 resolution: +For example, with the configuration below, the nonID as well as 'uid2', the 'medianet' id and the 'bidswitch' id will be requested: + +{% highlight javascript %} +pbjs.setConfig({ + userSync: { + userIds: [{ + "name": "liveIntentId", + "params": { + "publisherId": "12432415", + "requestedAttributesOverrides": {'uid2': true, 'medianet': true, 'bidswitch': true}, + }, + }] + } +}); +{% endhighlight %} + +### Multiple user ids + +The attributes 'uid2', 'medianet' or 'bidswitch' are treated specially by LiveIntent's user id sub-module. Each of these three attributes will result in a separate id returned by the sub-module. + +For example, in case 'uid2' is configured to be requested - additionally to the nonID - the `request.userId` object would look like this: + +{% highlight javascript %} +``` +{ + ... + "lipb" : { + "lipbid": "sample-nonid-value", + "segments": ["999"], + "uid2" : "sample-uid2-value" + }, + "uid2" : { + "id" : "sample-uid2-value" + } + ... +} +``` +{% endhighlight %} + +Note that 'uid2' is exposed as part of 'lipb' as well as separately as 'uid2'. 'medianet' and 'bidswitch' behave the same way. + +For the attributes 'lipbid' (nonID), 'uid2', 'medianet' and 'bidswitch' there is also support for their conversion into OpenRTB EIDS format. Please refer to [userId.md](../userId.md) for more information on conversion and [eids.md](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md) for output format examples. + +### Requesting uid2 + +An attribute that requires special mention here is 'uid2'. If this attribute is resolved by the id sub-module, it will be exposed in the same format as from the Unified ID 2.0 user id module. If both the LiveIntent module and the uid2 module manage to resolve an uid2, the one from the uid2 module will be used. Enabling this option in addition to the uid2 module is an easy way to increase your uid2 resolution rates. Example configuration to enable uid2 resolution: {% highlight javascript %} pbjs.setConfig({ From 5adc23ff0f33b6179f5c86ecca3f2481efd60f28 Mon Sep 17 00:00:00 2001 From: Sonali-More-Xandr <87759626+Sonali-More-Xandr@users.noreply.github.com> Date: Sun, 16 Apr 2023 01:27:12 +0530 Subject: [PATCH 077/564] remove oftmedia_server.md file (#4469) --- dev-docs/bidders/oftmedia_server.md | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 dev-docs/bidders/oftmedia_server.md diff --git a/dev-docs/bidders/oftmedia_server.md b/dev-docs/bidders/oftmedia_server.md deleted file mode 100644 index 34dabd86f6..0000000000 --- a/dev-docs/bidders/oftmedia_server.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: bidder -title: One Fifty Two Media Server -description: Prebid Server One Fifty Two Media Bidder Adaptor -pbjs: false -biddercode: oftmedia -aliasCode : adtelligent -gdpr_supported: true -coppa_supported: true -usp_supported: true -pbs: true -schain_supported: true -media_types: banner, video -prebid_member: true -userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId -safeframes_ok: true -gvl_id: 1111 -sidebarType: 1 ---- - -### Bid Params - -{: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|-------|----------|---------------------------------|----------|-----------| -| `aid` | required | The source ID from OftMedia. | `350975` | `integer` | From 43b7b7274bc93485a29be09ca9b1525e4e9c25b0 Mon Sep 17 00:00:00 2001 From: Eyvaz Ahmadzada <62054743+eyvazahmadzada@users.noreply.github.com> Date: Sun, 16 Apr 2023 00:39:46 +0400 Subject: [PATCH 078/564] IntentIQ: add analytics and update id submodule docs (#4450) * added: docs for intentIQ analytics adapter * update intentIQ ID system docs --- dev-docs/analytics/intentiq.md | 21 ++++ .../modules/userid-submodules/intentiq.md | 116 +++++++----------- 2 files changed, 65 insertions(+), 72 deletions(-) create mode 100644 dev-docs/analytics/intentiq.md diff --git a/dev-docs/analytics/intentiq.md b/dev-docs/analytics/intentiq.md new file mode 100644 index 0000000000..a0e7b1cc5c --- /dev/null +++ b/dev-docs/analytics/intentiq.md @@ -0,0 +1,21 @@ +--- +layout: analytics +title: IntentIQ +description: IntentIQ Analytics Adapter +modulecode: intentiq +--- + +### Description + +By using this Intent IQ adapter, you will be able to obtain comprehensive analytics and metrics regarding the performance of the Intent IQ Unified ID module. This includes how the module impacts your revenue, CPMs, and fill rates related to bidders and domains. + +#### Intent IQ Universal ID Registration + +No registration for this module is required. + +#### Intent IQ Universal ID Configuration + +IMPORTANT: requires Intent IQ Universal ID module be installed and configured. [(How-To)](https://docs.prebid.org/dev-docs/modules/userid-submodules/intentiq.html) + +No additional configuration for this module is required. We will use the configuration provided for Intent IQ Universal IQ module. + diff --git a/dev-docs/modules/userid-submodules/intentiq.md b/dev-docs/modules/userid-submodules/intentiq.md index 4a99dc6f03..6c7487b868 100644 --- a/dev-docs/modules/userid-submodules/intentiq.md +++ b/dev-docs/modules/userid-submodules/intentiq.md @@ -5,97 +5,68 @@ description: Intent IQ ID User ID sub-module useridmodule: intentIqIdSystem --- +# Intent IQ Universal ID module -Intent IQ’s universal ID with its unparalleled coverage of over 80% of ad inventory, protects publishers’ ability to rely on advertising as their main revenue source while preserving user privacy in a third party cookieless world. +By leveraging the Intent IQ identity graph, our module helps publishers, SSPs, and DSPs overcome the challenges of monetizing cookie-less inventory and preparing for a future without 3rd-party cookies. Our solution implements 1st-party data clustering and provides Intent IQ person IDs with over 90% coverage and unmatched accuracy in supported countries while remaining privacy-friendly and CCPA compliant. This results in increased CPMs, higher fill rates, and, ultimately, lifting overall revenue -The universal ID is an Intent IQ generated alphanumeric characters ID representing a person. This ID is not matched with personal information and remains anonymous to Intent IQ. +# All you need is a few basic steps to start using our solution. -Intent IQ universal ID enables partners - publishers, SSPs, DSPs, DMPs and advertisers to support, in a privacy-friendly way, and on a person level, core elements of the advertising business model - +## Registration -- Targeting across sites and devices -- Frequency capping -- Attribution measurement across sites and devices +Navigate to [our portal ](https://www.intentiq.com/) and contact our team for partner ID. +check our [documentation](https://pbmodule.documents.intentiq.com/) to get more information about our solution and how utilze it's full potential -Intent IQ's universal ID works across IP addresses and user-agent changes. - -Intent IQ's universal ID truly stands out in the coverage and accuracy it provides. Intent IQ's universal ID covers over 80% of ad inventory with 90% accuracy. By contrast, third-party cookies offer 56% coverage and log-in solutions offer coverage of less than 20%. +## Integration +{: .alert.alert-info :} +gulp build –modules=intentIqIdSystem -Add it to your Prebid.js package with: +We recommend including the Intent IQ Analytics adapter module for improved visibility -{: .alert.alert-info :} -gulp build --modules=intentIqIdSystem +## Configuration -## Intent IQ ID Registration +### Parameters -You can set up Intent IQ ID by contacting our operations team at [Intent IQ Contact Us](https://www.intentiq.com/contact-us) and getting your partner id. +Please find below list of parameters that could be used in configuring Intent IQ Universal ID module -The Intent IQ ID privacy is covered under the [Intent IQ Privacy Policy](https://www.intentiq.com/technology-privacy-policy). -## Intent IQ ID Configuration {: .table .table-bordered .table-striped } -| Param under userSync.userIds[] | Scope | Type | Description | Example | -| --- | --- | --- | --- | --- | -| name | Required | String | `"intentIqId"` | `"intentIqId"` | -| params | Required for IntentIqId | Object | Details for IntentIqId initialization. | | -| params.partner | Required | String | This is the partner ID value obtained from registering with IntentIQ. | `"1177538"` | -| params.pcid | Optional | String | This is the partner cookie ID, it is a dynamic value attached to the request. | `"g3hC52b"` | -| params.pai | Optional | String | This is the partner customer ID / advertiser ID, it is a dynamic value attached to the request. | `"advertiser1"` | - -{: .alert.alert-info :} -**NOTE:** The Intent IQ ID is encrypted with a key that changes every several hours. Demand partners utilize the latest key to decrypt the ID and use it. Therefore, to enable demand partners have an ID they can use, we highly recommend calling Intent IQ every 4 hours by setting storage.refreshInSeconds to 4 hours (4*3600 seconds) -## Intent IQ ID Examples +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| ------------------------------ | -------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | +| name | Required | String | The name of this module: "intentIqId" | `"intentIqId"` | +| params | Required | Object | Details for IntentIqId initialization. | | +| params.partner | Required | Number | This is the partner ID value obtained from registering with IntentIQ. | `1177538` | +| params.percentage | Required | Number | This a percentage value for our A/B testing group distribution. The values supposed to be in range of 0 to 100. We suggest to set it to 95 percent for optimal balance ofbetween prefromance and preceision. | `95` | +| params.pcid | Optional | String | This is the partner cookie ID, it is a dynamic value attached to the request. | `"g3hC52b"` | +| params.pai | Optional | String | This is the partner customer ID / advertiser ID, it is a dynamic value attached to the request. | `"advertiser1"` | -1) Publisher has a partner ID from Intent IQ and cookies. +### Configuration example -{: .alert.alert-warning :} {% highlight javascript %} pbjs.setConfig({ - userSync: { - userIds: [{ - name: "intentIqId", - params: { - partner: 123456 // valid partner id - }, - storage: { - type: "cookie", - name: "intentIqId", // create a cookie with this name - expires: 60, // cookie can last for 60 days - refreshInSeconds: 4*3600 // refresh ID every 4 hours to ensure it's fresh -} - }], - syncDelay: 3000 // 3 seconds after the first auction - } + userSync: { + userIds: [ + { + name: "intentIqId", + params: { + partner: 123456, // valid partner id + percentage: 95, + }, + storage: { + type: "html5", + name: "intentIqId", // set localstorage with this name + expires: 60, + refreshInSeconds: 4 * 3600, // refresh ID every 4 hours to ensure it's fresh + }, + }, + ], + syncDelay: 3000, + }, }); {% endhighlight %} -2) Publisher supports Intent IQ and HTML5 local storage. - -{% highlight javascript %} -pbjs.setConfig({ - userSync: { - userIds: [{ - name: "intentIqId", - params: { - partner: 123456 // valid partner id - }, - storage: { - type: "html5", - name: "intentIqId", // set localstorage with this name - expires: 60, - refreshInSeconds: 4*3600 // refresh ID every 4 hours to ensure it's fresh - } - }], - syncDelay: 3000 - } -}); -{% endhighlight %} - - -3) Publisher supports IntentIQ and HTML5 local storage with extra dynamic params such as 'pcid' and 'pai'. - {% highlight javascript %} pbjs.setConfig({ userSync: { @@ -103,8 +74,9 @@ pbjs.setConfig({ name: "intentIqId", params: { partner: 123456 // valid partner id - pcid: PCID_VARIABLE // string value, dynamically loaded into a variable before setting the configuration - pai: PAI_VARIABLE // string value, dynamically loaded into a variable before setting the configuration + pcid: PCID_VARIABLE, // string value, dynamically loaded into a variable before setting the configuration + pai: PAI_VARIABLE , // string value, dynamically loaded into a variable before setting the configuration + percentage: 95 }, storage: { type: "html5", @@ -115,4 +87,4 @@ pbjs.setConfig({ syncDelay: 3000 } }); -{% endhighlight %} +{% endhighlight %} \ No newline at end of file From 43962592228a51b7d9c4f5a94c73e1dc93b8585a Mon Sep 17 00:00:00 2001 From: JulieLorin Date: Sat, 15 Apr 2023 22:45:35 +0200 Subject: [PATCH 079/564] FPD Enrichment: use low entropy method by default to fetch user agent data (#4447) --- dev-docs/modules/enrichmentFpdModule.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md index 26f84e6657..f86b80b5fd 100644 --- a/dev-docs/modules/enrichmentFpdModule.md +++ b/dev-docs/modules/enrichmentFpdModule.md @@ -55,7 +55,8 @@ At the beginning of each auction, this module merges a number of values into the ### User agent client hints -The module populates `device.sua` with UA client hints retrieved from `navigator.userAgentData`. By default, it asks for [every available high entropy hint](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData#returning_high_entropy_values); you may specify the list of hints with the `uaHints` option: + +The module populates `device.sua` with UA client hints retrieved from `navigator.userAgentData`. By default, it won't ask for any high entropy hint. You can specify the list of hints using the `uaHints` option with [any available high entropy hint](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData#returning_high_entropy_values): ```javascript pbjs.setConfig({ @@ -68,7 +69,7 @@ pbjs.setConfig({ }) ``` -If `uaHints` is set to an empty array, the module will not attempt to retrieve any high entropy hint and use only the available low-entropy values. +If `uaHints` is set to an empty array or is not set, the module will not attempt to retrieve any high entropy hint and use only the available low-entropy values. # Related Reading - [Prebid.js First Party Data feature](/features/firstPartyData.html) From f3bd494df043f3dbee8ff618f6614b4a28d10379 Mon Sep 17 00:00:00 2001 From: v-dridger <123445033+v-dridger@users.noreply.github.com> Date: Sat, 15 Apr 2023 23:49:57 +0300 Subject: [PATCH 080/564] Intertech: creating doc for new server adapter (#4446) * Intertech: creating doc for new server adapter * fix --- dev-docs/bidders/intertech.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 dev-docs/bidders/intertech.md diff --git a/dev-docs/bidders/intertech.md b/dev-docs/bidders/intertech.md new file mode 100644 index 0000000000..29512af65b --- /dev/null +++ b/dev-docs/bidders/intertech.md @@ -0,0 +1,20 @@ +--- +layout: bidder +title: intertech +description: Prebid Intertech Bidder Adapter +pbs: true +biddercode: intertech +media_types: banner, native +--- + +### Registration + +The Intertech Bidding adapter requires setup before beginning. Please contact us at [prebid@intertechsrvcs.com](mailto:prebid@intertechsrvcs.com). + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-------------------------|-----------|-----------| +| `pageId` | required | Page ID | `123456` | `Integer` | +| `impId` | required | Block ID | `12` | `Integer` | From b43585d4cea3d022bff3587fae4af5d611a08bb2 Mon Sep 17 00:00:00 2001 From: Aaron Price <67345931+AaronColbyPrice@users.noreply.github.com> Date: Sat, 15 Apr 2023 13:52:45 -0700 Subject: [PATCH 081/564] FixUrlLinkInBidderSearch: changing autocomplete list from using bidderCode as the new url to the page url. This matches the implementation on line 47 where the bidder is linked to page.url in the tag. This fixes a problem where a bidder rebrands as a new company and wants to update labelling but needs to keep an old bidder code for backward compatability (#4445) --- dev-docs/bidders.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders.md b/dev-docs/bidders.md index a52a8bee0c..c9e05a5584 100644 --- a/dev-docs/bidders.md +++ b/dev-docs/bidders.md @@ -31,7 +31,7 @@ Publishers are advised to check with legal counsel before doing business with an
From 24a43f5c25524a875352ce1adf00586d69a429d3 Mon Sep 17 00:00:00 2001 From: ivs-mark <128337031+ivs-mark@users.noreply.github.com> Date: Sun, 16 Apr 2023 04:53:44 +0800 Subject: [PATCH 082/564] Add IVS bid adapter documentation (#4443) --- dev-docs/bidders/ivs.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 dev-docs/bidders/ivs.md diff --git a/dev-docs/bidders/ivs.md b/dev-docs/bidders/ivs.md new file mode 100644 index 0000000000..d79aa55232 --- /dev/null +++ b/dev-docs/bidders/ivs.md @@ -0,0 +1,21 @@ +--- +layout: bidder +title: IVS Bidder Adapter +description: Prebid IVS Bidder Adapter +biddercode: ivs +media_types: video +floors_supported: true +pbjs: true +sidebarType: 1 +--- + +### Note: + +The IVS Bidding adapter requires setup before beginning. Please contact us at prebid@ivs.tv + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------------|----------|----------------------------|-------------|-----------| +| `publisherId` | required | Unique id of the publisher | `'3001234'` | `string` | From 9f2ec1b885b65b9336f359e7681094d94ffddc01 Mon Sep 17 00:00:00 2001 From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com> Date: Sat, 15 Apr 2023 16:55:53 -0400 Subject: [PATCH 083/564] appnexus - change fpd flag (#4440) --- dev-docs/bidders/appnexus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 17d048b837..4eb2b4f7c9 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -12,7 +12,7 @@ coppa_supported: true usp_supported: true gpp_supported: true floors_supported: true -fpd_supported: true +fpd_supported: false pbjs: true pbjs_version_notes: please avoid using v7.15 and v7.16 pbs: true From 8c100a6c934858d50f576e85574d0a8bc03a71d9 Mon Sep 17 00:00:00 2001 From: Gena Date: Sat, 15 Apr 2023 23:57:59 +0300 Subject: [PATCH 084/564] 9Dots Media (#4436) --- dev-docs/bidders/9dotsmedia.md | 105 +++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 dev-docs/bidders/9dotsmedia.md diff --git a/dev-docs/bidders/9dotsmedia.md b/dev-docs/bidders/9dotsmedia.md new file mode 100644 index 0000000000..292163e91f --- /dev/null +++ b/dev-docs/bidders/9dotsmedia.md @@ -0,0 +1,105 @@ +--- +layout: bidder +title: 9Dots Media +description: 9Dots Media Bidder Adapter +biddercode: 9dotsmedia +aliasCode: adtelligent +media_types: video,banner +gdpr_supported: true +userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId +schain_supported: true +coppa_supported: true +usp_supported: true +safeframes_ok: true +prebid_member: true +pbjs: true +pbs: false +deals_supported: false +sidebarType: 1 +--- + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------|----------|---------------------------------|----------|-----------| +| `aid` | required | The source ID from 9Dots Media. | `12412` | `integer` | + +### Description +9Dots Media header bidding adapter connects with 9Dots Media demand sources in order to fetch bids. +This adapter provides a solution for accessing Video demand and display demand. + + +### Test Parameters +``` + var adUnits = [ + + // Video instream adUnit + { + code: 'test-div', + mediaTypes: { + video: { + context: 'instream', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: '9dotsmedia', + params: { + aid: 472386 + } + }] + }, + + // Video outstream adUnit + { + code: 'test-div', + mediaTypes: { + video: { + context: 'outstream', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: '9dotsmedia', + params: { + aid: 472386 + } + }] + }, + + // Video ADPOD adUnit + { + code: 'test-div', + sizes: [[640, 480]], + mediaTypes: { + video: { + context: 'adpod', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: '9dotsmedia', + params: { + aid: 472386 + } + }] + }, + + // Banner adUnit + { + code: 'test-div', + mediaTypes:{ + banner:{ + sizes: [[300, 250]] + } + } + bids: [{ + bidder: '9dotsmedia', + params: { + aid: 529814 + } + }] + } + ]; +``` From bec269fc8dd3ab59df4008b34e7330e15bfea72c Mon Sep 17 00:00:00 2001 From: Paulius Imbrasas <880130+CremboC@users.noreply.github.com> Date: Sat, 15 Apr 2023 21:58:30 +0100 Subject: [PATCH 085/564] Update Permutive documentation (#4435) --- dev-docs/modules/permutiveRtdProvider.md | 93 ++++++++++++------------ 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/dev-docs/modules/permutiveRtdProvider.md b/dev-docs/modules/permutiveRtdProvider.md index 5370d05467..27f9dc3e6d 100644 --- a/dev-docs/modules/permutiveRtdProvider.md +++ b/dev-docs/modules/permutiveRtdProvider.md @@ -15,7 +15,7 @@ sidebarType : 1 {:.no_toc} * TOC -{:toc} + {:toc} ## Prebid Config for Permutive RTD Module @@ -31,7 +31,7 @@ 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: +You then need to enable the Permutive RTD in your Prebid configuration. Below is an example of the format: ```javascript pbjs.setConfig({ @@ -63,20 +63,8 @@ as well as enabling settings for specific use cases mentioned above (e.g. acbidd | 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.acBidders | String[] | An array of bidder codes to share cohorts with in certain versions of Prebid, see below | `[]` | | params.maxSegs | Integer | Maximum number of cohorts to be included in either the `permutive` or `p_standard` key-value. | `500` | -| params.transformations | Object[] | An array of configurations for ORTB2 user data transformations | | - -##### The `transformations` parameter - -This array contains configurations for transformations we'll apply to the Permutive object in the ORTB2 `user.data` array. The results of these transformations will be appended to the `user.data` array that's attached to ORTB2 bid requests. - -##### Supported transformations - -{: .table .table-bordered .table-striped } -| Name | ID | Config structure | Description | -| ---------------------- | -------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------ | -| IAB taxonomies | iab | ```{ segtax: number, iabIds: Object}``` | Transform segment IDs from Permutive to IAB (note: alpha version, subject to change) | #### Context @@ -87,7 +75,7 @@ As Prebid utilizes TCF vendor consent, for the Permutive RTD module to load, Per #### Instructions -1. Publisher enables GDPR rules within Prebid. +1. Publisher enables rules within Prebid GDPR module 2. Label Permutive as an exception, as shown below. ```javascript [ @@ -110,29 +98,58 @@ Before making any updates to this configuration, please ensure that this approac ## Cohort Activation with Permutive RTD Module -### _Enabling Standard Cohorts_ - **Note**: Publishers must be enabled on the above Permutive RTD Submodule to enable Standard Cohorts. -The acbidders config in the Permutive RTD module allows publishers to determine which demand partners (SSPs) will receive standard cohorts via the user.data ortb2 object. Cohorts will be sent in the `p_standard` key-value. +### _Enabling Publisher Cohorts_ + +#### Standard Cohorts + +The Permutive RTD module sets Standard Cohort IDs as bidder-specific ortb2.user.data first-party data, following the Prebid ortb2 convention. Cohorts will be sent in the `p_standard` key-value. + +For Prebid versions below 7.29.0, populate the acbidders config in the Permutive RTD with an array of bidder codes with whom you wish to share Standard Cohorts with. You also need to permission the bidders by communicating the bidder list to the Permutive team at strategicpartnershipops@permutive.com. + +For Prebid versions 7.29.0 and above, do not populate bidder codes in acbidders for the purpose of sharing Standard Cohorts (Note: there may be other business needs that require you to populate acbidders for Prebid versions 7.29.0+, see Advertiser Cohorts below). To share Standard Cohorts with bidders in Prebid versions 7.29.0 and above, communicate the bidder list to the Permutive team at strategicpartnershipops@permutive.com. + +#### _Bidder Specific Requirements for Standard Cohorts_ +For PubMatic or OpenX: Please ensure you are using Prebid.js 7.13 (or later) +For Xandr: Please ensure you are using Prebid.js 7.29 (or later) +For Equativ: Please ensure you are using Prebid.js 7.26 (or later) + +#### Custom Cohorts + +The Permutive RTD module also supports passing any of the **Custom** Cohorts created in the dashboard to some SSP partners for targeting +e.g. setting up publisher deals. For these activations, cohort IDs are set in bidder-specific locations per ad unit (custom parameters). + +Currently, bidders with known support for custom cohort targeting are: + +- Xandr +- Magnite + +When enabling the respective Activation for a cohort in Permutive, this module will automatically attach that cohort ID to the bid request. +There is no need to enable individual bidders in the module configuration, it will automatically reflect which SSP integrations you have enabled in your Permutive dashboard. +Permutive cohorts will be sent in the permutive key-value. + -The Permutive RTD module sets standard cohort IDs as bidder-specific ortb2.user.data first-party data, following the Prebid ortb2 convention. +### _Enabling Advertiser Cohorts_ -There are **two** ways to assign which demand partner bidders (e.g. SSPs) will receive Standard Cohort information via the Audience Connector (acbidders) config: +If you are connecting to an Advertiser seat within Permutive to share Advertiser Cohorts, populate the acbidders config in the Permutive RTD with an array of bidder codes with whom you wish to share Advertiser Cohorts with. + +### _Managing acbidders_ + +If your business needs require you to populate acbidders with bidder codes based on the criteria above, there are **two** ways to manage it. #### Option 1 - Automated -New demand partner bidders may be added to the acbidders config directly within the Permutive Platform. +If you are using Prebid.js v7.13.0+, bidders may be added to or removed from the acbidders config directly within the Permutive Dashboard. **Permutive can do this on your behalf**. Simply contact your Permutive CSM with strategicpartnershipops@permutive.com on cc, indicating which bidders you would like added. -Or, a publisher may do this themselves within the UI using the below instructions. +Or, a publisher may do this themselves within the Permutive Dashboard using the below instructions. ##### Create Integration -In order to update acbidders via the Permutive dashboard, -it is necessary to first enable the prebid integration in the integrations page (settings). +In order to manage acbidders via the Permutive dashboard, it is necessary to first enable the Prebid integration via the integrations page (settings). ![Alt text](/assets/images/dev-docs/modules/permutiveRtdProvider-integration-create.png?raw=true "Permutive Prebid integration - create") @@ -142,33 +159,17 @@ Please see [this document](https://support.permutive.com/hc/en-us/articles/36001 ##### Update acbidders -The input for the “Data Provider config” is currently a multi-input free text. -A valid “bidder code” needs to be entered in order to enable Standard Cohorts to be passed to the desired partner. -The [prebid Bidders page](https://docs.prebid.org/dev-docs/bidders.html) contains instructions and a link to a list of possible bidder codes. +The input for the “Data Provider config” is a multi-input free text. A valid “bidder code” needs to be entered in order to enable Standard or Advertiser Cohorts to be passed to the desired partner. The [prebid Bidders page](https://docs.prebid.org/dev-docs/bidders.html) contains instructions and a link to a list of possible bidder codes. ![Alt text](/assets/images/dev-docs/modules/permutiveRtdProvider-integration-update.png?raw=true "Permutive Prebid integration - update") -Acbidders can be added or removed from the list using this feature, however, this will not impact any acbidders that have been applied using the manual method below. +Bidders can be added or removed from acbidders using this feature, however, this will not impact any bidders that have been applied using the manual method below. #### Option 2 - Manual -As a secondary option, new demand partner bidders may be added manually. +As a secondary option, bidders may be added manually. -To do so, a Publisher may define which bidders should receive Standard Cohorts by +To do so, define which bidders should receive Standard or Advertiser Cohorts by including the _bidder code_ of any bidder in the `acBidders` array. -**Note:** If a Publisher ever needs to remove a manually-added bidder, the bidder will also need to be removed manually. - -### _Enabling Custom Cohort IDs for Targeting_ - -Separately from Standard Cohorts - The Permutive RTD module also supports passing any of the **custom** cohorts created in the dashboard to some SSP partners for targeting -e.g. setting up publisher deals. For these activations, cohort IDs are set in bidder-specific locations per ad unit (custom parameters). - -Currently, bidders with known support for custom cohort targeting are: - -- Xandr -- Magnite - -When enabling the respective Activation for a cohort in Permutive, this module will automatically attach that cohort ID to the bid request. -There is no need to enable individual bidders in the module configuration, it will automatically reflect which SSP integrations you have enabled in your Permutive dashboard. -Permutive cohorts will be sent in the permutive key-value. +**Note:** If you ever need to remove a manually-added bidder, the bidder will also need to be removed manually. From 03e558bd2c259f9bc43e67ec35eac6fb94a4a403 Mon Sep 17 00:00:00 2001 From: Brian Schaaf Date: Sat, 15 Apr 2023 16:58:48 -0400 Subject: [PATCH 086/564] PubWise Support PBS (#4428) --- dev-docs/bidders/pwbid.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/pwbid.md b/dev-docs/bidders/pwbid.md index ec0361fbf4..ef32a00b7e 100644 --- a/dev-docs/bidders/pwbid.md +++ b/dev-docs/bidders/pwbid.md @@ -3,6 +3,7 @@ layout: bidder title: PubWise description: PubWise Bidder Adaptor pbjs: true +pbs: true biddercode: pwbid aliasCode: pubwise media_types: banner, native, video From 76e8da3a7461b4bb01108dc13b7292dd0d77abeb Mon Sep 17 00:00:00 2001 From: Vadim Mazzherin Date: Sun, 16 Apr 2023 03:00:08 +0600 Subject: [PATCH 087/564] ShowHeroes Bid Adapter: update documentation (#4422) * add ShowHeroes Adapter * removing longer-than-12 header happily we don't need that anymore * ShowHeroes Bid Adapter: update params * Delete showheroes.md * ShowHeroes bid adapter: update doc --------- Co-authored-by: bretg --- dev-docs/bidders/showheroes-bs.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev-docs/bidders/showheroes-bs.md b/dev-docs/bidders/showheroes-bs.md index 357cb5b546..8d84acbf72 100644 --- a/dev-docs/bidders/showheroes-bs.md +++ b/dev-docs/bidders/showheroes-bs.md @@ -6,6 +6,8 @@ pbjs: true biddercode: showheroes-bs media_types: video, banner gdpr_supported: true +usp_supported: true +schain_supported: true sidebarType: 1 --- From 5e5b5197e9d311513eec06100a62db34eb5d59d4 Mon Sep 17 00:00:00 2001 From: Ilia Medvedev Date: Sun, 16 Apr 2023 01:00:38 +0400 Subject: [PATCH 088/564] New Adapter: Evolution Technologies (#4421) * New Adapter: Evolution Technologies * Rename evolutionTechnologies to evtech --- dev-docs/bidders/evtech.md | 30 ++++++++++++++++++++++++++++ dev-docs/bidders/iionads.md | 4 +++- dev-docs/bidders/limelightDigital.md | 4 +++- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 dev-docs/bidders/evtech.md diff --git a/dev-docs/bidders/evtech.md b/dev-docs/bidders/evtech.md new file mode 100644 index 0000000000..d02b1ba27a --- /dev/null +++ b/dev-docs/bidders/evtech.md @@ -0,0 +1,30 @@ +--- +layout: bidder +title: Evolution Technologies +description: Evolution Technologies Bidder Adaptor +biddercode: evtech +pbjs: false +pbs: true +media_types: banner, video, audio, native +userIds: all +fpd_supported: false +gdpr_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: false +aliasCode: limelightDigital +sidebarType: 1 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|:--------------|:---------|:----------------------|:------------------|:----------| +| `host` | required | Ad network's RTB host | `'e-volution.ai'` | `string` | +| `publisherId` | required | Publisher ID | `12345` | `integer` | diff --git a/dev-docs/bidders/iionads.md b/dev-docs/bidders/iionads.md index cf6c28c092..3ca533cc1b 100644 --- a/dev-docs/bidders/iionads.md +++ b/dev-docs/bidders/iionads.md @@ -36,4 +36,6 @@ sidebarType: 1 | `custom4` | optional | Custom targeting field 4 | `'custom4'` | `string` | | `custom5` | optional | Custom targeting field 5 | `'custom5'` | `string` | -iionads server-side Prebid Server adapter supports `banner`, `video`, `audio`, `native` media types. But iionads client-side Prebid.js adapter supports only `banner` and `video` media types, doesn't support `audio` and `native`. +iionads server-side Prebid Server adapter requires only `publisherId` and `host` parameters. But iionads client-side Prebid.js adapter requires only `host`, `adUnitId`, `adUnitType`. + +iionads server-side Prebid Server adapter supports only `banner`, `video`, `audio`, `native` media types. But iionads client-side Prebid.js adapter supports only `banner` and `video` media types, doesn't support `audio` and `native`. diff --git a/dev-docs/bidders/limelightDigital.md b/dev-docs/bidders/limelightDigital.md index 2134f4d448..e3b8e3f06c 100644 --- a/dev-docs/bidders/limelightDigital.md +++ b/dev-docs/bidders/limelightDigital.md @@ -35,4 +35,6 @@ sidebarType: 1 | `custom4` | optional | Custom targeting field 4 | `'custom4'` | `string` | | `custom5` | optional | Custom targeting field 5 | `'custom5'` | `string` | -Limelight Digital server-side Prebid Server adapter supports `banner`, `video`, `audio`, `native` media types. But Limelight Digital client-side Prebid.js adapter supports only `banner` and `video` media types, doesn't support `audio` and `native`. +Limelight Digital server-side Prebid Server adapter requires only `publisherId` and `host` parameters. But Limelight Digital client-side Prebid.js adapter requires only `host`, `adUnitId`, `adUnitType`. + +Limelight Digital server-side Prebid Server adapter supports only `banner`, `video`, `audio`, `native` media types. But Limelight Digital client-side Prebid.js adapter supports only `banner` and `video` media types, doesn't support `audio` and `native`. From 6b61017af76206a886bbbeee6aa79db8ee68f81a Mon Sep 17 00:00:00 2001 From: onlsol <48312668+onlsol@users.noreply.github.com> Date: Sat, 15 Apr 2023 23:01:11 +0200 Subject: [PATCH 089/564] DSPx docs update (#4417) * schain support * userIds support * multiformat support * bid params description --- dev-docs/bidders/dspx.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidders/dspx.md b/dev-docs/bidders/dspx.md index 074cd12256..c60589d136 100644 --- a/dev-docs/bidders/dspx.md +++ b/dev-docs/bidders/dspx.md @@ -6,12 +6,15 @@ pbjs: true biddercode: dspx media_types: banner, video gdpr_supported: true -userIds: uid2, netId +schain_supported: true +userIds: uid2, netId, id5Id, sharedId +multiformat_supported: will-bid-on-one +gvl_id: 602 sidebarType: 1 --- ### Note: -The DSPx Bidder Adapter requires setup and approval from DSPx team. Please reach out to your account team or prebid@dspx.tv for more information. +The DSPx bidder adapter requires setup and approval from the DSPx team. Please reach out to prebid@dspx.tv for more information and start using it. ### Bid Params @@ -20,13 +23,13 @@ The DSPx Bidder Adapter requires setup and approval from DSPx team. Please reach | Name | Scope | Description | Example | Type | |---------------|----------|----------------------------------------------------------------------------|------------------------|-----------------| | `placement` | required | Placement ID from dspx. | `'101'` | `string` | -| `pfilter` | optional | Selection filter. E.g. floorprice (min_cpm_micros) | `{"floorprice": 1000000}`| `object` | +| `pfilter` | optional | Custom filter parameters. | `{"customxy": 1000000}`| `object` | | `bcat` | optional | List of Blocked Categories (IAB) - comma separated. | `'IAB2,IAB4'` | `string` | **Notice:** The creative type can be checked by the `type` property of `bidResponse` object. E.g.: ```js bidsBackHandler: function(bids) { - var contentType = bids[0].type // JS InSkin|JS Interscroller Type A|...; + var contentType = bids[0].type } ``` From cf8aeafe56917d3c3db65fbc564e63b24a2e7c6b Mon Sep 17 00:00:00 2001 From: beglobal2022 <120370005+beglobal2022@users.noreply.github.com> Date: Sun, 16 Apr 2023 02:32:35 +0530 Subject: [PATCH 090/564] Added document for bedigitech adaptor (#4394) Co-authored-by: yogesh.ingale1 --- dev-docs/bidders/bedigitech.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 dev-docs/bidders/bedigitech.md diff --git a/dev-docs/bidders/bedigitech.md b/dev-docs/bidders/bedigitech.md new file mode 100644 index 0000000000..383e42c381 --- /dev/null +++ b/dev-docs/bidders/bedigitech.md @@ -0,0 +1,23 @@ +--- +layout: bidder +title: BEdigitech +description: Prebid BEdigitech Bidder Adapter +pbjs: true +pbs: false +biddercode: bedigitech +gdpr_supported: false +usp_supported: false +media_types: banner, native +--- + +### Note: + +The BEdigitech Bidding adapter requires setup before beginning. Please contact us at yogesh@thebeglobal.com +Due to different integration API prebid.js and prebid-server api params are different + +### Prebid.JS Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementId` | required | bedigitech placement | `'1234'` | `'string'`| From 786122f545c408317e3c75ffd32ef62eed02aa48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 08:00:05 -0700 Subject: [PATCH 091/564] Bump ua-parser-js and browser-sync (#4486) Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) to 1.0.35 and updates ancestor dependency [browser-sync](https://github.com/BrowserSync/browser-sync). These dependencies need to be updated together. Updates `ua-parser-js` from 1.0.2 to 1.0.35 - [Release notes](https://github.com/faisalman/ua-parser-js/releases) - [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md) - [Commits](https://github.com/faisalman/ua-parser-js/compare/1.0.2...1.0.35) Updates `browser-sync` from 2.27.11 to 2.29.1 - [Release notes](https://github.com/BrowserSync/browser-sync/releases) - [Changelog](https://github.com/BrowserSync/browser-sync/blob/master/CHANGELOG.md) - [Commits](https://github.com/BrowserSync/browser-sync/compare/v2.27.11...v2.29.1) --- updated-dependencies: - dependency-name: ua-parser-js dependency-type: indirect - dependency-name: browser-sync dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 590 +++++++++++++++++++++++++++++----------------- package.json | 2 +- 2 files changed, 374 insertions(+), 218 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdd5679ae0..ac50a84219 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "popper.js": "^1.16.1" }, "devDependencies": { - "browser-sync": "^2.27.11", + "browser-sync": "^2.29.1", "browser-sync-webpack-plugin": "^2.0.1", "cross-env": "^7.0.2", "laravel-mix": "^5.0.7", @@ -2131,21 +2131,22 @@ "dev": true }, "node_modules/browser-sync": { - "version": "2.27.11", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz", - "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.1.tgz", + "integrity": "sha512-WXy9HMJVQaNUTPjmai330E2fnDA6W84l/vBILGkYu9yHXIpWw1gJYjdQWDfEhLFljYUHNTN9jM3GCej2T55m+g==", "dev": true, "dependencies": { - "browser-sync-client": "^2.27.11", - "browser-sync-ui": "^2.27.11", + "browser-sync-client": "^2.29.1", + "browser-sync-ui": "^2.29.1", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", + "chalk": "4.1.2", "chokidar": "^3.5.1", "connect": "3.6.6", "connect-history-api-fallback": "^1", "dev-ip": "^1.0.1", "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", + "eazy-logger": "^4.0.1", "etag": "^1.8.1", "fresh": "^0.5.2", "fs-extra": "3.0.1", @@ -2164,7 +2165,7 @@ "serve-static": "1.13.2", "server-destroy": "1.0.1", "socket.io": "^4.4.1", - "ua-parser-js": "1.0.2", + "ua-parser-js": "^1.0.33", "yargs": "^17.3.1" }, "bin": { @@ -2175,28 +2176,27 @@ } }, "node_modules/browser-sync-client": { - "version": "2.27.11", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz", - "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.1.tgz", + "integrity": "sha512-aESnjt3rU7CZpzjyqzhIC2UJ3MVhzRis7cPKkGbyYWDf/wnbxyRa3fFenF3Qx9061/guY3HHhD67uiTVV26DVg==", "dev": true, "dependencies": { "etag": "1.8.1", "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6", - "typescript": "^4.6.2" + "mitt": "^1.1.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/browser-sync-ui": { - "version": "2.27.11", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz", - "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.1.tgz", + "integrity": "sha512-MB7SAiUgVUrhipO2xyO1sheC9H0+LKXPQ3L1tQWcZ3AgizBnUNKAqDZPSwe4grNSa8o8ImSAwJp7lMS6XYy1Dw==", "dev": true, "dependencies": { "async-each-series": "0.1.1", + "chalk": "4.1.2", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", @@ -2204,6 +2204,76 @@ "stream-throttle": "^0.1.3" } }, + "node_modules/browser-sync-ui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync-ui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/browser-sync-ui/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync-ui/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-sync-webpack-plugin": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.0.1.tgz", @@ -2271,6 +2341,22 @@ "node": ">=8" } }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/browser-sync/node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -2394,6 +2480,15 @@ "node": ">= 6" } }, + "node_modules/browser-sync/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-sync/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -2586,6 +2681,18 @@ "node": ">=8" } }, + "node_modules/browser-sync/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-sync/node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4292,12 +4399,6 @@ "node": ">=4" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -4417,17 +4518,87 @@ } }, "node_modules/eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", "dev": true, "dependencies": { - "tfunk": "^4.0.0" + "chalk": "4.1.2" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/eazy-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eazy-logger/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eazy-logger/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eazy-logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4516,22 +4687,22 @@ } }, "node_modules/engine.io-client": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", - "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3", + "ws": "~8.11.0", "xmlhttprequest-ssl": "~2.0.0" } }, "node_modules/engine.io-client/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -9843,18 +10014,6 @@ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", "dev": true }, - "node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "dependencies": { - "symbol-observable": "1.0.1" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -10464,14 +10623,14 @@ "dev": true }, "node_modules/socket.io-client": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz", - "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz", + "integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.2.3", + "engine.io-client": "~6.4.0", "socket.io-parser": "~4.2.1" }, "engines": { @@ -10955,15 +11114,6 @@ "node": ">=4.0.0" } }, - "node_modules/symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -11138,50 +11288,6 @@ "node": ">=0.10.0" } }, - "node_modules/tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - } - }, - "node_modules/tfunk/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tfunk/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tfunk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -11329,23 +11435,10 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "dev": true, "funding": [ { @@ -14706,21 +14799,22 @@ "dev": true }, "browser-sync": { - "version": "2.27.11", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz", - "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.1.tgz", + "integrity": "sha512-WXy9HMJVQaNUTPjmai330E2fnDA6W84l/vBILGkYu9yHXIpWw1gJYjdQWDfEhLFljYUHNTN9jM3GCej2T55m+g==", "dev": true, "requires": { - "browser-sync-client": "^2.27.11", - "browser-sync-ui": "^2.27.11", + "browser-sync-client": "^2.29.1", + "browser-sync-ui": "^2.29.1", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", + "chalk": "4.1.2", "chokidar": "^3.5.1", "connect": "3.6.6", "connect-history-api-fallback": "^1", "dev-ip": "^1.0.1", "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", + "eazy-logger": "^4.0.1", "etag": "^1.8.1", "fresh": "^0.5.2", "fs-extra": "3.0.1", @@ -14739,7 +14833,7 @@ "serve-static": "1.13.2", "server-destroy": "1.0.1", "socket.io": "^4.4.1", - "ua-parser-js": "1.0.2", + "ua-parser-js": "^1.0.33", "yargs": "^17.3.1" }, "dependencies": { @@ -14783,6 +14877,16 @@ "fill-range": "^7.0.1" } }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -14876,6 +14980,12 @@ "is-glob": "^4.0.1" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -15029,6 +15139,15 @@ "ansi-regex": "^5.0.1" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -15079,30 +15198,80 @@ } }, "browser-sync-client": { - "version": "2.27.11", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz", - "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.1.tgz", + "integrity": "sha512-aESnjt3rU7CZpzjyqzhIC2UJ3MVhzRis7cPKkGbyYWDf/wnbxyRa3fFenF3Qx9061/guY3HHhD67uiTVV26DVg==", "dev": true, "requires": { "etag": "1.8.1", "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6", - "typescript": "^4.6.2" + "mitt": "^1.1.3" } }, "browser-sync-ui": { - "version": "2.27.11", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz", - "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.1.tgz", + "integrity": "sha512-MB7SAiUgVUrhipO2xyO1sheC9H0+LKXPQ3L1tQWcZ3AgizBnUNKAqDZPSwe4grNSa8o8ImSAwJp7lMS6XYy1Dw==", "dev": true, "requires": { "async-each-series": "0.1.1", + "chalk": "4.1.2", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", "socket.io-client": "^4.4.1", "stream-throttle": "^0.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "browser-sync-webpack-plugin": { @@ -16486,12 +16655,6 @@ "path-type": "^3.0.0" } }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -16600,12 +16763,63 @@ } }, "eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", "dev": true, "requires": { - "tfunk": "^4.0.0" + "chalk": "4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "ee-first": { @@ -16704,22 +16918,22 @@ } }, "engine.io-client": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", - "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3", + "ws": "~8.11.0", "xmlhttprequest-ssl": "~2.0.0" }, "dependencies": { "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "requires": {} } @@ -21090,15 +21304,6 @@ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", "dev": true }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -21620,14 +21825,14 @@ "dev": true }, "socket.io-client": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz", - "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz", + "integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.2.3", + "engine.io-client": "~6.4.0", "socket.io-parser": "~4.2.1" } }, @@ -22040,12 +22245,6 @@ "util.promisify": "~1.0.0" } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", - "dev": true - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -22176,43 +22375,6 @@ } } }, - "tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -22338,16 +22500,10 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true - }, "ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 71ac66fae4..3eb43407ae 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "homepage": "https://github.com/AtreNet/prebid.github.io#readme", "devDependencies": { - "browser-sync": "^2.27.11", + "browser-sync": "^2.29.1", "browser-sync-webpack-plugin": "^2.0.1", "cross-env": "^7.0.2", "laravel-mix": "^5.0.7", From be0652695b857796fd46048f6ce9e5ac5ff56df6 Mon Sep 17 00:00:00 2001 From: ValeriiBarsuk <121865116+ValeriiBarsuk@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:29:50 +0200 Subject: [PATCH 092/564] Updated PBS-database AMP, stored requests query (#4460) * Updated PBS-database AMP, stored requests query * Resolved remark * wordsmithing * updating to clarify top-level/imp-level --------- Co-authored-by: Valerii Barsuk Co-authored-by: bretg --- prebid-server/features/pbs-storedreqs-java.md | 23 ++++++++++-------- prebid-server/hosting/pbs-database.md | 24 +++++++++++-------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/prebid-server/features/pbs-storedreqs-java.md b/prebid-server/features/pbs-storedreqs-java.md index c34442950f..d9249deb78 100644 --- a/prebid-server/features/pbs-storedreqs-java.md +++ b/prebid-server/features/pbs-storedreqs-java.md @@ -14,8 +14,8 @@ title: Prebid Server | Features | Setting Up Stored Requests for Java ## Overview There are two different kinds of stored requests: -- **impression-level stored requests**: these are scoped to the contents of a single OpenRTB `imp` object -- **top-level stored requests**: these are scoped to the entire OpenRTB package, and is where you can place details in ext.prebid, tmax, site, etc. It is not recommended to place imp objects in this type of stored request. +- **impression-level stored requests**: these are scoped to the contents of a single OpenRTB `imp` object. Prebid Server defines these in imp[].ext.prebid.storedrequest. +- **top-level stored requests**: these are scoped to the entire OpenRTB package, and is where you can place details in ext.prebid, tmax, site, etc. It is not recommended to place imp objects in this type of stored request. Prebid Server defines these in ext.prebid.storedrequest. ## PBS-Java Stored Request Quickstart @@ -141,8 +141,8 @@ HTTP request properties will overwrite the Stored Request ones. ## Top-Level Stored Requests -So far, our examples have only used Stored Imp data. However, Stored Requests -are also allowed on the [BidRequest](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf#page=15). +So far, our examples have only used impression-level data. However, Stored Requests +are also allowed at the top level at ext.prebid.storedrequest. These work exactly the same way, but support storing properties like timeouts and price granularity. For example, assume the following `stored-requests/{id}.json`: @@ -197,11 +197,13 @@ will produce the same auction as if the HTTP request had been: } ``` -Prebid Server does allow Stored BidRequests and Stored Imps in the same HTTP Request. -The Stored BidRequest will be applied first, and then the Stored Imps after. +Prebid Server does allow both top-level and impression-level stored requests in the same HTTP Request. +The top-level stored request will be applied first, and then the impression-level stored request. **Beware**: Stored Request data will not be applied recursively. -If a Stored BidRequest includes Imps with their own Stored Request IDs, then the data for those Stored Imps will not be resolved. +If a Stored BidRequest includes Imps with their own Stored Request IDs, then the data for the contained Stored Imps will not be resolved. + +**Note**: However, stored requests may contain [storedresponses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses). ## Alternate backends @@ -225,8 +227,8 @@ settings: ``` The select query columns of `stored-requests-query` and `amp-stored-requests-query` properties should correspond to the specific format: -- first column: account ID which is searched by. -- second column: ID of stored data item which is searched by. +- first column: account ID, which is used to make sure that storedrequests are unique to the account +- second column: ID of stored data item - third column: value of stored data item. - forth column: type of stored data item. Can be `request` for stored requests or `imp` for stored impressions. @@ -277,7 +279,7 @@ settings: dbname: database-name user: username password: password - stored-requests-query: SELECT accountId, reqid, requestData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) UNION ALL SELECT accountId, impid, impData, 'imp' as dataType FROM stored_imps WHERE impid IN (%IMP_ID_LIST%) + stored-requests-query: SELECT accountId, reqid, requestData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) UNION ALL SELECT accountId, impid, impData, 'imp' as dataType FROM stored_requests WHERE impid IN (%IMP_ID_LIST%) amp-stored-requests-query: SELECT accountId, reqid, requestData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) http: endpoint: http://stored-requests.prebid.com @@ -296,3 +298,4 @@ Refresh rate can be negative or zero - in such case the data will be fetched onc ## Related Reading - [Stored Responses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses) +- [Hosting a PBS database](/prebid-server/hosting/pbs-database.html) diff --git a/prebid-server/hosting/pbs-database.md b/prebid-server/hosting/pbs-database.md index 084e7e6c78..4554dc5684 100644 --- a/prebid-server/hosting/pbs-database.md +++ b/prebid-server/hosting/pbs-database.md @@ -57,20 +57,22 @@ The Stored Request query needs to return fields in this order: There are two parameters that can be passed into the query: -- %REQUEST_ID_LIST% : a comma-separated list of "top-level" stored request IDs -- %IMP_ID_LIST% : a comma-separated list of "impression-level" stored request IDs +- %REQUEST_ID_LIST% : a comma-separated list of "top-level" stored request IDs - these are the IDs in ext.prebid.storedrequest.id. +- %IMP_ID_LIST% : a comma-separated list of "impression-level" stored request IDs - these are the IDs in imp[].ext.prebid.storedrequest.id. This query is defined in settings.database.stored-requests-query. Example: ``` settings: database: type: mysql - stored-requests-query: SELECT uuid, config, 'request' as dataType FROM stored_requests WHERE uuid IN (%REQUEST_ID_LIST%) UNION ALL SELECT uuid, config, 'imp' as dataType FROM stored_requests WHERE uuid IN (%IMP_ID_LIST%) + stored-requests-query: SELECT accountId, reqid, storedData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) UNION ALL SELECT accountId, reqid, storedData, 'imp' as dataType FROM stored_requests WHERE reqid IN (%IMP_ID_LIST%) ``` This example assumes that the schema includes these fields: -- uuid is a string field that contains the stored request ID -- config is a JSON field that contains the body of the stored request +- accountId: account ID, which is used to make sure that storedrequests are unique to the account +- reqid: ID of stored data item +- storedData: value of stored data item +- 'request' or 'imp': type of stored data item. Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. @@ -84,12 +86,14 @@ This query is defined in settings.database.amp-stored-requests-query. Example: settings: database: type: mysql - stored-requests-query: SELECT uuid, config, 'request' as dataType FROM stored_requests WHERE uuid IN (%REQUEST_ID_LIST%) + amp-stored-requests-query: SELECT accountId, reqid, storedData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) ``` This example assumes that the stored_requests schema includes these fields: -- uuid is a string field that contains the stored request ID -- config is a JSON field that contains the body of the stored request +- accountId: account ID, which is used to make sure that storedrequests are unique to the account +- reqid: ID of stored data item +- storedData: value of stored data item +- 'request': type of stored data item. Can be only be 'request' for AMP. Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. @@ -105,8 +109,8 @@ The Stored Response query needs to return fields in this order: One parameter can be passed into the query, though at this point, the parameter differs between Go and Java: -- %RESPONSE_ID_LIST% (PBS-Java): a comma-separated list of stored response IDs -- %ID_LIST% (PBS-Go): a comma-separated list of stored response IDs +- %RESPONSE_ID_LIST% (PBS-Java): a comma-separated list of stored response IDs. These come from imp[].ext.prebid.storedbidresponse or imp[].ext.prebid.storedauctionresponse. +- %ID_LIST% (PBS-Go): a comma-separated list of stored response IDs. These come from imp[].ext.prebid.storedbidresponse or imp[].ext.prebid.storedauctionresponse. This query is defined in settings.database.stored-requests-query. Example: ``` From 763401e5ed5cb38177d832a0c14fa1c3ef27dcbf Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 18 Apr 2023 09:21:08 -0400 Subject: [PATCH 093/564] Floors enforcePBS default is true on the server side (#4489) --- dev-docs/modules/floors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/floors.md b/dev-docs/modules/floors.md index 12a7f18299..30f41fdee4 100644 --- a/dev-docs/modules/floors.md +++ b/dev-docs/modules/floors.md @@ -293,7 +293,7 @@ a subset that will be merged under the 'data' object. | 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.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. | true | | enforcement.floorDeals | boolean | Enforce floors for deal bid requests. | false | | 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. | - | @@ -354,7 +354,7 @@ a subset that will be merged under the 'data' object. | 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.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. | true | | enforcement.floorDeals | boolean | Enforce floors for deal bid requests. | false | | 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 | From 42c1c660b5ca5f5565d45a079548d116b2c56288 Mon Sep 17 00:00:00 2001 From: Yuriy Velichko Date: Tue, 18 Apr 2023 19:49:51 +0300 Subject: [PATCH 094/564] Mobile: Restore the description of Prebid SDK utilization with 3rd party ad server (#4363) * ios: restore the description of Prebid SDK utilization with 3rd party ad server * fix typo, update statement * android: restore the description of Prebid SDK utilization with 3rd party ad server * fix broken link --- .../rendering/android-sdk-integration-pb.md | 68 ++++++++++++++++-- .../rendering/ios-sdk-integration-pb.md | 71 ++++++++++++++++--- ...ndroid-sdk-integration-gam-original-api.md | 2 +- 3 files changed, 125 insertions(+), 16 deletions(-) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md index 0d6aab3dbf..64f053f525 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md @@ -7,19 +7,73 @@ sidebarType: 2 --- -# Custom Integration +# Custom Bidding Integration {:.no_toc} -## Overview of Rendering API +You can use Prebid SDK to monetize your app with a custom ad server or even without it. Use the `Transport API` to obtain the targeting keywords for following usage with the custom ad server. Use the `Rendering API` to display the winning bid without primary ad server and its SDK. + +* TOC +{:toc} + +## Transport API + +The default ad server for Prebid's Mobile SDK is GAM. The SDK can be expanded to include support for 3rd party ad servers through the fetchDemand function. This function returns the Prebid Server bidder key/values (targeting keys), which can then be passed to the ad server of choice. + +In this mode, the publisher will be responsible for the following actions: + +* Call fetchDemand with extended targetingDict callback +* Retrieve targeting keys from extended fetchDemand function +* Convert targeting keys into the format for your ad server +* Pass converted keys to your ad server +* Render ad with Prebid Universal Creative or custom renderer + +This approach is avaliable for the following ad formats: + +* Display Banner via `BannerAdUnit` +* Video Banner and Instream Video via `VideoAdUnit` +* Display Interstitial via `InterstitialAdUnit` +* Video Interstitial via `VideoInterstitialAdUnit` +* Rewarded Video via `RewardedVideoAdUnit` +* Native Styles via `NativeRequest` + +The basic integration steps for these ad units you can find at the page for integration using [Original API](/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html). The diference is that you should use the `fetchDemand` function with following signature: + +``` kotlin +public void fetchDemand(@NonNull Object adObj, + @NonNull OnCompleteListener2 listener) { ... } + +public interface OnCompleteListener2 { + /** + * This method will be called when PrebidMobile finishes attaching keywords to unmodifiableMap. + * @param resultCode see {@link ResultCode} class definition for details + * @param unmodifiableMap a map of targeting Key/Value pairs + */ + @MainThread + void onComplete(ResultCode resultCode, + @Nullable Map unmodifiableMap); +} +``` + +Examples: + +``` kotlin +private fun loadRewardedVideo() { + adUnit?.fetchDemand { resultCode, unmodifiableMap -> + val keywords: Map = HashMap(unmodifiableMap) + + adServerObject.loadRewardedVideo(ADUNITID_REWARDED, keywords) + } +} +``` + +## Rendering API The integration and usage of the Rendering API is 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) -* TOC -{:toc} -## Banner API +### Banner API Integration example: @@ -61,7 +115,7 @@ For **Banner Video** you will also need to specify the `bannerView.videoPlacemen bannerView.videoPlacementType = PlacementType.IN_BANNER // or any other available type ``` -## Interstitial API +### Interstitial API Integration example: @@ -115,7 +169,7 @@ override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) { } ``` -## Rewarded API +### Rewarded API Integration example: diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md index 18a6e1ad1b..cafc31fe26 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md @@ -10,16 +10,71 @@ sidebarType: 2 # Custom Bidding Integration {:.no_toc} -## 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) +You can use Prebid SDK to monetize your app with a custom ad server or even without it. Use the `Transport API` to obtain the targeting keywords for following usage with the custom ad server. Use the `Rendering API` to display the winning bid without primary ad server and its SDK. * TOC {:toc} -## Banner API +## Transport API + +The default ad server for Prebid's Mobile SDK is GAM. The SDK can be expanded to include support for 3rd party ad servers through the fetchDemand function. This function returns the Prebid Server bidder key/values (targeting keys), which can then be passed to the ad server of choice. + +In this mode, the publisher will be responsible for the following actions: + +* Call fetchDemand with extended targetingDict callback +* Retrieve targeting keys from extended fetchDemand function +* Convert targeting keys into the format for your ad server +* Pass converted keys to your ad server +* Render ad with Prebid Universal Creative or custom renderer + +This approach is avaliable for the following ad formats: + +* Display Banner via `BannerAdUnit` +* Video Banner and Instream Video via `VideoAdUnit` +* Display Interstitial via `InterstitialAdUnit` +* Video Interstitial via `VideoInterstitialAdUnit` +* Rewarded Video via `RewardedVideoAdUnit` +* Native Styles via `NativeRequest` + +The basic integration steps for these ad units you can find at the page for integration using [Original API](/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html). The diference is that you should use the `fetchDemand` function with following signature: + +``` swift +dynamic public func fetchDemand( + completion: @escaping(_ result: ResultCode, + _ kvResultDict: [String : String]?) -> Void) +``` + +Examples: + +```swift +func loadBanner() { + + //adUnit is BannerAdUnit type + adUnit.fetchDemand { [weak self] (resultCode: ResultCode, targetingDict: [String : String]?) in + + self?.adServerRequest.customTargeting = targetingDict + self?.adServerBanner.load(self?.adServerRequest) + } +} + +func loadRewardedVideo() { + let adUnit = RewardedVideoAdUnit(configId: "1001-1") + adUnit.fetchDemand { [weak self] (resultCode: ResultCode, targetingDict: [String : String]?) in + + //Publisher should provide support for converting keys into format of 3rd party ad server and loading ads + let keywords = convertDictToAdServerKeywords(dict: targetingDict) + AdServerLoadAds.loadAd(withAdUnitID: "46d2ebb3ccd340b38580b5d3581c6434", keywords: keywords) + } +} +``` + +## Rendering API + +The Rendering API integration and usage are similar to any other Ad SDK. In this case, Prebid SDK 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) + +### Banner API Integration example: @@ -61,7 +116,7 @@ For **Banner Video** you also need to specify the ad format: banner.adFormat = .video ``` -## Interstitial API +### Interstitial API Integration example: @@ -126,7 +181,7 @@ func interstitialDidReceiveAd(_ interstitial: InterstitialRenderingAdUnit) { } ``` -## Rewarded API +### Rewarded API Integration example: diff --git a/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md b/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md index 191cd92268..cead15dc04 100755 --- a/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md +++ b/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md @@ -994,7 +994,7 @@ If the `AdManagerAdRequest ` contains targeting keywords, the respective Prebid #### Step 4: Implement OnCustomFormatAdLoadedListener protocol {:.no_toc} -In order to capture the native ad response you will need to implement [OnCustomFormatAdLoadedListener](https://radeon-drivers.com/?_=%2Fandroid%2Freference%2Fcom%2Fgoogle%2Fandroid%2Fgms%2Fads%2Fnativead%2FNativeCustomFormatAd.OnCustomFormatAdLoadedListener%23UUlexhFFzSDzTfOQ54KBpjGsLVY524B1MgR06Ro%3D) protocol. +In order to capture the native ad response you will need to implement [OnCustomFormatAdLoadedListener](https://developers.google.com/android/reference/com/google/android/gms/ads/nativead/NativeCustomFormatAd.OnCustomFormatAdLoadedListener) protocol. You should use following Prebid function to determine whether the Prebid line item should be rendered: From a10d636ea60f41eb4ea02afc96a44954f754cd86 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Tue, 18 Apr 2023 11:36:50 -0700 Subject: [PATCH 095/564] enabling the pm analytics mod to be downloadable (#4494) PubMatic Analytics Adapter will be available on Download page. --- dev-docs/analytics/pubmatic.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/analytics/pubmatic.md b/dev-docs/analytics/pubmatic.md index 08a7e34889..40d252b8fa 100644 --- a/dev-docs/analytics/pubmatic.md +++ b/dev-docs/analytics/pubmatic.md @@ -5,7 +5,6 @@ description: PubMatic Analytics Adapter modulecode: pubmatic prebid_member: true gvl_id: 76 -enable_download: false --- #### Registration From 0c74b29a52d49de77a4cf05adbbf049121732abd Mon Sep 17 00:00:00 2001 From: Yuriy Velichko Date: Tue, 18 Apr 2023 23:25:18 +0300 Subject: [PATCH 096/564] mobile: updates for sdk configuration flow (#4423) * mobile: updates for sdk configuration flow * doc: do not use test PBS URL in the public doc --- .../android/code-integration-android.md | 40 +++++++++----- .../pbm-api/ios/code-integration-ios.md | 55 +++++++++++++------ 2 files changed, 64 insertions(+), 31 deletions(-) diff --git a/prebid-mobile/pbm-api/android/code-integration-android.md b/prebid-mobile/pbm-api/android/code-integration-android.md index 63c19f7559..8b4842ce24 100644 --- a/prebid-mobile/pbm-api/android/code-integration-android.md +++ b/prebid-mobile/pbm-api/android/code-integration-android.md @@ -63,7 +63,9 @@ If you see errors while building the Prebid Mobile SDK or Demo Applications, mak {% include /alerts/alert_warning.html content=warning_note %} -## Initialize SDK +## Add SDK + +### Set Prebid Server {% capture warning_note %} All integration examples for Android are written in `Kotlin`. @@ -80,28 +82,40 @@ PrebidMobile.setPrebidServerAccountId(YOUR_ACCOUNT_ID) PrebidMobile.setPrebidServerHost(Host.APPNEXUS) ``` -If you have opted to host your own Prebid Server solution you will need to store the url to the server in your app. +If you have opted to host your own Prebid Server solution you will need to store the url to the server in your app. Make sure that your URL points to the [/openrtb2/auction](https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html) endpoint. + ``` -PrebidMobile.setPrebidServerHost(Host.createCustomHost("https://prebid-server-test-j.prebid.org/openrtb2/auction")) +PrebidMobile.setPrebidServerHost(Host.createCustomHost(PREBID_SERVER_AUCTION_ENDPOINT)) ``` -Once you set the account ID and the Prebid Server host, you should initialize the Prebid SDK. There are several options for how to do it. +### Initialize SDK -Use the following initialization for Prebid SDK: +Once you set the account ID and the Prebid Server host, you should initialize the Prebid SDK. Use the following initialization for Prebid SDK: ```kotlin -PrebidMobile.initializeSdk(applicationContext, object : SdkInitializationListener { - override fun onSdkInit() { - TODO("Not yet implemented") +PrebidMobile.initializeSdk(applicationContext) { status -> + if (status == InitializationStatus.SUCCEEDED) { + Log.d(TAG, "SDK initialized successfully!") + } else if (status == InitializationStatus.SERVER_STATUS_WARNING) { + Log.e(TAG, "Prebid Server status checking failed: $status\n${status.description}") } - - override fun onSdkFailedToInit(error: InitError?) { - TODO("Not yet implemented") + else { + Log.e(TAG, "SDK initialization error: $status\n${status.description}") } -}) +} ``` +During the initialization, SDK creates internal classes and performs the health check request to the [/status](https://docs.prebid.org/prebid-server/endpoints/pbs-endpoint-status.html) endpoint. If you use a custom PBS host you should provide a custom status endpoint as well: + +``` +PrebidMobile.setCustomStatusEndpoint(PREBID_SERVER_STATUS_ENDPOINT) +``` + +If something goes wrong with the request, the status of the initialization callback will be `SERVER_STATUS_WARNING`. It doesn't affect an SDK flow and just informs you about the health check result. + +### Check compatibility with your GMA SDK + If you integrate Prebid Mobile with GMA SDK, use the following method, which checks the compatibility of Prebid SDK with GMA SDK used in the app: ```kotlin @@ -182,7 +196,7 @@ Apply global settings with the `PrebidMobile` object. String containing the Prebid Server account ID. ```kotlin -PrebidMobile.setPrebidServerAccountId("123321") +PrebidMobile.setPrebidServerAccountId(YOUR_ACCOUNT_ID) var pbsAccountId = PrebidMobile.getPrebidServerAccountId() ``` diff --git a/prebid-mobile/pbm-api/ios/code-integration-ios.md b/prebid-mobile/pbm-api/ios/code-integration-ios.md index a5114a5933..bc62c341e4 100644 --- a/prebid-mobile/pbm-api/ios/code-integration-ios.md +++ b/prebid-mobile/pbm-api/ios/code-integration-ios.md @@ -88,49 +88,68 @@ scripts/buildPrebidMobile.sh This will output the PrebidMobile.framework. -## Initialize SDK +## Add SDK + +### Set Prebid Server Once you have a [Prebid Server](/prebid-mobile/prebid-mobile-getting-started.html), you will add 'account' info to the Prebid Mobile. For example, if you're using the AppNexus Prebid Server: ``` -Prebid.shared.prebidServerAccountId = "YOUR_ACCOUNT_ID" +Prebid.shared.prebidServerAccountId = YOUR_ACCOUNT_ID Prebid.shared.prebidServerHost = .Appnexus ``` -If you have opted to host your own Prebid Server solution, you will need to store the URL to the server in your app. +If you have opted to host your own Prebid Server solution, you will need to store the URL to the server in your app. Make sure that your URL points to the [/openrtb2/auction](https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html) endpoint. ``` -try! Prebid.shared.setCustomPrebidServer(url: "https://prebid-server-test-j.prebid.org/openrtb2/auction") +try! Prebid.shared.setCustomPrebidServer(url: PREBID_SERVER_AUCTION_ENDPOINT) ``` This method throws an exception if the provided URL is invalid. +### Initialize SDK + Once you set the account ID and the Prebid Server host, you should initialize the Prebid SDK. There are several options for how to do it. -For the No Ad Server scenario, use the following initialization: +If you integrate Prebid Mobile with GMA SDK, use the following initializer, which checks the compatibility of Prebid SDK with GMA SDK used in the app: +``` swift +Prebid.initializeSDK(GADMobileAds.sharedInstance()) { status, error in + switch status { + case .succeeded: + print("Prebid SDK successfully initialized") + case .failed: + if let error = error { + print("An error occurred during Prebid SDK initialization: \(error.localizedDescription)") + } + case .serverStatusWarning: + if let error = error { + print("Prebid Server status checking failed: \(error.localizedDescription)") + } + default: + break + } +} ``` + +Check the log messages of the app. If the provided GMA SDK version is not verified for compatibility, the Prebid SDK informs about it. + +For the No Ad Server scenario, use the following initialization: + +``` swift Prebid.initializeSDK { status, error in - if let error = error { - print("Initialization Error: \(error.localizedDescription)") - return - } + // .... } ``` -If you integrate Prebid Mobile with GMA SDK, use the following initializer, which checks the compatibility of Prebid SDK with GMA SDK used in the app: - +During the initialization, SDK creates internal classes and performs the health check request to the [/status](https://docs.prebid.org/prebid-server/endpoints/pbs-endpoint-status.html) endpoint. If you use a custom PBS host you should provide a custom status endpoint as well: ``` -Prebid.initializeSDK(GADMobileAds.sharedInstance()) { status, error in - if let error = error { - print("Initialization Error: \(error.localizedDescription)") - return - } -} +Prebid.shared.customStatusEndpoint = PREBID_SERVER_STATUS_ENDPOINT ``` -Check the log messages of the app. If the provided GMA SDK version is not verified for compatibility, the Prebid SDK informs about it. +If something goes wrong with the request, the status of the initialization callback will be `.serverStatusWarning`. It doesn't affect an SDK flow and just informs you about the health check result. + ## Set Targeting Parameters From 2774b4e184588d73cbba01248f54161e7e4cf9da Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 19 Apr 2023 10:58:28 -0400 Subject: [PATCH 097/564] trustx: update PBS support (#4499) removing the PBS flag from the 'standalone' docs file, which was intended for PBJS only --- dev-docs/bidders/trustxstandalone.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/trustxstandalone.md b/dev-docs/bidders/trustxstandalone.md index 951977146f..45c8797b58 100644 --- a/dev-docs/bidders/trustxstandalone.md +++ b/dev-docs/bidders/trustxstandalone.md @@ -3,7 +3,6 @@ layout: bidder title: TrustX (standalone) description: Prebid TrustX Bidder Adaptor pbjs: true -pbs: true biddercode: trustx media_types: banner, video multiformat_supported: will-bid-on-any From 3f535608bce1dde3e3a6ba3ce7b97c86e935580c Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:15:43 -0400 Subject: [PATCH 098/564] Updated Index's PBS docs (#4492) Updated bid request limit note --- dev-docs/bidders/ix-server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md index ea75fe7120..dbcd1baaa5 100644 --- a/dev-docs/bidders/ix-server.md +++ b/dev-docs/bidders/ix-server.md @@ -51,7 +51,7 @@ Publishers can use Prebid Server in any of the following ways with Index Exchang * In CTV apps and other long-form video environments, you (or the SSAI vendor) can make a call to Prebid Server using OpenRTB, and then Prebid Server uses our server-side adapter to call Index. For set up instructions, see [Call Index from CTV/long-form video environment](#set-up-instructions-to-call-index-through-prebid-server) section on this page. * In any other server-to-server OpenRTB environment, you can send OpenRTB bid requests to the Prebid Server host of your choice. For set up instructions, see [Call Index from any other server-to-server OpenRTB environment](#call-index-from-ortb) section on this page. -**Note about the bid request limit:** You can send up to 20 ad slots in a single bid request to Index. If a single bid request contains more than 20 ad slots, only the first 20 are accepted and the rest are ignored. +**Note about sending multiple ad slots in a single bid request:** Index accepts up to 100 valid ad slots in a single bid request. If a single bid request contains more than 100 ad slots (including invalid ad slots), only the first 100 valid ad slots are accepted and the rest are ignored. For example streaming TV media owners can signal multiple ad pods for long-form programming in a single request. From 7c321526ecd174051795cf5b2324c7924f99853d Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:16:57 -0400 Subject: [PATCH 099/564] updated Index's Prebid.js docs (#4491) Updated bid request limit, added AdUnit-specific data to the FPD module and rearranged the section. --- dev-docs/bidders/ix.md | 61 +++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 72997706e0..77ba5ff169 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -32,8 +32,9 @@ sidebarType: 1 - [Set up Prebid.js to call Index through Prebid Server (server-side adapter)](#set-up-prebidjs-to-call-index-through-prebid-server-server-side-adapter) - [Modules to include in your build process](#modules-to-include-in-your-build-process) - [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) - - [Index bidder-specific FPD module](#index-bidder-specific-fpd-module) - - [Prebid FPD module](#prebid-fpd-module) + - [Global data](#prebid-fpd-module) + - [Index bidder-specific data](#index-bidder-specific-fpd-module) + - [AdUnit-specific data](#adunit-specific-data) - [Index's outstream video player](#indexs-outstream-video-player) - [Prebid Native configuration](#prebid-native-configuration) - [Bid request parameters](#bid-request-parameters) @@ -54,13 +55,13 @@ Publishers can use Prebid.js to call Index Exchange (Index) in any of the follow * **Call through our server-side adapter**: Prebid.js makes a call to Prebid Server and then Prebid Server uses our server-side adapter to call Index. This reduces workload on the browser. For configuration instructions, see the [Set up Prebid.js to call Index through Prebid Server (server-side adapter)](#server-side-adapter) on this page. **Notes:** -* **Bid request limit**: You can send up to 20 ad slots in a single bid request to Index. If a single bid request contains more than 20 ad slots, only the first 20 are accepted and the rest are ignored. +* **Send multiple ad slots in a single bid request**: Index accepts up to 100 valid ad slots in a single bid request. If a single bid request contains more than 100 ad slots (including invalid ad slots), only the first 100 valid ad slots are accepted and the rest are ignored. For example streaming TV media owners can signal multiple ad pods for long-form programming in a single request. * **How to view bid requests sent to Index:** * In your browser, open a new tab. * Open the **Developer tools**. * In **Developer tools**, click the **Network** tab. * In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. -* **Recommended Global Bidder settings:** For our adapter, Index recommends enabling local storage. As of Prebid.js 7.x, local storage access must be explicitly specified. By leveraging local storage, Index is able to take advantage of the latest features our exchange has to offer. For instructions on enabling local storage, see Prebid’s [pbjs.bidderSettings](https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html) documentation. +* **Recommended Global Bidder settings:** For our adapter, Index recommends enabling local storage. As of Prebid.js 7.x, local storage access must be explicitly specified. By leveraging local storage, Index is able to take advantage of the latest features our exchange has to offer. For instructions on enabling local storage, see Prebid’s [pbjs.bidderSettings](https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html) documentation.
Example: ```javascript pbjs.bidderSettings = { @@ -198,18 +199,34 @@ If you are using a JSON file to specify modules, add `ixBidAdapter` and `dfpAdSe ## Set up First Party Data (FPD) -You can set up FPD using the Index bidder-specific module (recommended) or the Prebid FPD module. +You can set up the Prebid.js FPD module using Global data, Index bidder-specific site data, or ad unit-specific data. Index supports deal targeting in all the three FPD types. -**Notes:** +
+ +### Global data -* Index does not support ad unit-specific FPD and `ortb2.imp`. -* To target deals with Index, you must use the Index bidder-specific FPD module. The Prebid FPD module does not support deals targeting. If you have any questions or need help setting up the configuration, contact your Index Representative. +Use this data type to allow all bid adapters to have access to first party data that might be useful in ad targeting. This is available from Prebid.js version 4.30 and above. + +To supply data that is accessible to all bidders, use the `[pbjs.setConfig()]` object as illustrated below. Use the `[setBidderConfig()]` function to supply bidder-specific data. For more information about the standard or more detailed examples, see Prebid's [First Party Data Feature](https://docs.prebid.org/features/firstPartyData.html) documentation. + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + ... + }, + user: { + ... + } + } +}); +``` -### Index bidder-specific FPD module +### Index bidder-specific data -This module allows you to specify key-value pairs that will be included in your query string when targeting deals. For example, if a user visits a news page, you can pass that information by submitting a key-value pair for `category = news`. You can then create a deal in the Index UI and activate the deal only on pages that contain `category = news` as the key-value pair. +Use this data type to specify key-value pairs that will be included in your query string when targeting deals. For example, if a user visits a news page, you can pass that information by submitting a key-value pair for `category = news`. You can then create a deal in the Index UI and activate the deal only on pages that contain `category = news` as the key-value pair. To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the `ix` bidder level, provide the key-values in the `firstPartyData` parameter. Make sure that you set it before the `pbjs.requestBids` configuration. If you want to change the values, you can update the `pbjs.setConfig` once again. The change will be reflected in all future bid requests. @@ -224,26 +241,22 @@ To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the ` } }); ``` + +### AdUnit-specific data - - -### Prebid FPD module +Use this data type to specify key-value pairs at the ad unit level when targeting deals and apply it to all bidders. This is available from Prebid.js version 7.45 and above. To include the adUnit-specific data in a bid request, see Prebid's [Supplying AdUnit-Specific Data](https://docs.prebid.org/features/firstPartyData.html#supplying-adunit-specific-data) documentation. -This module allows all bid adapters to have access to first party data that might be useful in ad targeting. This is available from Prebid.js version 4.30 and above. -To supply data that is accessible to all bidders, use the `[pbjs.setConfig()]` object as illustrated below. Use the `[setBidderConfig()]` function to supply bidder-specific data. For more information about the standard or more detailed examples, see Prebid's [First Party Data Feature](https://docs.prebid.org/features/firstPartyData.html) documentation. ```javascript -pbjs.setConfig({ - ortb2: { - site: { - ... - }, - user: { - ... +ortb2Imp: { + ext: { + data: { + pbadslot: "homepage-top-rect", + adUnitSpecificAttribute: "123" } - } -}); + } + } ``` From c3feb1513f70e7957a3d380426a2adfb6cc6ed8a Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 19 Apr 2023 13:56:01 -0400 Subject: [PATCH 100/564] re-adding cleanmedianet (#4500) * re-adding cleanmedianet Per issue https://github.com/prebid/prebid.github.io/issues/4448 * Update cleanmedianet.md * Update cleanmedianet.md --- dev-docs/bidders/cleanmedianet.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 dev-docs/bidders/cleanmedianet.md diff --git a/dev-docs/bidders/cleanmedianet.md b/dev-docs/bidders/cleanmedianet.md new file mode 100644 index 0000000000..5b1d420dce --- /dev/null +++ b/dev-docs/bidders/cleanmedianet.md @@ -0,0 +1,29 @@ +--- +layout: bidder +title: Clean Media Net +description: Clean Media Bidder Adapter +biddercode: cleanmedianet +pbjs: true +media_types: banner, video +gdpr_supported: false +usp_supported: true +coppa_supported: false +schain_supported: true +floors_supported: true +userIds: +prebid_member: false +safeframes_ok: true +deals_supported: false +pbs_app_supported: false +fpd_supported: false +ortb_blocking_supported: false +gvl_id: +multiformat_supported: will-bid-on-any +--- + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------------+----------+--------------------------------------------------------+-------------------------+---------| +| `supplyPartnerId` | required | The supply account's ID in your Clean Media dashboard. | `"1253"`, `"1254"`, etc | string | From 8cbf858dd8632327be3b102352a86f074340153f Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 20 Apr 2023 10:01:27 +0200 Subject: [PATCH 101/564] Support consent mode for google analytics (#4441) * Support consent mode for google analytics * Use onetrustloaded global promise * Working consent for GA --- _includes/footer.html | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index c734d23e0a..da9a3fb82a 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -9,21 +9,33 @@
+ From fffa44d5b909313c6fb45ec25c83e19a89492a8b Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 20 Apr 2023 10:20:30 +0200 Subject: [PATCH 102/564] Revert "Support consent mode for google analytics (#4441)" (#4502) This reverts commit 8cbf858dd8632327be3b102352a86f074340153f. --- _includes/footer.html | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index da9a3fb82a..c734d23e0a 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -9,33 +9,21 @@ - From 9b5d29cae0b2e6d28e28ff29f9d69a5d534bf285 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 20 Apr 2023 13:15:58 +0200 Subject: [PATCH 103/564] Respect consent for google analytics (#4503) * Support consent mode for google analytics * Use onetrustloaded global promise * Working consent for GA * Disable TCF2 support for gtag --- _includes/footer.html | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index c734d23e0a..79da5595f1 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -9,21 +9,34 @@ + From d7910a667af6546319b99065b792f26dab2677f7 Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Fri, 21 Apr 2023 13:12:22 -0400 Subject: [PATCH 104/564] PBS-Go Feature Updates (#4507) --- dev-docs/modules/multibid.md | 2 +- prebid-server/developers/add-new-bidder-go.md | 2 +- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 6 ------ prebid-server/features/pbs-feature-idx.md | 8 ++++---- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/dev-docs/modules/multibid.md b/dev-docs/modules/multibid.md index e9ae46f0cc..36b3b9cdfb 100644 --- a/dev-docs/modules/multibid.md +++ b/dev-docs/modules/multibid.md @@ -104,4 +104,4 @@ array returned from the `interpretResponse` function. ## Related Topics -- [MultiBid in the Prebid Server /openrtb2/auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid-pbs-java-only) +- [MultiBid in the Prebid Server /openrtb2/auction endpoint](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid) diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index b06bb3c8b2..f52a14e8b0 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -494,7 +494,7 @@ import ( "fmt" "net/http" - "github.com/prebid/openrtb/v17/openrtb2" + "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index a886e3624f..412e9ebc30 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1140,9 +1140,6 @@ Each adapter must be coded to read the values from the ortb and pass it to their ##### Custom Targeting -{: .alert.alert-info :} -PBS-Java only - An OpenRTB extension, whether in the the original request or the [stored-request](/prebid-server/features/pbs-storedreqs.html), can customize the ad server targeting generated by PBS. The OpenRTB field is `ext.prebid.adservertargeting`. Here's an example: @@ -1203,9 +1200,6 @@ In order to pull AMP parameters out into targeting, Prebid Server places AMP que ##### MultiBid -{: .alert.alert-info :} -PBS-Java only - Allows a single bidder to bid more than once into an auction and have extra bids passed back to the client. diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index a202b3ddd1..e7b35b38a9 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -18,7 +18,7 @@ title: Prebid Server | Features | [AMP](/prebid-server/use-cases/pbs-amp.html) | Core | Reads and responds to the /openrtb2/amp endpoint | | | | Targeting | Core | Request can specify `includewinners` and `includebidderkeys`. These cause PBS to emit seatbid[].bid[].ext.prebid.targeting values. | | | | Targeting | Format | Request can specify `includeformat`, which causes PBS to emit hb_format along with other targeting values like hb_pb, etc. | | | -| Targeting | [Custom Targeting](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#custom-targeting) | Request can specify `ext.prebid.adservertargeting`, which causes PBS to emit custom targeting values. | | | +| Targeting | [Custom Targeting](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#custom-targeting) | Request can specify `ext.prebid.adservertargeting`, which causes PBS to emit custom targeting values. | | | | Request Params | Global Params | Publishers can specify [adapter-specific cross-impression attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#global-bid-adapter-parameters). | | | | [Price Granularity](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#targeting) | Core | Request can define quantization rules. Bids are quantized before being added to ad server targeting. | | | | Price Granularity | Mediatype pricegranularity | Request can define different quantization rules for different mediatypes. Bids are quantized before being added to ad server targeting. | | | @@ -30,11 +30,11 @@ title: Prebid Server | Features | GDPR | Support for basicEnforcementVendors | Host companies can define bidders that don't require vendor consent but do require Purpose consent. | | | | GDPR | TCF 2 Geo-Fencing | If the incoming request contains device.geo.country, PBS will enforce the EEA if the request is flagged as being in GDPR scope. | | | | GDPR | TCF 2 Geo-Lookup | Can use a geographic lookup service to help determine whether the incoming request is in-scope for GDPR. | | | -| GDPR | TCF 2 channel exception | Can be configured to turn off GDPR checks for a specific account and a specific channel. e.g. Account 123 has a different legal basis for AMP. | | | +| GDPR | TCF 2 channel exception | Can be configured to turn off GDPR checks for a specific account and a specific channel. e.g. Account 123 has a different legal basis for AMP. | | | | [US Privacy](/prebid-server/features/pbs-privacy.html#ccpa--us-privacy) | USP core | Able to: read the US Privacy consent string (CCPA) and [take appropriate enforcement action](https://github.com/prebid/prebid-server/issues/1129). | | | | US Privacy | USP AMP support | Able to: read the US Privacy consent string from AMP requests and [take appropriate enforcement action](https://github.com/prebid/prebid-server/issues/1176). | | | | [GPP](/prebid-server/features/pbs-privacy.html#gpp) | GPP Passthrough | Global Privacy Platform parameters are passed through auction and usersync requests. | | | -| [GPP](/prebid-server/features/pbs-privacy.html#gpp) | GPP TCF2/USP Support | PBS reads the Global Privacy Platform string and pulls out TCF2/USP strings when appropriate. | | | +| [GPP](/prebid-server/features/pbs-privacy.html#gpp) | GPP TCF2/USP Support | PBS reads the Global Privacy Platform string and pulls out TCF2/USP strings when appropriate. | | | | COPPA | Core | Able to read the COPPA flag and [take appropriate enforcement action](https://github.com/prebid/prebid-server/issues/929). | | | | Global Privacy Control | Core | Passes the Sec-GPC header through to bidders. | | | | [Cache](/prebid-server/features/pbs-caching.html) | Bids core | Accepts the ext.prebid.cache.bids parameter, storing bid objects in PBC. | | | @@ -74,7 +74,7 @@ title: Prebid Server | Features | [Events](https://docs.google.com/document/d/1ry0X4C2EV-R0pMrm1IQk9BstxaT395UCl3KKqTGa5c8/edit#heading=h.7w5yevygp2gz) | Events | Ability to process the /event endpoint, place /event URLs in the OpenRTB response, and place /event URLs in VAST XML. | | | | Events | Events vasttrack endpoint | Ability to process the /vasttrack endpoint initated by Prebid.js, placing /event URLs in VAST XML. | | | | Events | Events BidID Generation | Some bidders don't generate unique enough BidIDs to join with auction events. This feature allows the host company to inject a PBS-generated BidID alongside the bidder-generated ID. | | | -| Auction | [MultiBid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid) | Allow named bidders to supply more than one response. | | | +| Auction | [MultiBid](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#multibid) | Allow named bidders to supply more than one response. | | | | Analytics | Analytics module support | Allows developers to plug in a [custom analytics adapter](/prebid-server/developers/pbs-build-an-analytics-adapter.html). | | | | Bid Response Validation | Validate secure markup | PBS can configurably reject bid responses that don't supply a secure creative when in a secure context. | | | | Bid Response Validation | Validate bid sizes | PBS can configurably reject bid responses with sizes that are bigger than the request dimensions. | | | From fbf381e8a347937161d807afb17a637a47e098f6 Mon Sep 17 00:00:00 2001 From: Scott Kay Date: Fri, 21 Apr 2023 13:13:08 -0400 Subject: [PATCH 105/564] Add PBS OpenRTB 2.6-202303 Fields (#4508) --- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 412e9ebc30..a6904a8040 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -150,6 +150,8 @@ Prebid Server accepts all OpenRTB 2.x fields and passes them in the request to a | dooh | 2.6-202211 | not yet supported by PBS | | imp.qty | 2.6-202211 | (PBS-Go only so far) Bidders supporting 2.5 only: this field is removed | | imp.dt | 2.6-202211 | (PBS-Go only so far) Bidders supporting 2.5 only: this field is removed | +| imp.refresh | 2.6-202303 | (PBS-Go only so far) Bidders supporting 2.5 only: this field is removed | +| imp.video.plcmt | 2.6-202303 | (PBS-Go only so far) Bidders supporting 2.5 only: this field is removed | #### IDs From ef8919d2c2fca5d6289b183cd5a931f11521fd3d Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Fri, 21 Apr 2023 13:16:18 -0400 Subject: [PATCH 106/564] Updated the version number for ad-unit FPD (#4509) Updated the version number for ad-unit FPD --- dev-docs/bidders/ix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 77ba5ff169..20679f046a 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -245,7 +245,7 @@ To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the ` ### AdUnit-specific data -Use this data type to specify key-value pairs at the ad unit level when targeting deals and apply it to all bidders. This is available from Prebid.js version 7.45 and above. To include the adUnit-specific data in a bid request, see Prebid's [Supplying AdUnit-Specific Data](https://docs.prebid.org/features/firstPartyData.html#supplying-adunit-specific-data) documentation. +Use this data type to specify key-value pairs at the ad unit level when targeting deals and apply it to all bidders. This will be available from Prebid.js version 7.46 and above. To include the adUnit-specific data in a bid request, see Prebid's [Supplying AdUnit-Specific Data](https://docs.prebid.org/features/firstPartyData.html#supplying-adunit-specific-data) documentation. ```javascript From 0d500846ef9b9ddf807123b527349624382742c5 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 21 Apr 2023 10:18:54 -0700 Subject: [PATCH 107/564] Remove duplicate listing of the `video.placement` option (#4488) --- dev-docs/adunit-reference.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 0aeba72d89..93751c6562 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -113,7 +113,6 @@ See [Prebid Native Implementation](/prebid/native-implementation.html) for detai | `w` | Recommended | Integer | Width of the video player in device independent pixels (DIPS)., see [OpenRTB 2.5 spec][openRTB]. | | `h` | Recommended | Integer | Height of the video player in device independent pixels (DIPS)., see [OpenRTB 2.5 spec][openRTB]. | | `startdelay` | Recommended | Integer | Indicates the start delay in seconds, see [OpenRTB 2.5 spec][openRTB]. | -| `placement` | Optional | Integer | Placement type for the impression, see [OpenRTB 2.5 spec][openRTB]. | | `linearity` | Optional | Integer | Indicates if the impression must be linear, nonlinear, etc, see [OpenRTB 2.5 spec][openRTB]. | | `skip` | Optional | Integer | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes., see [OpenRTB 2.5 spec][openRTB]. | | `skipmin` | Optional | Integer | Videos of total duration greater than this number of seconds can be skippable; only applicable if the ad is skippable., see [OpenRTB 2.5 spec][openRTB]. | From 7d9e458f8206091c515f891eaf23eba4ac6a4c36 Mon Sep 17 00:00:00 2001 From: Valentin Petrovych <72038591+ValentinPostindustria@users.noreply.github.com> Date: Thu, 27 Apr 2023 18:12:16 +0300 Subject: [PATCH 108/564] Mobile SDK multiformat feature (#4476) * Update iOS documentation. * iOS documentation corrections. * Update Android documentation. * Android corrections. * iOS corrections. * Android ad unit formats renaming. * iOS AdFormat case renaming * doc: corrections for iOS * doc: corrections for Android --------- Co-authored-by: Olena Stepaniuk Co-authored-by: Yuriy Velichko --- .../android-sdk-customization-controls.md | 2 +- .../android-sdk-integration-admob.md | 4 +- .../rendering/android-sdk-integration-gam.md | 2 +- .../rendering/android-sdk-integration-max.md | 4 +- .../rendering/android-sdk-integration-pb.md | 2 +- .../rendering/ios-sdk-integration-admob.md | 10 +- .../rendering/ios-sdk-integration-gam.md | 8 +- .../rendering/ios-sdk-integration-max.md | 10 +- .../rendering/ios-sdk-integration-pb.md | 14 +- ...ndroid-sdk-integration-gam-original-api.md | 194 +++++++-- .../ios-sdk-integration-gam-original-api.md | 367 ++++++++++++++---- 11 files changed, 472 insertions(+), 145 deletions(-) diff --git a/prebid-mobile/modules/rendering/android-sdk-customization-controls.md b/prebid-mobile/modules/rendering/android-sdk-customization-controls.md index e058866350..14051a9750 100644 --- a/prebid-mobile/modules/rendering/android-sdk-customization-controls.md +++ b/prebid-mobile/modules/rendering/android-sdk-customization-controls.md @@ -166,7 +166,7 @@ The code sample: adUnit = MediationInterstitialAdUnit( activity, configId, - EnumSet.of(AdUnitFormat.DISPLAY), + EnumSet.of(AdUnitFormat.BANNER), mediationUtils ) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md index 80d905459e..9fd9b965b7 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md @@ -138,7 +138,7 @@ val mediationUtils = AdMobInterstitialMediationUtils(extras) adUnit = MediationInterstitialAdUnit( activity, configId, - AdUnitFormat.DISPLAY, + AdUnitFormat.BANNER, mediationUtils ) @@ -183,7 +183,7 @@ The **default** ad format for interstitial is **DISPLAY**. In order to make a `m adUnit = MediationInterstitialAdUnit( activity, configId, - EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO), + EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO), mediationUtils ) ``` diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md index 305f135fed..22ecbebaec 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-gam.md @@ -159,7 +159,7 @@ The **default** ad format for an interstitial ad is **DISPLAY**. In order to mak interstitialAdUnit = InterstitialAdUnit( requireContext(), configId, - EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO), + EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO), eventHandler) ``` diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-max.md b/prebid-mobile/modules/rendering/android-sdk-integration-max.md index dbda51a507..31b9dc84f6 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-max.md @@ -121,7 +121,7 @@ val mediationUtils = MaxMediationInterstitialUtils(maxInterstitialAd) adUnit = MediationInterstitialAdUnit( activity, configId, - EnumSet.of(AdUnitFormat.DISPLAY), + EnumSet.of(AdUnitFormat.BANNER), mediationUtils ) @@ -140,7 +140,7 @@ The **default** ad format for interstitial is **DISPLAY**. In order to make a `m adUnit = MediationInterstitialAdUnit( activity, configId, - EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO), + EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO), mediationUtils ) ``` diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md index 64f053f525..f1b26481e5 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-pb.md @@ -138,7 +138,7 @@ The **default** ad format for interstitial is **DISPLAY**. In order to make a `m interstitialAdUnit = InterstitialAdUnit( requireContext(), configId, - EnumSet.of(AdUnitFormat.DISPLAY, AdUnitFormat.VIDEO)) + EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO)) ``` #### Step 1: Create an Ad Unit diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md index 489858d325..0a5d57a784 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md @@ -137,17 +137,17 @@ GADInterstitialAd.load(withAdUnitID: adUnitID, request: self?.gadRequest) { [wea }) ``` -The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property. +The **default** ad format for interstitial is **.banner**. 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 both video amd banner ads +adUnit?.adFormats = [.video, .banner] -// Make bid request for disply ad (default behaviour) -adUnit?.adFormats = [.display] +// Make bid request for banner ad (default behaviour) +adUnit?.adFormats = [.banner] ``` diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md index 858db8e2fa..cfe92bb361 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-gam.md @@ -152,17 +152,17 @@ if interstitial.isReady { ``` -The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values in the `adFormats` property. +The **default** ad format for interstitial is **.banner**. In order to make a `multiformat bid request`, set the respective values in 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] +adUnit?.adFormats = [.video, .banner] -// Make bid request for disply ad (default behaviour) -adUnit?.adFormats = [.display] +// Make bid request for banner ad (default behaviour) +adUnit?.adFormats = [.banner] ``` diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md index 965ed0d59a..fc59a138ca 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-max.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-max.md @@ -117,17 +117,17 @@ adUnit?.fetchDemand { [weak self] result in }) ``` -The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request` set the respective values in the `adFormats` property. +The **default** ad format for interstitial is **.banner**. In order to make a `multiformat bid request` set the respective values in 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 both video amd banner ads +adUnit?.adFormats = [.video, .banner] -// Make bid request for disply ad (default behaviour) -adUnit?.adFormats = [.display] +// Make bid request for banner ad (default behaviour) +adUnit?.adFormats = [.banner] ``` diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md index cafc31fe26..0bdb2beb4d 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-pb.md @@ -139,17 +139,17 @@ if interstitial.isReady { ``` -The **default** ad format for interstitial is **.display**. In order to make a `multiformat bid request`, set the respective values into the `adFormats` property. +The **default** ad format for interstitial is **.banner**. 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 both video and banner ads +adUnit?.adFormats = [.video, .banner] -// Make bid request for disply ad (default behaviour) -adUnit?.adFormats = [.display] +// Make bid request for banner ad (default behaviour) +adUnit?.adFormats = [.banner] ``` @@ -161,7 +161,7 @@ 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. +> **NOTE:** minSizePercentage - plays an important role in a bidding process for banner ads. If provided space is not enough demand partners won't respond with the bids. #### Step 2: Load the Ad {:.no_toc} @@ -225,4 +225,4 @@ Wait until the ad will be loaded and present it to the user in any suitable time func rewardedAdDidReceiveAd(_ rewardedAd: RewardedAdUnit) { // Now the ad is ready for display } -``` \ No newline at end of file +``` diff --git a/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md b/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md index cead15dc04..8264e1f049 100755 --- a/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md +++ b/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.md @@ -21,7 +21,11 @@ This is the original Prebid mobile integration approach when SDK plays the trans ![In-App Bidding with Prebid](/assets/images/prebid-mobile/prebid-in-app-bidding-overview-prebid-original-gam.png) -## Display Banner +## Banner API + +Starting with Prebid Mobile `2.1.0` you can use `BannerAdUnit` to bid over the banner and/or video demand. The default ad format is `BANNER`. To customize the bidding format, specify the ad formats in the `BannerAdUnit` constructor. + +### HTML Banner Integration example: @@ -33,8 +37,9 @@ private fun createAd() { adUnit?.setAutoRefreshInterval(refreshTimeSeconds) // 2. Configure banner parameters - val parameters = BannerBaseAdUnit.Parameters() + val parameters = BannerParameters() parameters.api = listOf(Signals.Api.MRAID_3, Signals.Api.OMID_1) + adUnit.bannerParameters = parameters // 3. Create AdManagerAdView val adView = AdManagerAdView(this) @@ -55,7 +60,7 @@ private fun createAd() { } ``` -GAM ad view listner: +GAM ad view listener: ```kotlin private fun createGAMListener(adView: AdManagerAdView): AdListener { @@ -88,7 +93,10 @@ Initialize the `BannerAdUnit` with properties: #### Step 2: Configure banner parameters {:.no_toc} -Using the `BannerBaseAdUnit.Parameters()` you can customize the bid request for BannerAdUnit. +Using the `BannerParameters()` you can customize the bid request for BannerAdUnit. + +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `BannerBaseAdUnit.Parameters` class is deprecated. Use `BannerParameters` instead. The `api` property is dedicated to adding values for API Frameworks to a bid response according to the OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) spec. The supported values for GMA SDK integration are: @@ -119,17 +127,17 @@ Be sure that you make the ad request with the same `AdManagerAdRequest` object t Once an app receives a signal that an ad is loaded, you should use the method `AdViewUtils.findPrebidCreativeSize` to verify whether it's Prebid's ad and resize the ad slot respectively to the creative's properties. -## Video Banner +### Video Banner (Outstream Video) Integration example: ```kotlin private fun createAd() { // 1. Create VideoAdUnit - adUnit = VideoAdUnit(CONFIG_ID, WIDTH, HEIGHT) + adUnit = BannerAdUnit(CONFIG_ID, WIDTH, HEIGHT, EnumSet.of(AdUnitFormat.VIDEO)) // 2. Configure video ad unit - adUnit?.parameters = configureVideoParameters() + adUnit?.videoParameters = configureVideoParameters() // 3. Create AdManagerAdView val gamView = AdManagerAdView(this) @@ -147,12 +155,15 @@ private fun createAd() { } ``` +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoAdUnit` class is deprecated. Use `BannerAdUnit` class with video ad format instead. + + Configure Video parameters: ```kotlin -private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { - return VideoBaseAdUnit.Parameters().apply { - +private fun configureVideoParameters(): VideoParameters { + return VideoParameters(listOf("video/x-flv", "video/mp4")).apply { api = listOf( Signals.Api.VPAID_1, Signals.Api.VPAID_2 @@ -162,7 +173,6 @@ private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { minBitrate = 300 maxDuration = 30 minDuration = 5 - mimes = listOf("video/x-flv", "video/mp4") playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn) protocols = listOf( Signals.Protocols.VAST_2_0 @@ -189,18 +199,22 @@ private fun createListener(gamView: AdManagerAdView): AdListener { } ``` -#### Step 1: Create a VideoAdUnit +#### Step 1: Create a BannerAdUnit with the video ad type {:.no_toc} -Initialize the `VideoAdUnit` with the following properties: +Initialize the `BannerAdUnit` with the following properties: - `configId` - an ID of the Stored Impression on the Prebid Server - `adSize` - the size of the ad unit which will be used in the bid request. +- `adUnitFormats` - `AdUnitFormat.VIDEO` for a video ad #### Step 2: Configure video parameters {:.no_toc} -Using the `VideoParameters` you can customize the bid request for a VideoAdUnit. +Using the `VideoParameters` you can customize the bid request for a `BannerAdUnit`. + +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoBaseAdUnit.Parameters` class is deprecated. Use `VideoParameters` instead. #### placement {:.no_toc} @@ -227,7 +241,6 @@ The `api` property is dedicated to adding values for API Frameworks to a bid res * `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal * `7` or `Signals.Api.OMID_1` : signals OMSDK support - #### maxBitrate {:.no_toc} @@ -297,7 +310,61 @@ You should now request the ad from GAM. If the `AdManagerAdRequest` contains tar Be sure that you make the ad request with the same `AdManagerAdRequest` object that you passed to the `fetchDemand` method. Otherwise, the ad request won't contain targeting keywords, and Prebid's ad won't ever be displayed. -## Display Interstitial +### Multiformat Banner (HTML + Video) + +Integration example: + +```kotlin +// 1. Create BannerAdUnit +adUnit = BannerAdUnit(configId, WIDTH, HEIGHT, EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO)) +adUnit?.setAutoRefreshInterval(refreshTimeSeconds) + +// 2. Configure banner and video parameters +val parameters = BannerParameters() +parameters.api = listOf(Signals.Api.MRAID_3, Signals.Api.OMID_1) +adUnit?.bannerParameters = parameters + +adUnit?.videoParameters = VideoParameters(listOf("video/mp4")) + +// 3. Create AdManagerAdView +val adView = AdManagerAdView(this) +adView.adUnitId = AD_UNIT_ID +adView.setAdSizes(AdSize(WIDTH, HEIGHT)) +adView.adListener = createGAMListener(adView) + +// Add GMA SDK banner view to the app UI +adWrapperView.addView(adView) + +// 4. Make a bid request to Prebid Server +val request = AdManagerAdRequest.Builder().build() +adUnit?.fetchDemand(request) { + + // 5. Load GAM Ad + adView.loadAd(request) +} +``` + +#### Step 1: Create a BannerAdUnit +{:.no_toc} + +Initialize the `BannerAdUnit` with properties: + +- `configId` - an ID of the Stored Impression on the Prebid Server +- `width` - the width of the ad unit which will be used in the bid request. +- `height` - the height of the ad unit which will be used in the bid request. +- `adUnitFormats` - ad unit formats for the current ad unit. + +#### Step 2-5 +{:.no_toc} + +Steps 2-5 are the same as for Display Banner. Setting up banner and video parameters can be found in Display Banner and Video Banner respectively. + + +## Interstitial API + +Starting with Prebid Mobile `2.1.0` you can use `InterstitialAdUnit ` to bid over the banner and/or video demand. The default ad format is `BANNER`. To customize the bidding format, specify the ad formats in the `InterstitialAdUnit ` constructor. + +### HTML Interstitial Integration example: @@ -373,18 +440,18 @@ Be sure that you make the ad request with the same `AdManagerAdRequest` object t Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/android/interstitial#display_the_ad) to display an interstitial ad right after receiving it or later in a natural pauses in the flow of an app. -## Video Interstitial +### Video Interstitial Integration Example: ```kotlin private fun createAd() { - // 1. Create VideoInterstitialAdUnit - adUnit = VideoInterstitialAdUnit(CONFIG_ID) + // 1. Create InterstitialAdUnit + adUnit = InterstitialAdUnit(CONFIG_ID, EnumSet.of(AdUnitFormat.VIDEO)) // 2. Configure video ad unit - adUnit?.parameters = configureVideoParameters() + adUnit?.videoParameters = configureVideoParameters() // 3. Make a bid request to Prebid Server val request = AdManagerAdRequest.Builder().build() @@ -401,11 +468,15 @@ private fun createAd() { } ``` +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoInterstitialAdUnit` class is deprecated. Use `InterstitialAdUnit` class with video ad format instead. + + Configuration function: ```kotlin -private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { - return VideoBaseAdUnit.Parameters().apply { +private fun configureVideoParameters(): VideoParameters { + return VideoParameters(listOf("video/x-flv", "video/mp4")).apply { placement = Signals.Placement.Interstitial api = listOf( @@ -417,7 +488,6 @@ private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { minBitrate = 300 maxDuration = 30 minDuration = 5 - mimes = listOf("video/x-flv", "video/mp4") playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn) protocols = listOf( Signals.Protocols.VAST_2_0 @@ -449,9 +519,10 @@ private fun createAdListener(): AdManagerInterstitialAdLoadCallback { #### Step 1: Create an Ad Unit {:.no_toc} -Initialize the Interstitial Video Ad Unit with the following properties: +Initialize the `InterstitialAdUnit` with the following properties: - `configId` - an ID of Stored Impression on the Prebid Server +- `adUnitFormats` - AdUnitFormat.VIDEO for a video ad #### Step 2: Configure video parameters {:.no_toc} @@ -475,7 +546,46 @@ Be sure that you make the ad request with the same `AdManagerAdRequest` object t Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/android/interstitial#display_the_ad) to display an interstitial ad right after receiving it or later in a natural pauses in the flow of an app. -## Rewarded Video +### Multiformat Interstitial (HTML + Video) + +Integration example: + +```kotlin +// 1. Create InterstitialAdUnit +adUnit = InterstitialAdUnit(configId, EnumSet.of(AdUnitFormat.BANNER, AdUnitFormat.VIDEO)) +adUnit?.setMinSizePercentage(80, 60) +adUnit?.videoParameters = VideoParameters(listOf("video/mp4")) + + +// 2. Make a bid request to Prebid Server +val request = AdManagerAdRequest.Builder().build() +adUnit?.fetchDemand(request) { + + // 3. Load a GAM interstitial ad + AdManagerInterstitialAd.load( + this, + AD_UNIT_ID, + request, + createListener() + ) +} +``` + +#### Step 1: Create an Ad Unit +{:.no_toc} + +Initialize the `InterstitialAdUnit` with the following properties: + +- `configId` - an ID of Stored Impression on the Prebid Server +- `adUnitFormats` - ad unit formats for the current ad unit. + +#### Steps 2-3 +{:.no_toc} + +Steps 2-3 are the same as for Display Banner. Setting up banner and video parameters can be found in Display Interstitial and Video Interstitial respectively. + + +## Rewarded Video API Integration example: @@ -485,7 +595,7 @@ private fun createAd() { adUnit = RewardedVideoAdUnit(CONFIG_ID) // 2. Configure Video parameters - adUnit?.parameters = configureVideoParameters() + adUnit?.videoParameters = configureVideoParameters() // 3. Make a bid request to Prebid Server val request = AdManagerAdRequest.Builder().build() @@ -502,12 +612,11 @@ private fun createAd() { } ``` -Configure vide ad unit: +Configure video ad unit: ```kotlin -private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { - return VideoBaseAdUnit.Parameters().apply { - mimes = listOf("video/mp4") +private fun configureVideoParameters(): VideoParameters { + return VideoParameters(listOf("video/mp4")).apply { protocols = listOf(Signals.Protocols.VAST_2_0) playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOff) } @@ -563,17 +672,17 @@ Be sure that you make the ad request with the same `AdManagerAdRequest` object t Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/android/rewarded#show_the_ad) to display a rewarded ad right after receiving it or later in a natural pauses in the flow of an app. -## Video Instream +## Instream Video API Integration example: ```kotlin private fun createAd() { // 1. Create VideoAdUnit - adUnit = VideoAdUnit(CONFIG_ID, WIDTH, HEIGHT) + adUnit = InStreamVideoAdUnit(CONFIG_ID, WIDTH, HEIGHT) // 2. Configure video parameters - adUnit?.parameters = configureVideoParameters() + adUnit?.videoParameters = configureVideoParameters() // 3. Init player view playerView = PlayerView(this) @@ -600,11 +709,14 @@ private fun createAd() { } ``` +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoAdUnit` class is deprecated. Use `InStreamVideoAdUnit ` instead. + Configure the video ad: ```kotlin -private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { - return VideoBaseAdUnit.Parameters().apply { +private fun configureVideoParameters(): VideoParameters { + return VideoParameters(listOf("video/x-flv", "video/mp4")).apply { placement = Signals.Placement.InStream api = listOf( @@ -616,7 +728,6 @@ private fun configureVideoParameters(): VideoBaseAdUnit.Parameters { minBitrate = 300 maxDuration = 30 minDuration = 5 - mimes = listOf("video/x-flv", "video/mp4") playbackMethod = listOf(Signals.PlaybackMethod.AutoPlaySoundOn) protocols = listOf( Signals.Protocols.VAST_2_0 @@ -689,7 +800,9 @@ Using Prebid util method, generate Google IMA URI for downloading the cached cre Follow the Google Guide for [integrating IMA with ExoPlayer](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/exoplayer-extension) to run a video and show instream ad from the winning bid. -## Native Style Banner +## Native API + +### Native Banner Integration example: @@ -805,7 +918,7 @@ Now you should request the ad from GAM. If the `AdManagerAdRequest` contains tar Be sure that you make the ad request with the same `AdManagerAdRequest` object that you passed to the `fetchDemand` method. Otherwise, the ad request won't contain targeting keywords, and Prebid's ad won't ever be displayed. -## In-App Native +### In-App Native Integration example: @@ -1013,10 +1126,7 @@ Once the Prebid line item is recognized you should extract the ad from the winni Each ad unit in the Original API is a subclass of the `AdUnit` class, which provides the following properties and methods for additional configuration. -### Properties - -#### pbAdSlot -{:.no_toc} +### Ad Slot PB Ad Slot is an identifier tied to the placement the ad will be delivered in. The use case for PB Ad Slot is to pass to exchange an ID they can use to tie to reporting systems or use for data science driven model building to match with impressions sourced from alternate integrations. A common ID to pass is the ad server slot name. diff --git a/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.md b/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.md index 0cd9b06dae..6d7b6d9606 100644 --- a/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.md +++ b/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.md @@ -21,7 +21,11 @@ This is the original Prebid mobile integration approach when SDK plays the trans ![In-App Bidding with Prebid](/assets/images/prebid-mobile/prebid-in-app-bidding-overview-prebid-original-gam.png) -## Display Banner +## Banner API + +Starting with Prebid Mobile `2.1.0` you can use `BannerAdUnit` to bid over the banner and/or video demand. The default ad format is `.banner`. To customize the bidding format you should specify the `adFormats` property of the `BannerAdUnit`. + +### HTML Banner Integration example: @@ -33,7 +37,7 @@ adUnit.setAutoRefreshMillis(time: 30000) // 2. Configure banner parameters let parameters = BannerParameters() parameters.api = [Signals.Api.MRAID_2] -adUnit.parameters = parameters +adUnit.bannerParameters = parameters // 3. Create a GAMBannerView gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(adSize)) @@ -89,6 +93,9 @@ The `api` property is dedicated to adding values for API Frameworks to bid respo * `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal * `7` or `Signals.Api.OMID_1` : signals OMSDK support +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `parameters` property is deprecated. Use `bannerParameters` instead. + #### Step 3: Create a GAMBannerView {:.no_toc} @@ -111,23 +118,25 @@ Be sure that you make the ad request with the same `GAMRequest` object that you Once an app receives a signal that an ad is loaded, you should use the method `AdViewUtils.findPrebidCreativeSize` to verify whether it is a Prebid ad and resize the ad slot respectively to the creative's properties. -## Video Banner +### Video Banner (Outstream Video) Integration example: ``` swift // 1. Create a BannerAdUnit -adUnit = VideoAdUnit(configId: storedImpVideoBanner, size: adSize) +adUnit = BannerAdUnit(configId: CONFIG_ID, size: adSize) + +// 2. Set ad format +adUnit.adFormats = [.video] -// 2. Configure video parameters -let parameters = VideoParameters() -parameters.mimes = ["video/mp4"] +// 3. Configure video parameters +let parameters = VideoParameters(mimes: ["video/mp4"]) parameters.protocols = [Signals.Protocols.VAST_2_0] parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] parameters.placement = Signals.Placement.InBanner -adUnit.parameters = parameters +adUnit.videoParameters = parameters -// 3. Create a GAMBannerView +// 4. Create a GAMBannerView gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(adSize)) gamBanner.adUnitID = gamAdUnitVideoBannerOriginal gamBanner.rootViewController = self @@ -137,28 +146,36 @@ gamBanner.delegate = self bannerView.addSubview(gamBanner) bannerView.backgroundColor = .clear -// 4. Make a bid request to Prebid Server +// 5. Make a bid request to Prebid Server let gamRequest = GAMRequest() adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") - // 5. Load GAM Ad + // 6. Load GAM Ad self?.gamBanner.load(gamRequest) } ``` -#### Step 1: Create a VideoAdUnit +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoAdUnit` class is deprecated. Use `BannerAdUnit` class with video ad format instead. + +#### Step 1: Create a BannerAdUnit {:.no_toc} -Initialize the `VideoAdUnit` with the following properties: +Initialize the `BannerAdUnit` with the following properties: - `configId` - an ID of the Stored Impression on the Prebid Server - `adSize` - the size of the ad unit which will be used in the bid request. -#### Step 2: Configure the video parameters +#### Step 2: Set ad format {:.no_toc} -Using the `VideoParameters` you can customize the bid request for VideoAdUnit. +For video ad unit, you must set video ad format. Default value for `adFormats` property is `[.banner]`. + +#### Step 3: Configure the video parameters +{:.no_toc} + +Using the `VideoParameters` you can customize the bid request for video ads. #### placement {:.no_toc} @@ -172,7 +189,6 @@ In the context of a VideoInterstitialAdUnit, rewarded video ads are typically la * `4` or `InFeed` : In-Feed placement is found in content, social, or product feeds. * `5` or `Slider`, `Floating` or `Interstitial` : Open RTB supports one of three values for option 5 as either Slider, Floating or Interstitial. If an enum value is supplied in placement, bidders will receive value 5 for placement type and assume to be interstitial with the instl flag set to 1. - #### api {:.no_toc} @@ -185,7 +201,6 @@ The `api` property is dedicated to adding values for API Frameworks to bid respo * `6` or `Signals.Api.MRAID_3` : MRAID-3 support signal * `7` or `Signals.Api.OMID_1` : signals OMSDK support - #### maxBitrate {:.no_toc} @@ -210,6 +225,7 @@ Integer representing the OpenRTB 2.5 minimum video ad duration in seconds. {:.no_toc} Array of strings representing the supported OpenRTB 2.5 content MIME types (e.g., “video/x-ms-wmv”, “video/mp4”). +Required property. #### playbackMethod {:.no_toc} @@ -237,31 +253,137 @@ Array of OpenRTB 2.5 playback methods. If none are specified, any method may be - `7` or `Signals.Protocols.VAST_4_0` : VAST 4.0 - `8` or `Signals.Protocols.VAST_4_0_Wrapper` : VAST 4.0 Wrapper - -#### Step 3: Create a GAMBannerView +#### Step 4: Create a GAMBannerView {:.no_toc} Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner) to integrate a banner ad unit. -#### Step 4: Make a bid request +#### Step 5: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `GAMRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. -#### Step 5: Load an Ad +#### Step 6: Load an Ad {:.no_toc} You should now request the ad from GAM. If the `GAMRequest` contains targeting keywords. The respective Prebid line item will be returned from GAM and GMA SDK will render its creative. Be sure that you make the ad request with the same `GAMRequest` object that you passed to the `fetchDemand` method. Otherwise the ad request won't contain targeting keywords and Prebid's ad won't ever be displayed. -## Display Interstitial +### Multiformat Banner (HTML + Video) + +Integration example: + +``` swift +// 1. Create a BannerAdUnit +adUnit = BannerAdUnit(configId: CONFIG_ID, size: adSize) +adUnit.setAutoRefreshMillis(time: 30000) + +// 2. Set adFormats +adUnit.adFormats = [.banner, .video] + +// 3. Configure banner parameters +let bannerParameters = BannerParameters() +bannerParameters.api = [Signals.Api.MRAID_2] +adUnit.bannerParameters = bannerParameters + +// 4. Configure video parameters +let videoParameters = VideoParameters(mimes: ["video/mp4"]) +videoParameters.protocols = [Signals.Protocols.VAST_2_0] +videoParameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] +videoParameters.placement = Signals.Placement.InBanner +adUnit.videoParameters = videoParameters + +// 5. Create a GAMBannerView +gamBanner = GAMBannerView(adSize: GADAdSizeFromCGSize(adSize)) +gamBanner.adUnitID = gamAdUnitMultiformatBannerOriginal +gamBanner.rootViewController = self +gamBanner.delegate = self + +// Add GMA SDK banner view to the app UI +bannerView?.addSubview(gamBanner) + +// 6. Make a bid request to Prebid Server +let gamRequest = GAMRequest() +adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 7. Load GAM Ad + self?.gamBanner.load(gamRequest) +} +``` + +Implement GADBannerViewDelegate: + +```swift +func bannerViewDidReceiveAd(_ bannerView: GADBannerView) { + + // 8. Resize ad view if needed + AdViewUtils.findPrebidCreativeSize(bannerView, success: { size in + guard let bannerView = bannerView as? GAMBannerView else { return } + bannerView.resize(GADAdSizeFromCGSize(size)) + }, failure: { (error) in + PrebidDemoLogger.shared.error("Error occuring during searching for Prebid creative size: \(error)") + }) +} +``` + +#### Step 1: Create a BannerAdUnit +{:.no_toc} + +Initialize the `BannerAdUnit` with the following properties: + +- `configId` - an ID of the Stored Impression on the Prebid Server +- `adSize` - the size of the ad unit which will be used in the bid request. + +#### Step 2: Set ad formats +{:.no_toc} + +For multiformat ad unit, you must set both banner and video ad formats. + +#### Step 3: Configure banner parameters +{:.no_toc} + +Provide configuration properties for the banner ad using the [BannerParameters](#step-2-configure-banner-parameters) object. + +#### Step 4: Configure video parameters +{:.no_toc} + +Provide configuration properties for the video ad using the [VideoParameters](#step-3-configure-the-video-parameters) object. + +#### Step 5: Create a GAMBannerView +{:.no_toc} + +Follow the [GMA SDK documentation](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/banner) to integrate a banner ad unit. + +#### Step 6: Make a bid request +{:.no_toc} + +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `GAMRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. + +#### Step 7: Load an Ad +{:.no_toc} + +Now you should request the ad from GAM. If the `GAMRequest` contains targeting keywords, the respective Prebid line item will be returned from GAM and GMA SDK will render its creative. + +Be sure that you make the ad request with the same `GAMRequest` object that you passed to the `fetchDemand` method. Otherwise, the ad request won't contain targeting keywords, and Prebid's ad won't ever be displayed. + +#### Step 8: Adjust the ad view size +{:.no_toc} + +Once an app receives a signal that an ad is loaded, you should use the method `AdViewUtils.findPrebidCreativeSize` to verify whether it is a Prebid ad and resize the ad slot respectively to the creative's properties. + +## Interstitial API + +Starting with Prebid Mobile `2.1.0` you can use `InterstitialAdUnit ` to bid over the banner and/or video demand. The default ad format is `.banner`. To customize the bidding format you should specify the `adFormats` property of the `InterstitialAdUnit `. + +### HTML Interstitial Integration example: ``` swift // 1. Create an Interstitial Ad Unit -adUnit = InterstitialAdUnit(configId: storedImpDisplayInterstitial) +adUnit = InterstitialAdUnit(configId: CONFIG_ID) // 2. Make a bid request to Prebid Server let gamRequest = GAMRequest() @@ -283,7 +405,7 @@ adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in } ``` -#### Step 1: InterstitialAdUnit +#### Step 1: Create an InterstitialAdUnit {:.no_toc} Initialize the InterstitialAdUnit with the following properties: @@ -298,6 +420,9 @@ Initialize the InterstitialAdUnit with the following properties: > Prebid Server will send the eligible size list to each bidder to solicit a bid. For a full description of the Prebid Server logic, please refer to the [Prebid Server PR 797](https://github.com/prebid/prebid-server/pull/797/files). +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `parameters` property is deprecated. Use `bannerParameters` instead. + #### Step 2: Make a bid request {:.no_toc} @@ -315,34 +440,36 @@ Be sure that you make the ad request with the same `GAMRequest` object that you Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial#display_the_ad) to display an interstitial ad right after receiving it or later in a natural pauses in the flow of an app. -## Video Interstitial +### Video Interstitial Integration Example: ```swift -// 1. Create a VideoInterstitialAdUnit -adUnit = VideoInterstitialAdUnit(configId: storedImpVideoInterstitial) +// 1. Create a InterstitialAdUnit +adUnit = InterstitialAdUnit(configId: CONFIG_ID) -// 2. Configure video parameters -let parameters = VideoParameters() -parameters.mimes = ["video/mp4"] +// 2. Set ad format +adUnit.adFormats = [.video] + +// 3. Configure video parameters +let parameters = VideoParameters(mimes: ["video/mp4"]) parameters.protocols = [Signals.Protocols.VAST_2_0] parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] -adUnit.parameters = parameters +adUnit.videoParameters = parameters -// 3. Make a bid request to Prebid Server +// 4. Make a bid request to Prebid Server let gamRequest = GAMRequest() adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") -// 4. Load a GAM interstitial ad +// 5. Load a GAM interstitial ad GAMInterstitialAd.load(withAdManagerAdUnitID: gamAdUnitVideoInterstitialOriginal, request: gamRequest) { ad, error in guard let self = self else { return } if let error = error { PrebidDemoLogger.shared.error("Failed to load interstitial ad with error: \(error.localizedDescription)") } else if let ad = ad { - // 5. Present the interstitial ad + // 6. Present the interstitial ad ad.present(fromRootViewController: self) ad.fullScreenContentDelegate = self } @@ -350,6 +477,9 @@ GAMInterstitialAd.load(withAdManagerAdUnitID: gamAdUnitVideoInterstitialOriginal } ``` +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoInterstitialAdUnit` class is deprecated. Use `InterstitialAdUnit` class with video ad format instead. + #### Step 1: Create an Ad Unit {:.no_toc} @@ -357,42 +487,127 @@ Initialize the Interstitial Video Ad Unit with properties: - `configId` - an ID of Stored Impression on the Prebid Server -#### Step 2: Configure video parameters + +#### Step 2: Set ad format {:.no_toc} -Provide configuration properties for the video ad using the [VideoParameters](#step-2-configure-video-parameters) object. +For video ad unit, you must set video ad format. Default value for `adFormats` property is `[.banner]`. -#### Step 3: Make a bid request +#### Step 3: Configure video parameters +{:.no_toc} + +Provide configuration properties for the video ad using the [VideoParameters](#step-3-configure-the-video-parameters) object. + +#### Step 4: Make a bid request {:.no_toc} The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `GAMRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. -#### Step 4: Load a GAM interstitial ad +#### Step 5: Load a GAM interstitial ad {:.no_toc} Now you should request the ad from GAM. If the `GAMRequest` contains targeting keywords. The respective Prebid line item will be returned from GAM and GMA SDK will render its creative. Be sure that you make the ad request with the same `GAMRequest` object that you passed to the `fetchDemand` method. Otherwise the ad request won't contain targeting keywords and Prebid's ad won't ever be displayed. -#### Step 5: Present the interstitial ad +#### Step 6: Present the interstitial ad {:.no_toc} Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial#display_the_ad) to display an interstitial ad right after receiving it or later in a natural pauses in the flow of an app. -## Rewarded Video +### Multiformat Interstitial (HTML + Video) + +Integration example: + +``` swift +// 1. Create an InterstitialAdUnit +adUnit = InterstitialAdUnit(configId: CONFIG_ID, minWidthPerc: 60, minHeightPerc: 70) + +// 2. Set adFormats +adUnit.adFormats = [.banner, .video] + +// 3. Configure parameters +let parameters = VideoParameters(mimes: ["video/mp4"]) +parameters.protocols = [Signals.Protocols.VAST_2_0] +parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] +adUnit.videoParameters = parameters + +// 4. Make a bid request to Prebid Server +let gamRequest = GAMRequest() +adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in + PrebidDemoLogger.shared.info("Prebid demand fetch for GAM \(resultCode.name())") + + // 5. Load a GAM interstitial ad + GAMInterstitialAd.load(withAdManagerAdUnitID: gamAdUnitMultiformatInterstitialOriginal, request: gamRequest) { ad, error in + guard let self = self else { return } + + if let error = error { + PrebidDemoLogger.shared.error("Failed to load interstitial ad with error: \(error.localizedDescription)") + } else if let ad = ad { + // 5. Present the interstitial ad + ad.fullScreenContentDelegate = self + ad.present(fromRootViewController: self) + } + } +} +``` + +#### Step 1: Create an InterstitialAdUnit +{:.no_toc} + +Initialize the InterstitialAdUnit with the following properties: + +- `configId` - an ID of Stored Impression on the Prebid Server +- `minWidthPerc`: Optional parameter to specify the minimum width percent an ad may occupy of a device's real estate. Support in SDK version 1.2+ +- `minHeightPrec`: Optional parameter to specify the minimum height percent an ad may occupy of a device's real estate. Support in SDK version 1.2+ + +> **NOTE:** As of version 1.2+, Prebid SDK has extended the functionality of Interstitial ad monetization by using a smart ad size selection process to monetize sizes smaller than full screen ads. App developers can specify a minimum width and minimum height percentage an ad can occupy of a devices real state, with Prebid Server (PBS) deriving a limited set of ad sizes (max 10) as eligible for the auction. + +> PBS will take the AdUnit's size (width and height) as the max size for the interstitial as size, generating a list of ad sizes, selecting the first 10 sizes that fall within the imp's max size and minimum percentage size. All the interstitial parameters will still be passed to the bidders, allowing them to use their own size matching algorithms if they prefer. + +> Prebid Server will send the eligible size list to each bidder to solicit a bid. For a full description of the Prebid Server logic, please refer to the [Prebid Server PR 797](https://github.com/prebid/prebid-server/pull/797/files). + +#### Step 2: Set ad formats +{:.no_toc} + +For multiformat ad unit, you must set both banner and video ad formats. + +#### Step 3: Configure parameters +{:.no_toc} + +Provide configuration properties for the banner ad using the [BannerParameters](#step-2-configure-banner-parameters) object. +Provide configuration properties for the video ad using the [VideoParameters](#step-3-configure-the-video-parameters) object. + +#### Step 4: Make a bid request +{:.no_toc} + +The `fetchDemand` method makes a bid request to the Prebid Server. You should provide a `GAMRequest` object to this method so Prebid SDK sets the targeting keywords of the winning bid for future ad requests. + +#### Step 5: Load a GAM interstitial ad +{:.no_toc} + +You should now request the ad from GAM. If the `GAMRequest` contains targeting keywords. The respective Prebid line item will be returned from GAM and GMA SDK will render its creative. + +Be sure that you make the ad request with the same `GAMRequest` object that you passed to the `fetchDemand` method. Otherwise the ad request won't contain targeting keywords and Prebid's ad won't ever be displayed. + +#### Step 6: Present the interstitial ad +{:.no_toc} + +Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/interstitial#display_the_ad) to display an interstitial ad right after receiving it or later in a natural pauses in the flow of an app. + +## Rewarded Video API Integration example: ``` swift // 1. Create a RewardedVideoAdUnit -adUnit = RewardedVideoAdUnit(configId: storedImpVideoRewarded) +adUnit = RewardedVideoAdUnit(configId: CONFIG_ID) // 2. Configure video parameters -let parameters = VideoParameters() -parameters.mimes = ["video/mp4"] +let parameters = VideoParameters(mimes: ["video/mp4"]) parameters.protocols = [Signals.Protocols.VAST_2_0] parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOff] -adUnit.parameters = parameters +adUnit.videoParameters = parameters // 3. Make a bid request to Prebid Server adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in @@ -414,7 +629,7 @@ adUnit.fetchDemand(adObject: gamRequest) { [weak self] resultCode in } } ``` -#### Step 1: Create an Ad Unit +#### Step 1: Create a RewardedVideoAdUnit {:.no_toc} Initialize the Rewarded Video Ad Unit with properties: @@ -424,7 +639,10 @@ Initialize the Rewarded Video Ad Unit with properties: #### Step 2: Configure video parameters {:.no_toc} -Provide configuration properties for the video ad using the [VideoParameters](#step-2-configure-video-parameters) object. +Provide configuration properties for the video ad using the [VideoParameters](#step-3-configure-the-video-parameters) object. + +{: .alert.alert-warning :} +Please, note that starting from PrebidMobile `2.1.0` the `parameters` property is deprecated. Use `videoParameters` instead. #### Step 3: Make a bid request {:.no_toc} @@ -443,20 +661,19 @@ Be sure that you make the ad request with the same `GAMRequest` object that you Follow the [GMA SDK guide](https://developers.google.com/ad-manager/mobile-ads-sdk/ios/rewarded#show_the_ad) to display a rewarded ad right after receiving it or later in natural pauses in the flow of an app. -## Video Instream +## Instream Video API Integration example: ```swift -// 1. Create VideoAdUnit -adUnit = VideoAdUnit(configId: storedImpVideo, size: CGSize(width: 1,height: 1)) +// 1. Create InstreamVideoAdUnit +adUnit = InstreamVideoAdUnit(configId: CONFIG_ID, size: CGSize(width: 1,height: 1)) // 2. Configure Video Parameters -let parameters = VideoParameters() -parameters.mimes = ["video/mp4"] +let parameters = VideoParameters(mimes: ["video/mp4"]) parameters.protocols = [Signals.Protocols.VAST_2_0] parameters.playbackMethod = [Signals.PlaybackMethod.AutoPlaySoundOn] -adUnit.parameters = parameters +adUnit.videoParameters = parameters // 3. Prepare IMAAdsLoader adsLoader = IMAAdsLoader(settings: nil) @@ -530,10 +747,13 @@ func adsManagerDidRequestContentResume(_ adsManager: IMAAdsManager) { } ``` -#### Step 1: Create an Ad Unit +{: .alert.alert-warning :} +Starting from PrebidMobile `2.1.0` the `VideoAdUnit` class is deprecated. Use `InstreamVideoAdUnit` class instead. + +#### Step 1: Create an InstreamVideoAdUnit {:.no_toc} -Initialize the Video Ad Unit with properties: +Initialize the Instream Video Ad Unit with properties: - `configId` - an ID of Stored Impression on the Prebid Server - `size` - Width and height of the video ad unit. @@ -541,7 +761,7 @@ Initialize the Video Ad Unit with properties: #### Step 2: Configure video parameters {:.no_toc} -Provide configuration properties for the video ad using the [VideoParameters](#step-2-configure-video-parameters) object. +Provide configuration properties for the video ad using the [VideoParameters](#step-3-configure-the-video-parameters) object. #### Step 3: Prepare IMAAdsLoader {:.no_toc} @@ -553,7 +773,6 @@ Prepare the in-stream setup according to the [Google's docs](https://developers. The `fetchDemand` method makes a bid request to the Prebid Server. You should use the version of the `fetchDemand` which returns the targeting keywords in the callback. Later you will construct the IMA ad request using these keywords. - #### Step 5: Generate GAM Instream URI {:.no_toc} @@ -575,7 +794,9 @@ On a successful load event, the `IMAAdsLoader` calls the adsLoadedWithData metho Lastly, to manage events and state changes, the ads manager needs a delegate of its own. The `IMAAdManagerDelegate` has methods to handle ad events and errors, as well as methods to trigger play and pause on your video content. -## Native Style Banner +## Native API + +### Native Banner Integration example: @@ -602,7 +823,7 @@ Then integrate the native style ad using GAM Banner ad unit ```swift // 1. Create NativeRequest -nativeUnit = NativeRequest(configId: nativeStoredImpression, assets: nativeRequestAssets) +nativeUnit = NativeRequest(configId: CONFIG_ID, assets: nativeRequestAssets) nativeUnit.context = ContextType.Social nativeUnit.placementType = PlacementType.FeedContent nativeUnit.contextSubType = ContextSubType.Social @@ -677,7 +898,7 @@ You should now request the ad from GAM. If the `GAMRequest` contains targeting k Be sure that you make the ad request with the same `GAMRequest` object that you passed to the `fetchDemand` method. Otherwise the ad request won't contain targeting keywords and Prebid's ad won't ever be displayed. -## In-App Native +### In-App Native At a high level the in app rendering process works like this: @@ -704,25 +925,25 @@ These instructions will enable you to create a creative template in either Googl 6. Name your new format. 7. Choose `ADD VARIABLE` and add the following variable names and placeholders. - {: .table .table-bordered .table-striped } - | Variable Name | Placeholder | - |---------------------+----------------------------------| - | isPrebid | [%isPrebid%] | - | hb_cache_id_local | [%hb_cache_id_local%] | +{: .table .table-bordered .table-striped } +| Variable Name| Placeholder| +|--------------+------------| +| isPrebid | [%isPrebid%] | +| hb_cache_id_local | [%hb_cache_id_local%] | - Make sure to indicate that the variables are required. +Make sure to indicate that the variables are required. 8. Return to the home screen, click `Delivery > Creatives`, and create a creative with `Native Format`, choosing the template you created. In the user-defined variables you just created, set the following values: {: .table .table-bordered .table-striped } - | Variable Name | Value | - |---------------------+----------------------------------| - | isPrebid | 1 | - | hb_cache_id_local | %%PATTERN:hb_cache_id_local%% | +| Variable Name | Value | +|---------------------+----------------------------------| +| isPrebid | 1 | +| hb_cache_id_local | %%PATTERN:hb_cache_id_local%% | 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. -### Integration Example +#### Integration Example {:.no_toc} Prepare the set of requested assets first. @@ -868,10 +1089,7 @@ Once the Prebid line item is recognized, the `NativeAdDelegate` will be activate Each ad unit in the original API is a subclass of the `AdUnit` class, which provides the following properties and methods for the additional configuration. -### Properties - -#### pbAdSlot -{:.no_toc} +### Ad Slot PB Ad Slot is an identifier tied to the placement the ad will be delivered in. The use case for PB Ad Slot is to pass to exchange an ID they can use to tie to reporting systems or use for data science driven model building to match with impressions sourced from alternate integrations. A common ID to pass is the ad server slot name. @@ -898,7 +1116,6 @@ Allows to resume the stopped autorefresh for the ad unit with predefined autoref ### Context Keyword - #### addContextKeyword {:.no_toc} From c2c8151ea50465cc6279cbee09bd541aea30b194 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 27 Apr 2023 16:20:13 -0400 Subject: [PATCH 109/564] deprecating rhythmone (#4523) --- dev-docs/bidders/rhythmone.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/rhythmone.md b/dev-docs/bidders/rhythmone.md index ab4b8b2ed8..770b23ebcc 100644 --- a/dev-docs/bidders/rhythmone.md +++ b/dev-docs/bidders/rhythmone.md @@ -10,9 +10,11 @@ gdpr_supported: true schain_supported: true gvl_id: 36 sidebarType: 1 +enable_download: false --- - +{: .alert.alert-warning :} +The rhythmone bidder is deprecated, and will be removed in a future release of Prebid.js and Prebid Server. ### Bid Params From 0311b8dff0de7025924eff21e5a1f74ab2a8bf06 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 27 Apr 2023 16:46:04 -0400 Subject: [PATCH 110/564] mobile home page typos (#4526) * mobile home page typos * table header --- prebid-mobile/prebid-mobile.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/prebid-mobile/prebid-mobile.md b/prebid-mobile/prebid-mobile.md index 03f8e5ff4d..4ee540ef54 100644 --- a/prebid-mobile/prebid-mobile.md +++ b/prebid-mobile/prebid-mobile.md @@ -17,11 +17,11 @@ Prebid Mobile libraries are available for iOS and Android. * TOC {:toc} -## Benefits and Fetures +## Benefits and Features Prebid SDK rendering offers the following benefits: -- **Transparent, open source header bidding solution**. The single integration point with Prebid Server**, enabling direct access to more mobile buyers. +- **Transparent, open source header bidding solution**. The single integration point with Prebid Server, enabling direct access to more mobile buyers. - **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. @@ -53,20 +53,18 @@ Prebid SDK supports following integration scenarios: In all scenarios, Prebid SDK leverages Prebid Server for demand. -The next chart shows which API is used for which Ad Server +The following chart shows which API is used for which Ad Server {: .table .table-bordered .table-striped } -| |Original API|Rendering API|Mediation API| +|Ad Server|Original API|Rendering API|Mediation API| |------------|------------|-------------|-------------| |No Ad Server| | ✅ | | |GAM | ✅ | ✅ | | |AdMob | | | ✅ | |MAX | | | ✅ | -Nothe that you can integrate Prebid demand into GAM setup using one of the options - Original API, Rendering API. - -Below are the processes for all modes: +The following sections describe each integration method. ### No Ad Server From 077df14ce2498612a9b078d7c1231fb50aad6991 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Fri, 28 Apr 2023 01:54:14 -0600 Subject: [PATCH 111/564] add pbs gpp suport (#4525) * add pbs gpp suport * move to bottom --- dev-docs/pbs-bidders.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/pbs-bidders.md b/dev-docs/pbs-bidders.md index ca45b46a19..093f62c830 100644 --- a/dev-docs/pbs-bidders.md +++ b/dev-docs/pbs-bidders.md @@ -56,6 +56,7 @@ Publishers are advised to check with legal counsel before doing business with an | **Mobile App Support** | {% if page.pbs_app_supported and page.pbs_app_supported == false %}no{% elsif page.pbs_app_supported and page.pbs_app_supported == true %}yes{% else %}check with bidder{% endif %} | **Prebid Server Adapter** | yes | | **Floors Support** | {% if page.floors_supported == false %}no{% elsif page.floors_supported == true %}yes{% else %}check with bidder{% endif %} | **First Party Data Support** | {% if page.fpd_supported == true %}yes{% elsif page.fpd_supported == false %}no{% else %}check with bidder{% endif %} | | **Multi Format Support** | {% if page.multiformat_supported %}{{page.multiformat_supported}}{% else %}check with bidder{% endif %} | **ORTB Blocking Support** | {% if page.ortb_blocking_supported == true %}yes{% elsif page.ortb_blocking_supported == false %}no{% elsif page.ortb_blocking_supported == 'partial' %}partial{% else %}check with bidder{% endif %} | +| **GPP Support** | {% if page.gpp_supported == true %}yes{% else %}no{% endif %} |

"Send All Bids" Ad Server Keys

From 80a2645882436316fa4c1ac7e60bce97cb1b1e5b Mon Sep 17 00:00:00 2001 From: TM Date: Fri, 28 Apr 2023 09:55:56 +0200 Subject: [PATCH 112/564] banner support added (#4524) Co-authored-by: Tomasz Mielcarz --- dev-docs/bidders/adrino.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/adrino.md b/dev-docs/bidders/adrino.md index ba44df65c1..225727b892 100644 --- a/dev-docs/bidders/adrino.md +++ b/dev-docs/bidders/adrino.md @@ -5,7 +5,7 @@ description: Prebid Adrino Bidder Adapter pbjs: true pbs: true biddercode: adrino -media_types: no-display, native +media_types: banner, native gdpr_supported: true gvl_id: 1072 sidebarType: 1 From 13cb6b2a947e717fe6f0f115199770b037bf72b2 Mon Sep 17 00:00:00 2001 From: TheMediaGrid <44166371+TheMediaGrid@users.noreply.github.com> Date: Fri, 28 Apr 2023 10:59:59 +0200 Subject: [PATCH 113/564] TrustX: update legacy doc (#4518) --- dev-docs/bidders/trustxstandalone.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev-docs/bidders/trustxstandalone.md b/dev-docs/bidders/trustxstandalone.md index 45c8797b58..f67fa71d6b 100644 --- a/dev-docs/bidders/trustxstandalone.md +++ b/dev-docs/bidders/trustxstandalone.md @@ -13,6 +13,8 @@ pbjs_version_notes: 6.x and before sidebarType: 1 --- +#### Is relevant for versions 6.X and before + ### Table of Contents - [Table of Contents](#table-of-contents) From f0a8a0dc897dc1d70b10a2cc7c3fbc94578e5d54 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 28 Apr 2023 05:10:01 -0400 Subject: [PATCH 114/564] GPID: clarifying when gpt-pre-auction can be used (#4512) --- features/pbAdSlot.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/features/pbAdSlot.md b/features/pbAdSlot.md index 8da35d6380..37b125f91d 100644 --- a/features/pbAdSlot.md +++ b/features/pbAdSlot.md @@ -54,11 +54,13 @@ someday we'll deprecate it in favor of the more standard GPID. There are two ways a publisher can inject these values into the header bidding auctions: -1. Supply them manually on the PBJS AdUnits -2. Install the [GPT Pre-Auction module](/dev-docs/modules/gpt-pre-auction.html) +1. Supply them manually on the PBJS AdUnits. This is required for in-stream video and for publishers not using GAM. +2. If you're using GPT, install the [GPT Pre-Auction module](/dev-docs/modules/gpt-pre-auction.html) ### Defining them on the PBJS Ad Unit +This approach what you'll have to use for in-stream video and for publishers not using GAM. + #### Example 1 - unique ad slot names In this example, there's no need for the "UNIQUIFIER" string because every ad slot From 3ac6fc775295bad5206d0dc95edf86f69f952c5c Mon Sep 17 00:00:00 2001 From: Nima Sarayan <36764654+nimasrn@users.noreply.github.com> Date: Fri, 28 Apr 2023 12:46:58 +0330 Subject: [PATCH 115/564] Updated docs for Vidoomy blocking supported (#4493) --- dev-docs/bidders/vidoomy.md | 64 +++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/dev-docs/bidders/vidoomy.md b/dev-docs/bidders/vidoomy.md index aba41d2353..18be825a86 100644 --- a/dev-docs/bidders/vidoomy.md +++ b/dev-docs/bidders/vidoomy.md @@ -12,23 +12,73 @@ coppa_supported: true pbs: true sidebarType: 1 schain_supported: true +ortb_blocking_supported: true --- ### Note: + [Vidoomy](https://vidoomy.com/), for more info please contact support@vidoomy.com ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|------------------|----------|------------------|------------------------------|----------| -| `id` | required | id | `123123` | `string` | -| `pid` | required | pid | `'123123'` | `string` | +| Name | Scope | Description | Example | Type | +|-------|----------|-------------|------------|----------| +| `id` | required | id | `123123` | `string` | +| `pid` | required | pid | `'123123'` | `string` | ### Bid Params (Prebid Server) {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|------------------|----------|------------------|------------------------------|----------| -| `zoneId` | required | Zone Id | "123123" | `string` | + +| Name | Scope | Description | Example | Type | +|----------|----------|---------------------------------------------|-------------------|----------------| +| `zoneId` | required | Zone Id | "123123" | `string` | +| `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `string array` | +| `badv` | optional | Blocked Advertiser Domains | `['example.com']` | `string array` | +| `bapp` | optional | blocked advertiser mobile app bundles | `['app.com']` | `string array` | +| `btype` | optional | blocked creative types (e.g. XHTML) | `[1, 2, 3]` | `int array` | +| `battr` | optional | blocked creative attributes (e.g. audio) | `[1, 2, 3]` | `int array` | + +Notes: + +- Preferred to provide the `bcat`, `badv`, `bapp`, `btype` and `battr` within the first party data (above). When both + methods are provided, first + party data values will be prioritized. + +### First Party Data + +Publishers can use the `ortb2` configuration parameter to provide First Party Data. + +#### OpenRTB Parameters + +The following table contains currently supported parameters we parse. + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|---------|----------|---------------------------------------------|-------------------|---------| +| `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `Array` | +| `badv` | optional | Blocked Advertiser Domains | `['example.com']` | `Array` | +| `bapp` | optional | blocked advertiser mobile app bundles | `['app.com']` | `Array` | +| `btype` | optional | blocked creative types (e.g. XHTML) | `[1, 2, 3]` | `Array` | +| `battr` | optional | blocked creative attributes (e.g. audio) | `[1, 2, 3]` | `Array` | + +Notes: + +- will extract the bcat,badv,bapp,btype,battr if passed within `ortb2` + +Example configuration: + +``` +pbjs.setConfig({ + ortb2: { + bcat: ['IAB1-1'], + badv: ['example.com'], + bapp: ['app.com'], + btype: [1, 2, 3], + battr: [1, 2, 3] + } +}); +``` From 34456b3f724237e748f4e34d84af84db9679f81d Mon Sep 17 00:00:00 2001 From: Nisar Thadathil Date: Fri, 28 Apr 2023 16:24:50 +0530 Subject: [PATCH 116/564] Updated documentation for Vidoomy bidfloor and userId module (#4474) * Updated docs for Vidoomy blocking supported * Updated documentation for Vidoomy bidfloor support --------- Co-authored-by: nima --- dev-docs/bidders/vidoomy.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dev-docs/bidders/vidoomy.md b/dev-docs/bidders/vidoomy.md index 18be825a86..19476f409c 100644 --- a/dev-docs/bidders/vidoomy.md +++ b/dev-docs/bidders/vidoomy.md @@ -13,28 +13,31 @@ pbs: true sidebarType: 1 schain_supported: true ortb_blocking_supported: true +userIds: all +floors_supported: true --- ### Note: [Vidoomy](https://vidoomy.com/), for more info please contact support@vidoomy.com -### Bid Params +### Client Side Bid Params {: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------------|----------|------------------|------------------------------|----------| +| `id` | required | id | `'123123'` | `string` | +| `pid` | required | pid | `'123123'` | `string` | +| `bidfloor` | optional | CPM bidfloor in USD | `0.08` | `float` | -| Name | Scope | Description | Example | Type | -|-------|----------|-------------|------------|----------| -| `id` | required | id | `123123` | `string` | -| `pid` | required | pid | `'123123'` | `string` | -### Bid Params (Prebid Server) +### Server Side Bid Params (Prebid Server) {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |----------|----------|---------------------------------------------|-------------------|----------------| -| `zoneId` | required | Zone Id | "123123" | `string` | +| `zoneId` | required | Zone Id | `'123123'` | `string` | | `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `string array` | | `badv` | optional | Blocked Advertiser Domains | `['example.com']` | `string array` | | `bapp` | optional | blocked advertiser mobile app bundles | `['app.com']` | `string array` | @@ -81,4 +84,4 @@ pbjs.setConfig({ battr: [1, 2, 3] } }); -``` +``` \ No newline at end of file From 74e824f1fdfe4890a5a5a6814e08811bf7aecc02 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Tue, 2 May 2023 14:27:37 -0400 Subject: [PATCH 117/564] Gdpr warnings (#4529) * Update apstream.md * Update cleanmedianet.md * Update engageya.md * Update gamoshi.md * Update gamoshi.md * Update logan.md * Update logan.md * Update mathildeads.md * Update smilewanted.md * Update triplelift.md * Update videoreach.md * Update videoreach.md * Update beop.md * Update yahoossp.md * Update logan.md * Update triplelift.md * Update yahoossp.md * Update apstream.md * Update beop.md * Update cleanmedianet.md * Update engageya.md * Update logan.md * Update mathildeads.md * Update videoreach.md * Update aol.md * Update triplelift.md --------- Co-authored-by: bretg --- dev-docs/bidders/aol.md | 10 +++++++--- dev-docs/bidders/apstream.md | 6 +++++- dev-docs/bidders/beop.md | 4 ++++ dev-docs/bidders/cleanmedianet.md | 4 ++++ dev-docs/bidders/engageya.md | 6 +++++- dev-docs/bidders/logan.md | 6 +++++- dev-docs/bidders/mathildeads.md | 6 +++++- dev-docs/bidders/smilewanted.md | 6 +++++- dev-docs/bidders/videoreach.md | 5 ++++- dev-docs/bidders/yahoossp.md | 6 +++++- 10 files changed, 49 insertions(+), 10 deletions(-) diff --git a/dev-docs/bidders/aol.md b/dev-docs/bidders/aol.md index 536916ab93..2e0a80f0dc 100644 --- a/dev-docs/bidders/aol.md +++ b/dev-docs/bidders/aol.md @@ -4,17 +4,21 @@ title: AOL description: Prebid AOL Bidder Adaptor pbjs: true biddercode: aol -gdpr_supported: true +gdpr_supported: false usp_supported: true gvl_id: 25 userIds: connectId sidebarType: 1 --- +### Disclosure + +This adapter may not handle user syncs for TCF2 or GPP correctly. The user sync consent querystring parameters are generated at the time of the bid request and might be stale at the time of the user sync. See https://github.com/prebid/Prebid.js/pull/9345#issuecomment-1362887086 + ### IMPORTANT NOTICE! **TL;DR** -1. The `aol` adapter is scheduled to be depreciated. -2. Our New `yahoossp` is available for early adoption. +1. The `aol` adapter is scheduled to be deprecated. +2. Our New `yahoossp` is available for adoption. 3. Please contact your Account Manager/Executive for migration details. Dear Publishers & Partners, diff --git a/dev-docs/bidders/apstream.md b/dev-docs/bidders/apstream.md index f521dc931e..45a2bf8955 100644 --- a/dev-docs/bidders/apstream.md +++ b/dev-docs/bidders/apstream.md @@ -5,11 +5,15 @@ description: AP Stream Bidder Adapter biddercode: apstream pbjs: true media_types: banner -gdpr_supported: true +gdpr_supported: false gvl_id: 394 sidebarType: 1 --- +### Disclosure + +Note: This bidder passes consent strings but not the gdprApplies flag to its backend. This may result in some incorrect TCF2 processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Bid Params {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/beop.md b/dev-docs/bidders/beop.md index c6ae7b9c7c..bc7acb126e 100644 --- a/dev-docs/bidders/beop.md +++ b/dev-docs/bidders/beop.md @@ -7,6 +7,10 @@ biddercode: beop sidebarType: 1 --- +### Disclosure + +Note: This bidder never sends gdprApplies to its endpoint. This may result in some incorrect GDPR processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Bid Params {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/cleanmedianet.md b/dev-docs/bidders/cleanmedianet.md index 5b1d420dce..012797c749 100644 --- a/dev-docs/bidders/cleanmedianet.md +++ b/dev-docs/bidders/cleanmedianet.md @@ -21,6 +21,10 @@ gvl_id: multiformat_supported: will-bid-on-any --- +### Disclosure + +Note: This bidder appears to only consider gdprApplies if a consent string is available. This may result in some incorrect GDPR processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Bid params {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/engageya.md b/dev-docs/bidders/engageya.md index 7b1e0523f2..59acd25cac 100644 --- a/dev-docs/bidders/engageya.md +++ b/dev-docs/bidders/engageya.md @@ -5,10 +5,14 @@ description: Prebid Engageya Bidder Adapter media_type: banner, native biddercode: engageya pbjs: true -gdpr_supported: true +gdpr_supported: false sidebarType: 1 --- +### Disclosure + +Note: This bidder appears to only consider gdprApplies if a consent string is available. This may result in some incorrect TCF2 processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Bid params {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/logan.md b/dev-docs/bidders/logan.md index dabd33ac4e..8280d42bbd 100644 --- a/dev-docs/bidders/logan.md +++ b/dev-docs/bidders/logan.md @@ -6,12 +6,16 @@ biddercode: logan usp_supported: true schain_supported: true media_types: banner, video, native -gdpr: true +gdpr_supported: false pbjs: true pbs: true sidebarType: 1 --- +### Disclosure + +Note: This bidder appears to only consider gdprApplies if a consent string is available. This may result in some incorrect GDPR processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Bid Params {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/mathildeads.md b/dev-docs/bidders/mathildeads.md index f5c0043b86..564b53ebab 100644 --- a/dev-docs/bidders/mathildeads.md +++ b/dev-docs/bidders/mathildeads.md @@ -6,13 +6,17 @@ biddercode: mathildeads usp_supported: true schain_supported: true media_types: banner, video, native -gdpr_supported: true +gdpr_supported: false pbjs: true pbs: false pbs_app_supported: false sidebarType: 1 --- +### Disclosure + +Note: This bidder appears to only consider gdprApplies if a consent string is available. This may result in some incorrect TCF2 processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Prebid.JS Bid Params {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/smilewanted.md b/dev-docs/bidders/smilewanted.md index a56e2e1e16..13dd71aee8 100644 --- a/dev-docs/bidders/smilewanted.md +++ b/dev-docs/bidders/smilewanted.md @@ -6,13 +6,17 @@ media_types: banner, video pbjs: true pbs: true biddercode: smilewanted -gdpr_supported: true +gdpr_supported: false usp_supported: true userIds: all gvl_id: 639 sidebarType: 1 --- +### Disclosure + +Note: This bidder appears to only consider gdprApplies if a consent string is available.. This may result in some incorrect TCF2 processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 + ### Note To use us as a bidder you must have an account and an active "zoneId" on our Smile Wanted platform. diff --git a/dev-docs/bidders/videoreach.md b/dev-docs/bidders/videoreach.md index 2420efc1bc..e74f82d5c7 100644 --- a/dev-docs/bidders/videoreach.md +++ b/dev-docs/bidders/videoreach.md @@ -5,10 +5,13 @@ description: Video Reach Bidder Adapter for Prebid.js pbjs: true biddercode: videoreach media_types: banner, video -gdpr_supported: true +gdpr_supported: false sidebarType: 1 --- +### Disclosure + +Note: This bidder's user syncs appear to only consider gdprApplies if a consent string is available. This may result in some incorrect TCF2 processing, such as when the consent string is not yet available but the publisher has decided GDPR always applies. See https://github.com/prebid/Prebid.js/issues/7775 ### Bid Params diff --git a/dev-docs/bidders/yahoossp.md b/dev-docs/bidders/yahoossp.md index 5be9c7b356..b5b077a33e 100644 --- a/dev-docs/bidders/yahoossp.md +++ b/dev-docs/bidders/yahoossp.md @@ -7,7 +7,7 @@ pbjs: true media_types: banner, video biddercode: yahoossp prebid_member: true -gdpr_supported: true +gdpr_supported: false usp_supported: true schain_supported: true coppa_supported: true @@ -16,6 +16,10 @@ userIds: All sidebarType: 1 --- +### Disclosure + +This adapter may not handle user syncs for TCF2 or GPP correctly. The user sync consent querystring parameters are generated at the time of the bid request and might be stale at the time of the user sync. See https://github.com/prebid/Prebid.js/pull/9345#issuecomment-1362887086 + ### Important Notice (JS vs PBS) There are differences between our Prebid.js & Prebid-Server Yahoo SSP adapters. The Prebid-server adapter currently does not support: From c9e2e1b6dffd0a69e7fbe52d574ea9bd919c549a Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 2 May 2023 16:32:26 -0400 Subject: [PATCH 118/564] PBS auction endpoint price granularity (#4532) native is supported per https://github.com/prebid/prebid-server/issues/857 --- .../endpoints/openrtb2/pbs-endpoint-auction.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index a6904a8040..ea68c7a9d2 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -375,6 +375,7 @@ to set these params on the response at `response.seatbid[i].bid[j].ext.prebid.ta | mediatypepricegranularity | no | Defines how PBS quantizes bid prices into buckets, allowing for different ranges by media type. | (see below) | object | | mediatypepricegranularity.banner | no | Defines how PBS quantizes bid prices into buckets for banners. | (see below) | object | | mediatypepricegranularity.video | no | Defines how PBS quantizes bid prices into buckets for video. | (see below) | object | +| mediatypepricegranularity.native | no | Defines how PBS quantizes bid prices into buckets for native. | (see below) | object | | mediatypepricegranularity.TYPE.precision | no | How many decimal places are there in price buckets. | Defaults to 2 | integer | | mediatypepricegranularity.TYPE.ranges | no | Same as pricegranularity.ranges | (see below) | array of objects | | includewinners | no | Whether to include targeting for the winning bids in response.seatbid[].bid[]. ext.prebid.targeting. Defaults to false. | true | boolean | @@ -416,19 +417,20 @@ One of "includewinners" or "includebidderkeys" must be true (both default to fal The parameter "includeformat" indicates the type of the bid (banner, video, etc) for multiformat requests. It will add the key `hb_format` and/or `hb_format_{bidderName}` as per "includewinners" and "includebidderkeys" above. -MediaType PriceGranularity (PBS-Java only) - when a single OpenRTB request contains multiple impressions with different mediatypes, or a single impression supports multiple formats, the different mediatypes may need different price granularities. If `mediatypepricegranularity` is present, `pricegranularity` would only be used for any mediatypes not specified. +MediaType PriceGranularity - when a single OpenRTB request contains multiple impressions with different mediatypes, or a single impression supports multiple formats, the different mediatypes may need different price granularities. If `mediatypepricegranularity` is present, `pricegranularity` would only be used for any mediatypes not specified. +For example: ``` { "ext": { "prebid": { "targeting": { - "mediatypepricegranularity": { - "banner": { - "ranges": [ + "pricegranularity": { // use this for banner and native + "ranges": [ {"max": 20, "increment": 0.5} ] - }, + }, + "mediatypepricegranularity": { // video gets a different set of ranges "video": { "ranges": [ {"max": 10, "increment": 1}, @@ -468,7 +470,8 @@ MediaType PriceGranularity (PBS-Java only) - when a single OpenRTB request conta The winning bid for each `request.imp[i]` will also contain `hb_bidder`, `hb_size`, and `hb_pb` (with _no_ {bidderName} suffix). To prevent these keys, set `request.ext.prebid.targeting.includeWinners` to false. -**NOTE**: Targeting keys are limited to 20 characters. If {bidderName} is too long, the returned key +**NOTES**: +- Targeting keys are limited to 20 characters. If {bidderName} is too long, the returned key will be truncated to only include the first 20 characters. ##### Buyer UID From 9bf44d0e478a2bc158deacf9b0b8fa6da04fa01f Mon Sep 17 00:00:00 2001 From: congdu-kun <126609480+congdu-kun@users.noreply.github.com> Date: Wed, 3 May 2023 12:56:07 -0700 Subject: [PATCH 119/564] add documentation for PAIR ID userid submodule (#4462) * add documentation for PAIR ID userid submodule * Add liveramp storageKey parameter to Pair Id doc * Add a short blurb for PAIR * Add link to PAIR technical doc --- dev-docs/modules/userid-submodules/pair.md | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 dev-docs/modules/userid-submodules/pair.md diff --git a/dev-docs/modules/userid-submodules/pair.md b/dev-docs/modules/userid-submodules/pair.md new file mode 100644 index 0000000000..0671559854 --- /dev/null +++ b/dev-docs/modules/userid-submodules/pair.md @@ -0,0 +1,65 @@ +--- +layout: userid +title: Google PAIR ID +description: pair PairId User ID sub-module +useridmodule: pairIdSystem +--- + +Developed by and for use with Display and Video 360, PAIR (Publisher Advertiser Identity Reconciliation) is a secure and privacy-forward way for enabling advertisers and publishers to reconcile their +first-party data for marketing use cases via advanced data encryption methods without the +reliance on third-party cookies. PAIR can help advertisers and publishers maintain control of first-party data while ensuring there is no pooling of data, no leakage of data, no leakage of insights, durablility for the future using secure encryption methods, and no user tracking across publishers. See this [document](https://services.google.com/fh/files/misc/pair_visual_final_10242022.pdf) for more information about PAIR. + +Add it to your Prebid.js package with: + +{: .alert.alert-info :} +gulp build --modules=pairIdSystem + +## PAIR ID Configuration + +{: .table .table-bordered .table-striped } +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | The name of PAIR ID user ID module. | `"pairId"` | +| params | Optional | Object | Container of all module params. | | +| params.liveramp | Optional | Object | Container of all liveramp cleanroom specified params. | | +| params.liveramp.storageKey | Optional | String | storage key to fetch liveramp provided PAIR Id, the default key is `"_lr_pairId_"` | `"_lr_pairId_custom"` | + +## PAIR ID Examples + +Publishers manage PAIR Ids themselves can store pairIds as a byte64 encoded array of ids in local storage and/or 1st party cookies entry `pairId`. + +{% highlight javascript %} + +// should have byte64 value ready in 'pairId' local storage/cookie entry + +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'pairId' + }] + } +}); +{% endhighlight %} + +Or if to use cleanrooms provided implementation, it can be specified by adding the provider and their configs to the config, take liveramp as an example. + +{% highlight javascript %} + +// value in 'pairid' local storage/cookie entry will be combined with ids provided by cleamroom liveramp + +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'pairId', + params: { + liveramp: { + storageKey: '_lr_pairId_custom' + } + }, + }] + } +}); +{% endhighlight %} + + + From 81b10f9525d1332052e6621494123bdf4872b9ed Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 3 May 2023 16:10:12 -0400 Subject: [PATCH 120/564] mobile FAQ (#4530) * mobile FAQ * Update faq/prebid-mobile-faq.md Co-authored-by: Muki Seiler * adding new entries from Yurii --------- Co-authored-by: Muki Seiler --- _data/sidebar.yml | 16 ++++ faq/faq.md | 16 ++-- faq/prebid-mobile-faq.md | 174 +++++++++++++++++++++++++++++++++++++++ faq/prebid-server-faq.md | 6 +- 4 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 faq/prebid-mobile-faq.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 8129f22992..7b85c62d59 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -652,6 +652,14 @@ sectionTitle: subgroup: 0 +- sbSecId: 2 + title: Prebid Mobile FAQ + link: /faq/prebid-mobile-faq.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + # - sbSecId: 2 # title: Modules # link: @@ -1442,6 +1450,14 @@ sectionTitle: subgroup: 0 +- sbSecId: 5 + title: Prebid Server FAQ + link: /faq/prebid-server-faq.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + - sbSecId: 5 title: Versions link: diff --git a/faq/faq.md b/faq/faq.md index de57ee611b..6a19bb8629 100644 --- a/faq/faq.md +++ b/faq/faq.md @@ -10,19 +10,25 @@ sidebarType: 7 Everyone has questions. We have answers - at least to some of the most frequently asked questions. -## [Prebid.js](/dev-docs/faq.html) +## Prebid.js Check out the [Prebid.js FAQ](/dev-docs/faq.html). If you don't find what you need there, here are some additional resources: - [Troubleshooting](/troubleshooting/troubleshooting.html) - [About Prebid.js](/prebid/prebidjs.html) -- [Training Videos](/videos/index.html) -- [Resources](/support/index.html) +- [Support Resources](/support/index.html) -## [Prebid Server](/faq/prebid-server-faq.html) +## Prebid Server If you don't find answers to your questions in the [Prebid Server FAQ](/faq/prebid-server-faq.html), you can learn more here: - [Troubleshooting](/troubleshooting/troubleshooting.html) - [Prebid Server Overview](/prebid-server/overview/prebid-server-overview.html) -- [Resources](/support/index.html) +- [Support Resources](/support/index.html) + +## Prebid Mobile SDK + +Please see the [Prebid Mobile FAQ](/faq/prebid-mobile-faq.html). You can learn more at: + +- [Prebid Mobile home page](/prebid-mobile/prebid-mobile.html) +- [Support Resources](/support/index.html) diff --git a/faq/prebid-mobile-faq.md b/faq/prebid-mobile-faq.md new file mode 100644 index 0000000000..d8ee30bb19 --- /dev/null +++ b/faq/prebid-mobile-faq.md @@ -0,0 +1,174 @@ +--- +layout: page_v2 +title: Prebid Mobile FAQ | Prebid +description: Prebid Mobile FAQ +sidebarType: 2 +--- + +# Prebid Mobile FAQ +{:.no_toc} + +This page has answers to some frequently asked questions about Prebid Mobile. If you don't find what you're looking for here, there are other ways to [get help](/support/index.html). + +* TOC +{:toc} + +## General + +### What size is the SDK? + +Compiled sizes: +- Android: 800 KB +- iOS: 3.2 Mb + +Note: these sizes will go down as several assets will be pulled out into a CDN over the coming months. + +### Does the SDK have UI components? If so, are they localized? + +The Prebid SDK has no localized UI components. + +Most probably you will use an integration approach that doesn’t utilize UI component at all, as they are used only with the Rendering API. + +### Is the SDK compressed using any compression tools? + +No. + +### Is the SDK encrypted or obfuscated in any way? + +No. + +## Dependencies + +### Does the SDK use third-party libraries? + +Just the Open Measurement SDK. + +### Does it have external dependencies? + +No. + +### Does it use open-source libraries? If so, which licences are used? + +No. The Prebid SDK is itself a library open sourced under the Apache 2 license. + +### Are there any back-end dependencies to this SDK? + +Yes - the app developer must have a [Prebid Server](/prebid-server/index.html) at their disposal. This is open source software that they may run themselves, or they may contract with a [Managed Service](https://prebid.org/product-suite/managed-services/). + +## Communication + +### Does the SDK make network requests and how often and how heavy? + +Yes. Its main job is to formulate requests to [Prebid Server](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html) to obtain bids for ad units. + +The frequency of HTTPS network calls is up to the app developer. It depends on whether and how frequently ad units are refreshed. The payload size will depend on how many ad units are present in the app and what kind of consent strings are present. For one ad unit, the size should be under 2KB, with each ad unit adding a couple hundred bytes. + +## Maintenance + +### How often is the SDK updated? + +It varies, but on average, it's updated about once per month. + +The open source repos have a list of releases: +https://github.com/prebid/prebid-mobile-ios/releases +https://github.com/prebid/prebid-mobile-android/releases + +### How does one update the Prebid Mobile version? + +The best way is to integrate SDK via dependency managers - CocoaPods (iOS) and Maven (Android). You can specify the particular version or point the dependency manager to the latest SDK version. In the second case, the new version of SDK will be added to the app as soon as released. + +### If a bug is found in the SDK, what is the process for reporting it? + +Please open a github issue: + +https://github.com/prebid/prebid-mobile-ios/issues +https://github.com/prebid/prebid-mobile-android/issues + +### Is there a support forum where we can monitor issues and resolutions? + +Yes, you may monitor github issues and pull requests at the repositories noted above. + +### Are there debug/logging options that can be toggled on/off? +Yes. + +1. You can change app console log verbose level via PrebiMobile.shared.logLevel +2. You can set the OpenRtb 'test' flag for Prebid Server to return additional server-side information. See 'debug' in https://docs.prebid.org/prebid-mobile/pbm-api/android/code-integration-android.html and https://docs.prebid.org/prebid-mobile/pbm-api/ios/code-integration-ios.html + +## Privacy/Security + +### Does the SDK store any data locally on the device? If so, what is it? + +If the developer calls certain functions, the SDK will store the results for future auctions. See the "Local Storage" section of +https://docs.prebid.org/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html + +In all other cases SDK plays a transport role. It collects information from API (if it’s allowed by privacy settings) and sends it in the bid requests to the server. SDK uses the following datasources: +- TCF API - SDK reads data from UserDefaults +- Configuration / Targeting API - publishers provide data to SDK in runtime +- Device API - SDK collects device info using public OS API, like user agent, OS version, location + +### Does the SDK send any Personal Information over the network? + +The Prebid SDK sends information provided by the publisher using the Targeting API. We recommend that publishers avoid targeting to personal information unless reviewed by their own legal teams. + +The SDK will send IP address and device latitude/longitude information. Prebid Server will anonymize requests as required by regulations, including GDPR, COPPA, CCPA. See the [Prebid Server privacy features](/prebid-server/features/pbs-privacy.html) for more details. + +### Is the SDK GDPR compliant? + +Yes - the SDK will forward TCF consent strings to Prebid Server where requests may be anonymized or restricted. It is up to the entity hosting Prebid Server to configure the server properly. + +Also note that Prebid.org is committed to other privacy initiatives such as the IAB's Global Privacy Platform, including US National Privacy and TCF-Canada. + +### How does the SDK allow for deletion of user private data? + +SDK does’t commit any action on managing user data. Only publishers using SDK’s API can provide/store/remove user data. + +## Performance + +### Does the SDK do any work in the background? If so, what is it? + +The SDK will receive responses from Prebid Server in the background and call the application-defined callbacks. + +The developer may set up auto-refresh for ad units. If in the background, Prebid SDK will not perform bid requests. + +### Has power usage related to this SDK been tested? + +No. We'd welcome any community member to help us with requirements, code, and/or results. + +### How long does it take to initialize? +Is not measured, but very fast. Because it makes only initialization of internal classes and optional health check calls to PBS. The result of the health check call does not influence the SDK behavior, so publishers may not wait for its result during the initialization. + +## API Questions + +### What is the difference between Original API and Rendering API? + +The main difference is that with Original API, the Prebid demand is rendered by the Ad Server SDK (Google Mobile Ads SDK) using Prebid Universal Creative. But with Rendering API, Prebid SDK renders the winning bid in its own Web or Video views. + +## iOS Specifics + +### Does the SDK support Swift 3+? + +Yes. Prebid SDK is developed with latest Xcode version. + +### Does it ship as a CocoaPod? + +Yes - https://cocoapods.org/pods/PrebidMobile + +### Is it bit code enabled? + +Starting with 2.1.0: No + +### Does it support 64-bit? +Yes. + +## Android Specifics + +### What are the targeted APIs? + +Android API 32. + +### Does it include Broadcast Receivers in the Manifest? + +No. + +## Further Reading +- [Prebid Mobile home page](/prebid-mobile/prebid-mobile.html) diff --git a/faq/prebid-server-faq.md b/faq/prebid-server-faq.md index 827f51f179..9a58f8d7b6 100644 --- a/faq/prebid-server-faq.md +++ b/faq/prebid-server-faq.md @@ -26,8 +26,10 @@ but it's not necessary for contributing code as a community member. ## How can I debug Prebid Server requests? + When invoking Prebid Server through Prebid.js, this can be done just by adding `?pbjs_debug=true` to the page URL. -+ Through AMP, you can put `test: 1` in the stored request, or add `debug=1` to the query string of Prebid Server's AMP endpoint. -+ If calling directly, add `test: 1` to the JSON. ++ Through AMP, you can put `ext.prebid.debug: true` in the stored request, or add `debug=1` to the query string of Prebid Server's AMP endpoint. ++ If calling directly, add `ext.prebid.debug: true` to the JSON. + +The OpenRTB `test:1` flag will also turn on debugging, and for true test requests, is the most appropriate thing to do, depending on your scenario. SSPs may not respond or log `test` requests. ## Why are there two versions of Prebid Server? Are they kept in sync? From bcf152a64652a36ab0f0382b85cafa49bdbe2417 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 4 May 2023 21:41:30 +0200 Subject: [PATCH 121/564] Fix #4539 by allowing GA if consent is already given (#4540) --- _includes/footer.html | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index 79da5595f1..c4b6cdae34 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -26,15 +26,21 @@ anonymize_ip: true }); - // new google analytics v4 property - gtag('config', 'G-GM972HCTEB'); - - // use the global variable provided in the head-common to wait for onetrust - window.onetrustLoaded.then(() => { - // grant consent if one trust says so. We use the callback to update gtag consent status + // grant consent if one trust says so. We use the callback to update gtag consent status + function oneTrustGaConsent() { OneTrust.InsertHtml('given', 'prebid-google-analytics-consent', function() { gtag('consent', 'update', {'ad_storage': 'granted','analytics_storage': 'granted'}); }, {}, 'C0002'); + } + + + // use the global variable provided in the head-common to wait for onetrust + window.onetrustLoaded.then(() => { + // if consent has already been given + oneTrustGaConsent(); + + // if a users sees the first layer message and gives consent + OneTrust.OnConsentChanged(() => oneTrustGaConsent()); }); From 344217b52664d8903f2dcd2b067c80b6655b092b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Fri, 5 May 2023 17:55:38 +0200 Subject: [PATCH 122/564] greenbids RTD provider (#4517) * greenbids RTD provider * update doc * code formatting Co-authored-by: Muki Seiler * Code formatting Co-authored-by: Muki Seiler --------- Co-authored-by: Muki Seiler --- dev-docs/modules/greenbidsRtdProvider.md | 72 ++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 dev-docs/modules/greenbidsRtdProvider.md diff --git a/dev-docs/modules/greenbidsRtdProvider.md b/dev-docs/modules/greenbidsRtdProvider.md new file mode 100644 index 0000000000..a30eb51016 --- /dev/null +++ b/dev-docs/modules/greenbidsRtdProvider.md @@ -0,0 +1,72 @@ +--- +layout: page_v2 +title: Greenbids Realtime Module +display_name: Greenbids Realtime Module +description: The Greenbids RTD adapter allows to dynamically filter calls to SSP to reduce outgoing call to the programmatics chain, reducing ad serving carbon impact +page_type: module +module_type: rtd +module_code : greenbidsRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Greenbids Realtime Module +{:.no_toc} + +* TOC +{:toc} + +## Overview + +The Greenbids RTD adapter allows to dynamically filter calls to SSP to reduce outgoing call to the programmatics chain, reducing ad serving carbon impact + +## 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 | `'greenbidsRtdProvider'` | `string` | +| `waitForIt ` | required (mandatory true value) | Tells prebid auction to wait for the result of this module | `'true'` | `boolean` | +| `params` | required | | | `Object` | +| `params.pbuid` | required | The client site id provided by Greenbids. | `'TEST_FROM_GREENBIDS'` | `string` | +| `params.targetTPR` | optional (default 0.95) | Target True positive rate for the throttling model | `0.99` | `[0-1]` | +| `params.timeout` | optional (default 200) | Maximum amount of milliseconds allowed for module to finish working (has to be <= to the realTimeData.auctionDelay property) | `200` | `number` | + +#### Example + +```javascript +const greenbidsDataProvider = { + name: 'greenbidsRtdProvider', + waitForIt: true, + params: { + pbuid: 'TEST_FROM_GREENBIDS', + timeout: 200 + } +}; +pbjs.setConfig({ + realTimeData: { + auctionDelay: 200, + dataProviders: [greenbidsDataProvider] + } +}); +``` + +## Integration +To install the module, follow these instructions: + +#### Step 1: Contact Greenbids to get a pbuid and account + +#### Step 2: Integrate the Greenbids Analytics Adapter (see prebid Analytics modules) + +#### Step 3: Prepare the base Prebid file + +- Option 1: Use Prebid [Download](/download.html) page to build the prebid package. Ensure that you do check *Greenbids Realtime Module* module + +- Option 2: From the command line, run `gulp build --modules=greenbidsRtdProvider,...` + +#### Step 4: Set configuration + +Enable Greenbids Real Time Module using `pbjs.setConfig`. Example is provided in Configuration section. \ No newline at end of file From 1d546d7418c5a4c1e49d1f07b02aa4e7a4ea3a2a Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 5 May 2023 17:17:04 -0400 Subject: [PATCH 123/564] first batch of intro videos (#4516) * initial control of intro videos * adding next two videos * missing paren * fixed link * added Prebid Server * padding * updated CSS --- _layouts/home.html | 3 +- overview/all-videos.md | 16 +++++ overview/intro-to-header-bidding-video.md | 70 +++++++++++++++++++ overview/intro-to-header-bidding.md | 10 +++ overview/intro-video.md | 50 +++++++++++++ overview/intro.md | 17 +++++ prebid-mobile/prebid-mobile-video.md | 46 ++++++++++++ prebid-mobile/prebid-mobile.md | 10 +++ .../overview/prebid-server-overview-video.md | 65 +++++++++++++++++ .../overview/prebid-server-overview.md | 9 +++ prebid/prebidjs-video.md | 54 ++++++++++++++ prebid/prebidjs.md | 12 ++++ 12 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 overview/all-videos.md create mode 100644 overview/intro-to-header-bidding-video.md create mode 100644 overview/intro-video.md create mode 100644 prebid-mobile/prebid-mobile-video.md create mode 100644 prebid-server/overview/prebid-server-overview-video.md create mode 100644 prebid/prebidjs-video.md diff --git a/_layouts/home.html b/_layouts/home.html index 4738f798d5..fec6c2de1b 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -9,7 +9,8 @@

Prebid Documentation

-

Welcome to the Prebid.org technical documentation portal. Here you will find the help you need to work with the Prebid.org family of products. Visit Prebid.org for general product overviews, blog updates, and additional information on membership and events. If you're wondering what Header Bidding is all about, check out our Introduction to Header Bidding

+

Welcome to the Prebid.org technical documentation portal. Here you will find the help you need to work with the Prebid.org family of Header Bidding products. You could start with the video introduction to Prebid or visit Prebid.org for general product overviews, blog updates, and additional information on membership and events. If you're wondering what Header Bidding is all about, check out our Introduction to Header Bidding

. +
diff --git a/overview/all-videos.md b/overview/all-videos.md new file mode 100644 index 0000000000..2d299d326f --- /dev/null +++ b/overview/all-videos.md @@ -0,0 +1,16 @@ +--- +layout: page_v2 +title: All Prebid Training Video +description: Directory of Prebid Video Overviews +sidebarType: 0 +--- + +# Video Overviews + +These are the multi-media overviews that Prebid has created covering various aspect of Header Bidding and Prebid. + +1. [Intro to Header Bidding](/overview/intro-to-header-bidding-video.html) - A high-level explanation of what header bidding is, what its benefits are, and how it works. +2. [Intro to Prebid](/overview/intro-video.html) - A high-level introduction to the Prebid community and its products. +3. [Intro to Prebid.js](/prebid/prebidjs-video.html) - A high-level overview of Prebid.js, Prebid’s header bidding product for websites. +4. [Intro to Prebid Mobile](/prebid-mobile/prebid-mobile-video.html) - A high-level overview of Prebid Mobile, Prebid’s header bidding product for iOS and Android applications. +4. [Intro to Prebid Server](/prebid-server/overview/prebid-server-overview-video.html) - A high-level overview of Prebid Server, Prebid’s solution for header bidding in the cloud. diff --git a/overview/intro-to-header-bidding-video.md b/overview/intro-to-header-bidding-video.md new file mode 100644 index 0000000000..9a278ae91f --- /dev/null +++ b/overview/intro-to-header-bidding-video.md @@ -0,0 +1,70 @@ +--- +layout: page_v2 +title: Video Intro to Header Bidding +description: A video overview of Header Bidding +sidebarType: 0 +--- + +# A Video Introduction to Header Bidding + +A high-level explanation of what header bidding is, what its benefits are, and how it works. + +
+ +Further Content: +- [Intro to Header Bidding](/overview/intro-to-header-bidding.html) +- [Header Bidding with Prebid](/overview/intro.html#header-bidding-with-prebid) +- [All videos](/overview/all-videos.html) + +Related Videos: +- [Introduction to Prebid](/overview/intro-video.html) +- [Introduction to Prebid.js](/prebid/prebidjs-video.html) + +## Transcript + +Header bidding is a technology used by website publishers and app developers to sell advertising opportunities through programmatic advertising marketplaces. It uses real-time auctions to maximize the value of ads online. + +### Yield Management Problem +To understand why header bidding is important, let's explore the problem it aims to solve. Publishers and app developers earn money through advertising, and they want to maximize the revenue they earn from a finite amount of traffic. This challenge is similar to a farmer working to maximize the amount of vegetables their land yields, or an airline maximizing the airfare they earn for seats on flights. This problem is called yield management or yield optimization. + +To maximize yield, a seller will need to form relationships with a selection of buyers that are able to buy advertising impressions at good prices. They’ll also set up an advertising technology stack that gives their buyers the opportunity to compete for each and every ad impression. The ad stack is also responsible for rendering the ads and offers the seller controls that influence pricing, ad quality, and user experience. Analytics, A/B testing, and other optimization tools help the seller grow their yield over time. + +In digital media, there are two prominent techniques for managing yield: the waterfall and header bidding. + +### Before Header Bidding: The Waterfall +The waterfall predates header bidding, and header bidding was developed to overcome shortcomings in the waterfall’s ability to maximize yield. + +Let’s break this down: + +In a waterfall, the seller creates a prioritized ranking of their buyer partners. Each time an impression is available for sale, the top partner in the ranking is shown the opportunity and has the option to buy it or refuse it. If they choose to buy, they deliver their ad. If they refuse, the waterfall shows the impression to the next partner in the ranking, and the cycle repeats until a willing buyer is found. + +The waterfall’s design limits publishers’ ability to maximize yield, because it doesn’t expose impression opportunities to all of the potential buyers and can’t find the best price for each impression. Its sequential nature also makes it a slow process, which causes some impressions to go unsold. + +### Header Bidding: A Better Solution to the Yield Management Problem +Header bidding overcomes many of the waterfall’s limitations using a simple, time-tested mechanism: auctions. + +Auctions allow all potential buyers to see the impression simultaneously and compete for it by bidding. This ensures that the impression is sold for a fair price and delivers the ad quickly and efficiently. + +Publishers and app developers find that header bidding allows them to work with more buyers than the waterfall does. Header bidding also allows buyers to find their target audiences more easily and deliver more effective advertising campaigns + +### How Header Bidding Works +Let’s get into how header bidding works: + +For most sellers, header bidding is one component of an advertising technology stack. The header bidding component is known as the “header bidding wrapper”, and it works in close coordination with the seller’s primary ad server. + +When a web page or app loads, the header bidding wrapper also loads. The wrapper initiates an auction for the available ad spaces on the page, and sends bid requests to potential buyers, notifying them that an impression is available for sale. + +In a fraction of a second, the buyers respond with bids containing the ad they want to serve, the price they're willing to pay, and other relevant information. The header bidding wrapper then collects and passes these bids to the primary ad server. + +The ad server considers the header bidding bids alongside other potential buyers and decides which buyer wins. Within the ad server, header bidding bids compete based on price and do not interfere with the delivery of reserved, guaranteed and sponsorship campaigns. When the ad server chooses a header bidding buyer, it works with the wrapper to render the ad to the page. + +### Header Bidding and Prebid +Header bidding began to appear in 2015, and has since replaced the waterfall on most websites. In mobile app environments, header bidding is quickly gaining popularity. Prebid.org formed to help publishers and advertising technology companies coordinate their efforts around header bidding, and Prebid is now the industry standard. Prebid is a non-profit member-based organization that offers open-source solutions for header bidding for all major ad formats, device types, and environments. + +### Learn More +If you want to learn more about header bidding and Prebid, visit docs.prebid.org. + + +## Related Reading +- [Intro to Header Bidding](/overview/intro-to-header-bidding.html) +- [All video overviews](/overview/all-videos.html) diff --git a/overview/intro-to-header-bidding.md b/overview/intro-to-header-bidding.md index fc03f918a7..f1237a9430 100644 --- a/overview/intro-to-header-bidding.md +++ b/overview/intro-to-header-bidding.md @@ -18,6 +18,16 @@ Let’s start by saying that the term “header bidding” is a bit of a misnome * TOC {:toc} +## Overview + +A video overview of header bidding. + +
+ +Further Reading: +- [Transcript of this video overview](/overview/intro-to-header-bidding-video.html) +- [Header Bidding with Prebid](/overview/intro.html#header-bidding-with-prebid) + ## Brief Description Header bidding is a process that enables publishers to capture bids for ad units from demand sources that might otherwise have been missed. By implementing header bidding, a publisher can gather bids from multiple sources that will then compete directly with bids from the ad server. What this means is that header bidding can help you, as a publisher, make more money and improve your ad quality by making the auctions for your ad space more competitive and transparent. diff --git a/overview/intro-video.md b/overview/intro-video.md new file mode 100644 index 0000000000..df04a35489 --- /dev/null +++ b/overview/intro-video.md @@ -0,0 +1,50 @@ +--- +layout: page_v2 +title: Video Intro to Prebid.org +description: A video overview of Prebid org and products +sidebarType: 0 +--- + +# A Video Overview of Prebid.org + +A high-level introduction to the Prebid community and its products. + +
+ +Further Content: +- [Intro to Prebid](/overview/intro.html) +- [Introduction for Developers](/developers.html) +- [Prebid Membership](https://prebid.org/membership) +- [Prebid on Github](https://github.com/prebid) +- [All videos](/overview/all-videos.html) + +Related Videos: +- [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) +- [Introduction to Prebid.js](/prebid/prebidjs-video.html) +- [Introduction to Prebid Mobile](/prebid-mobile/prebid-mobile-video.html) +- Introduction to Prebid Server (coming soon) + +## Transcript + +Prebid is a non-profit organization, a JavaScript library, and a suite of products that extend the capabilities of the publisher ad stack. + +Prebid is a member-based organization made up of companies in the digital publishing and advertising technology industries. These companies work together through Prebid.org to build free, open source software that monetizes digital media through advertising. + +### Why Prebid? +Prebid addresses the need for reliable shared technology in programmatic advertising. Serving a single ad is a complex and tightly choreographed routine that requires the cooperation of many entities. This process takes just a few seconds and occurs several billion times per day, accounting for billions of dollars per year in advertising spend. + +With such high stakes, the digital media industry needs standards that are accessible, transparent, and fair. Prebid establishes the foundation for sellers, buyers, and vendors to work together effectively to create high quality digital media supply chains and maximize the value of publishers’ content. + +### A Brief History of Prebid +The birth of Prebid can be traced back to Prebid.js, an open-source JavaScript library that provided a simple and reliable way to implement header bidding on websites. Header bidding is technology that connects websites to programmatic advertising marketplaces. In the early days of header bidding, these integrations were complicated and opaque. This made it difficult for publishers to maximize the value of their content and difficult for advertisers to buy advertising space efficiently and transparently. + +Prebid.js addressed these problems by creating a standardized, transparent platform for header bidding. Following the rapid adoption of Prebid.js, Prebid.org was formed to oversee the development of Prebid technology and create new products. + +### Prebid’s Products +Today, Prebid has three product areas: Prebid.js, Prebid Mobile, and Prebid Server. Prebid.js is a client-side header bidding wrapper for websites, while Prebid Mobile enables header bidding in iOS and Android applications. Prebid Server makes it possible to run header bidding auctions in the cloud for monetizing websites, apps, long form video streams, digital out-of-home, and other forms of media. + +### Prebid.org +Prebid Org has a Board of Directors representing its publisher, buyer, and technology provider members. The Board steers Prebid, upholding its principles and setting its goals. Within Prebid.org, there are also several Project Management Committees, each of which drives the development of a specific Product area. The Committees are made up of people who work for Prebid’s member companies. Prebid also has a small full-time staff that does software development, community development, and administration. The Prebid community also includes companies who offer proprietary products and services that extend Prebid’s capabilities and provide enterprise support. + +### Learn More +To learn more about Prebid, visit prebid.org. To get started using Prebid, visit docs.prebid.org. To learn about becoming a Prebid Member, visit prebid.org/membership. To contribute to the software, visit Prebid's Github repository at github.com/prebid. diff --git a/overview/intro.md b/overview/intro.md index 5b54f572c7..7189697d70 100644 --- a/overview/intro.md +++ b/overview/intro.md @@ -16,6 +16,18 @@ Prebid is the leading header bidding solution. It is free and fully open source, {: .alert.alert-info :} If you’re looking for a marketing-level overview of the Prebid software and organization, including product features, membership, events, and so on, visit [Prebid.org](https://prebid.org/). +## Overview + +A video overview of Prebid. + +
+ +Further Reading: +- [Transcript of this video overview](/overview/intro-video.html) +- [Introduction for Developers](/developers.html) +- [Prebid Membership](https://prebid.org/membership) +- [Prebid on Github](https://github.com/prebid) + ## Header Bidding with Prebid The Prebid.org suite of products leads the industry in providing header bidding to publishers. @@ -174,3 +186,8 @@ Prebid also has an active member community that ensures Prebid will continue to The ad server you’re working with makes their money by taking a cut of the winning bid price, so you might be wondering if Prebid also takes a cut. The answer is NO. Prebid is free to anyone who wants to use it. So how does Prebid continue to evolve as a quality set of products (not to mention provide events and great documentation) without taking in fees? Through dedicated volunteers from member companies, alongside a small handful of employees and an occasional contractor paid through Prebid.org membership dues. All dues go into serving the Prebid community and providing a voice for our members in the world of header bidding. You don’t have to be a Prebid.org member to use Prebid. However, we do highly encourage you to explore the benefits of membership and consider joining. No matter the size of your company, Prebid has membership options available that will provide value to anyone interested in header bidding today and in the future. For more information on Prebid.org membership, see [Prebid.org Membership Overview](https://prebid.org/membership/). + +## Related Reading +- [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) +- [Prebid Product Suite](https://prebid.org/product-suite/) +- [What is Prebid.js](/prebid/prebidjs.html) diff --git a/prebid-mobile/prebid-mobile-video.md b/prebid-mobile/prebid-mobile-video.md new file mode 100644 index 0000000000..098d4f84e2 --- /dev/null +++ b/prebid-mobile/prebid-mobile-video.md @@ -0,0 +1,46 @@ +--- +layout: page_v2 +title: Video Intro to Prebid Mobile +description: A video overview of Prebid Mobile SDK +sidebarType: 0 +--- + +# A Video Overview of Prebid Mobile + +A high-level overview of Prebid Mobile, Prebid’s header bidding product for iOS and Android applications. + +
+ +Further Content: +- [Intro to Prebid](/overview/intro.html) +- [Prebid Managed Services](https://prebid.org/product-suite/managed-services/) +- [All videos](/overview/all-videos.html) + +Related Videos: +- [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) +- Introduction to Prebid Server (coming soon) + +## Transcript + +Prebid is a non-profit organization, a JavaScript library, and a suite of products that extend the capabilities of the publisher ad stack. + +Prebid is a member-based organization made up of companies in the digital publishing and advertising technology industries. These companies work together through Prebid.org to build free, open source software that monetizes digital media through advertising. + +### Why Prebid? +Prebid addresses the need for reliable shared technology in programmatic advertising. Serving a single ad is a complex and tightly choreographed routine that requires the cooperation of many entities. This process takes just a few seconds and occurs several billion times per day, accounting for billions of dollars per year in advertising spend. + +With such high stakes, the digital media industry needs standards that are accessible, transparent, and fair. Prebid establishes the foundation for sellers, buyers, and vendors to work together effectively to create high quality digital media supply chains and maximize the value of publishers’ content. + +### A Brief History of Prebid +The birth of Prebid can be traced back to Prebid.js, an open-source JavaScript library that provided a simple and reliable way to implement header bidding on websites. Header bidding is technology that connects websites to programmatic advertising marketplaces. In the early days of header bidding, these integrations were complicated and opaque. This made it difficult for publishers to maximize the value of their content and difficult for advertisers to buy advertising space efficiently and transparently. + +Prebid.js addressed these problems by creating a standardized, transparent platform for header bidding. Following the rapid adoption of Prebid.js, Prebid.org was formed to oversee the development of Prebid technology and create new products. + +### Prebid’s Products +Today, Prebid has three product areas: Prebid.js, Prebid Mobile, and Prebid Server. Prebid.js is a client-side header bidding wrapper for websites, while Prebid Mobile enables header bidding in iOS and Android applications. Prebid Server makes it possible to run header bidding auctions in the cloud for monetizing websites, apps, long form video streams, digital out-of-home, and other forms of media. + +### Prebid.org +Prebid Org has a Board of Directors representing its publisher, buyer, and technology provider members. The Board steers Prebid, upholding its principles and setting its goals. Within Prebid.org, there are also several Project Management Committees, each of which drives the development of a specific Product area. The Committees are made up of people who work for Prebid’s member companies. Prebid also has a small full-time staff that does software development, community development, and administration. The Prebid community also includes companies who offer proprietary products and services that extend Prebid’s capabilities and provide enterprise support. + +### Learn More +To learn more about Prebid, visit prebid.org. To get started using Prebid, visit docs.prebid.org. To learn about becoming a Prebid Member, visit prebid.org/membership. To contribute to the software, visit Prebid's Github repository at github.com/prebid. diff --git a/prebid-mobile/prebid-mobile.md b/prebid-mobile/prebid-mobile.md index 4ee540ef54..a8f2833ea2 100644 --- a/prebid-mobile/prebid-mobile.md +++ b/prebid-mobile/prebid-mobile.md @@ -17,6 +17,16 @@ Prebid Mobile libraries are available for iOS and Android. * TOC {:toc} +## Video Overview of Prebid Mobile + +A high-level overview of Prebid Mobile, Prebid’s header bidding product for iOS and Android applications. + +
+ +Further Content: +- [Transcript of this video](/prebid-mobile/prebid-mobile-video.html) +- [Prebid Managed Services](https://prebid.org/product-suite/managed-services/) + ## Benefits and Features Prebid SDK rendering offers the following benefits: diff --git a/prebid-server/overview/prebid-server-overview-video.md b/prebid-server/overview/prebid-server-overview-video.md new file mode 100644 index 0000000000..6af75d1834 --- /dev/null +++ b/prebid-server/overview/prebid-server-overview-video.md @@ -0,0 +1,65 @@ +--- +layout: page_v2 +title: Video Intro to Prebid Server +description: A video overview of Prebid Server +sidebarType: 5 +--- + +# A Video Overview of Server + +A high-level overview of Prebid Server, Prebid’s solution for header bidding in the cloud. + +
+ +Further Content: +- [Intro to Prebid](/overview/intro.html) +- [Prebid Server Overview](/prebid-server/overview/prebid-server.html) +- [Prebid Membership](https://prebid.org/membership) +- [Prebid on Github](https://github.com/prebid) +- [All videos](/overview/all-videos.html) + +Related Videos: +- [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) +- [Introduction to Prebid Mobile](/prebid-mobile/prebid-mobile-video.html) + +## Transcript + +### About Prebid Server + +Prebid Server is a solution for running real-time advertising auctions in the cloud. + +It works in conjunction with Prebid.js, Prebid SDK, and other technologies to make header bidding possible for any ad format in any type of digital media. + +Prebid Server has everything necessary to sell advertising opportunities through server-side header bidding, including bidder integrations, privacy controls, creative caching, currency conversion, price floors, and analytics. + +It supports more than 150 demand sources, including many of the world’s largest exchanges, DSPs, ad networks, and agencies. + +### Why Prebid Server? + +Prebid Server brings the revenue-maximizing power of header bidding to environments that don’t support standard JavaScript. + +Header bidding originated as a JavaScript technology for websites, and the leading solution for header bidding in standard browser-based environments is Prebid.js. Prebid.js is very popular, but it only works on normal websites. Mobile apps, AMP websites, long-form video, and digital out-of-home need their own solution for header bidding, and that’s what Prebid Server provides. + +Prebid Server can also be used to augment Prebid.js on websites. Prebid Server can be a powerful tool in yield management strategies that aim to maximize both advertising revenue and user experience. + +### How Prebid Server Works +Prebid Server is open-source code that is free to use. To use it, you’ll need to set up a server to host the solution. You can set up your own servers, or use one of the managed services offered by companies in the Prebid community. + +Let’s walk through an example of Prebid Server in use. + +A digital advertising seller sets Prebid Server up on a server. + +Prebid Server receives ad requests from a personal computer, a mobile device, or another server. + +Prebid Server is able to enrich ad requests it receives, which means that it adds additional contextual information like IP-based location. It’s also able to interpret user consent and take actions such as restricting auction functions or limiting the sharing of personal data. + +Next, Prebid Server runs the auction. It sends bid requests to bidders, who respond with bids. Prebid Server validates each of the bids, checking for things like privacy compliance and adherence to price floors. It then finalizes the auction and transmits the results to the system that sent it the initial ad request. + +The seller who uses and hosts Prebid Server configures it to work how they want it to. Settings like privacy and consent controls, price floors, auction controls, the selection of bidders, and ad request enrichment functions are all determined by configurations that the seller sets. + +### Getting Started +To learn more about Prebid Server, including information about setting up your own hosting server, visit docs.prebid.org. + +To learn more about Prebid community companies that offer hosting services, visit prebid.org. + +If you are a developer who would like to see the source code or contribute to Prebid Server, visit Prebid on Github at github.com/prebid/. diff --git a/prebid-server/overview/prebid-server-overview.md b/prebid-server/overview/prebid-server-overview.md index 9b10da7266..d5f0419baa 100644 --- a/prebid-server/overview/prebid-server-overview.md +++ b/prebid-server/overview/prebid-server-overview.md @@ -30,6 +30,15 @@ The Prebid Cache is an adjunct to Prebid Server that stores VAST and bids as nee Explore [Prebid Server features](/prebid-server/features/pbs-feature-idx.html) in more detail. +## Video Introduction + +A high-level overview of Prebid Server, Prebid’s solution for header bidding in the cloud. + +
+ +Further Reading: +- [Transcript of this video overview](/prebid-server/overview/prebid-server-overview-video.html) + ## Where to Run Prebid Server Unlike Prebid.js, Prebid Server is a server. It needs somewhere to run, and that somewhere ought to be scaleable, distributed, and fast. diff --git a/prebid/prebidjs-video.md b/prebid/prebidjs-video.md new file mode 100644 index 0000000000..f1f72226da --- /dev/null +++ b/prebid/prebidjs-video.md @@ -0,0 +1,54 @@ +--- +layout: page_v2 +title: Video Intro to Prebid.js +description: A video overview of Prebid org and products +sidebarType: 0 +--- + +# A Video Overview of Prebid.js + +A high-level overview of Prebid.js, Prebid’s header bidding product for websites. + +
+ +Further Content: +- [Intro to Header Bidding](/overview/intro-to-header-bidding.html) +- [Header Bidding with Prebid](/overview/intro.html#header-bidding-with-prebid) +- [What is Prebid.js?](/prebid/prebidjs.html) +- [Prebid.js Developer Quick Start](/dev-docs/getting-started.html) +- [All videos](/overview/all-videos.html) + +Related Videos +- [Introduction to Prebid](/overview/intro-video.html) +- [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) +- Prebid.js Impression Flow (coming soon) +- Components of Prebid.js (coming soon) +- Identity in Prebid.js (coming soon) + +## Transcript + +### Introduction +Prebid js is a powerful, open-source header bidding wrapper that allows publishers to monetize their websites by running an auction for any ad on any page. + +It’s the industry standard in header bidding. It’s used by tens of thousands of websites and supports more than 200 demand sources. + +### Features and Capabilities +Prebid.js allows a publisher to set up a detailed map of their advertising inventory across one or many websites. It allows them to select which demand partners should compete to bid on each ad slot and provides a robust set of controls over ad slots, auction dynamics, and page performance. There is also a set of optional add-ons for analytics, ad request enrichment, identity and privacy control, price floors, and more. These tools allow publishers to maximize revenue while preserving user experience and privacy. Prebid.js is flexible and modular, allowing it to integrate cleanly into any ad stack. + +### What makes Prebid.js different +What distinguishes Prebid.js from other header bidding solutions is its robust set of features, its extensive adoption among sellers and buyers of digital advertising, and its principles of transparency, fairness, and open-source. Prebid.js is built by the community that uses it. As an open platform, Prebid.js also lays the foundation for an innovative ecosystem in which independent companies offer Prebid-compatible products and services. +### How Prebid.js is Made +Prebid.js is built collaboratively by Prebid member companies and Prebid.org.. This team works together under the oversight of the Prebid.js Product Management Committee, which is the group within Prebid.org that is responsible for developing Prebid.js. The Product Management Committee maintains Prebid.js’ roadmap and coordinates the software’s development. + +### How Prebid.js Works +When a publisher uses Prebid.js, they create a wrapper. The wrapper includes Prebid’s core auction and ad serving functions, as well as add-ons that the publisher uses to customize the wrapper to their needs. The publisher chooses a list of buyers, which Prebid calls bidders. For each bidder, the publisher adds a specific block of code called a bid adapter to their wrapper. Each bidder develops its own bid adapter and contributes it to the Prebid library. + +Let’s run through an example Prebid auction: + +Prebid.js is installed to the website. Each time a new impression opportunity becomes available, Prebid.js notifies the bidders, who respond with bids. Then, Prebid might select an auction winner and render its ad to the page, but more commonly, it will pass the bid information on to the ad server, which makes a final decision about which ad source should be awarded the impression. Within the ad server, header bidding bids compete based on price, and do not compete with the delivery of reserved, guaranteed, and sponsorship campaigns. When the ad server chooses a header bidding buyer, it works with the wrapper to render the ad to the page. + +### Getting Started +Prebid.js is free to use. You can get started with your own installation of the latest version of Prebid by visiting docs.prebid.org. + +There are also several companies that offer Prebid.js managed services, which may include technical support, ad operations and yield optimization services, hosting services, and extra product features like user interfaces or analytics. To learn more about these, visit prebid.org. + diff --git a/prebid/prebidjs.md b/prebid/prebidjs.md index 5433f70a31..b09167430a 100644 --- a/prebid/prebidjs.md +++ b/prebid/prebidjs.md @@ -11,6 +11,18 @@ sidebarType: 1 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. +## Video Overview of Prebid.js + +A high-level overview of Prebid.js, Prebid’s header bidding product for websites. + +
+ +Further Reading: +- [Transcript of this video overview](/prebid/prebidjs-video.html) +- [Intro to Header Bidding](/overview/intro-to-header-bidding.html) +- [Header Bidding with Prebid](/overview/intro.html#header-bidding-with-prebid) +- [Prebid.js Developer Quick Start](/dev-docs/getting-started.html) + ## How Does Prebid.js Work? At a high level, header bidding with Prebid.js involves just a few steps: From 169026dffc039daab64f0b67ad2e1ea510c73d1e Mon Sep 17 00:00:00 2001 From: samuel-palmer-relevant-digital <77437973+samuel-palmer-relevant-digital@users.noreply.github.com> Date: Wed, 10 May 2023 13:29:48 +0200 Subject: [PATCH 124/564] New Adapter: Relevant Digital (#4426) * New Adapter: Relevant Digital * Added documentation for new parameters * Added documentation for forgotten 'pbsBufferMs' parameter --- dev-docs/bidders/relevantdigital.md | 133 ++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 dev-docs/bidders/relevantdigital.md diff --git a/dev-docs/bidders/relevantdigital.md b/dev-docs/bidders/relevantdigital.md new file mode 100644 index 0000000000..3015428fef --- /dev/null +++ b/dev-docs/bidders/relevantdigital.md @@ -0,0 +1,133 @@ +--- +layout: bidder +title: Relevant Digital +description: Relevant Digital Bid Adapter +biddercode: relevantdigital +pbjs: true +gdpr_supported: true +usp_supported: true +coppa_supported: false +schain_supported: true +floors_supported: true +media_types: banner, video, native +userIds: all +prebid_member: true +safeframes_ok: true +deals_supported: true +pbs: false +pbs_app_supported: false +fpd_supported: true +ortb_blocking_supported: no +gvl_id: 1100 +multiformat_supported: true +sidebarType: 1 +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------------------------------|----------------------------|--------------| +| `placementId` | required | The placement id. | `'6204e83a077_620f9e8e4fe'` | `String` | +| `pbsHost` | required if not set in config | Host name of the server. | `'pbs-example.relevant-digital.com'` | `String` | +| `accountId` | required if not set in config | The account id. | `'6204e5fa70e3ad108'` | `String` | +| `useSourceBidderCode` | optional | Set to `true` in order to use the bidder code of the actual server-side bidder in bid responses. You **MUST** also use `allowAlternateBidderCodes: true` in `bidderSettings` if you enabled this - as otherwise the bids will be rejected.| `true` | `Boolean` | + +### Config Parameters + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|---------------------------------------------------------|----------------------------|--------------| +| `pbsHost` | required if not set in bid parameters | Host name of the server. | `'pbs-example.relevant-digital.com'` | `String` | +| `accountId` | required if not set in bid parameters | The account id. | `'6204e5fa70e3ad108'` | `String` | +| `pbsBufferMs` | optional | How much less in *milliseconds* the server's internal timeout should be compared to the normal Prebid timeout. Default is *250*. To be increased in cases of frequent timeouts. | `250` | `Integer` | +| `useSourceBidderCode` | optional | Set to `true` in order to use the bidder code of the actual server-side bidder in bid responses. You **MUST** also use `allowAlternateBidderCodes: true` in `bidderSettings` if you enabled this - as otherwise the bids will be rejected.| `true` | `Boolean` | + +### Example setup using pbjs.setConfig() +This is the recommended method to set the global configuration parameters. +```javascript +pbjs.setConfig({ + relevantdigital: { + pbsHost: 'pbs-example.relevant-digital.com', + accountId: '6204e5fa70e3ad10821b84ff', + }, +}); + +var adUnits = [ + { + code: 'test-div', + mediaTypes: { banner: { sizes: [[300, 250], [320, 320]] }}, + bids: [ + { + bidder: 'relevantdigital', + params: { + placementId: '6204e83a077c5825441b8508_620f9e8e4fe67c1f87cd30ed', + } + } + ], + } +]; +``` +# Example setup using only bid params +This method to set the global configuration parameters (like **pbsHost**) in **params** could simplify integration of a provider for some publishers. Setting different global config-parameters on different bids is not supported in general*, as the first settings found will be used and any subsequent global settings will be ignored. + + * _The exception is `useSourceBidderCode` which can be overriden individually per ad unit._ +```javascript +var adUnits = [ + { + code: 'test-div', + mediaTypes: { banner: { sizes: [[300, 250], [320, 320]] }}, + bids: [ + { + bidder: 'relevantdigital', + params: { + placementId: '6204e83a077c5825441b8508_620f9e8e4fe67c1f87cd30ed', + pbsHost: 'pbs-example.relevant-digital.com', + accountId: '6204e5fa70e3ad10821b84ff', + } + } + ], + } +]; +``` + +### Example setup with multiple providers +**Notice:** Placements below are _not_ live test placements +```javascript + +pbjs.aliasBidder('relevantdigital', 'providerA'); +pbjs.aliasBidder('relevantdigital', 'providerB'); + +pbjs.setConfig({ + providerA: { + pbsHost: 'pbs-example-a.relevant-digital.com', + accountId: '620533ae7f5bbe1691bbb815', + }, + providerB: { + pbsHost: 'pbs-example-b.relevant-digital.com', + accountId: '990533ae7f5bbe1691bbb815', + }, +}); + +var adUnits = [ + { + code: 'test-div', + mediaTypes: { banner: { sizes: [[300, 250], [320, 320]] }}, + bids: [ + { + bidder: 'providerA', + params: { + placementId: '610525862d7517bfd4bbb81e_620523b7d1dbed6b0fbbb817', + } + }, + { + bidder: 'providerB', + params: { + placementId: '990525862d7517bfd4bbb81e_770523b7d1dbed6b0fbbb817', + } + }, + ], + } +]; +``` + From 51be78be4741d8f6e768adaebf69efd8ced27f3d Mon Sep 17 00:00:00 2001 From: xwang202 <57196235+xwang202@users.noreply.github.com> Date: Wed, 10 May 2023 20:01:47 +0800 Subject: [PATCH 125/564] FreeWheel SSP Adapter: add gpp_supported (#4538) --- dev-docs/bidders/freewheelssp.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/freewheelssp.md b/dev-docs/bidders/freewheelssp.md index 04429dd8d4..4b48260e46 100644 --- a/dev-docs/bidders/freewheelssp.md +++ b/dev-docs/bidders/freewheelssp.md @@ -1,6 +1,6 @@ --- layout: bidder -title: freeWheelssp +title: FreeWheelssp description: Freewheel Bidder Adaptor pbjs: true pbs: true @@ -9,6 +9,7 @@ aliasCode: freewheel-ssp gvl_id: 285 gdpr_supported: true usp_supported: true +gpp_supported: true coppa_supported: true schain_supported: true media_types: video From 6fe597de6ca927c97e4eacfda7421cd54aa74314 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 05:02:25 -0700 Subject: [PATCH 126/564] Bump engine.io and socket.io (#4536) Bumps [engine.io](https://github.com/socketio/engine.io) and [socket.io](https://github.com/socketio/socket.io). These dependencies needed to be updated together. Updates `engine.io` from 6.2.1 to 6.4.2 - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/6.2.1...6.4.2) Updates `socket.io` from 4.5.3 to 4.6.1 - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/4.5.3...4.6.1) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect - dependency-name: socket.io dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 126 ++++++++++++++++++++++++++++++---------------- 1 file changed, 84 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac50a84219..fe50e54f28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1090,10 +1090,13 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/glob": { "version": "7.1.3", @@ -4666,9 +4669,9 @@ } }, "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -4680,7 +4683,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" }, "engines": { "node": ">=10.0.0" @@ -4739,9 +4742,9 @@ } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -10600,27 +10603,51 @@ "dev": true }, "node_modules/socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/socket.io-client": { "version": "4.6.1", @@ -13882,10 +13909,13 @@ "dev": true }, "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/glob": { "version": "7.1.3", @@ -16885,9 +16915,9 @@ } }, "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -16899,7 +16929,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "ws": "~8.11.0" }, "dependencies": { "cookie": { @@ -16909,9 +16939,9 @@ "dev": true }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "requires": {} } @@ -21805,24 +21835,36 @@ } }, "socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" } }, "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + } + } }, "socket.io-client": { "version": "4.6.1", From 0cfb5288c4573161e799358e54d1830de561fa21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 05:25:45 -0700 Subject: [PATCH 127/564] Bump lodash from 4.17.20 to 4.17.21 (#4555) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) --- updated-dependencies: - dependency-name: lodash dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe50e54f28..13368f79bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7347,9 +7347,9 @@ } }, "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "node_modules/lodash.isfinite": { @@ -19066,9 +19066,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.isfinite": { From 271f69363137f45e78cf7b23007abab966055753 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 05:45:42 -0700 Subject: [PATCH 128/564] Bump y18n from 4.0.0 to 4.0.3 (#4553) Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.3. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/y18n-v4.0.3/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/compare/v4.0.0...y18n-v4.0.3) --- updated-dependencies: - dependency-name: y18n dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 13368f79bf..079782b3f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12654,9 +12654,9 @@ } }, "node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/yallist": { @@ -23530,9 +23530,9 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { From 11753deb8348137a7a7ad77f5071557a4408c86b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 05:57:47 -0700 Subject: [PATCH 129/564] Bump ini from 1.3.5 to 1.3.8 (#4557) Bumps [ini](https://github.com/npm/ini) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/npm/ini/releases) - [Changelog](https://github.com/npm/ini/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/ini/compare/v1.3.5...v1.3.8) --- updated-dependencies: - dependency-name: ini dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 079782b3f0..961e530744 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6509,13 +6509,10 @@ "dev": true }, "node_modules/ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "engines": { - "node": "*" - } + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/internal-ip": { "version": "4.3.0", @@ -18408,9 +18405,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "internal-ip": { From 94f8a794872b78f8c56e757440812de44f1ca79c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 06:02:22 -0700 Subject: [PATCH 130/564] Bump elliptic from 6.5.3 to 6.5.4 (#4554) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 961e530744..84232c6030 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4615,18 +4615,18 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, "node_modules/elliptic/node_modules/bn.js": { @@ -16862,18 +16862,18 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { From 630fcbacb9e2236d96b8c20322449da22b1ae47b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 06:17:32 -0700 Subject: [PATCH 131/564] Bump node-notifier and webpack-notifier (#4556) Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) and [webpack-notifier](https://github.com/Turbo87/webpack-notifier). These dependencies needed to be updated together. Updates `node-notifier` from 5.4.3 to 9.0.1 - [Changelog](https://github.com/mikaelbr/node-notifier/blob/master/CHANGELOG.md) - [Commits](https://github.com/mikaelbr/node-notifier/compare/v5.4.3...v9.0.1) Updates `webpack-notifier` from 1.8.0 to 1.15.0 - [Release notes](https://github.com/Turbo87/webpack-notifier/releases) - [Changelog](https://github.com/Turbo87/webpack-notifier/blob/master/CHANGELOG.md) - [Commits](https://github.com/Turbo87/webpack-notifier/compare/v1.8.0...v1.15.0) --- updated-dependencies: - dependency-name: node-notifier dependency-type: indirect - dependency-name: webpack-notifier dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 226 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 200 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84232c6030..4c7be5d269 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5948,7 +5948,7 @@ "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", "dev": true }, "node_modules/handle-thing": { @@ -6723,6 +6723,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -7889,16 +7904,80 @@ "dev": true }, "node_modules/node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", "dev": true, "dependencies": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.0" + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/node-releases": { @@ -12397,14 +12476,42 @@ } }, "node_modules/webpack-notifier": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz", - "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.15.0.tgz", + "integrity": "sha512-N2V8UMgRB5komdXQRavBsRpw0hPhJq2/SWNOGuhrXpIgRhcMexzkGQysUyGStHLV5hkUlgpRiF7IUXoBqyMmzQ==", "dev": true, "dependencies": { - "node-notifier": "^5.1.2", - "object-assign": "^4.1.0", - "strip-ansi": "^3.0.1" + "node-notifier": "^9.0.0", + "strip-ansi": "^6.0.0" + }, + "peerDependencies": { + "@types/webpack": ">4.41.31" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + } + } + }, + "node_modules/webpack-notifier/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-notifier/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/webpack-sources": { @@ -17929,7 +18036,7 @@ "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", "dev": true }, "handle-thing": { @@ -18577,6 +18684,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -19532,16 +19645,61 @@ } }, "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", "dev": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.0" + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "node-releases": { @@ -23391,14 +23549,30 @@ } }, "webpack-notifier": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz", - "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.15.0.tgz", + "integrity": "sha512-N2V8UMgRB5komdXQRavBsRpw0hPhJq2/SWNOGuhrXpIgRhcMexzkGQysUyGStHLV5hkUlgpRiF7IUXoBqyMmzQ==", "dev": true, "requires": { - "node-notifier": "^5.1.2", - "object-assign": "^4.1.0", - "strip-ansi": "^3.0.1" + "node-notifier": "^9.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "webpack-sources": { From 6e9cc5b1014904d2c8e051930a63b161a11ca5b8 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 10 May 2023 13:21:35 -0400 Subject: [PATCH 132/564] Flagging emx_digital as deprecated (#4564) --- dev-docs/bidders/emx_digital.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dev-docs/bidders/emx_digital.md b/dev-docs/bidders/emx_digital.md index d9dbf61025..8e508c7a00 100644 --- a/dev-docs/bidders/emx_digital.md +++ b/dev-docs/bidders/emx_digital.md @@ -15,6 +15,9 @@ userIds: identityLink, uid2 sidebarType: 1 --- +{: .alert.alert-warning :} +The emx_digital bidder is deprecated, and will be removed in a future release of Prebid.js and Prebid Server. + ### Registration To use this bidder you will need an account and a valid tagid from our exchange. For further information, please contact your Account Manager or adops@emxdigital.com. From 1e2dfbc42f6847827c52e2d7ab64050dda0c0bb3 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 10 May 2023 16:52:32 -0400 Subject: [PATCH 133/564] PBS: fix video cache example (#4566) --- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index ea68c7a9d2..d081a6ac53 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -684,7 +684,7 @@ If the `ext.prebid.cache.vastxml` object is present, Prebid Server will make a b "ext": { "prebid": { "cache": { - "bids": { + "vastXml": { "url": "https://example.com:443/cache?uuid=385b283c-22cb-49a0-8c0b-8b88c49d9fe9", "cacheId": "385b283c-22cb-49a0-8c0b-8b88c49d9fe9" } From f607cd59cb157b2106d5a88868341aa57d7c7e59 Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Thu, 11 May 2023 12:42:56 -0400 Subject: [PATCH 134/564] Update ix.md (#4565) * Update ix.md added the version from which we support the Index bidder-specific data * Update ix.md Updated step 6 (about FPD) in the set up steps to make it clearer to understand --- dev-docs/bidders/ix.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 20679f046a..9f528a1aa1 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -122,7 +122,7 @@ In this configuration Prebid.js calls Index directly from the browser using our } }); ``` -5. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. +5. (Optional) Set up First Party Data (FPD). For more information about the data types we support and the instructions for each option, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. 6. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function as follows:
```javascript pbjs.setConfig({ @@ -160,7 +160,7 @@ In this configuration, Prebid.js makes a call to Prebid Server and then Prebid S } }); ``` -6. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. +6. (Optional) Set up First Party Data (FPD). For more information about the data types we support and the instructions for each option, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. 7. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()]` function as follows: ```javascript pbjs.setConfig({ @@ -226,7 +226,7 @@ pbjs.setConfig({ ### Index bidder-specific data -Use this data type to specify key-value pairs that will be included in your query string when targeting deals. For example, if a user visits a news page, you can pass that information by submitting a key-value pair for `category = news`. You can then create a deal in the Index UI and activate the deal only on pages that contain `category = news` as the key-value pair. +This data type is available from Prebid version 7.49.0 and above. You can use it to specify key-value pairs that will be included in your query string when targeting deals. For example, if a user visits a news page, you can pass that information by submitting a key-value pair for `category = news`. You can then create a deal in the Index UI and activate the deal only on pages that contain `category = news` as the key-value pair. To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the `ix` bidder level, provide the key-values in the `firstPartyData` parameter. Make sure that you set it before the `pbjs.requestBids` configuration. If you want to change the values, you can update the `pbjs.setConfig` once again. The change will be reflected in all future bid requests. From 75c9e1c5e5ab459dead90cea4bb8bff1d6b48236 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 11 May 2023 12:48:38 -0400 Subject: [PATCH 135/564] axonix param table formatting (#4548) * axonix param table formatting * added type column --- dev-docs/bidders/axonix.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dev-docs/bidders/axonix.md b/dev-docs/bidders/axonix.md index b0d5c66d9c..c4f843b34b 100644 --- a/dev-docs/bidders/axonix.md +++ b/dev-docs/bidders/axonix.md @@ -14,10 +14,10 @@ sidebarType: 1 The Axonix Bidding adapter requires setup before beginning. Please contact us at support.axonix@emodoinc.com. ### Bid Params - -| Name | Scope | Description | Example | -| :------------ | :------- | :---------------------------------------------- | :------------------------------------- | -| `supplyId` | required | Supply UUID | `'2c426f78-bb18-4a16-abf4-62c6cd0ee8de'` | -| `region` | optional | Cloud region | `'us-east-1'` | -| `endpoint` | optional | Supply custom endpoint | `'https://open-rtb.axonix.com/custom'` | -| `instl` | optional | Set to 1 if using interstitial (default: 0) | `1` | +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|-------|----------------------------------------------|-------------------------------------|------| +| `supplyId` | required | Supply UUID | `'2c426f78-bb18-4a16-abf4-62c6cd0ee8de'` | string | +| `region` | optional | Cloud region | `'us-east-1'` | string | +| `endpoint` | optional | Supply custom endpoint | `'https://open-rtb.axonix.com/custom'` | string | +| `instl` | optional | Set to 1 if using interstitial (default: 0) | `1` | integer | From 9d7074693805c73468c19395719eb66b9fdc597b Mon Sep 17 00:00:00 2001 From: Piotr Jaworski <109736938+piotrj-rtbh@users.noreply.github.com> Date: Fri, 12 May 2023 22:02:25 +0200 Subject: [PATCH 136/564] RTB House Bid Adapter: docs update - `bcat` & `badv` ORTB params support (#4522) * RTBHouse Bid Adapter: adds channel as optional param, updates bidder flags * RTBHouse Bid Adapter: fixed table descriptions * RTBHouse Bid Adapter: minor textual changes on bidder docs * ortb_blocking_supported and description section * ortb_blocking_supported and description section (#1) * ortb_blocking_supported and description section * rephrasing * ORTB blocking examples update * Javascript type for examples added * typo fix * code fix * Prebid Server setup by host companies --------- Co-authored-by: Leandro Otani Co-authored-by: rtbh-lotani <83652735+rtbh-lotani@users.noreply.github.com> --- dev-docs/bidders/rtbhouse.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/dev-docs/bidders/rtbhouse.md b/dev-docs/bidders/rtbhouse.md index 3feec1ce33..60b4ca65bf 100644 --- a/dev-docs/bidders/rtbhouse.md +++ b/dev-docs/bidders/rtbhouse.md @@ -13,6 +13,7 @@ media_types: banner, native schain_supported: true userIds: id5Id, identityLink, pubProvidedId pbs_app_supported: true +ortb_blocking_supported: partial sidebarType: 1 --- @@ -27,6 +28,36 @@ sidebarType: 1 | `bidfloor` | optional | Minimal CPM value | `0.01` | `float` | | `channel` | optional | Inventory channel identifier, limited to 50 characters | `Partner 1 - News` | `string` | +#### ORTB Blocking +RTB House supports blocking advertisers in `badv` and categories in `bcat` parameters. +The blocked advertisers/categories list has no length limitation, but response timeout is more likely to occur as the number of entries grow. +Blocked advertisers list (`badv`) is an array of domains as strings. +Blocked categories list (`bcat`) is an array of IAB categories as strings. + +For example: +##### Globally defined ORTB Blocking: +```javascript +pbjs.setConfig({ + ortb2: { + badv: ["domain1.com", "domain2.com"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } +)}; +``` +##### ORTB Blocking specific only to rtbhouse bidder: +```javascript +pbjs.setBidderConfig({ + bidders: ['rtbhouse'], + config:{ + ortb2: { + badv: ["domain1.com", "domain2.com"], + bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"] + } + } +}); +``` +### Setting up the Prebid Server Adapter +If you’re a Prebid Server host company looking to enable the RTB House server-side adapter, you'll need to contact prebid@rtbhouse.com. They will guide you through the process. Do not use the default bidder config file as it will require custom partner code to be entered. It will be provided by RTB House. ### Please note: From b13c32f12f23aedbbc72b45760f957b980df3abf Mon Sep 17 00:00:00 2001 From: YakirLavi <73641910+YakirLavi@users.noreply.github.com> Date: Sat, 13 May 2023 17:54:16 +0300 Subject: [PATCH 137/564] Rise Bid Adapter: update documentation - support Coppa param (#4505) * Update Rise readme * fix rise doc * change rise docs * fix rise docs * added is_wrapper parameter to rise doc * changed is_wrapper to boolean * add coppa support documentation (#6) --------- Co-authored-by: noamtzu Co-authored-by: Noam Tzuberi Co-authored-by: innay --- dev-docs/bidders/rise.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index 5a6efbfe1c..0088d620a3 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -7,6 +7,7 @@ pbjs: true biddercode: rise media_types: banner, video schain_supported: true +coppa_supported: true gdpr_supported: true usp_supported: true floors_supported: true From ad36a89cebe6788fa57aead13b7273fc7983ca18 Mon Sep 17 00:00:00 2001 From: YakirLavi <73641910+YakirLavi@users.noreply.github.com> Date: Sat, 13 May 2023 18:23:53 +0300 Subject: [PATCH 138/564] MinuteMedia: Update documentation - Coppa support (#4506) * Update Rise readme * fix rise doc * change rise docs * fix rise docs * added is_wrapper parameter to rise doc * changed is_wrapper to boolean * update documentation - coppa param --------- Co-authored-by: noamtzu Co-authored-by: Noam Tzuberi Co-authored-by: innay Co-authored-by: YakirLavi From 2f275bba776114dc80b36324d307d9b0ad7c0280 Mon Sep 17 00:00:00 2001 From: EngageMediaHB <130045707+EngageMediaHB@users.noreply.github.com> Date: Sat, 13 May 2023 19:41:53 +0300 Subject: [PATCH 139/564] add EMTV adapter doc (#4472) --- dev-docs/bidders/emtv.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dev-docs/bidders/emtv.md diff --git a/dev-docs/bidders/emtv.md b/dev-docs/bidders/emtv.md new file mode 100644 index 0000000000..8de30ab0ba --- /dev/null +++ b/dev-docs/bidders/emtv.md @@ -0,0 +1,30 @@ +--- +layout: bidder +title: EMTV +description: Prebid EMTV Bidder Adapter +biddercode: emtv +usp_supported: true +gdpr_supported: true +coppa_supported: true +schain_supported: true +floors_supported: true +media_types: banner, video, native +multiformat_supported: will-not-bid +pbjs: true +pbs: true +pbs_app_supported: true +safeframes_ok: true +sidebarType: 1 +--- + +### 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 From f46a6582cd9a171e293429ee566232a4a4bc46b1 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Sun, 14 May 2023 11:51:12 -0700 Subject: [PATCH 140/564] added docs for the adjustAlternateBids bidderSettings functionality (#4547) --- .../publisher-api-reference/bidderSettings.md | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/bidderSettings.md b/dev-docs/publisher-api-reference/bidderSettings.md index 2da634a29d..34b7810e43 100644 --- a/dev-docs/publisher-api-reference/bidderSettings.md +++ b/dev-docs/publisher-api-reference/bidderSettings.md @@ -48,7 +48,8 @@ Some sample scenarios where publishers may wish to alter the default settings: | 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/or 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. | +| 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. | +| adjustAlternateBids | standard or adapter-specific | 7.48.0 | false | Optionally allow alternate bidder codes to use an adapter's bidCpmAdjustment function by default instead of the standard bidCpmAdjustment function if present (note: if a bidCpmAdjustment function exists for the alternate bidder code within bidderSettings, then this will be used instead of falling back to the adapter's bidCpmAdjustment function). | ##### 2.1. adserverTargeting @@ -317,4 +318,38 @@ pbjs.bidderSettings = { 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` +##### 2.10. adjustAlternateBids + +Optionally allow alternate bidder codes originating from a specific bid adapter to fallback to that same adapter's bidCpmAdjustment function. When adjustAlternateBids is set to true, the prioity of which bidCpmAdjustment function to utilize will be as follows based on what is present within the bidderSettings object: + +1. Alternate bidder code bidCpmAdjustment function +2. Adapter bidCpmAdjustment function +3. The standard bidCpmAdjustment function + +{% highlight js %} + +pbjs.bidderSettings = { + standard: { + allowAlternateBidderCodes: false, + bidCpmAdjustment: function(bidCpm, bid){ return bidCpm * .95; }, + [...] + }, + pubmatic: { + allowAlternateBidderCodes: true, + allowedAlternateBidderCodes: ["groupm"], + adjustAlternateBids: true, + bidCpmAdjustment: function(bidCpm, bid){ return bidCpm * .85; }, + [...] + }, + appnexus: { + allowAlternateBidderCodes: true, + allowedAlternateBidderCodes: ["*"], + bidCpmAdjustment: function(bidCpm, bid){ return bidCpm * .90; }, + [...] + } +} +{% endhighlight %} + +In the above example, if PubMatic were to return the "groupm" bidder code then the bidCpmAdjustment function under `pubmatic` would be used instead of what is available under `standard`. +
From 84ed532d5b59bc193b3bc9ff9cf94f90ea173fed Mon Sep 17 00:00:00 2001 From: franfrvr <130403896+franfrvr@users.noreply.github.com> Date: Mon, 15 May 2023 05:57:18 +0100 Subject: [PATCH 141/564] New Adapter: FRVR Ad Network (#4515) * New Adapter: FRVR Ad Network * New Adapter: FRVR Ad Network email contact * New Adapter: FRVR Ad Network feedback --- dev-docs/bidders/frvradn.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 dev-docs/bidders/frvradn.md diff --git a/dev-docs/bidders/frvradn.md b/dev-docs/bidders/frvradn.md new file mode 100644 index 0000000000..8bcaf89f71 --- /dev/null +++ b/dev-docs/bidders/frvradn.md @@ -0,0 +1,32 @@ +--- +layout: bidder +title: FRVR Ad Network +description: FRVR Ad Network Prebid Bidder Adapter +biddercode: frvradn +gdpr_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true +floors_supported: true +media_types: banner, video, native +multiformat_supported: will-bid-on-one +safeframes_ok: true +userIds: all +pbjs: false +pbs: true +pbs_app_supported: true +gvl_id: 1107 +sidebarType: 1 +--- + +### Registration + +FRVR Ad Network Bidding adapter requires setup before beginning. Please contact us at info@frvr.com + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|--------------|-----------|----------| +| `publisher_id` | required | Publisher ID | `'11111'` | `string` | +| `ad_unit_id` | required | Ad Unit ID | `'22222'` | `string` | \ No newline at end of file From 8c648e00760e0bec1edffd230a87398aba8d9f10 Mon Sep 17 00:00:00 2001 From: Parth Shah Date: Mon, 15 May 2023 21:08:51 +0530 Subject: [PATCH 142/564] chore(prebid): update dev docs to include tagId in video example (#4537) --- dev-docs/bidders/deepintent.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/deepintent.md b/dev-docs/bidders/deepintent.md index 8c35e4ccbf..37a8f1c200 100644 --- a/dev-docs/bidders/deepintent.md +++ b/dev-docs/bidders/deepintent.md @@ -110,6 +110,7 @@ var videoAdUnits = [ bids: [{ bidder: 'deepintent', params: { + tagId: "1399", // required publisherId: '32572', // required adSlot: '38519891@300x250' // required video: { From b87804eca280a89876694de3c8a45e40d8801aad Mon Sep 17 00:00:00 2001 From: Piotr Jaworski <109736938+piotrj-rtbh@users.noreply.github.com> Date: Mon, 15 May 2023 19:40:32 +0200 Subject: [PATCH 143/564] Add RTB House Bid Adapter as example implementation of FLEDGE (#4568) * RTBHouse Bid Adapter: adds channel as optional param, updates bidder flags * RTBHouse Bid Adapter: fixed table descriptions * RTBHouse Bid Adapter: minor textual changes on bidder docs * ortb_blocking_supported and description section * ortb_blocking_supported and description section (#1) * ortb_blocking_supported and description section * rephrasing * ORTB blocking examples update * Javascript type for examples added * typo fix * code fix * Prebid Server setup by host companies * RTB House Bidder added as an example implementation interpretResponse with FLEDGE --------- Co-authored-by: Leandro Otani Co-authored-by: rtbh-lotani <83652735+rtbh-lotani@users.noreply.github.com> --- dev-docs/modules/fledgeForGpt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/fledgeForGpt.md b/dev-docs/modules/fledgeForGpt.md index f26d439b15..1fec14e285 100644 --- a/dev-docs/modules/fledgeForGpt.md +++ b/dev-docs/modules/fledgeForGpt.md @@ -147,7 +147,7 @@ for more details. This means that the AuctionConfig objects returned from `inter the request it should be associated with. This may raise the question: why isn't the AuctionConfig object returned as part of the bid? The answer is that it's possible to participate in the FLEDGE auction without returning a contextual bid. -An example of this can be seen in the OpenX OpenRTB bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/openxOrtbBidAdapter.js#L327). +An example of this can be seen in the OpenX OpenRTB bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/openxOrtbBidAdapter.js#L327) or RTB House bid adapter [here](https://github.com/prebid/Prebid.js/blob/8fe7115021fd348d0f3b090da48c40c095078800/modules/rtbhouseBidAdapter.js#LL135C4-L135C4). Other than the addition of the `bidId` field, the `AuctionConfig` object should adhere to the requirements set forth in FLEDGE. The details of creating an `AuctionConfig` object are beyond the scope of this document. From 6411572158ef6513a0975d42871f00a102f3062f Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Mon, 15 May 2023 11:14:24 -0700 Subject: [PATCH 144/564] Documentation for Billing Deferral (#4546) * added documention for billing deferral * some more doc updates * updated triggerBilling example * Update triggerBilling.md * Update bidder-adaptor.md * Update InterstitialAds.md --------- Co-authored-by: bretg --- dev-docs/adunit-reference.md | 3 +- dev-docs/bidder-adaptor.md | 28 ++++++++++++++++++- .../publisher-api-reference/triggerBilling.md | 25 +++++++++++++++++ features/InterstitialAds.md | 9 ++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 dev-docs/publisher-api-reference/triggerBilling.md diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 93751c6562..b147636805 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -40,6 +40,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `ttlBuffer` | Optional | Number | TTL buffer override for this adUnit. See [setConfig({ttlBuffer})](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ttlBuffer) | | `renderer` | Optional | Object | Custom renderer, typically used for [outstream video](/dev-docs/show-outstream-video-ads.html) | | `video` | Optional | Object | Used to link an Ad Unit to the [Video Module][videoModule]. For allowed params see the [adUnit.video reference](#adUnit-video). | +| `deferBilling` | Optional | Boolean | Used by a publisher to flag adUnits as being separately billable. This allows for a publisher to trigger billing manually for winning bids. See [pbjs.triggerBilling](/dev-docs/publisher-api-reference/triggerBilling.html) and [onBidBillable](/dev-docs/bidder-adaptor.html#registering-on-bid-billable) for more info. | @@ -604,7 +605,7 @@ pbjs.addAdUnits({ }); {% endhighlight %} -For more information on Interstitial ads, reference the [Interstitial feature page](/features/InterstitialAds.html). +For more information on Interstitial ads, reference the [Interstitial feature page](/features/InterstitialAds.html). Additionally, to assist with billing optimization and interstitial ads, the triggerBilling and onBidBillable functionality can be utilized. See [pbjs.triggerBilling](/dev-docs/publisher-api-reference/triggerBilling.html) and [onBidBillable](/dev-docs/bidder-adaptor.html#registering-on-bid-billable) for more info. diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 2600288810..f3ba662263 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -8,7 +8,6 @@ sidebarType: 1 --- - # How to Add a New Prebid.js Bidder Adapter {:.no_toc} @@ -609,6 +608,33 @@ Sample data received by this function: } {% endhighlight %} +### Registering on Bid Billable + +The `onBidBillable` function will be called when it deems a bid to be billable. When a bid wins, it is by default also billable. That is, by default, onBidWon and onBidBillable will be called one after the other. However, a publisher can flag adUnits as being separately billable: `pbjs.addAdUnits({deferBilling: true, ...})`. Winning bids for adUnits with `deferBilling` set to true, trigger the onBidWon function but not the onBidBillable function. When appropriate (e.g. an interstitial is displayed), the publisher may then call the public API method, `pbjs.triggerBilling(winningAdIdToBill)` passing the winning bid to be billed, which will trigger onBidBillable. + +Sample data received by this function (same as what is recieved for onBidWon): + +{% highlight js %} +{ + "bidder": "example", + "width": 300, + "height": 250, + "adId": "330a22bdea4cac", + "mediaType": "banner", + "cpm": 0.28 + "ad": "...", + "requestId": "418b37f85e772c", + "adUnitCode": "div-gpt-ad-1460505748561-0", + "size": "350x250", + "adserverTargeting": { + "hb_bidder": "example", + "hb_adid": "330a22bdea4cac", + "hb_pb": "0.20", + "hb_size": "350x250" + } +} +{% endhighlight %} + ### Registering on Set Targeting The `onSetTargeting` function will be called when the adserver targeting has been set for a bid from the adapter. diff --git a/dev-docs/publisher-api-reference/triggerBilling.md b/dev-docs/publisher-api-reference/triggerBilling.md new file mode 100644 index 0000000000..ab44945a09 --- /dev/null +++ b/dev-docs/publisher-api-reference/triggerBilling.md @@ -0,0 +1,25 @@ +--- +layout: api_prebidjs +title: pbjs.triggerBilling +description: +sidebarType: 1 +--- + + +Allows a publisher the option to manually trigger billing for a winning bid (The winning bid to be billed is passed through the function below as an argument). + +{% highlight js %} + +pbjs.triggerBilling(winningAdIdToBill); + +{% endhighlight %} + +{: .alert.alert-warning :} +Note: In order to use `pbjs.triggerBilling`, the following is also required. + +- Any bid adapters a publisher integrates with must include the onBidBillable(bid) method which will be invoked by Prebid.js when it deems a bid to be billable (When a bid wins, it is by default also billable. That is, by default, Prebid.js will invoke onBidWon and onBidBillable one after the other). +- A publisher must flag all adUnits as being separately billable via the deferBilling key: `pbjs.addAdUnits({deferBilling: true, ...})` (Setting deferBilling to true will trigger onBidWon but not onBidBillable). +- When appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningAdIdToBill)`, which would then trigger onBidBillable. + + +
diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md index 67a68304fe..d943385a16 100644 --- a/features/InterstitialAds.md +++ b/features/InterstitialAds.md @@ -76,6 +76,15 @@ utils.deepAccess(bidRequest.ortb2Imp, 'instl') The assumption is that bid adapters will copy the values to the appropriate protocol location for their endpoint. +## Billing Deferral + +Optimizing when billing occurs for an interstitial ad can sometimes be tricky. The following built-in Prebid.js functionality can help assist with this: +- Bid adapters can provide a method called `onBidBillable(bid)` which will be invoked by Prebid.js when it deems a bid to be billable (Note: A bid adapter must have the onBidBillable method configured for this to work). +- When a bid wins, it is by default also billable. That is, by default, Prebid.js will invoke the bid adapter methods onBidWon and onBidBillable one after the other. +- A publisher can flag individual adUnits as being separately billable with the following configuration: `pbjs.addAdUnits({deferBilling: true, ...})` +- Winning bids for adUnits with deferBilling set to true will trigger a bid adapters onBidWon method but not their onBidBillable method. +- Finally, when appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningAdIdToBill)` with the winning bid to be billed, which would trigger a bid adapters onBidBillable method. + ## Related Topics - The [AdUnit Reference](/dev-docs/adunit-reference.html) From 0087ff0e4bbf73a89982a921e39889a3cc47cba4 Mon Sep 17 00:00:00 2001 From: Volodymyr Pavlov <48243894+grakholsky@users.noreply.github.com> Date: Mon, 15 May 2023 21:21:01 +0300 Subject: [PATCH 145/564] adtrgtme: update adapter params (#4531) * adtrgtme: add bid param site_id * adtrgtme: update bid param example site_id --- dev-docs/bidders/adtrgtme.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dev-docs/bidders/adtrgtme.md b/dev-docs/bidders/adtrgtme.md index c0af0853a9..e6d969d59a 100644 --- a/dev-docs/bidders/adtrgtme.md +++ b/dev-docs/bidders/adtrgtme.md @@ -24,3 +24,11 @@ sidebarType: 1 ### Note: The Adtrgtme bidding adapter requires setup before beginning. Please contact us at info@adtarget.me + +### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example | Type | +|-----------|----------|-------------|--------------|----------| +| `site_id` | required | Site ID | `1234567890` | `uint64` | \ No newline at end of file From 6371e353b533b091eafc8d1b14486314178b1dc1 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Mon, 15 May 2023 13:45:01 -0700 Subject: [PATCH 146/564] fix for defer billing docs (#4570) --- dev-docs/bidder-adaptor.md | 2 +- dev-docs/publisher-api-reference/triggerBilling.md | 4 ++-- features/InterstitialAds.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index f3ba662263..1f1ea8a295 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -610,7 +610,7 @@ Sample data received by this function: ### Registering on Bid Billable -The `onBidBillable` function will be called when it deems a bid to be billable. When a bid wins, it is by default also billable. That is, by default, onBidWon and onBidBillable will be called one after the other. However, a publisher can flag adUnits as being separately billable: `pbjs.addAdUnits({deferBilling: true, ...})`. Winning bids for adUnits with `deferBilling` set to true, trigger the onBidWon function but not the onBidBillable function. When appropriate (e.g. an interstitial is displayed), the publisher may then call the public API method, `pbjs.triggerBilling(winningAdIdToBill)` passing the winning bid to be billed, which will trigger onBidBillable. +The `onBidBillable` function will be called when it deems a bid to be billable. When a bid wins, it is by default also billable. That is, by default, onBidWon and onBidBillable will be called one after the other. However, a publisher can flag adUnits as being separately billable: `pbjs.addAdUnits({deferBilling: true, ...})`. Winning bids for adUnits with `deferBilling` set to true, trigger the onBidWon function but not the onBidBillable function. When appropriate (e.g. an interstitial is displayed), the publisher may then call the public API method, `pbjs.triggerBilling(winningBidObjectToBill)` passing the winning bid to be billed, which will trigger onBidBillable. Sample data received by this function (same as what is recieved for onBidWon): diff --git a/dev-docs/publisher-api-reference/triggerBilling.md b/dev-docs/publisher-api-reference/triggerBilling.md index ab44945a09..f6e96bd0f1 100644 --- a/dev-docs/publisher-api-reference/triggerBilling.md +++ b/dev-docs/publisher-api-reference/triggerBilling.md @@ -10,7 +10,7 @@ Allows a publisher the option to manually trigger billing for a winning bid (The {% highlight js %} -pbjs.triggerBilling(winningAdIdToBill); +pbjs.triggerBilling(winningBidObjectToBill); {% endhighlight %} @@ -19,7 +19,7 @@ Note: In order to use `pbjs.triggerBilling`, the following is also required. - Any bid adapters a publisher integrates with must include the onBidBillable(bid) method which will be invoked by Prebid.js when it deems a bid to be billable (When a bid wins, it is by default also billable. That is, by default, Prebid.js will invoke onBidWon and onBidBillable one after the other). - A publisher must flag all adUnits as being separately billable via the deferBilling key: `pbjs.addAdUnits({deferBilling: true, ...})` (Setting deferBilling to true will trigger onBidWon but not onBidBillable). -- When appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningAdIdToBill)`, which would then trigger onBidBillable. +- When appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningBidObjectToBill)`, which would then trigger onBidBillable.
diff --git a/features/InterstitialAds.md b/features/InterstitialAds.md index d943385a16..e8766372f8 100644 --- a/features/InterstitialAds.md +++ b/features/InterstitialAds.md @@ -83,7 +83,7 @@ Optimizing when billing occurs for an interstitial ad can sometimes be tricky. - When a bid wins, it is by default also billable. That is, by default, Prebid.js will invoke the bid adapter methods onBidWon and onBidBillable one after the other. - A publisher can flag individual adUnits as being separately billable with the following configuration: `pbjs.addAdUnits({deferBilling: true, ...})` - Winning bids for adUnits with deferBilling set to true will trigger a bid adapters onBidWon method but not their onBidBillable method. -- Finally, when appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningAdIdToBill)` with the winning bid to be billed, which would trigger a bid adapters onBidBillable method. +- Finally, when appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningBidObjectToBill)` with the winning bid to be billed, which would trigger a bid adapters onBidBillable method. ## Related Topics From 97b9e087117c17c23197fe1acc920b94bb809616 Mon Sep 17 00:00:00 2001 From: Patrick Loughrey Date: Mon, 15 May 2023 16:45:37 -0400 Subject: [PATCH 147/564] Triplelift Bidder Docs: Clarifying Native Support (#4569) * TL-34447 Add GPP Support to Prebid.org * TL-27059: Added pDMP documentation * Update triplelift.md * Triplelift: Update video params * Triplelift: Clarifying native documentation * Triplelift: Clarifying native documentation --------- Co-authored-by: bretg --- dev-docs/bidders/triplelift_native.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/triplelift_native.md b/dev-docs/bidders/triplelift_native.md index cb2e77f118..4085b6e4bd 100644 --- a/dev-docs/bidders/triplelift_native.md +++ b/dev-docs/bidders/triplelift_native.md @@ -14,7 +14,7 @@ userIds: criteo, identityLink, unifiedId prebid_member: true safeframes_ok: true deals_supported: true -pbjs: true +pbjs: false pbs: true pbs_app_supported: true fpd_supported: true @@ -23,9 +23,10 @@ sidebarType: 1 --- {: .alert.alert-info :} -The Triplelift Prebid Server bidding adapter and user sync endpoint require setup before beginning. Please contact us at prebid@triplelift.com. +This is a Prebid Server adapter for running component native only. For the standard Prebid JS Triplelift bid adapter, see the "Triplelift" bidder. If you are interested in running component native via Prebid JS, please contact us at prebid@triplelift.com. -This is a Prebid Server adapter for running component native only. For the standard Prebid JS Triplelift bid adapter, see the "Triplelift" bidder. +{: .alert.alert-info :} +The Triplelift Prebid Server bidding adapter and user sync endpoint require setup before beginning. Please contact us at prebid@triplelift.com. ### Table of Contents From 063deed22b69349aaab79e0497b525b162d75aea Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 15 May 2023 17:44:05 -0400 Subject: [PATCH 148/564] mobile fixes (#4572) --- _data/sidebar.yml | 6 +++--- _layouts/home.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 7b85c62d59..0bba0c027e 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -761,7 +761,7 @@ subgroup: 2 - sbSecId: 2 - title: Prebid Utilities + title: Prebid Utility Functions link: /prebid-mobile/pbm-api/ios/pbm-util-ios.html isHeader: 0 isSectionHeader: 0 @@ -778,7 +778,7 @@ subgroup: 3 - sbSecId: 2 - title: Code Integration + title: SDK Integration link: /prebid-mobile/pbm-api/android/code-integration-android.html isHeader: 0 isSectionHeader: 0 @@ -786,7 +786,7 @@ subgroup: 3 - sbSecId: 2 - title: GAM Original API + title: GAM Original Integration link: /prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html isHeader: 0 isSectionHeader: 0 diff --git a/_layouts/home.html b/_layouts/home.html index fec6c2de1b..19af7069e8 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -40,7 +40,7 @@

Prebid Documentation

Prebid Mobile SDK

Lightweight SDK enabling app publishers to move beyond the waterfall

View Docs -

Download Mobile SDK

+

Download Mobile SDK

From 6aa84b8193e8d98c8d804cc8598bbec9096e137a Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 16 May 2023 12:45:12 -0400 Subject: [PATCH 149/564] disabling openxoutstream from download (#4577) --- dev-docs/bidders/openxoutstream.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dev-docs/bidders/openxoutstream.md b/dev-docs/bidders/openxoutstream.md index e5a304ac6d..7602e7ddfd 100644 --- a/dev-docs/bidders/openxoutstream.md +++ b/dev-docs/bidders/openxoutstream.md @@ -9,8 +9,11 @@ prebid_member: true coppa_supported: true gvl_id: 69 sidebarType: 1 +enable_download : false --- +{: .alert.alert-warning :} +Deprecated adapter ### Bid Params From f1b618d12b1c41e9ca5055136d57cd4857f429c6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 16 May 2023 18:43:46 -0700 Subject: [PATCH 150/564] document new plcmt field (#4550) * document new plcmt field * Update dev-docs/adunit-reference.md Co-authored-by: Muki Seiler --------- Co-authored-by: Muki Seiler --- dev-docs/adunit-reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index b147636805..88213cc124 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -104,6 +104,7 @@ See [Prebid Native Implementation](/prebid/native-implementation.html) for detai | `context` | Recommended | String | The video context, either `'instream'`, `'outstream'`, or `'adpod'` (for long-form videos). Example: `context: 'outstream'`. Defaults to 'instream'. | | `useCacheKey` | Optional | Boolean | Defaults to `false`. While context `'instream'` always will return an vastUrl in bidResponse, `'outstream'` will not. Setting this `true` will use cache url defined in global options also for outstream responses. | | `placement` | Recommended | Integer | 1=in-stream, 2=in-banner, 3=in-article, 4=in-feed, 5=interstitial/floating. **Highly recommended** because some bidders require more than context=outstream. | +| `plcmt` | Recommended | Integer | 1=in-stream, 2=accompanying content, 3=interstitial, 4=no content/standalone. **Highly recommended** to comply with new IAB video specifications. See [AdCOM v1 spec](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md#list_plcmtsubtypesvideo) | | `playerSize` | Optional | Array[Integer,Integer] | The size (width, height) of the video player on the page, in pixels. Example: `playerSize: [640, 480]` | | `api` | Recommended | Array[Integer] | List of supported API frameworks for this impression. If an API is not explicitly listed, it is assumed not to be supported. For list, see [OpenRTB 2.5 spec][openRTB]. If your video player or video ads SDK supports [Open Measurement][OpenMeasurement], **recommended** to set `7` for OMID-1| | `mimes` | Recommended | Array[String] | Content MIME types supported, e.g., `"video/x-ms-wmv"`, `"video/mp4"`. **Required by OpenRTB when using [Prebid Server][pbServer]**. | From 11f9477a77429a228a5c20c9c430a4c1a4967319 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Wed, 17 May 2023 06:58:49 -0700 Subject: [PATCH 151/564] Added code example for how to use pbjs.triggerBilling (#4573) * fix for defer billing docs * added defer billing coding example to show usage * copy update * updated docs for pbjs.triggerBilling method --- .../publisher-api-reference/triggerBilling.md | 70 ++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/dev-docs/publisher-api-reference/triggerBilling.md b/dev-docs/publisher-api-reference/triggerBilling.md index f6e96bd0f1..bb84d585a9 100644 --- a/dev-docs/publisher-api-reference/triggerBilling.md +++ b/dev-docs/publisher-api-reference/triggerBilling.md @@ -6,20 +6,74 @@ sidebarType: 1 --- -Allows a publisher the option to manually trigger billing for a winning bid (The winning bid to be billed is passed through the function below as an argument). - -{% highlight js %} - -pbjs.triggerBilling(winningBidObjectToBill); - -{% endhighlight %} +Allows a publisher the option to manually trigger billing for a winning bid or bids when ready to do so. {: .alert.alert-warning :} -Note: In order to use `pbjs.triggerBilling`, the following is also required. +Note: In order to use `pbjs.triggerBilling`, see the following bullet points below: - Any bid adapters a publisher integrates with must include the onBidBillable(bid) method which will be invoked by Prebid.js when it deems a bid to be billable (When a bid wins, it is by default also billable. That is, by default, Prebid.js will invoke onBidWon and onBidBillable one after the other). - A publisher must flag all adUnits as being separately billable via the deferBilling key: `pbjs.addAdUnits({deferBilling: true, ...})` (Setting deferBilling to true will trigger onBidWon but not onBidBillable). - When appropriate (e.g. an interstitial is displayed), the publisher may call `pbjs.triggerBilling(winningBidObjectToBill)`, which would then trigger onBidBillable. +See below for an example of how triggerBilling can be used: + +{: .alert.alert-warning :} +Note: The logic to decide when to invoke `pbjs.triggerBilling` is open-ended. One common use case could be to listen for an "on view" event emitted from your ad server.

For instance, the example below listens for GPT's "impressionViewable" event to determine if a deferred ad unit has become visible and is therefore ready for billing. The utilized approach to determine when to invoke `pbjs.triggerBilling` should be customized to your specific needs (For more on GPT's "impressionViewable" event, see: [https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent](https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent)).

Additionally, the example below takes into account the possibility of multiple deferred ad units being present on a page that could potentially invoke the triggerBilling function (see the "deferredAdUnitIds" variable in the snippet below). The amount of deferred ad units needed on a page are dependent on your needs and could vary. + +{% highlight js %} +... + +var adUnits = [ + { + code: "deferred-ad-element-id-1", + deferBilling: true, // decide whether an ad unit should be deferred + ... + }, + { + code: "deferred-ad-element-id-2", + deferBilling: true, // decide whether an ad unit should be deferred + ... + } +]; + +pbjs.que.push(function () { // standard prebid configuration + pbjs.addAdUnits(adUnits); + pbjs.requestBids({ + bidsBackHandler: sendAdserverRequest, + timeout: 1000, + }); +}); + +function sendAdserverRequest(bids, timedOut, auctionId) { + let winningBidsWithDeferredAdUnits = []; // bids associated with deferred ad units that win the Prebid auction will be added to this array (there could be one or many winning bids) + let deferredAdUnitIds = ['deferred-ad-element-id-1', 'deferred-ad-element-id-2']; // enter the ad unit ids you would like to defer billing for (there could be one or many deferred ad unit ids) + + deferredAdUnitIds.forEach(deferredAdUnitId => { + if (bids[deferredAdUnitId]) { + // confirm each deferred ad unit came back with the bid responses + pbjs.onEvent("bidWon", (bid) => { + if (bid.adUnitCode === deferredAdUnitId) { + // confirm bid for deferred ad unit has won + winningBidsWithDeferredAdUnits.push(bid); + } + }); + } + }); + + // next, run some custom logic to detect if a publisher is ready to trigger billing (ex: the ad unit became visible). + // note: the following code block inside of the "impressionViewable" event listener is just one example of how to trigger billing for deferred ad units by utilizing GPT's "impressionViewable" event. + googletag.pubads().addEventListener("impressionViewable", (event) => { + const adSlotId = event.slot.getSlotElementId(); + winningBidsWithDeferredAdUnits.find(bid => { + if (bid.adUnitCode === adSlotId) { // confirm if the ad slot that became viewable was a deferred ad slot + pbjs.triggerBilling(bid); + } + }); + }); +} + +... + +{% endhighlight %}
From b02f6118f567732eab567524f688bb9fd7893e4c Mon Sep 17 00:00:00 2001 From: Gen Whitt <107279666+genwhittTTD@users.noreply.github.com> Date: Wed, 17 May 2023 18:47:15 -0400 Subject: [PATCH 152/564] Edits to the Unified ID 2.0 page. (#4576) --- .../modules/userid-submodules/unified2.md | 94 +++++++++++-------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/dev-docs/modules/userid-submodules/unified2.md b/dev-docs/modules/userid-submodules/unified2.md index cc410d5b56..058e5b1b0e 100644 --- a/dev-docs/modules/userid-submodules/unified2.md +++ b/dev-docs/modules/userid-submodules/unified2.md @@ -5,82 +5,96 @@ description: Unified ID 2.0 User ID sub-module useridmodule: uid2IdSystem --- +Unified ID 2.0 (UID2) is an open-source identity solution built for the open internet. It leverages encrypted email and phone number data to provide a privacy-conscious, secure, and accurate identity standard for the entire digital advertising ecosystem. -Unified ID 2 (often just called 'UID2') is an email based id solution that is owned and operated by the prebid community. Unified ID 2 relies on user consent before an id can be added to the bid stream. Consent can be gathered by SSO providers who have integrated against the UID2 framework, or Publishers own login & consent mechaninism. +UID2 relies on user consent before an ID can be added to the bid stream. Consent can be gathered by SSO providers who have integrated against the UID2 framework, or through a publisher's own login and consent mechanism. -Add it to your Prebid.js package with: +To add UID2 to your Prebid.js package, run the following: {: .alert.alert-info :} gulp build --modules=uid2IdSystem -## Unified ID Registration +## Unified ID 2.0 Registration -You can set up Unified ID 2 in one of these ways: +You can set up Unified ID 2.0 in one of these ways: -- Include the module to your pb.js wrapper. You will need to apply for Publisher access to the UID2 system at [The Trade Desk's UID2 portal](https://www.thetradedesk.com/us/about-us/industry-initiatives/unified-id-solution-2-0#request-access). Using this option, you will need to generate UID2 tokens server-side (there is currently no client-side-only flow without using an SSO provider). You provide these tokens to Prebid.js either using a cookie or directly in configuration. -- Utilize a [managed services](https://prebid.org/product-suite/managed-services/) company who can do this for you. +- Include the module to your pb.js wrapper. You will need to apply for publisher access [on the UID2 website](https://unifiedid.com/request-access). Using this option, you must generate UID2 tokens server-side. There is currently no flow for client-side only, unless you use an SSO provider. You provide these tokens to Prebid.js either by using a cookie or directly in the configuration. +- Use a [managed services](https://prebid.org/product-suite/managed-services/) company that can do this for you. -Each publisher’s privacy policy should take UnifiedId 2 into account. +Each publisher’s privacy policy should take UnifiedID 2.0 into account. -## Unified ID 2 Tokens +## Unified ID 2.0 Tokens -UID2 tokens are generated on the server-side by making an API call to a UID2 operator using details provided when you receive UID2 Publisher access. This API will return a JSON data structure with multiple values, including an advertising token and a refresh token. For full functionality, the entire object should be provided, either JSON-encoded as a server-set cookie or by being included in the configuration object (see examples). +UID2 tokens are generated on the server side by making an API call to a UID2 operator using details provided when you receive UID2 publisher access. This API returns a JSON data structure with multiple values, including an advertising token and a refresh token. For full functionality, provide the entire object in one of these ways: +- JSON-encoded as a cookie. +- Included in the configuration object. -Sample token response object: +For examples, see [Unified ID 2.0 Examples](#unified-id-20-examples). -`{`
  `"advertising_token": "...",`
  `"refresh_token": "...",`
  `"identity_expires": 1633643601000,`
  `"refresh_from": 1633643001000,`
  `"refresh_expires": 1636322000000,`
  `"refresh_response_key": "wR5t6HKMfJ2r4J7fEGX9Gw=="`
`}` +The following sample is fictitious, but shows what the token response object looks like: -When this full data structure is provided, the module will automatically refresh the token periodically, as long as the refresh token hasn't expired. +```javascript +{ + "advertising_token": "...", + "refresh_token": "...", + "identity_expires": 1633643601000, + "refresh_from": 1633643001000, + "refresh_expires": 1636322000000, + "refresh_response_key": "wR5t6HKMfJ2r4J7fEGX9Gw==" +} +``` -## Unified ID 2 Legacy Mode +When this full data structure is provided, the module automatically refreshes the token periodically, as long as the refresh token hasn't expired. -There is a legacy mode where either the value of the advertising token can be provided directly (see the `value` param in the *Configuration* section), or via a legacy cookie. In this mode, no attempt is made to automatically refresh the token. +## Unified ID 2.0 Server-Only Mode -To use the cookie-based legacy mode, set a cookie named `__uid2_advertising_token` to the value of the advertising token only. For example: +There is a server-only mode where the value of the advertising token can be provided either directly (see the `value` parameter in the [Unified ID 2.0 Configuration](#unified-id-20-configuration) section) or via a cookie. In this mode, no attempt is made to automatically refresh the token. + +To use the cookie-based server-only mode, set a cookie named `__uid2_advertising_token` to the value of the advertising token only, as shown in this fictitious example: `__uid2_advertising_token=eb33b0cb-8d35-4722-b9c0-1a31d4064888` -## Unified ID 2 Configuration +## Unified ID 2.0 Configuration -The below parameters apply only to the UID 2.0 User ID Module integration. +The following parameters apply only to the Unified ID 2.0 module integration. {: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | -| name | Required | String | ID value for the UID20 module - `"uid2"` | `"uid2"` | -| params.uid2Token | Optional | Object | The initial UID2 token. This should be `body` element of the decrypted response from a call to the `/token/generate` or `/token/refresh` endpoint. | See the sample token above. | -| params.uid2ServerCookie | Optional | String | The name of a cookie which holds the initial UID2 token, set by the server. The cookie should contain JSON in the same format as the alternative uid2Token param. **If uid2Token is supplied, this param is ignored.** | See the sample token above. | +| name | Required | String | ID value for the Unified ID 2.0 module - `"uid2"` | `"uid2"` | +| params.uid2Token | Optional | Object | The initial UID2 token. This should be the `body` element of the decrypted response from a call to the `/token/generate` or `/token/refresh` endpoint. | See the sample token above. | +| params.uid2ServerCookie | Optional | String | The name of a cookie that holds the initial UID2 token, set by the server. The cookie should contain JSON in the same format as the alternative uid2Token param. **If uid2Token is supplied, this param is ignored.** | See the sample token above. | | params.uid2ApiBase | Optional | String | Overrides the default UID2 API endpoint. | `https://prod.uidapi.com` _(default)_ | -| value | Not recommended | Object | Used only if the page has a separate mechanism for storing the UID 2.O ID. The value is an object containing the values to be sent to the adapters. In this scenario, no URL is called and nothing is added to local storage. Tokens will **not** be automatically refreshed. | `{"uid2": { "id": "eb33b0cb-8d35-4722-b9c0-1a31d4064888"}}` | +| value | Not recommended | Object | Used only if the page has a separate mechanism for storing the UID 2.0 ID. The value is an object containing the values to be sent to the adapters. In this scenario, no URL is called and nothing is added to local storage, and the tokens are **not** automatically refreshed. | `{"uid2": { "id": "eb33b0cb-8d35-4722-b9c0-1a31d4064888"}}` | -## Unified ID 2 Example +## Unified ID 2.0 Examples -Publisher has set a server-side cookie called `uid2_identity` containing the UID2 token generation response object: +In the following example, the publisher has set a cookie called `uid2_identity` containing the UID2 token generation response object: {% highlight javascript %} pbjs.setConfig({ - userSync: { - userIds: [{ - name: 'uid2', - params: { - uid2ServerCookie: 'uid2_identity' - } - }] - } + userSync: { + userIds: [{ + name: 'uid2', + params: { + uid2ServerCookie: 'uid2_identity' + } + }] + } }); {% endhighlight %} -Publisher has retrieved a server-generated UID2 response and it is currently stored in the JavaScript variable `uid2Identity`: +In the following example, the publisher has retrieved a server-generated UID2 response, and it is currently stored in the JavaScript variable `uid2Identity`: {% highlight javascript %} pbjs.setConfig({ - userSync: { - userIds: [{ - name: 'uid2', - params: { - uid2Token: uid2Identity - } - }] - } + userSync: { + userIds: [{ + name: 'uid2', + params: { + uid2Token: uid2Identity + } + }] + } }); {% endhighlight %} From 7d961c50c26c4bba686c8e50697631fdc6565772 Mon Sep 17 00:00:00 2001 From: Ilia Medvedev Date: Thu, 18 May 2023 05:48:30 +0600 Subject: [PATCH 153/564] New adapter: Adsyield (#4533) --- dev-docs/bidders/adsyield.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/adsyield.md b/dev-docs/bidders/adsyield.md index d4264a969f..645ea7dc56 100644 --- a/dev-docs/bidders/adsyield.md +++ b/dev-docs/bidders/adsyield.md @@ -3,6 +3,7 @@ layout: bidder title: AdsYield description: Prebid AdsYield Bidder Adaptor pbjs: true +pbs: true biddercode: adsyield aliasCode: admixer media_types: video @@ -14,6 +15,13 @@ sidebarType: 1 ### 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` | + +| 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` | +| `host` | required | Ad network's RTB host | `'open-adsyield.com'` | `string` | +| `publisherId` | required | Publisher ID | `12345` | `integer` | + +Adsyield server-side Prebid Server adapter requires only `publisherId` and `host` parameters. But Adsyield client-side Prebid.js adapter requires only `zone`. + +Adsyield server-side Prebid Server adapter supports only `banner`, `video`, `audio`, `native` media types. But Adsyield client-side Prebid.js adapter supports only `video` media types, doesn't support `banner`, `audio` and `native`. From 0b0295116104007c1efbb6bb0a5c5a815d87a881 Mon Sep 17 00:00:00 2001 From: prebid-sp <131664583+prebid-sp@users.noreply.github.com> Date: Thu, 18 May 2023 05:24:18 +0530 Subject: [PATCH 154/564] added silverpush adapter docs (#4510) * added silverpush adapter docs * Remove
from table * added table classes for video params doc --------- Co-authored-by: Amit Jangra Co-authored-by: Muki Seiler --- dev-docs/bidders/silverpush.md | 133 +++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 dev-docs/bidders/silverpush.md diff --git a/dev-docs/bidders/silverpush.md b/dev-docs/bidders/silverpush.md new file mode 100644 index 0000000000..51458be1d1 --- /dev/null +++ b/dev-docs/bidders/silverpush.md @@ -0,0 +1,133 @@ +--- +layout: bidder +title: Silverpush +description: Prebid Silverpush Bidder Adaptor +pbjs: true +pbs: true +biddercode: silverpush +media_types: banner, video +schain_supported: true +gdpr_supported: true +usp_supported: true +coppa_supported: true +gpp_supported: true +floors_supported: true +userIds: +prebid_member: false +fpd_supported: false +multiformat_supported: will-bid-on-one +sidebarType: 1 +--- + +### Registration +The Example Bidding adapter requires setup before beginning. Please contact us at prebid@silverpush.co. + + +### Bid Parameters + +#### Banner + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| -------------- | ----------- | ------------------------------------------ | ------------- | ------------ | +| `publisherId` | required | Publisher id provided by silverpush | "123456" | String | +| `bidFloor` | optional | Minimum price in USD. bidFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50.
| 1.50 | Number | + + +#### mediaTypes.banner + +The following banner parameters are supported here so publishers may fully declare their banner inventory: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| --------- | ------------| ----------------------------------------------------------------- | --------- | --------- | +| sizes | required | Avalaible sizes supported for banner ad unit | [ [300, 250], [300, 600] ] | [[Integer, Integer], [Integer, Integer]] | + + +### AdUnit Format for Banner +```javascript +const adUnits = [{ + code: 'div-1', + mediaTypes: { + banner: { + sizes: [ [300, 250], [300,600] ] + } + }, + bids: [{ + bidder: 'silverpush', + params: { + publisherId: "123456", + bidFloor: 1.2 + } + }] +}]; +``` + +#### Video + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| ---- | ----- | ----------- | ------- | ---- | +| `publisherId` | required | Publisher id provided by silverpush | "123456" | String | +| `bidFloor` | optional | Minimum price in USD. bidFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50. | 1.50 | Number | + +#### mediaTypes.video + + +The following video parameters are supported here so publishers may fully declare their video inventory: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +| --------- | ------------| ----------------------------------------------------------------- | --------- | --------- | +| context | required | instream or outstream |"outstream" | string | +| playerSize | required | Avalaible sizes supported for video ad unit. | [300, 250] | [Integer, Integer] | +| mimes | required | List of content MIME types supported by the player. | ["video/mp4"]| [String]| +| protocols | required | Supported video bid response protocol values. | [2,3,5,6] | [integers]| +| api | required | Supported API framework values. | [2] | [integers] | +| maxduration | required | Maximum video ad duration in seconds. | 30 | Integer | +| minduration | required | Minimum video ad duration in seconds. | 6 | Integer | +| startdelay | required | Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements. | 0 | Integer | +| placement | required | Placement type for the impression. | 1 | Integer | +| minbitrate | optional | Minimum bit rate in Kbps. | 300 | Integer | +| maxbitrate | optional | Maximum bit rate in Kbps. | 9600 | Integer | +| playbackmethod | optional | Playback methods that may be in use. Only one method is typically used in practice. | [2]| [Integers] | +| linearity | optional | OpenRTB2 linearity. in-strea,overlay... | 1 | Integer | +| skip | optional | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes . | 1 | Integer | +| skipafter | optional | Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable. | 5 | Integer | +| delivery | optional | OpenRTB2 delivery. Supported delivery methods (e.g., streaming, progressive). If none specified, assume all are supported. | 1 | [Integer] | + + + + +### AdUnit Format for Video +```javascript +var videoAdUnits = [{ + code: 'video-1', + mediaTypes: { + video: { + api: [1, 2, 4, 6], + mimes: ['video/mp4'], + context: 'instream', // or 'outstream' + playerSize: [ 640, 480 ], + protocols: [4,5,6,7], + placement: 1, + minduration: 0, + maxduration: 60, + startdelay: 0 + } + }, + bids: [ + { + bidder: 'silverpush', + params: { + publisherId: "123456", + bidfloor: 2.5 + } + } + ] +}] +``` + + +## Additional Details +For any queries, reach us at prebid@silverpush.co. \ No newline at end of file From a921b0d9d42b407eba61845f4d1dfcb5cc990e49 Mon Sep 17 00:00:00 2001 From: Viktor Dreiling <34981284+3link@users.noreply.github.com> Date: Thu, 18 May 2023 15:26:00 +0200 Subject: [PATCH 155/564] Update liveintent.md (#4580) Co-authored-by: Viktor Dreiling --- dev-docs/modules/userid-submodules/liveintent.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dev-docs/modules/userid-submodules/liveintent.md b/dev-docs/modules/userid-submodules/liveintent.md index 8f0cc8dbdf..16f79fd649 100644 --- a/dev-docs/modules/userid-submodules/liveintent.md +++ b/dev-docs/modules/userid-submodules/liveintent.md @@ -123,6 +123,7 @@ NOTE: For optimal performance, the LiveIntent ID module should be called at ever | name | Required | String | The name of this module. | `'liveIntentId'` | | params | Required | Object | Container of all module params. || | params.publisherId |Optional| String | The unique identifier for each publisher (for existing LiveIntent customers)|`'12432415'`| +| params.distributorId |Optional| String | The unique identifier for each distributor (for existing LiveIntent customers). Will be ignored if `params.liCollectConfig.appId` is provided. |`'did-0123'`| | params.ajaxTimeout |Optional| Number |This configuration parameter defines the maximum duration of a call to the IdentityResolution endpoint. By default, 1000 milliseconds.|`1000`| | params.partner | Optional| String |The name of the partner whose data will be returned in the response.|`'prebid'`| | params.identifiersToResolve |Optional| Array[String] |Used to send additional identifiers in the request for LiveIntent to resolve against the LiveIntent ID.|`['my-id']`| @@ -188,6 +189,7 @@ pbjs.setConfig({ name: "liveIntentId", params: { publisherId: "9896876", + distributorId: "did-0123", identifiersToResolve: ["my-own-cookie"], url: "https://publisher.liveintent.com/idex", partner: "prebid", @@ -208,3 +210,5 @@ pbjs.setConfig({ } }) ``` + +Please note: the distributorId will be ignored when liCollectConfig.appId is present. From bc82c144e0c9c52bfac2338f0884cdf003b136b8 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 18 May 2023 10:32:28 -0400 Subject: [PATCH 156/564] Second batch of training videos (#4571) * training videos 2.1-2.3 * fixed link * fix space * add link * making sidebar groupings consistent --------- Co-authored-by: Chris Huie --- _data/sidebar.yml | 24 +++- identity/prebid-identity-video.md | 54 +++++++++ identity/prebid-identity.md | 11 +- overview/all-videos.md | 13 +- overview/intro-video.md | 2 +- prebid-mobile/prebid-mobile-video.md | 2 +- .../overview/prebid-server-overview-video.md | 2 +- prebid/prebidjs-components-video.md | 111 ++++++++++++++++++ prebid/prebidjs-flow-video.md | 102 ++++++++++++++++ prebid/prebidjs-video.md | 8 +- 10 files changed, 312 insertions(+), 17 deletions(-) create mode 100644 identity/prebid-identity-video.md create mode 100644 prebid/prebidjs-components-video.md create mode 100644 prebid/prebidjs-flow-video.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 0bba0c027e..ee8cb8b255 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -136,7 +136,7 @@ sbCollapseId: prebidjs - sbSecId: 1 - title: Developer Quick Start + title: General link: isHeader: 1 headerId: devquickstart @@ -161,6 +161,22 @@ sectionTitle: subgroup: 0 +- sbSecId: 1 + title: Basic Impression Flow + link: /prebid/prebidjs-flow-video.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 1 + title: Prebid.js Components + link: /prebid/prebidjs-components-video.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + - sbSecId: 1 title: Consent Management Best Practices link: /dev-docs/cmp-best-practices.html @@ -862,7 +878,7 @@ sbCollapseId: ad-ops - sbSecId: 3 - title: Overview + title: General link: isHeader: 1 headerId: adopsoverview @@ -1175,7 +1191,7 @@ sbCollapseId: prebid-video - sbSecId: 4 - title: Overview + title: General link: isHeader: 1 headerId: vidoverview @@ -1386,7 +1402,7 @@ sbCollapseId: prebid-server - sbSecId: 5 - title: Overview + title: General link: isHeader: 1 headerId: serveroverview diff --git a/identity/prebid-identity-video.md b/identity/prebid-identity-video.md new file mode 100644 index 0000000000..746e338139 --- /dev/null +++ b/identity/prebid-identity-video.md @@ -0,0 +1,54 @@ +--- +layout: page_v2 +title: Video Intro to Prebid Identity Solutions +description: A video overview of Prebid Identity Solutions +sidebarType: 9 +--- + +# A Video Overview of Prebid Identity Solutions + +An explanation of Prebid’s user identity and consent management tools. + +
+ +Further Content: +- [User Identity Overview](/identity/prebid-identity.html) +- [SharedID](/identity/sharedid.html) +- [Prebid.js Modules](/dev-docs/modules/) +- [All Videos](/overview/all-videos.html) + +Related Videos: +- [Introduction to Prebid.js](/prebid/prebidjs-video.html) +- [Components of Prebid.js](/prebid/prebidjs-components-video.html) + +## Transcript + +### Introduction + +Prebid offers a powerful set of tools that help publishers to integrate with user identity solutions in a way that follows their organization’s privacy strategy. + +Digital media sellers need to have sophisticated practices for handling the data that describes users and audiences. To increase the value of impression opportunities surfaced to buyers, publishers may wish to transmit a pseudonymous user identifier in Prebid.js bid requests. These identifiers are a form of ad request enrichment. They can help increase the value of impression opportunities to buyers by unlocking the buyer’s ability to perform actions like frequency capping and audience targeting. + +At the same time, all members of the digital advertising supply chain have a responsibility to protect the privacy of internet users and to comply with privacy and data laws. Therefore, all sellers must develop an identity and privacy strategy that is rooted in their approach to monetization, user experience, and regulatory compliance. Prebid’s tools can be used to integrate with identity solutions and execute on an identity and privacy strategy. Prebid does not provide legal advice and makes no guarantees about compliance with any law or regulation. + +### Identity Solutions: SharedId and User ID Module + +Sellers using Prebid.js can transmit identity signals using Prebid’s SharedId service or any other major identity solution. SharedId is an open-source identity solution developed and maintained by Prebid. It stores a unique user ID in the publisher’s domain and makes it accessible to Prebid auction bidders. Bidders may then use this identifier for ad targeting, frequency capping, or other purposes. In addition to SharedId, Prebid also supports dozens of other popular identity servies. The benefits and mechanics of each service vary, and it is up to the seller to decide which providers align best with their privacy and identity strategies. + +The Prebid.js User ID Module is used to integrate SharedId and other services into Prebid.js. The providers of identity solutions build submodules that are compatible with the User ID module. The submodules allow the provider’s service to get and set identifiers and expose the identifiers to bidders. + +Publishers have complete control over which user ID submodules are included in their Prebid.js wrappers. Prebid.js also allows publishers to establish controls over user IDs, such as restricting when and how user syncing can occur during the header bidding auction. + +### Privacy Solutions: Consent Modules +Prebid.js also includes tools that allow publishers to execute on their privacy, consent, and regulatory compliance strategies. These tools work in close coordination with the User ID module and Prebid adapters to control whether, when, and how user identifiers are created or shared. + +Collectively, these tools are called Consent Management Modules. They connect to the publisher’s Consent Management Platform, or CMP to make the user’s preferences about data use available to Prebid.js and to Prebid bidders. + +Consent Management modules allow Publishers and bidders to use consent data to decide when to activate user ID modules, whether to allow bidders to perform cookie syncs, and whether or not to serve ads. + +These modules are designed to provide tools related to specific regulations, but do not guarantee compliance with any regulatory requirements. + +### Getting Started + +To learn more about the Prebid User ID Module, SharedID, and Prebid Consent Management Modules, visit docs.prebid.org + diff --git a/identity/prebid-identity.md b/identity/prebid-identity.md index d83d63b126..ade27e9380 100644 --- a/identity/prebid-identity.md +++ b/identity/prebid-identity.md @@ -14,7 +14,16 @@ To do this, Prebid offers a number of identity-related products that encourage a - [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/) + +## Overview + +An explanation of Prebid’s user identity and consent management tools. + +
+ +Further Reading: +- [Transcript of this video overview](/identity/prebid-identity-video.html) +- [Prebid.js Modules](/dev-docs/modules/) ## Prebid.js and Identity diff --git a/overview/all-videos.md b/overview/all-videos.md index 2d299d326f..2a49c4c476 100644 --- a/overview/all-videos.md +++ b/overview/all-videos.md @@ -7,10 +7,13 @@ sidebarType: 0 # Video Overviews -These are the multi-media overviews that Prebid has created covering various aspect of Header Bidding and Prebid. +Multimedia overviews covering various aspect of Header Bidding and Prebid. 1. [Intro to Header Bidding](/overview/intro-to-header-bidding-video.html) - A high-level explanation of what header bidding is, what its benefits are, and how it works. -2. [Intro to Prebid](/overview/intro-video.html) - A high-level introduction to the Prebid community and its products. -3. [Intro to Prebid.js](/prebid/prebidjs-video.html) - A high-level overview of Prebid.js, Prebid’s header bidding product for websites. -4. [Intro to Prebid Mobile](/prebid-mobile/prebid-mobile-video.html) - A high-level overview of Prebid Mobile, Prebid’s header bidding product for iOS and Android applications. -4. [Intro to Prebid Server](/prebid-server/overview/prebid-server-overview-video.html) - A high-level overview of Prebid Server, Prebid’s solution for header bidding in the cloud. +1. [Intro to Prebid.org](/overview/intro-video.html) - A high-level introduction to the Prebid community and its products. +1. [Intro to Prebid.js](/prebid/prebidjs-video.html) - A high-level overview of Prebid.js, Prebid’s header bidding product for websites. +1. [Intro to Prebid Mobile](/prebid-mobile/prebid-mobile-video.html) - A high-level overview of Prebid Mobile, Prebid’s header bidding product for iOS and Android applications. +1. [Intro to Prebid Server](/prebid-server/overview/prebid-server-overview-video.html) - A high-level overview of Prebid Server, Prebid’s solution for header bidding in the cloud. +1. [Identity in Prebid.js](/identity/prebid-identity-video.html) - An explanation of Prebid’s user identity and consent management tools. +1. [Prebid.js Impression Flow](/prebid/prebidjs-flow-video.html) - A step-by-step walkthrough of a typical Prebid.js auction. +1. [Components of Prebid.js](/prebid/prebidjs-components-video.html) - An explanation of Prebid.js’ components and a guide to using Prebid.js reference documentation. diff --git a/overview/intro-video.md b/overview/intro-video.md index df04a35489..e05aeb2a41 100644 --- a/overview/intro-video.md +++ b/overview/intro-video.md @@ -22,7 +22,7 @@ Related Videos: - [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) - [Introduction to Prebid.js](/prebid/prebidjs-video.html) - [Introduction to Prebid Mobile](/prebid-mobile/prebid-mobile-video.html) -- Introduction to Prebid Server (coming soon) +- [Introduction to Prebid Server](/prebid-server/overview/prebid-server-overview-video.html) ## Transcript diff --git a/prebid-mobile/prebid-mobile-video.md b/prebid-mobile/prebid-mobile-video.md index 098d4f84e2..2acd57c45e 100644 --- a/prebid-mobile/prebid-mobile-video.md +++ b/prebid-mobile/prebid-mobile-video.md @@ -18,7 +18,7 @@ Further Content: Related Videos: - [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) -- Introduction to Prebid Server (coming soon) +- [Introduction to Prebid Server](/prebid-server/overview/prebid-server-overview-video.html) ## Transcript diff --git a/prebid-server/overview/prebid-server-overview-video.md b/prebid-server/overview/prebid-server-overview-video.md index 6af75d1834..8d9fa005b7 100644 --- a/prebid-server/overview/prebid-server-overview-video.md +++ b/prebid-server/overview/prebid-server-overview-video.md @@ -16,7 +16,7 @@ Further Content: - [Prebid Server Overview](/prebid-server/overview/prebid-server.html) - [Prebid Membership](https://prebid.org/membership) - [Prebid on Github](https://github.com/prebid) -- [All videos](/overview/all-videos.html) +- [All Videos](/overview/all-videos.html) Related Videos: - [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) diff --git a/prebid/prebidjs-components-video.md b/prebid/prebidjs-components-video.md new file mode 100644 index 0000000000..1cbf56ecdb --- /dev/null +++ b/prebid/prebidjs-components-video.md @@ -0,0 +1,111 @@ +--- +layout: page_v2 +title: Video Intro to Prebid.js Components +description: A video overview of Prebid.js Components +sidebarType: 1 +--- + +# A Video Overview of Prebid.js Components + +An explanation of Prebid.js’ components and a guide to using Prebid.js reference documentation. + +
+ +Further Content: +- [Ad Unit Reference](/dev-docs/adunit-reference.html) +- [Bidder Params Reference](/dev-docs/bidders.html) +- [Modules Overview](/dev-docs/modules/) +- [Analytics Overview](/overview/analytics.html) +- [Prebid.js Download](/download.html) +- [Prebid.js Configuration Reference](/dev-docs/publisher-api-reference/setConfig.html) +- [All videos](/overview/all-videos.html) + +Related Videos +- [Introduction to Prebid.js](/prebid/prebidjs-video.html) +- [Prebid.js Impression Flow](/prebid/prebidjs-flow-video.html) +- [Identity in Prebid.js](/identity/prebid-identity-video.html) + +## Transcript + +### Introduction + +This video will take a tour of Prebid.js. We’ll show you Prebid.js’ basic components and explain how they work together to serve ads. + +The video assumes that you have a basic understanding of what Prebid.js does. For some background, check out our other videos, including the Introduction to Prebid.js, and the Prebid.js Impression Flow, which walks through a Prebid.js auction step-by-step. + +A typical Prebid.js installation includes four basic components: the Prebid.js core, modules, bid adapters, and Ad Units. + +Prebid.js core components are the functional components of Prebid.js that do things like execute the auction. Prebid.js must include these components in order to work properly. + +Modules are optional components that extend Prebid.js’ capabilities. There are many different kinds of modules for purposes like ad request enrichment, analytics, consent management, and more. + +Bid adapters are functional components that allow bidders to be integrated into Prebid.js. Each bidder has its own bid adapter. + +Finally, Ad Units are where ad slots are defined within Prebid.js. They describe the characteristics of ad slots and are used to determine the set of bidders that are allowed to serve on each slot. + +Now we’ll explore modules, bid adapters, and ad units in more detail. As we go, we’ll refer to the relevant sections of the Prebid.js reference documentation, which lives at docs.prebid.org. Check the notes section below this video for links to all of the documentation referred to in the video. + +### Bid Adapters + +We’ll start with bid adapters. + +Bid adapters are plugins that enable Prebid.js to send bid requests to and receive bid responses from bidders. A company that wants to be able to compete in Prebid auctions builds their own bid adapter and contributes it to the Prebid repository + +When the Prebid auction runs, bid adapters construct a bid request into the bidder’s proprietary format. The request can include information from the Ad Unit and from other sources such as consent modules and real time data modules. + +Bid adapters also allow Prebid.js to translate each bidder’s response into a format that Prebid understands. + +### Ad Units + +An Ad Unit represents a single ad slot on a web page, and contains all the information needed for Prebid.js to request bids for the slot. + +Each ad unit has a unique identifier called an ad unit code, and includes two key blocks of information that are configured by the publisher: Media Types and Bids. + +#### Media Types + +Media Types define the ad formats that the ad placement can display, such as banner, native, or video. Within the mediaType configuration, the publisher describes the characteristics of the ad slot. + +For example, the banner ad mediaType allows the publisher to specify the dimensions of the slot, and the video mediaType lets the publisher specify whether the slot is an instream or outstream placement. + +An ad unit can include multiple mediaTypes, which makes the slot a multi-format slot. + +The Ad Unit Reference at docs.prebid.org contains detailed information about Ad Units and Media Types. + +#### Bids + +Bids is an array of bid objects: one for each bidder who is enabled to compete for the ad slot’s impression opportunities. + +To include a bidder in auctions for a given Ad Unit, the publisher adds a bid object for the bidder to the Ad Unit. + +The contents of the bid object are used to control the data that’s sent to bidders in bid requests. Bidders decide which parameters appear in their own bid objects. Common parameters are bidder-specific identifiers of the publisher, site, and ad slot. Publishers work with their bidder partners to configure these parameters. + +The Bidder Params reference is where to look for documentation on how to configure Prebid bidders parameters. + +### Modules + +Next, we’ll discuss Prebid modules, which are optional components that add extra functionality to Prebid.js. Some modules have been built by the core Prebid team, while others have been contributed by Prebid member companies and third-party developers. Modules are always open-source. In some cases, companies will develop a module to help power a Prebid-related paid service. + +There are many types of modules in Prebid. They serve many purposes and can plug into any phase of the Prebid.js auction. For more information on the auction phases, check out the Prebid.js Impression Flow video. Prebid.js Modules page at docs.prebid.org has a list of all of Prebid.js’ modules, including a short description of each one. + +In this video, we’ll focus on a few key categories of modules: + +One category is modules for ad request enrichment, which is the process of adding extra information to bid requests. Ad request enrichment can help publishers improve monetization by helping bidders evaluate impression opportunities more effectively. Enrichment data is a broad category, and can include user identifiers, seller-defined audiences, contextual targeting data, viewability signals, and more. + +Another important and commonly-used category is consent management modules. These modules allow publishers to execute on their approach to user privacy and data consent. To learn more about consent management, check out our video on Identity in Prebid.js. + +A final key category are modules commonly known as analytics adapters. These are vital for getting the best possible performance out of Prebid. Analytics adapters are used to gather information about Prebid auctions and send it to servers that will aggregate the data into reports. There are dozens of analytics adapters. A complete list of analytics adapters can be found on the Analytics for Prebid page at docs.prebid.org. + +The capabilities of Prebid’s modules go even further beyond these three key categories. For example, some modules help publishers optimize Prebid’s performance by controlling auction settings like bid timeout and price floors dynamically. More information about these can be found on the Prebid.js modules page. + +When you’re ready to build a Prebid.js wrapper with a hand-picked selection of modules, visit the Download page at docs.prebid.org. + +### Prebid.js Configuration + +As we’ve already seen, much of a Prebid.js integration’s parameters are configured inside ad units. However, there are also settings of Prebid.js that apply globally, such as general auction controls and the parameters of modules. These settings are stored in the Prebid.js configuration, which is set using the pbjs.setConfig() method. + +Many of Prebid’s most important settings live here, including bidder timeout, user sync settings, and price granularity. + +Detailed documentation of the Prebid.js configuration can be found in the publisher API reference. https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html + +That’s it for this overview of Prebid.js for more information, check the links in the description below or visit docs.prebid.org. + diff --git a/prebid/prebidjs-flow-video.md b/prebid/prebidjs-flow-video.md new file mode 100644 index 0000000000..c8c5e779dd --- /dev/null +++ b/prebid/prebidjs-flow-video.md @@ -0,0 +1,102 @@ +--- +layout: page_v2 +title: Video Intro to the Prebid.js Auction +description: A video overview of a Prebid.js Auction +sidebarType: 1 +--- + +# A Video Walkthrough of a Typical Prebid.js Auction + +A step-by-step walkthrough of a typical Prebid.js auction. + +
+ +Further Content: +- [Intro to Header Bidding](/overview/intro-to-header-bidding.html) +- [Header Bidding with Prebid](/overview/intro.html#header-bidding-with-prebid) +- [What is Prebid.js?](/prebid/prebidjs.html) +- [Prebid.js Quick Start](/dev-docs/getting-started.html) +- [All videos](/overview/all-videos.html) + +Related Videos +- [Introduction to Prebid](/overview/intro-video.html) +- [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) +- [Components of Prebid.js](/prebid/prebid-components-video.html)) +- [Identity in Prebid.js](/identity/prebid-identity-video.html) + +## Transcript + +### Introduction + +This video will walk through the steps required to serve a display ad through an ordinary Prebid.js integration. +- This is the simplest and most common type of Prebid auction. Specifically, it is a client-side auction for a display ad running in a single-format ad slot on a website that uses a primary ad server. +- There are many variations on this basic form, which include: + - Auctions for other ad formats, such as video or native + - Auctions that use Prebid Server + - Auctions that use Prebid.js without a primary ad server + - Auctions in other environments such as AMP, mobile apps, and long-form video. +- Let’s start with a high-level overview of the steps: + - When the page loads, Prebid.js loads. The page invokes Prebid.js, which goes through a three-stage process: Pre-Auction, Auction and Post Auction. + - In the Pre-Auction stage, Prebid.js gathers information that it needs to run auctions for the ad slots on the page. + - Next comes the Auction stage: + - Prebid.js makes bid requests to bidders that the publisher has selected + - The bidders respond to Prebid.js with bids + - Finally, the post-auction stage begins + - Prebid.js gathers the bids and reformats them into a format that the primary ad server will understand + - For each ad slot, requests are sent to the ad server. These requests contains information about the bids Prebid.js received. + - The ad server receives the requests and decides which of the publisher’s ad buyers should serve an ad. Prebid bidders are considered alongside other potential buyers. + - When the primary ad server selects a Prebid bidder, it returns Prebid code that renders the ad to the page. + +### Impression Flow + +Now, we’ll go through the process in detail. + +1. **Pre-Auction** + 1. The user requests the page, the publishers’ CMS is called and returns the page source, which includes instructions to load Prebid.js and begin an auction for one or more Ad Units + 1. An Ad Unit represents a unique ad slot on the page. + 1. The Ad Unit contains information about the attributes of the ad slot, such as the ad format, and dimensions. The Ad Unit also includes the list of bidders that are allowed to bid on the ad slot. + 1. In Prebid, the word “auction” refers to the process by which bids are solicited and received for one or more Ad Units. A bidder will usually receive a single HTTP request that contains information about one or more Ad Units, and the bidder is able to bid on any or all of them. + 1. Before the auction begins, Prebid.js is able to retrieve other optional information, depending on how the publisher has configured it. This information can include: + 1. User consent information from the publisher’s consent management platform + 1. Ad request enrichment data that describes the user, site, or page + 1. Price floor information + 1. And more +1. **Auction** - The auction begins. + 1. Prebid.js sends bid requests to bidders. + 1. Bidders will receive an HTTP request that contains one or more ad units. Which ad units each bidder receives depends on how the ad units are set up by the publisher. + 1. Bid requests contain information about the ad units, page, user, and auction, including the page URL, ad slot identifiers, user identifiers, first party data, consent data, supply chain data, price floors and more. + 1. A bidder’s bid adapter is the component that formats the bid requests the bidder receives. Bidders build and maintain their own bid adapters and submit them to the open-source Prebid.js repository. + 1. At this point, Prebid.js will also start a timer that it uses to enforce the publisher’s configured bid timeout. The bid timeout determines the amount of time that Prebid.js will wait to receive bidders’ responses. + 1. Bidders consider the impression opportunity. They will consult their own sources of demand and determine whether they are able to offer an ad for the opportunity. If they do, they’ll also decide upon a price they would be willing to pay. + 1. Bidders return responses. + 1. The bidder’s HTTP response contains their bids for the Ad Units in the auction. The bidder isn’t required to place a bid, and bids only on the ad units they hope to win. + 1. Responses that include a bid will contain a URL that refers to the ad’s creative, a price, and other information such as deal IDs. + 1. Bids that Prebid.js receives before the bid timeout period has elapsed are considered valid bids. The bid timeout is set by the publisher in the Prebid.js configuration. Bids not received before the bid timeout will be logged as timed-out bids. + 1. Prebid.js processes responses + 1. As Prebid.js receives responses from bidders, it processes them + 1. Bidders’ bid adapters are responsible for parsing the bidders’ responses and exposing bid information to Prebid.js. + 1. Bid processing starts with extracting information from the bid, which can include bid prices, deal IDs, and ad format information. + 1. Where necessary, Prebid.js will perform other validations or transformations like price floor enforcement or currency conversion + 1. Prebid’s auction completes when either all of the bidders have responded and Prebid has processed their bids, or when the timeout period set by the publisher has elapsed. + 1. After the auction has completed, Prebid formats the bid information as a set of key-value pairs that the primary ad server will understand. +1. **Post-Auction** + 1. With the Prebid auction complete, the ad server is called + 1. A request is sent to the primary ad server for each of the slots on the page. These requests will contain the bid key-value pairs. + 1. The ad server receives its request and evaluates the demand sources that the publisher has enabled, which includes but is not limited to Prebid bidders. + 1. Other demand sources that the ad server might consider are: + 1. Direct-sold campaigns with reservations, guarantees, or sponsorships + 1. Bids from other header bidding or programmatic sources + 1. Waterfall-style demand sources such as ad networks + 1. Each ad server works a little bit differently. For more information about how Prebid.js works with ad servers, refer to Prebid’s Ad Ops documentation. + 1. When the ad server selects a Prebid bid to serve, it returns a piece of Prebid code called a creative. + 1. **Ad Rendering** + 1. The creative triggers the ad rendering process, in which Prebid.js retrieves the bidder’s ad and renders it to the ad slot on the page. + +### Conclusion + +- So that’s how an ad is served through Prebid.js +- Publishers can measure their monetization performance, troubleshoot issues, and maximize yield by gathering data about their header bidding auctions. Prebid supports a standardized interface for analytics adapters that allows publishers to integrate header bidding analytics tools that give them the insights they need. +- Prebid.js logs events throughout the auction and ad serving process. These events are exposed to analytics adapters, and they include the start of the auction, requests to bidders, bid responses, timeouts, ad server requests, ad renders, and more. +- Tools like the Professor Prebid browser extension also have the ability to monitor Prebid.js events and can be used for troubleshooting, debugging, and optimization. +- To learn more about the Prebid Auction and about Prebid’s analytics, optimization, and troubleshooting tools, visit [docs.prebid.org](docs.prebid.org). + diff --git a/prebid/prebidjs-video.md b/prebid/prebidjs-video.md index f1f72226da..bf52d8393c 100644 --- a/prebid/prebidjs-video.md +++ b/prebid/prebidjs-video.md @@ -2,7 +2,7 @@ layout: page_v2 title: Video Intro to Prebid.js description: A video overview of Prebid org and products -sidebarType: 0 +sidebarType: 1 --- # A Video Overview of Prebid.js @@ -21,9 +21,9 @@ Further Content: Related Videos - [Introduction to Prebid](/overview/intro-video.html) - [Introduction to Header Bidding](/overview/intro-to-header-bidding-video.html) -- Prebid.js Impression Flow (coming soon) -- Components of Prebid.js (coming soon) -- Identity in Prebid.js (coming soon) +- [Prebid.js Impression Flow](/prebid/prebidjs-flow-video.html) +- [Components of Prebid.js](/prebid/prebidjs-components-video.html) +- [Identity in Prebid.js](/identity/prebid-identity-video.html) ## Transcript From 205d291e2bb1282e7e12426ef75d79e02538bea9 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 18 May 2023 10:38:51 -0400 Subject: [PATCH 157/564] axonix table formatting (#4584) --- dev-docs/bidders/axonix.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/axonix.md b/dev-docs/bidders/axonix.md index c4f843b34b..2e9f5067cb 100644 --- a/dev-docs/bidders/axonix.md +++ b/dev-docs/bidders/axonix.md @@ -14,6 +14,7 @@ sidebarType: 1 The Axonix Bidding adapter requires setup before beginning. Please contact us at support.axonix@emodoinc.com. ### Bid Params + {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |------------|-------|----------------------------------------------|-------------------------------------|------| From 6da7574e82fb533963271bba9538d5c8dca75efb Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 18 May 2023 16:34:02 -0400 Subject: [PATCH 158/564] update ipv6 anon (#4585) --- prebid-server/features/pbs-privacy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/features/pbs-privacy.md b/prebid-server/features/pbs-privacy.md index aac617e743..be915bd676 100644 --- a/prebid-server/features/pbs-privacy.md +++ b/prebid-server/features/pbs-privacy.md @@ -85,7 +85,7 @@ If `regs.coppa` is set to '1' on the OpenRTB request, the following anonymizatio - Removes all ID fields: device.ifa, device.macsha1, device.macmd5, device.dpidsha1, device.dpidmd5, device.didsha1, device.didmd5 - Truncate ip field - remove lowest 8 bits. -- Truncate ipv6 field - remove lowest 32 bits. +- Truncate ipv6 field - anonymize as noted below. - Remove geo.lat, geo.lon. geo.metro, geo.city, and geo.zip - Remove user.id, user.buyeruid, user.yob, and user.gender From e0a380ed2ebd4881ca797ca7fbd8584f330fa580 Mon Sep 17 00:00:00 2001 From: adxcgcom <31470944+adxcgcom@users.noreply.github.com> Date: Thu, 18 May 2023 21:06:16 +0000 Subject: [PATCH 159/564] Update adxcg.md (#4581) * Update adxcg.md * remove gvlid * add back N/A gvl --------- Co-authored-by: Chris Huie --- dev-docs/analytics/adxcg.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/dev-docs/analytics/adxcg.md b/dev-docs/analytics/adxcg.md index 527c436b0c..17784bc03e 100644 --- a/dev-docs/analytics/adxcg.md +++ b/dev-docs/analytics/adxcg.md @@ -3,9 +3,35 @@ layout: analytics title: Adxcg description: Adxcg Analytics Adapter modulecode: adxcg +gdpr_supported: false +usp_supported: false +coppa_supported: false +prebid_member: false +gvl_id: N/A +enable_download: false --- #### Registration -Please visit [https://www.adxcg.com/](https://www.adxcg.com/) for more information. +The Adxcg analytics adapter requires setup and approval from the Adxcg team, even for existing accounts. +Please reach out to your account team or visit [https://www.adxcg.com/](https://www.adxcg.com/) for more information. + +#### Analytics Options + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------| +| publisherId | required | The Adxcg publisher account ID | `'42'` | string | + + +### Example Configuration + +``` + pbjs.enableAnalytics({ + provider: 'adxcg', + options: { + publisherId: 'OBTAIN-FROM-ADXCG' + } + }); +``` From 24e679ae6e0b3f8956649661bdfb1c1b755c19db Mon Sep 17 00:00:00 2001 From: Marios Kosmas <110163065+mariosk5@users.noreply.github.com> Date: Fri, 19 May 2023 00:12:04 +0300 Subject: [PATCH 160/564] New adapter: Project Agora (#4567) --- dev-docs/bidders/projectagora.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 dev-docs/bidders/projectagora.md diff --git a/dev-docs/bidders/projectagora.md b/dev-docs/bidders/projectagora.md new file mode 100644 index 0000000000..908b9ccf11 --- /dev/null +++ b/dev-docs/bidders/projectagora.md @@ -0,0 +1,27 @@ +--- +layout: bidder +title: Project Agora +description: Prebid Project Agora Bidder Adapter +biddercode: projectagora +pbjs: true +pbs: false +aliasCode: appnexus +gdpr_supported: true +media_types: banner, video, native +gvl_id: 1032 +schain_supported: true +userId: all +sidebarType: 1 +--- +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementID` | required | Placement id | `'11111'` | `string` | + +Project Agora is an aliased bidder for AppNexus. + +### Note: + +The Project Agora bidder adapter requires setup before beginning. Please contact us at pub_support@projectagora.com. From 66cc3ada429c8d78410ab274d72448971d509339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Robakowski?= Date: Thu, 18 May 2023 23:46:05 +0200 Subject: [PATCH 161/564] Add Eskimi bidder documentation (#4471) * Add Eskimi bidder documentation * add safeframes_ok and ortb_blocking_supported fields to eskimi bidder docs --- dev-docs/bidders/eskimi.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 dev-docs/bidders/eskimi.md diff --git a/dev-docs/bidders/eskimi.md b/dev-docs/bidders/eskimi.md new file mode 100644 index 0000000000..e1b452dd71 --- /dev/null +++ b/dev-docs/bidders/eskimi.md @@ -0,0 +1,24 @@ +--- +layout: bidder +title: Eskimi +description: Prebid Eskimi Bidder Adapter +pbjs: true +pbs: false +biddercode: eskimi +deals_supported: false +media_types: banner +gvl_id: 814 +sidebarType: 1 +schain_supported: true +floors_supported: true +safeframes_ok: false +ortb_blocking_supported: false +--- + + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------------|----------|-------------------------------|---------|------------| +| `placementId` | required | The placement ID from Eskimi. | `612` | `integer` | From 7cab5d6ed1ac7914abe795deb83a0e3f5737af26 Mon Sep 17 00:00:00 2001 From: bretg Date: Sun, 21 May 2023 10:48:32 -0400 Subject: [PATCH 162/564] adding mobile FAQ entries (#4586) --- faq/prebid-mobile-faq.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/faq/prebid-mobile-faq.md b/faq/prebid-mobile-faq.md index d8ee30bb19..b5e9e02da7 100644 --- a/faq/prebid-mobile-faq.md +++ b/faq/prebid-mobile-faq.md @@ -37,6 +37,17 @@ No. No. +### Is the SDK synchronous? + +Prebid SDK is always async. The completion handler for the main fetchDemand() method is called asynchronously when the bid response (or timeout, network error, etc.) is received. The app defines the desired timeout. + +### How long do bids remain valid? + +Prebid SDK does not support a [limited bid cache](dev-docs/faq.html#does-prebidjs-cache-bids) like Prebid.js does. Which means it's up to the app to build any kind of pre-fetch or bid-cache feature. Notes: + +1. If Prebid Cache is being utilized, the Time-To-Live for that cache should be understood. By default, the TTL for Prebid Cache is 5 minutes for banners and 15 minutes for video, but this can be changed. +2. No matter what the Cache TTL is set to, it's important that any pre-fetch or bid-cache feature built into the app should respect the OpenRTB `seatbid.bid.exp` field for each bid, which is the expiration of the bid in seconds. + ## Dependencies ### Does the SDK use third-party libraries? From de95c6f7d7293c18b5ae048717287960aed6630a Mon Sep 17 00:00:00 2001 From: Alexander Jones Date: Thu, 25 May 2023 08:04:16 -0500 Subject: [PATCH 163/564] typo (#4588) --- prebid-server/use-cases/pbs-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/use-cases/pbs-sdk.md b/prebid-server/use-cases/pbs-sdk.md index 8232659d84..cfd5bbb3c5 100644 --- a/prebid-server/use-cases/pbs-sdk.md +++ b/prebid-server/use-cases/pbs-sdk.md @@ -265,7 +265,7 @@ Prebid Universal Creative loads in the webiview, which sees the `hb_env=mobile-a ### Load Ad -The Prebid Universal Crative will parse the response, looking for the `adm` object, loading the full markup into the webview. +The Prebid Universal Creative will parse the response, looking for the `adm` object, loading the full markup into the webview. ## Further Reading From ba9bf2990913e44d96bacd3669fd8c1fabd87229 Mon Sep 17 00:00:00 2001 From: Eyvaz Ahmadzada <62054743+eyvazahmadzada@users.noreply.github.com> Date: Fri, 26 May 2023 16:41:03 +0400 Subject: [PATCH 164/564] IntentIQ: added enableCookieStorage optional parameter docs (#4595) * added: enable cookie param docs * added: enableCookieStorage default value info --- dev-docs/modules/userid-submodules/intentiq.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/intentiq.md b/dev-docs/modules/userid-submodules/intentiq.md index 6c7487b868..e64cdeddc3 100644 --- a/dev-docs/modules/userid-submodules/intentiq.md +++ b/dev-docs/modules/userid-submodules/intentiq.md @@ -41,6 +41,7 @@ Please find below list of parameters that could be used in configuring Intent IQ | params.percentage | Required | Number | This a percentage value for our A/B testing group distribution. The values supposed to be in range of 0 to 100. We suggest to set it to 95 percent for optimal balance ofbetween prefromance and preceision. | `95` | | params.pcid | Optional | String | This is the partner cookie ID, it is a dynamic value attached to the request. | `"g3hC52b"` | | params.pai | Optional | String | This is the partner customer ID / advertiser ID, it is a dynamic value attached to the request. | `"advertiser1"` | +| params.enableCookieStorage | Optional | Boolean | This is a parameter allowing to enable or disable cookie storage. Defaults to false. | `"true"` | ### Configuration example @@ -53,6 +54,7 @@ pbjs.setConfig({ params: { partner: 123456, // valid partner id percentage: 95, + enableCookieStorage: true }, storage: { type: "html5", @@ -76,7 +78,8 @@ pbjs.setConfig({ partner: 123456 // valid partner id pcid: PCID_VARIABLE, // string value, dynamically loaded into a variable before setting the configuration pai: PAI_VARIABLE , // string value, dynamically loaded into a variable before setting the configuration - percentage: 95 + percentage: 95, + enableCookieStorage: false }, storage: { type: "html5", From fc9c89b0e873a8f74108e07457e9075cad3d22cc Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Fri, 26 May 2023 17:47:10 +0300 Subject: [PATCH 165/564] Adkernel: documenting diDNA display alias (#4600) --- dev-docs/bidders/didnadisplay.md | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 dev-docs/bidders/didnadisplay.md diff --git a/dev-docs/bidders/didnadisplay.md b/dev-docs/bidders/didnadisplay.md new file mode 100644 index 0000000000..92a3a49706 --- /dev/null +++ b/dev-docs/bidders/didnadisplay.md @@ -0,0 +1,34 @@ +--- +layout: bidder +title: diDNA Display +description: diDNA Display Bidder Adaptor +biddercode: didnadisplay +pbjs: true +pbs: false +media_types: banner, native, video +gdpr_supported: true +usp_supported: true +coppa_supported: true +pbs_app_supported: false +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +sidebarType: 1 +--- + +### Note: + +The diDNA Display 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.didna.io'` | `string` | +| `zoneId` | required | Zone Id | 30164 | `integer` | From c6d13c8f8921065f762718d5a60705f2e41cb241 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 08:20:05 -0700 Subject: [PATCH 166/564] Bump socket.io-parser from 4.2.1 to 4.2.3 (#4597) Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.1 to 4.2.3. - [Release notes](https://github.com/socketio/socket.io-parser/releases) - [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.1...4.2.3) --- updated-dependencies: - dependency-name: socket.io-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c7be5d269..5447d89a30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10741,9 +10741,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -22034,9 +22034,9 @@ } }, "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", From b45617b16dfdb9f85047b2e5bd79ec7bfda37f77 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Fri, 26 May 2023 12:12:20 -0400 Subject: [PATCH 167/564] Update roxot.md (#4593) --- dev-docs/analytics/roxot.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dev-docs/analytics/roxot.md b/dev-docs/analytics/roxot.md index b0ab67b2e9..859f3ef3dc 100644 --- a/dev-docs/analytics/roxot.md +++ b/dev-docs/analytics/roxot.md @@ -7,5 +7,20 @@ modulecode: roxot #### Registration -Please visit [https://roxot.com/](https://roxot.com/) for more information. +To start using Prebid Analytics, please, email us at contact@roxot.com to provide us with your billing info and get your personal publisher ID which is used in the prebid config on your site/s. + +Add the following code to your prebid.js config to activate Prebid Analytics: + +#### Example Configuration +``` + +pbjs.que.push(function () { + pbjs.enableAnalytics({ + provider: 'roxot', + options: { + publisherIds: ["YOUR-PUBLISHER-ID"] + } + }); +}); +``` From 3d74491979814c5d417304843c642122cba86059 Mon Sep 17 00:00:00 2001 From: Ioan-Alexandru Stef <126675343+ioan-alexandru-stef-smaato@users.noreply.github.com> Date: Tue, 30 May 2023 20:14:11 +0300 Subject: [PATCH 168/564] Smaato: Add skadn note for AdPods (#4592) * PREB-39 added skadn note for AdPods * PREB-39 change userId to userIds --- dev-docs/bidders/smaato.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index 89e5054c65..dfab0ab753 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -9,7 +9,7 @@ usp_supported: true coppa_supported: true gpp_supported: true media_types: banner, video, native -userId: criteo, pubCommonId, unifiedId +userIds: all pbjs: true pbs: true pbs_app_supported: true @@ -59,6 +59,10 @@ The Smaato adapter will convert bidfloors to 'USD' currency as needed. | `adbreakId` | required | Your Smaato adbreak id. Required for adpod (long-form video) requests | `'41002234'` | `string` | | `app` | optional | Object containing mobile app parameters. See the [App Object](#smaato-app-object) for details.| `app : { ifa: '56700000-9cf0-22bd-b23e-46b96e40003a'}` | `object` | +##### Note + +In case of AdPods, the Smaato adapter will only read the first `imp[].skadn` entry for each AdPod, such that there should only be one `skadn` occurrence per AdPod. + #### App Object From 1dcea8f14bb2f483310aafd22aa471e9cd2891d1 Mon Sep 17 00:00:00 2001 From: congdu-kun <126609480+congdu-kun@users.noreply.github.com> Date: Wed, 31 May 2023 06:09:52 -0700 Subject: [PATCH 169/564] Fix a typo in pair.md (#4608) --- dev-docs/modules/userid-submodules/pair.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/userid-submodules/pair.md b/dev-docs/modules/userid-submodules/pair.md index 0671559854..1c59c5bd23 100644 --- a/dev-docs/modules/userid-submodules/pair.md +++ b/dev-docs/modules/userid-submodules/pair.md @@ -22,7 +22,7 @@ gulp build --modules=pairIdSystem | name | Required | String | The name of PAIR ID user ID module. | `"pairId"` | | params | Optional | Object | Container of all module params. | | | params.liveramp | Optional | Object | Container of all liveramp cleanroom specified params. | | -| params.liveramp.storageKey | Optional | String | storage key to fetch liveramp provided PAIR Id, the default key is `"_lr_pairId_"` | `"_lr_pairId_custom"` | +| params.liveramp.storageKey | Optional | String | storage key to fetch liveramp provided PAIR Id, the default value is `"_lr_pairId"` | `"_lr_pairId_custom"` | ## PAIR ID Examples From c6d5a84a48b94f33a9064bd9f3e5256d10196cbc Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 31 May 2023 11:42:16 -0400 Subject: [PATCH 170/564] Condense prebid video docs into something more manageable. (#4549) * Condense prebid video docs into something more manageable. * Clarify what type of video is supported be prebid and video module. --- _data/sidebar.yml | 141 ---------------- prebid-video/video-module.md | 8 +- .../integration-examples/jwplayer.html | 123 ++++++++++++++ .../integration-examples/videojs.html | 150 ++++++++++++++++++ prebid-video/video-overview.md | 7 +- 5 files changed, 283 insertions(+), 146 deletions(-) create mode 100644 prebid-video/video-module/integration-examples/jwplayer.html create mode 100644 prebid-video/video-module/integration-examples/videojs.html diff --git a/_data/sidebar.yml b/_data/sidebar.yml index ee8cb8b255..ae0f05dc43 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1215,39 +1215,6 @@ sectionTitle: subgroup: 0 -- sbSecId: 4 - title: Getting Started with Long Form Video for Prebid.js - link: /prebid-video/video-long-form.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 0 - - -- sbSecId: 4 - title: Show Video Ads with Google Ad Manager - link: /dev-docs/show-video-with-a-dfp-video-tag.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 0 - -- sbSecId: 4 - title: Show OTT Video Ads with Prebid - link: /dev-docs/show-long-form-video-with-gam.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 0 - -- sbSecId: 4 - title: Outstream Video Ads - link: /dev-docs/show-outstream-video-ads.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 0 - - sbSecId: 4 title: Training Videos link: /videos/prebid-video.html @@ -1281,114 +1248,6 @@ sectionTitle: subgroup: 1 -- sbSecId: 4 - title: Examples - link: - isHeader: 1 - headerId: videxamples - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: "Instream" - link: - isHeader: 0 - isSectionHeader: 0 - isCatHeader: 1 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'Prebid Video Module: VideoJS' - link: /examples/video/instream/videoModule/videojs/video-module-videojs.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'JW Player (Platform)' - link: /examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'JW Player (Self-Hosted)' - link: /examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'VideoJS' - link: /examples/video/instream/videojs/pb-ve-videojs.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: "Outstream" - link: - isHeader: 0 - isSectionHeader: 0 - isCatHeader: 1 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'Basic IMA' - link: /examples/video/outstream/basic-ima.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'Google Ad Manager' - link: /examples/video/outstream/pb-ve-outstream-dfp.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'No Server' - link: /examples/video/outstream/pb-ve-outstream-no-server.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'No Server (Specify Renderer)' - link: /examples/video/outstream/pb-ve-outstream-no-server-specify-renderer.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: "Long-Form (Ad Pods)" - link: - isHeader: 0 - isSectionHeader: 0 - isCatHeader: 1 - sectionTitle: - subgroup: 2 - -- sbSecId: 4 - title: 'Freewheel' - link: /examples/video/long-form/pb-ve-lf-freewheel.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 - #--------------Prebid Server--------------| - sbSecId: 5 diff --git a/prebid-video/video-module.md b/prebid-video/video-module.md index 68114e8d61..d75c2dd00a 100644 --- a/prebid-video/video-module.md +++ b/prebid-video/video-module.md @@ -8,7 +8,7 @@ sidebarType: 4 # The Video Module -The Prebid Video Module allows Prebid to directly integrate with a Video Player. +The Prebid Video Module allows Prebid to directly integrate with a Video Player. Currently the Video Module only supports instream implementations. The Video Module will allow Prebid.js to automatically: - render bids in the desired video player @@ -62,6 +62,12 @@ To register a video player with Prebid, you must use `setConfig` to set a `video In order for Prebid to know which Ad Unit relates to which Video Player, you must include a `video` configuration in your Ad Unit. This allows Prebid to render the ad in the proper Video Player and obtain the Ortb data from the Video Player that will render the ad. For the list of properties in the `video` object of the ad unit please visit the [adUnit.video reference]({{site.baseurl}}/dev-docs/adunit-reference.html#adUnit.video). +#### Implementation Examples + +[Video.js]({{site.baseurl}}/prebid-video/video-module/integration-examples/videojs.html) + +[JW Player]({{site.baseurl}}/prebid-video/video-module/integration-examples/jwplayer.html) + ### Features for Publishers Integrating with the Video Module gives publishers access to the following features diff --git a/prebid-video/video-module/integration-examples/jwplayer.html b/prebid-video/video-module/integration-examples/jwplayer.html new file mode 100644 index 0000000000..b96d150912 --- /dev/null +++ b/prebid-video/video-module/integration-examples/jwplayer.html @@ -0,0 +1,123 @@ + + + + + + + JW Player with Playlist + + + + + + + + +

JW Player with Playlist

+ +
Div-1: Player placeholder div
+
+ + + diff --git a/prebid-video/video-module/integration-examples/videojs.html b/prebid-video/video-module/integration-examples/videojs.html new file mode 100644 index 0000000000..74d180ea82 --- /dev/null +++ b/prebid-video/video-module/integration-examples/videojs.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + VideoJS with Playlist + + + + + + + + +

VideoJS with Playlist

+ +
Div-1: Player placeholder div
+ + + + + diff --git a/prebid-video/video-overview.md b/prebid-video/video-overview.md index f9cdedd4a1..5cfc63ebde 100644 --- a/prebid-video/video-overview.md +++ b/prebid-video/video-overview.md @@ -18,11 +18,8 @@ sidebarType: 4 Prebid.js provides tools that allow header bidding video demand to compete with your ad server video demand. Prebid video demand can be incorporated for both instream, outstream, and long-form video slots. -- Instream - Instream video ads serve in-line with existing video content on your page. The ads can serve before, during, or after a piece of video content. As the publisher, you must provide your own video player that can be used to render the ads. +Prebid.js supports all the latest [OpenRTB Video types and subtypes](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md#list--placement-subtypes---video-). -- Outstream – Outstream video ads serve separately from any existing video content. Often, outstream video ad units are used to create video inventory on pages that do not include any video content. The outstream video ad is displayed through an associated outstream video renderer, which usually ingests configuration options that control the user experience. (For example, the outstream video player can be configured to expand within a text body on-page when in view, and collapse when the video is finished). - -- Long-form - Long-form video content always has a content arc with a beginning, middle and end. Ads display in an ad pod, a grouping of individual ads that appear either in the beginning, end or during the video content. As the publisher you must provide your own video player that can be used to render the ads. ## Implementation @@ -33,6 +30,8 @@ Here’s a high-level overview of the steps required to start using Prebid.js fo For implementation details, see [Getting Started with Video for Prebid.js]({{site.github.url}}/prebid-video/video-getting-started.html). +The [Prebid Video Module]({{site.github.url}}/prebid-video/video-getting-started.html#prebid-video-module) is the recommended way to implement video. + ## How It Works ### Instream Video From 5fbb38730c045ac9e4fd1135a4c40f2491fe7987 Mon Sep 17 00:00:00 2001 From: Piotr Jaworski <109736938+piotrj-rtbh@users.noreply.github.com> Date: Wed, 31 May 2023 19:51:43 +0200 Subject: [PATCH 171/564] RTB House: add fledge docs; reorganization (#4605) --- dev-docs/bidders/rtbhouse.md | 37 ++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/rtbhouse.md b/dev-docs/bidders/rtbhouse.md index 60b4ca65bf..91cad3e134 100644 --- a/dev-docs/bidders/rtbhouse.md +++ b/dev-docs/bidders/rtbhouse.md @@ -28,14 +28,20 @@ sidebarType: 1 | `bidfloor` | optional | Minimal CPM value | `0.01` | `float` | | `channel` | optional | Inventory channel identifier, limited to 50 characters | `Partner 1 - News` | `string` | -#### ORTB Blocking +#### Please note: + +* Since 4.43 the bidfloor param will be ignored if a value is specified via floor module. + +* The channel param is available starting from Prebid 6.6.0. Please reach your RTBHouse representative for details on how to enable and use the channel param. + +### ORTB Blocking RTB House supports blocking advertisers in `badv` and categories in `bcat` parameters. The blocked advertisers/categories list has no length limitation, but response timeout is more likely to occur as the number of entries grow. Blocked advertisers list (`badv`) is an array of domains as strings. Blocked categories list (`bcat`) is an array of IAB categories as strings. For example: -##### Globally defined ORTB Blocking: +#### Globally defined ORTB Blocking: ```javascript pbjs.setConfig({ ortb2: { @@ -44,7 +50,7 @@ pbjs.setConfig({ } )}; ``` -##### ORTB Blocking specific only to rtbhouse bidder: +#### ORTB Blocking specific only to rtbhouse bidder: ```javascript pbjs.setBidderConfig({ bidders: ['rtbhouse'], @@ -59,8 +65,27 @@ pbjs.setBidderConfig({ ### Setting up the Prebid Server Adapter If you’re a Prebid Server host company looking to enable the RTB House server-side adapter, you'll need to contact prebid@rtbhouse.com. They will guide you through the process. Do not use the default bidder config file as it will require custom partner code to be entered. It will be provided by RTB House. -### Please note: -* Since 4.43 the bidfloor param will be ignored if a value is specified via floor module. +### Protected Audience API (FLEDGE) support +There’s an option to receive demand for Protected Audience API (FLEDGE/PAAPI) +ads using RTB House bid adapter. +Prebid’s [fledgeForGpt](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html) +module and Google Ad Manager is currently required. -* The channel param is available starting from Prebid 6.6.0. Please reach your RTBHouse representative for details on how to enable and use the channel param. +The following steps should be taken to setup Protected Audience for RTB House: + +1. Reach out to your RTB House representative for setup coordination. + +2. Build and enable FLEDGE module as described in +[fledgeForGpt](https://docs.prebid.org/dev-docs/modules/fledgeForGpt.html) +module documentation. + + a. Make sure to enable RTB House bidder to participate in FLEDGE. If there are any other bidders to be allowed for that, add them to the **bidders** array: +```javascript +pbjs.setBidderConfig({ + bidders: ["rtbhouse"], + config: { + fledgeEnabled: true + } +}); +``` From bad35d70af3571237c275491ecf924c554798cef Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 31 May 2023 20:17:16 +0200 Subject: [PATCH 172/564] Update adnuntius.md (#4591) Adds documentation for the new `maxDeals` parameter. --- dev-docs/bidders/adnuntius.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/adnuntius.md b/dev-docs/bidders/adnuntius.md index 18464e3366..207e366665 100644 --- a/dev-docs/bidders/adnuntius.md +++ b/dev-docs/bidders/adnuntius.md @@ -25,6 +25,7 @@ sidebarType: 1 | `auId` | required | The ad unit ID `'0000000000072345'` leading zeros can be omitted. | `'0000000000072345'` | `string` | | `network` | optional | Used if you want to make requests to multiple networks in adnuntius. | `'adnuntius'` | `string`| | `targeting` | optional | Targeting to be sent through to adnuntius with the request. | `{ c: ['prebids'] }` | `string`| +| `maxDeals` | optional | The maximum number of deal bids to include. Default 0. | `1` | `Integer` | #### Targeting From e94db6635ba9f6f1238923a7afb1909cbc17c7fd Mon Sep 17 00:00:00 2001 From: khang-vu-ttd <109103626+khang-vu-ttd@users.noreply.github.com> Date: Wed, 31 May 2023 12:30:26 -0700 Subject: [PATCH 173/564] kvu-OPATH-760-update-docs-with-kvp (#4602) --- dev-docs/bidders/ttd.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dev-docs/bidders/ttd.md b/dev-docs/bidders/ttd.md index e453380962..d50597571e 100644 --- a/dev-docs/bidders/ttd.md +++ b/dev-docs/bidders/ttd.md @@ -182,3 +182,10 @@ Lists of `api`, `playbackmethod`, `protocols`, `pos`, and `expdir` potential val - `3` : Up - `4` : Down - `5` : Full Screen + +### First Party Data (Supported starting prebid v7.49) +Publishers should set [First Party Data](https://docs.prebid.org/features/firstPartyData.html) in the `ortb2` and `ortb2Imp` objects. These fields are supported: + +- `ortb2.site.ext.data` +- `ortb2.user.ext.data` +- `AdUnit.ortb2Imp.ext.data` (for AdUnit data) \ No newline at end of file From b4b8964c7477903ca4b1b351362e8c5979533937 Mon Sep 17 00:00:00 2001 From: Damyan Date: Thu, 1 Jun 2023 13:33:38 +0300 Subject: [PATCH 174/564] AdHash bid adapter changes (#4527) * AdHash documentation * multiformat_supported added * Removing globalScript flag --- dev-docs/bidders/adhash.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dev-docs/bidders/adhash.md b/dev-docs/bidders/adhash.md index e8a276ff2d..ab7a27d138 100644 --- a/dev-docs/bidders/adhash.md +++ b/dev-docs/bidders/adhash.md @@ -4,8 +4,10 @@ title: AdHash description: Prebid AdHash Bidder Adapter pbjs: true biddercode: adhash +media_types: display, video safeframes_ok: false gdpr_supported: true +multiformat_supported: will-bid-on-any sidebarType: 1 --- @@ -17,15 +19,16 @@ Here is what you need for Prebid integration with AdHash: 3. Use the Publisher ID and Platform URL as parameters in params. Please note that a number of AdHash functionalities are not supported in the Prebid.js integration: -* Cookie-less frequency and recency capping; -* Audience segments; -* Price floors and passback tags, as they are not needed in the Preebid.js setup; -* Reservation for direct deals only, as bids are evaluated based on their price. +* Price floors and passback tags, as they are not needed in the Prebid.js setup; +* Reservation for direct deals only, as bids are evaluated based on their price; +* Fill rate reporting, as unfilled impressions can be filled by any other bidder; +* CPC deals, as bidding happens only on CPM pricing. ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|--------------|------------------------------------------------|----------| -| `publisherId` | required | Publisher ID | `'0x1234567890123456789012345678901234567890'` | `string` | -| `platformURL` | required | Platform URL | `'https://adhash.org/p/example/'` | `string` | +| Name | Scope | Description | Example | Type | +|----------------|----------|----------------|------------------------------------------------|-----------| +| `publisherId` | required | Publisher ID | `'0x1234567890123456789012345678901234567890'` | `string` | +| `platformURL` | required | Platform URL | `'https://adhash.com/p/example/'` | `string` | +| `bidderURL` | optional | Bidder URL | `'https://bidder.adhash.com'` | `string` | From 142848431870e4cb683cc41ee987352ecee57360 Mon Sep 17 00:00:00 2001 From: Dmytro Shyrokov Date: Thu, 1 Jun 2023 13:34:26 +0300 Subject: [PATCH 175/564] Xeworks adapter: pbs support added (#4543) * meazy adapter docs * Xeworks Bid Adapter: update docs --------- Co-authored-by: Dmitry --- dev-docs/bidders/xe.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/xe.md b/dev-docs/bidders/xe.md index afa8396dbb..39682450ac 100644 --- a/dev-docs/bidders/xe.md +++ b/dev-docs/bidders/xe.md @@ -9,7 +9,7 @@ gdpr_supported: true usp_supported: true prebid_member: false pbjs: true -pbs: false +pbs: true schain_supported: true floors_supported: true multiformat_supported: will-bid-on-any @@ -21,11 +21,19 @@ sidebarType: 1 The Xe.works adapter requires setup before beginning. Please contact us at team@xe.works -### Bid params +### Prebid.js Bid params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------------|----------|-----------------------------|---------------|-----------| | `placement` | required | Placement ID | `test-banner` | `string` | | `env` | required | Environment name | `xe` | `string` | -| `ext` | optional | Specific integration config | `{}` | `object` | \ No newline at end of file +| `ext` | optional | Specific integration config | `{}` | `object` | + +### Prebid Server Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-----------------------------|------------------------------------|-----------| +| `env` | required | Environment name | `xe-stage` | `string` | +| `pid` | required | Uniq placement ID | `dc230510222b516f0eb9a10e5913d3b5` | `string` | From 5276a69a8d0ebe5fda28260a55ba6f5c81b91b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9onard=20Labat?= Date: Thu, 1 Jun 2023 12:45:18 +0200 Subject: [PATCH 176/564] Criteo Bid Adapter : Update documentation according to latest features added about video & rwdd support (#4596) --- dev-docs/bidders/criteo.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md index c26f00e223..20bd455d28 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -38,11 +38,22 @@ Prebid-Server support is on alpha test and is currently a non-finished product. | `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` | +| `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). +Criteo supports both `ortb2` and `ortb2Imp` methods to set [First Party Data](https://docs.prebid.org/features/firstPartyData.html). + +The standard Open RTB properties supported from `ortb2` / `ortb2Imp` are described in the following table. + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------| +| `ortb2.user` | optional | Details via a Open RTB User object about the human user of the device; the advertising audience. | N/A | `object` | +| `ortb2.site` | optional | Details via a Open RTB Site object about the publisher’s website. | N/A | `object` | +| `ortb2Imp.rwdd` | optional | Indicates whether the user receives a reward for viewing the ad, where 0 = no, 1 = yes. | `1` | `integer` | + +Besides these standard properties, `ext` field can be used to send any publisher specific data which may have been discussed with a Criteo representative. ### Video Object @@ -65,7 +76,8 @@ In addition, Criteo adapter relies on parameters specified in the mediaTypes.vid | `playerSize` | required | Width and height of the player | `[640, 480]` | `Array` | | `protocols` | required | Supported video bid response protocols. VAST 1.0: `1`; VAST 2.0: `2`; VAST 3.0: `3`; VAST 1.0 Wrapper: `4`; VAST 2.0 Wrapper: `5`; VAST 3.0 Wrapper: `6`; | `|5, 6]` | `Array` | | `maxduration` | required | Maximum ad duration in seconds | `20` | `integer` | -| `api` | required | API frameworks supported. VPAID 1.0: `1`; VPAID 2.0: `2`; MRAID-1: `3`; ORMMA: `4`; MRAID-2: `5`; | `[1, 2]` | `Array` | +| `api` | required | API frameworks supported. VPAID 1.0: `1`; VPAID 2.0: `2`; MRAID 1.0: `3`; ORMMA: `4`; MRAID 2.0: `5`; MRAID 3.0: `6`; OMID 1.0: `7`; | `[1, 2]` | `Array` | +| `plcmt` | optional | 1=in-stream, 2=accompanying content, 3=interstitial, 4=no content/standalone. Highly recommended to comply with new IAB video specifications. | `1` | `integer` | #### Example of Video Ad-unit ``` From 1640601ede9c119e15ceddd42200f030539c9289 Mon Sep 17 00:00:00 2001 From: Nitin Nimbalkar <96475150+pm-nitin-nimbalkar@users.noreply.github.com> Date: Thu, 1 Jun 2023 16:19:38 +0530 Subject: [PATCH 177/564] Data controller Module Code renamed with actual file name (#4589) --- dev-docs/modules/dataControllerModule.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/dataControllerModule.md b/dev-docs/modules/dataControllerModule.md index 5d425c5e9c..79b6e86b18 100644 --- a/dev-docs/modules/dataControllerModule.md +++ b/dev-docs/modules/dataControllerModule.md @@ -3,7 +3,7 @@ layout: page_v2 page_type: module title: Data Controller Module description: Filters the EIDs/SDA being transmitted to bid stream. -module_code : dataController +module_code : dataControllerModule display_name : Data Controller Module enable_download : true sidebarType : 1 From 12723a30be91ef8e33e2d47590053e0d2490b5dc Mon Sep 17 00:00:00 2001 From: maxime-dupuis <118775839+maxime-dupuis@users.noreply.github.com> Date: Thu, 1 Jun 2023 06:50:14 -0400 Subject: [PATCH 178/564] Sharethrough - Support native (#4583) --- dev-docs/bidders/sharethrough.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/sharethrough.md b/dev-docs/bidders/sharethrough.md index d988965b2a..71e7ea3dca 100644 --- a/dev-docs/bidders/sharethrough.md +++ b/dev-docs/bidders/sharethrough.md @@ -6,7 +6,7 @@ description: Prebid Sharethrough Adaptor gdpr_supported: true coppa_supported: true floors_supported: true -media_types: banner, video +media_types: banner, video, native safeframes_ok: true schain_supported: true userIds: all From 0b86f8790a8ad75ef5b77ab7bd903dd13446311f Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Thu, 1 Jun 2023 15:19:02 +0200 Subject: [PATCH 179/564] Grant US traffic consent for GA and wait for CMP 500ms --- _includes/footer.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_includes/footer.html b/_includes/footer.html index c4b6cdae34..2abb9cb9da 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -21,7 +21,11 @@ window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); - gtag('consent', 'default', {'ad_storage': 'denied','analytics_storage': 'denied'}); + gtag('consent', 'default', { + 'analytics_storage': 'granted', + 'region': ['US'] + }); + gtag('consent', 'default', {'ad_storage': 'denied','analytics_storage': 'denied', 'wait_for_update': 500}); gtag("config", "G-GM972HCTEB", { anonymize_ip: true }); From b3ed7c6bcde2f8875346370d9a0394c813c963ef Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 1 Jun 2023 11:58:33 -0400 Subject: [PATCH 180/564] adding create table examples (#4612) --- prebid-server/hosting/pbs-database.md | 70 ++++++++++++++++++--------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/prebid-server/hosting/pbs-database.md b/prebid-server/hosting/pbs-database.md index 4554dc5684..bed4b269fa 100644 --- a/prebid-server/hosting/pbs-database.md +++ b/prebid-server/hosting/pbs-database.md @@ -30,6 +30,8 @@ you to be able to integrate a few tables into that existing database and then re So instead of Prebid defining your schema, we just define the fields that need to come from the query. You can then design the SQL query and put it in PBS configuration. +That said, it's often been requested that Prebid just suggest a minimal schema, so there are examples below. + ## Database Queries Prebid Server queries the database in the following scenarios: @@ -37,8 +39,8 @@ Prebid Server queries the database in the following scenarios: {: .table .table-bordered .table-striped } | Data | SQL Config | Description | |------+---------------+-------------| -| Stored Requests | settings.database.stored-requests-query | Retrieve stored request JSON for incoming OpenRTB | -| AMP Stored Requests | settings.database.amp-stored-requests-query | Retrieve stored request JSON for incoming AMP | +| Auction endpoint Stored Requests | settings.database.stored-requests-query | Retrieve stored request JSON for incoming OpenRTB | +| AMP endpoint Stored Requests | settings.database.amp-stored-requests-query | Retrieve stored request JSON for incoming AMP | | Stored Responses | settings.database.stored-responses-query | Retrieve stored response data | | Account Data | settings.database.account-query (PBS-Java only) | Retrieve host company-specific account information | @@ -51,9 +53,10 @@ The Stored Request query needs to return fields in this order: {: .table .table-bordered .table-striped } | Field Num | Name | Type | Meaning | Default | |-----------+------+------+---------+---------| -| 1 | request ID | string | The Stored Request ID | n/a | -| 2 | request body | JSON | The body of the Stored Request | n/a | -| 3 | label | string | This is always just the static value 'request' | n/a | +| 1 | account ID | string | The Account ID may be used to distinguish between stored request IDs with the same name across accunts. (PBS-Java only) | n/a | +| 2 | request ID | string | The Stored Request ID | n/a | +| 3 | request body | JSON | The body of the Stored Request | n/a | +| 4 | label | string | Defines whether this item is a 'request' (top-level SR) or 'imp' (imp-level SR).| n/a | There are two parameters that can be passed into the query: @@ -68,13 +71,21 @@ settings: stored-requests-query: SELECT accountId, reqid, storedData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) UNION ALL SELECT accountId, reqid, storedData, 'imp' as dataType FROM stored_requests WHERE reqid IN (%IMP_ID_LIST%) ``` -This example assumes that the schema includes these fields: -- accountId: account ID, which is used to make sure that storedrequests are unique to the account -- reqid: ID of stored data item -- storedData: value of stored data item -- 'request' or 'imp': type of stored data item. +This **example** assumes that one table contains both top-level and imp-level stored requests: -Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. +``` +CREATE TABLE `stored_requests` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `accountId` int(11) NOT NULL, + `reqid` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `storedData` json NOT NULL +) +``` + +{: .alert.alert-info :} +This schema is for example only -- it's not a terribly smart schema for use in production. You should consider adding fields like insertDate and updateDate, and of course define indices. And again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown in the example query. + +Note: if we had to do it all over again, we'd get rid of the distinction between REQUEST_ID_LIST and IMP_ID_LIST. ### AMP Stored Requests @@ -89,13 +100,8 @@ settings: amp-stored-requests-query: SELECT accountId, reqid, storedData, 'request' as dataType FROM stored_requests WHERE reqid IN (%REQUEST_ID_LIST%) ``` -This example assumes that the stored_requests schema includes these fields: -- accountId: account ID, which is used to make sure that storedrequests are unique to the account -- reqid: ID of stored data item -- storedData: value of stored data item -- 'request': type of stored data item. Can be only be 'request' for AMP. +It's expected that your AMP stored requests are stored in the same schema as yourother stored requests. The query is, however, separably configurable. -Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. ### Stored Responses @@ -120,9 +126,19 @@ settings: stored-responses-query: SELECT resid, responseData FROM stored_responses WHERE resid IN (%ID_LIST%) ``` -This example assumes that the stored_responses schema includes these fields: -- resid is a string field that contains the stored response ID -- responseData is a JSON field that contains the body of the stored response +This **example** schema assumes that the stored_responses schema includes these fields: +``` +CREATE TABLE `stored_responses` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `resid` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `responseData` json NOT NULL +) +``` + +{: .alert.alert-info :} +This schema is for example only -- it's not a terribly smart schema for use in production. You should consider adding fields like insertDate and updateDate, and of course define indices. And again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown in the example query. + +Note: there's no reason you couldn't put stored responses in the same table as stored requests as long as there's a field differentiating them for use in the query. ### Account Data @@ -152,11 +168,17 @@ settings: account-query: JSON_MERGE_PATCH(JSON_OBJECT( 'id', accountId ), COALESCE(config, '{}')) as consolidated_config FROM accounts WHERE accountId = %ACCOUNT_ID% LIMIT 1 ``` -This example assumes that the accounts schema includes these fields: -- accountId is a string field that contains the account ID -- config is a JSON field that contains all the rest of the account-level fields +This **example** schema assumes that the accounts schema includes these fields: +``` +CREATE TABLE `accounts` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `accountId` int(11) NOT NULL, + `config` json NOT NULL +) +``` -Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. +{: .alert.alert-info :} +This schema is for example only -- it's not a terribly smart schema for use in production. You should consider adding fields like insertDate and updateDate, and of course define indices. And again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown in the example query. See the [PBS-Java configuration docs](https://github.com/prebid/prebid-server-java/blob/master/docs/application-settings.md#configuration-document-json) for detail on the JSON structure expected as the result of the query. There are many account-level settings detailed there. From 3f35abafa904d94332f5e626ec3d7f86f5717bfc Mon Sep 17 00:00:00 2001 From: UOL - TechOps <116287445+uoladtech@users.noreply.github.com> Date: Thu, 1 Jun 2023 16:09:52 -0300 Subject: [PATCH 181/564] New adapter: Uol as an AppNexus alias (#4601) * New adapter: Uol as an AppNexus alias * Update uol.md Just changing the way the adapter name will appear --- dev-docs/bidders/uol.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 dev-docs/bidders/uol.md diff --git a/dev-docs/bidders/uol.md b/dev-docs/bidders/uol.md new file mode 100644 index 0000000000..1dd7494124 --- /dev/null +++ b/dev-docs/bidders/uol.md @@ -0,0 +1,27 @@ +--- +layout: bidder +title: UOL +description: UOL Bidder Adapter +biddercode: uol +pbjs: true +pbs: false +aliasCode: appnexus +gdpr_supported: true +media_types: banner, video, native +gvl_id: 32 +schain_supported: true +userId: all +sidebarType: 1 +--- +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementID` | required | Placement id | `'11111'` | `string` | + +Uol is an aliased bidder for AppNexus. + +### Note: + +The UOL bidder adapter requires setup before beginning. Please contact us at l-dev-techops@uolinc.com. From b59cff61a784a14b784875cb72b681ad5d6eb271 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 1 Jun 2023 15:10:52 -0400 Subject: [PATCH 182/564] PBS activity controls (#4552) * initial control of PBS activities doc * checkpoint * wordsmithing * more links, module details * fixed ipv6 masking comment --- prebid-server/developers/add-a-module.md | 19 +- .../features/pbs-activitycontrols.md | 246 ++++++++++++++++++ prebid-server/features/pbs-feature-idx.md | 1 + prebid-server/features/pbs-privacy.md | 7 + 4 files changed, 269 insertions(+), 4 deletions(-) create mode 100644 prebid-server/features/pbs-activitycontrols.md diff --git a/prebid-server/developers/add-a-module.md b/prebid-server/developers/add-a-module.md index ab608c1521..6953e240e6 100644 --- a/prebid-server/developers/add-a-module.md +++ b/prebid-server/developers/add-a-module.md @@ -137,7 +137,17 @@ to the PBS host company. Examples: - 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 +### 7. Identify Sensitive Data Usage + +If your module either utilizes or supplies user-level data like User First Party Data or precise geographic information, it must adhere to the framework supplied by the [Activity Controls](/prebid-server/features/pbs-activitycontrols.html). + +For instance: +- if your module is going to supply user-level data (e.g. "job title") to bid adapters, it must check permissions for the `enrichUfpd` activity. +- if your module is going to forward the entire ORTB request to an endpoint, it must check the `transmitUfpd` and `transmitPreciseGeo` activity permissions. + +The details about how exactly to code this differs by platform. See the developer docs for Go and Java linked below. + +### 8. 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 @@ -153,7 +163,7 @@ that a given bidder is losing bid opportunities by not adhering to the auction p 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 +### 9. Write the Code, Config, and Unit Tests The details of the implementation depend on the platform. @@ -165,7 +175,7 @@ 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 +### 10. 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: @@ -176,7 +186,7 @@ create a file in /prebid-server/pbs-modules. You can start by copying one of the - Analytics Tag support - Privacy Support: disclose whether the module has user privacy implications and support for GDPR, CCPA, etc. -### 10. Submit the Pull Requests +### 11. Submit the Pull Requests When everthing checks out on your dev environment, submit the PRs for review. @@ -184,3 +194,4 @@ When everthing checks out on your dev environment, submit the PRs for review. - [Prebid Server Module List](/prebid-server/pbs-modules/index.html) - [PBS Module Analytics Tags Conventions](/prebid-server/developers/module-atags.html) +- [PBS Activity Controls](/prebid-server/features/pbs-activitycontrols.html) diff --git a/prebid-server/features/pbs-activitycontrols.md b/prebid-server/features/pbs-activitycontrols.md new file mode 100644 index 0000000000..51eeef68da --- /dev/null +++ b/prebid-server/features/pbs-activitycontrols.md @@ -0,0 +1,246 @@ +--- +layout: page_v2 +sidebarType: 5 +title: Prebid Server | Features | Actvity Controls + +--- + +# Prebid Server Activity Controls +{: .no_toc } + +{: .alert.alert-warning :} +This feature is currently only available in PBS-Java. + +Prebid supports a centralized control mechanism for privacy-sensitive activities. +These controls are intended to serve as building blocks for privacy protection mechanisms, allowing publishers to directly specify what should be permitted or avoided in any given regulatory environment. + +* TOC +{: toc } + +## Overview + +There are many privacy regulations that Prebid publishers need to accomodate. Prebid Server supplies [several features](/prebid-server/features/pbs-privacy.html) to help Publishers implement their legal policies, but there are scenarios where extra control is needed: + +- a Publisher's lawyers want to make a particular exception +- support hasn't been built for a regulation the Publisher needs to comply with + +### Prebid Server Is a Toolkit + +{: .alert.alert-danger :} +Important: This resource should not be construed as legal advice and Prebid.org makes no guarantees about compliance with any law or regulation. Please note that because every company and its collection, use, and storage of personal data is different, you should seek independent legal advice relating to obligations under European and /or US regulations, including the GDPR, the ePrivacy Directive and CCPA. Only a lawyer can provide you with legal advice specifically tailored to your situation. Nothing in this guide is intended to provide you with, or should be used as a substitute for, legal advice tailored to your business. + +1. Get a privacy lawyer. +2. Consider all the privacy regulations your content business is subject to. +3. Come up with a plan. +4. Use Prebid Server server features and these Activity Controls as ways to help implement your privacy plan with respect to header bidding. +5. Let us know if there are tools missing from the Prebid toolkit. + +### What is an Activity? + +We did an analysis of the things Prebid does that might be of concern to privacy regulations. We call these things "potentially restricted activities", or just "activities" for short. Some examples: + +- Syncing ID cookies +- Transmitting user first party data +- Transmitting the user's geographic location +- etc. + +The [full list of activities](#activities) is below. + +An activity control is a gatekeeper that makes a decision about whether the activity should be allowed in a specific context: + +- Should I allow this usersync for bidderB? +- Is it ok for this data to be passed to bidderC and analyticsD? +- Should I anonymize the geographic information for this request? +- etc. + +Prebid Server core checks with the Activity Controls to see whether a given activity is allowed for a given situation. The configuration for the activity comes from one of two places: either account-specific configuration or if not specified there, there's a host-level default. + +### Example Activity Control + +Here's an example account config that prevents bidderA, bidderB, and analytics adapters from receiving `user.eids[]` and `user.ext.data`: +``` +{ + privacy: { + allowactivities: { + transmitUfpd: { + default: true, + rules: [{ + condition: { + componentName: ["bidderA", "bidderB"] + }, + allow: false + },{ + condition: { + componentType: ["analytics"] + }, + allow: false + }] + } + } + } +``` + +
+ +## Configuration + +The `privacy.allowActivities` is a new account configuration option that contains a list of activity names -- see the [full list of activities below](#activities). + +``` +{ + privacy: { + allowactivities: { + ACTIVITY: { + default: true, + rules: [{ + condition: { ... }, + allow: false + },{ + ... more rules ... + }] + } + } + } +``` + +Each activity is an object that can contain these attributes: + +{: .table .table-bordered .table-striped } +| Name | Type | Description | +|------|------|-------------| +| `default` | boolean | Whether the activity should be allowed if no other rule applies. Defaults to true. | +| `rules` | array of objects | Rules for this activity | +| `rules[].condition` | object | Conditions to use for this rule. See the [rules](#rules) section below for details. If omitted, the rule always applies. | +| `rules[].allow` | boolean | Whether the activity should be allowed when this rule applies. Defaults to true. | + +`Rules` is an array of objects that a publisher can contruct to provide fine-grained control over a given activity. + +There's more about [rules](#rules) below. + + + +### Activities + +Here's the list of the 'potentially restricted activities' that Prebid Server core can restrict for Publishers: + +{: .table .table-bordered .table-striped } +| Name | Description | Effect when denied | +|----------------|-------------|---------------------------| +| `syncUser` | The [/cookie_sync](/prebid-server/endpoints/pbs-endpoint-cookieSync.html) or [/setuid](/prebid-server/endpoints/pbs-endpoint-setuid.html) endpoint has been asked to perform a sync or set-cookie. | Sync or setuid is skipped for one or more bidders. | +| `fetchBids` | A bid adapter wants to participate in an auction | Bidder is removed from the auction | +| `enrichUfpd` | A module wants to add user first party data to outgoing requests (`user.data` and `user.ext.data` in ORTB) | Module is not allowed to run. | +| `reportAnalytics` | The [/auction](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html), [/amp](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html), or [/event](/prebid-server/endpoints/pbs-endpoint-event.html) endpoint is about to call an analytics adapter. | Adapter is not called. | +| `transmitUfpd` | A bid adapter, analytics adapter, or module wants to access and/or transmit user FPD or EIDs to their endpoint | User FPD and EIDs are hidden from the adapter or module: `user.data`, `user.ext.data`, `user.{id, buyeruid, yob, gender}`, `user.eids`, `device.{device.ifa, macsha1, macmd5, dpidsha1, dpidmd5, didsha1, didmd5}` | +| `transmitPreciseGeo` | A bid adapter, analytics adapter, or module wants to access and/or transmit precise geolocation data to their endpoint | Latitude, longitude, and IP address are rounded off. Specifically, lat and long are truncated to two decimal places, IPv4 masks rightmost 8 bits, IPv6 masks the rightmost bits based on a configured value. | + + + +### Rules + +There are three parts to an Activity Control's rule: + +1. The priority - position within the array +2. The `condition` - logic for matching the rule +3. The `allow` status - what happens if the condition matches + +For example, this rule would allow bidderX to perform the activity if no higher priority rules take precedence. + ``` + ... + rules: [{ + condition: { + componentName: ["bidderX"] + }, + allow: true + }] + ... +``` + +Note: The Prebid.js version of this feature supports _explicit_ priority signals. That's not the case for the Prebid Server feature. Instead, for PBS, priority is implicit in the ordering of the array. + +#### Rule Conditions + +If a `condition` in a rule evaluates to true, the `allow` attribute of the rule will be utilized. If there's no condition specified, the rule's `allow` attribute will always be utilized. + +These are the conditional attributes available: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Type | Example | +|------|------|-------------|-------|-------| +| componentType | optional | Can be "bidder", "analytics", or "module". | array of strings | ["bidder"] | +| componentName | optional | Name of a specific bid adapter, analytics adapter, or module. | array of strings | ["bidderX"] | + +{: .alert.alert-info :} +Note on names: if two components share a name (e.g. "ssp1") for both a bid adapter and an analytics adapter, the rule may need to distinguish between them by providing both `componentName` and `componentType`. + +#### Allow + +If the rule's condition matches, the `allow` attribute defines whether the rule 'votes' to allow (true) or disallow (false) the activity in question. + +If `allow` is not defined, the rule is assumed to assert **true** (i.e. allow the activity to happen). + +### Interaction with other privacy features + +Currently, the Activity Control feature is separate from other privacy features: + +1. Activity Controls are run before other privacy features. So, for instance, if a bidder is removed from a request by the `fetchBids` activity, the GDPR processing for that bidder will not take place. +1. GDPR-suppression activities must still be managed through that feature's configuration. (See details for [PBS-Go](https://github.com/prebid/prebid-server/blob/master/config/config.go) or [PBS-Java](https://github.com/prebid/prebid-server-java/blob/master/docs/config-app.md)) +1. Likewise, Activity Control rules do not override USPrivacy or COPPA. + +{: .alert.alert-info :} +While Activity Controls are currently not well integrated with other privacy features, that will change over the coming months. + + +### Examples + +#### Anonymize auctions and disable usersyncs for bidderA + +``` +{ + privacy: { + allowactivities: { + transmitUfpd: { + rules: [{ + condition: { + componentName: ["bidderA"] + }, + allow: false + }] + }, + syncUser: { + rules: [{ + condition: { + componentName: ["bidderA"] + }, + allow: false + }] + } + } + } +} +``` + +#### Prevent User First Party Data and EIDs from going to analytics adapters + +``` +{ + privacy: { + allowactivities: { + transmitUfpd: { + rules: [{ + condition: { + componentType: ["analytics"] + }, + allow: false + }] + } + } + } +} +``` + +## Modules + +Modules that perform any 'potentially restricted activity' are responsible for confirming they are allowed to perform that activity. See [Adding a PBS Module](/prebid-server/developers/add-a-module.html) for more information. + +## Further Reading +- [Prebid Server privacy regulation support](/prebid-server/features/pbs-privacy.html) diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index e7b35b38a9..5a8d04ccfd 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -37,6 +37,7 @@ title: Prebid Server | Features | [GPP](/prebid-server/features/pbs-privacy.html#gpp) | GPP TCF2/USP Support | PBS reads the Global Privacy Platform string and pulls out TCF2/USP strings when appropriate. | | | | COPPA | Core | Able to read the COPPA flag and [take appropriate enforcement action](https://github.com/prebid/prebid-server/issues/929). | | | | Global Privacy Control | Core | Passes the Sec-GPC header through to bidders. | | | +| Activity Controls | Core | [Account-level controls](/prebid-server/features/pbs-activitycontrols.html) over privacy sensitive activities. | | | | [Cache](/prebid-server/features/pbs-caching.html) | Bids core | Accepts the ext.prebid.cache.bids parameter, storing bid objects in PBC. | | | | Cache | VAST core | Accepts the ext.prebid.cache.vastxml parameter, storing VAST responses in PBC. | | | | Cache | Winning-only flag | Accepts a 'ext.prebid.cache.winningonly' parameter on the request. If true, instead of caching all bids and VAST, only the winning bid or VAST is stored. | | | diff --git a/prebid-server/features/pbs-privacy.md b/prebid-server/features/pbs-privacy.md index be915bd676..a99e20acfb 100644 --- a/prebid-server/features/pbs-privacy.md +++ b/prebid-server/features/pbs-privacy.md @@ -10,6 +10,13 @@ title: Prebid Server | Features | Privacy * TOC {:toc} +## Prebid Server Activity Control Infrastructure + +Prebid Server supports a mechanism for Publisher control for overriding privacy-sensitive activities. See the [Activity Controls](/prebid-server/features/pbs-activitycontrols.html) for more information. + +Note that Activity Controls are currently not well integrated with other privacy features, but that will change as these features mature. + + ## Mobile 'Limit Ad Tracking' flag If PBS receives 'device.lmt' flag in the OpenRTB request, it does the following anonymization: From 2bed132e83de17c5cc95bcebd9149bdceaee4697 Mon Sep 17 00:00:00 2001 From: radubarbos Date: Thu, 1 Jun 2023 22:12:43 +0300 Subject: [PATCH 183/564] ConnectId auto generated puid and storage updates. (#4582) Co-authored-by: dumitrubarbos --- dev-docs/modules/userid-submodules/yahoo.md | 38 +++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/dev-docs/modules/userid-submodules/yahoo.md b/dev-docs/modules/userid-submodules/yahoo.md index 706988b73e..2b034cdaba 100644 --- a/dev-docs/modules/userid-submodules/yahoo.md +++ b/dev-docs/modules/userid-submodules/yahoo.md @@ -27,8 +27,8 @@ Note: Parameters are case-sensitive. ConnectID is the proper name of our product | params | Required | Object | Container of all module params. || | params.pixelId | Required | Number | The Yahoo-supplied publisher-specific pixel ID. | `"0000"` | -| params.he | Optional | String | The SHA-256 hashed user email address which has been lowercased prior to hashing. Pass both `he` and `puid` params if present, otherwise pass either of the two that is available. |`"ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"`| -| params.puid | Optional | String | The publisher supplied user identifier such as a first-party cookie. Pass both `he` and `puid` params if present, otherwise pass either of the two that is available. | `"ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c5880dba3baf9c1da"` | +| params.he | Optional | String | The SHA-256 hashed user email address which has been lowercased prior to hashing. |`"ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"`| +| params.puid | Optional | String | A domain-specific user identifier such as a first-party cookie. If not passed, a puid value will be auto-generated and stored in local and / or cookie storage. | `"ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c5880dba3baf9c1da"` | {: .table .table-bordered .table-striped }
@@ -52,7 +52,7 @@ pbjs.setConfig({ ``` ``` -// [Sample #2]: Using a hashed email and a publisher-supplied user identifier such as a first-party cookie. +// [Sample #2]: Neither a hashed email nor a publisher user identifier is passed. pbjs.setConfig({ userSync: { @@ -60,14 +60,40 @@ pbjs.setConfig({ name: "connectId", params: { pixelId: "0000", - he: "ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4", - puid: "ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c580dba3baf9c1da" } }] } }) ``` +``` +// [Sample #3]: Using a hashed email and a publisher user identifier such as a first-party cookie. + +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "connectId", + params: { + pixelId: "0000", + he: "ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4" + puid: "ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c580dba3baf9c1da" + } + }] + } +}) +``` + +## Implementation Verification +Follow the steps below to check that ConnectIDs are being successfully retrieved and included on ad requests. +1) Open a Prebid-enabled page on the website. +2) Open the browser console and enter pbjs.getUserIds(). +3) Verify connectId is in the list. + - If connectId is not in the list, the correct pixelId parameter is likely not being passed. Verify you are using the correct value provided by Yahoo. Reach out to [connectid.support@yahooinc.com](mailto:connectid.support@yahooinc.com) for assistance. +4) Verify that ConnectID is successfully included in the ad requests. + - Go to the Network tab and search for an ad call event to any of the SSPs that you are using (e.g., “prebid-client”). + - Navigate to the Payload tab. Check that yahoo.com is listed as a source in the user.ext.eids array. +5) Repeat steps 1-4 after an email is provided via login or some other mechanism used to collect user registration on the website. + ## Honoring Privacy Choices Yahoo ConnectID provides multiple mechanisms for users to manage their privacy choices. Users can manage their choices via [ConnectID Control Portal](http://connectid.yahoo.com), on the [Yahoo Privacy Dashboard](https://legal.yahoo.com/us/en/yahoo/privacy/dashboard/index.html) and [NAI’s Audience Matched Opt Out page](https://optout.networkadvertising.org/optout/email). No further actions are required by Publishers as Yahoo will ensure that privacy choices selected by users via one of these methods are honored. We will automatically stop generating ConnectIDs for users who have opted-out. @@ -83,7 +109,7 @@ Please note that the storage related parameters are optional. We recommend that | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | storage | Optional | Object | Defines where and for how long the results of the call to get a user ID will be stored. | | -| storage.type | Optional | String | Defines where the resolved user ID will be stored (either `'cookie'` or `'html5'` local storage).| `'cookie'` | +| storage.type | Optional | String | Defines where the resolved user ID will be stored (either 'cookie' or 'html5' local storage). | `'cookie'` | | storage.name | Optional | String | The name of the cookie or html5 local storage where the resolved user ID will be stored. | `'connectId'` | | storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `15` | {: .table .table-bordered .table-striped } From 289bd141d0c28d8a39174448ef5c7e5926f2fadf Mon Sep 17 00:00:00 2001 From: Aaron Friedman Date: Thu, 1 Jun 2023 16:09:54 -0400 Subject: [PATCH 184/564] FreeWheel SSP Adapter: add bidder params (#4609) Co-authored-by: Aaron Friedman --- dev-docs/bidders/freewheelssp.md | 46 ++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/freewheelssp.md b/dev-docs/bidders/freewheelssp.md index 4b48260e46..fa6bffc5b7 100644 --- a/dev-docs/bidders/freewheelssp.md +++ b/dev-docs/bidders/freewheelssp.md @@ -21,5 +21,47 @@ sidebarType: 1 {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | -|----------|----------|-------------|---------|----------| -| `zoneId` | required | | | `string` | +|----------|----------|-------------------------|--------|----------| +| `zoneId` | required | The zone ID for the ad. | "2003" | `string` | +| `format` | optional | The format to use for displaying the ad. Can be one of the following:
* screen-roll
* intext-roll
* sliderad
* floorad
* expand-banner
* instream
* inbanner
Note: The screen-roll, intext-roll, sliderad and floorad formats are all FreeWheel outstream formats.
Default value: "instream" | "screen-roll" | `string` | +| `bidfloor` | optional | Bid floor price. | 13.2118 | `float` | +| `bidfloorcur` | optional | Bid floor currency. | "USD" | `string` | +| `vastUrlParams` | optional | Add query parameters to the vast request. Should be a single item level JSON.
Works with formats: instream, inbanner | { protocolVersion:'3.0' } | `object` | + +When the following params are used with instream or inbanner formats, they should be included in the `vastUrlParams` object. For other formats, they should be included directly in the `params` object: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-------------------------|--------|----------| +| `soundButton` | optional | If enabled, the sound will be off by default and the user will be able to turn it on/off by clicking on a button. (disabled on iOS devices)
Default value: false | true | `boolean` | +| `defaultMute` | optional | If "soundButton=true" is set, controls if the video will start with the sound muted.
Default value: true | false | `boolean` | +| `timeline` | optional | Display a progress bar to the bottom of the ad unit.
Default value: false | true | `boolean` | +| `protocolVersion` | optional | Specify the VAST version that will be used for the vastVersion parameter value on AdsSetup request.
Default Value: 4.2 | 3 .0 | `float` | +| `onOver` | optional | Allows to enable the sound only when the mouse is over the ad container.
Works with formats: screen-roll, intext-roll, sliderad, floorad, expand-banner
Default value: false | true | `boolean` | +| `closeTimeout` | optional | The duration in milliseconds before displaying the close button.
Works with formats: screen-roll, intext-roll, sliderad, floorad
Default value: 5000 | 2000 | `integer` | +| `animated` | optional | Enable an animation on opening and on closing of the video.
Works with formats: intext-roll, sliderad
Default value: true | false | `boolean` | +| `animationSpeed` | optional | If the animated parameter is set to true, allows to choose the animation speed in milliseconds.
Works with formats: intext-roll, sliderad
Default value: 700 | 500 | `integer` | +| `contentId` | optional | Displays the ad inside the content-id dom element (dom id). Requires an 'auto', 'p' or 'article' param.
Works with format: intext-roll | "element-id" | `string` | +| `auto` | optional | If value is set to "v2", position the intext-roll automatically. If contentId is set, the auto positioning will find a position inside the 'contentId' dom element.
If contentId is not set, the auto positionaing will search the best position to display the ad based on the page semantic. It will select several possible position and show the intext-roll at the time one of them is made visible.
Works with format: intext-roll
Default value: null | "v2" | `string` | +| `article` | optional | Set the location of the ad just after the given article tag in the page (0 is for the first article tag). If content-id is set, the article index is relative to articles inside the 'content-id' dom element | "element-id"
Works with format: intext-roll | `string` | +| `p` | optional | Set the location of the ad just after the given paragraph tag in the page (0 is for the first p tag). If content-id is set, the p index is relative to paragraphs inside the 'content-id' dom element.
Works with format: intext-roll | "element-id" | `string` | +| `iframeMode` | optional | Indicate to intext-roll that it is served in a friendly hidden iframe. Can be one of the following:
* normal - place ad in friendly iframe
* dfp - place ad in iframe on dfp platform
Works with format: intext-roll | "normal" | `string` | +| `inRead` | optional | When true, will keep the ad slot window on the page when the ad is done.
Works with format: intext-roll
Default value: false | true | `boolean` | +| `lang` | optional | Text language. Can be one of: [fr,en,es,it,de,nl,pt]
Works with format: intext-roll
Default value: "fr" | "en" | `string` | +| `openingTime` | optional | The time in milliseconds to display the opening animation.
Works with format: intext-roll
Default value: 0 | 100 | `integer` | +| `pauseRatio` | optional | Specify the viewabilityratio where the ad is paused. This can be a float between 0 and 1, or "never" which means never paused. The default value will pause when the ad has less than 50% viewability.
Works with formats: intext-roll, expand-banner
Default value: 0.5 | 0.9 | `float` \| `string` | +| `closeAction` | optional | Define what to do for the banner after all ads complete. Can be one of:
* collapse - will set the target css display property to "none".
* hide - will leave the target element in place, empty.
Works with formats: intext-roll, expand-banner
Default value: “collapse” | "hide" | `string` | +| `domId` | optional | id of the dom element containing the text. If this targeted div is empty, be sure it has the needed width or a width of 0px will be used. Note that the script tag should be added in the page AFTER the targeted dom element so the target will be ready when the script runs.
Works with formats: intext-roll, expand-banner | "element-id" | `string` | +| `errorAction` | optional | Define what to do for the banner after an ad error. Can be one of:
* collapse - will set the target css display property to "none".
* hide - will leave the target element in place, empty.
Works with formats: intext-roll, expand-banner
Default value: “collapse” | "hide" | `string` | +| `stickToTop` | optional | Controls if the ad will stick to the top of the browser window. Can be one of the following:
* true - The ad will stick to the top of the browser window upon scroll.
* "bottom" - The ad will stick to the top and will be hidden again when reaching the bottom of the page.
* number - The ad will stick to the top for the given distance in pixels.
Works with formats: intext-roll, expand-banner | 300 | `boolean \| string \| number` | +| `blurDisplay` | optional | Allow to choose between too blur effects for the sides of the banner. Can be one of:
* big - will show the blured video only once in the background.
* duplicate - will show the blured video twice: once for each side.
Works with format: expand-banner
Default value: "big" | "duplicate" | `string` | +| `expandDirection` | optional | Allows to force the expansion direction. Can be one of the following:
* before - Expand to the left if the banner is vertical and to the top if the banner is horizontal.
* after - Expand to the right if the banner is vertical and to the bottom if the banner is horizontal.
* center - Expand to left and right if the banner is vertical. Expand to the top and bottom if the banner is horizontal.
* auto - Expand based on the space available on the page. Expand to the left and/or right if the banner is vertical. and expand to the top and bottom if the banner is horizontal, depending on the space available.
* none - Banner will not expand
Works with format: expand-banner
Default value: "auto" | "before" | `string` | +| `zIndex` | optional | Force the z-index value on the ad container. The default value is around 4100 (see IAB guidelines). Use this parameter if it doesn't fit your needs.
Works with format: expand-banner
Default value: ~4100 | 1000 | `integer` | +| `hAlign` | optional | Horizontal side where to display the video. Can be one of:
* left - horizontal align to the left of the page.
* middle - horizontal align to the middle of the page.
* right - horizontal align to the right of the page.
Works with format: sliderad
Default value: "right" | "left" | `string` | +| `hSpacing` | optional | Set a horizontal spacing between the hAlign side and the video.
Works with format: sliderad
Default value: 10 | 20 | `integer` | +| `vAlign` | optional | Vertical side where to display the video. Can be one of:
* top - vertical align to the top of the page.
* middle - vertical align to the middle of the page.
* bottom - vertical align to the bottom of the page.
Works with format: sliderad
Default value: "bottom" | "top" | `string` | +| `vSpacing` | optional | Set a vertical spacing between the vAlign side and the video.
Works with format: sliderad
Default value: 10 | 20 | `integer` | +| `mod` | optional | Ad trigger mode. Can be one of:
* asap - play the ad asap
* click - play the ad when the user clicks a link
* scroll - play the ad when the user scrolls
Works with format: screen-roll
Default value: "asap" | "click" | `string` | +| `opacity` | optional | Define the opacity of the background. This is a number between 0 (completely transparent) and 1 (totally black).
Works with format: screen-roll
Default value: 0.4 | .5 | `float` | +| `smartPlay` | optional | Enable to use autoPlay on mobile devices.
Works with format: screen-roll
Default value: false | true | `boolean` | +| `bannerHeight` | optional | The height in pixel of the bottom banner. The video ad takes this height when its not expanded.
Works with format: floorad
Default value: 250 | 500 | `integer` | From 4336639ef47d99d263d77951d93414bc8b81b625 Mon Sep 17 00:00:00 2001 From: Gena Date: Thu, 1 Jun 2023 23:34:15 +0300 Subject: [PATCH 185/564] SSP Copper6 doc (#4587) * SSP Copper6 doc * add pbs * Update copper6.md neither copper6 nor adtelligent are listed as Prebid.org members. Flipping that flag to false. --------- Co-authored-by: bretg --- dev-docs/bidders/copper6.md | 105 ++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 dev-docs/bidders/copper6.md diff --git a/dev-docs/bidders/copper6.md b/dev-docs/bidders/copper6.md new file mode 100644 index 0000000000..1b03e50189 --- /dev/null +++ b/dev-docs/bidders/copper6.md @@ -0,0 +1,105 @@ +--- +layout: bidder +title: SSP Copper6 +description: SSP Copper6 Bidder Adapter +biddercode: copper6 +aliasCode: adtelligent +media_types: video,banner +gdpr_supported: true +userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId +schain_supported: true +coppa_supported: true +usp_supported: true +safeframes_ok: true +prebid_member: false +pbjs: true +pbs: true +deals_supported: false +sidebarType: 1 +--- + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------|----------|---------------------------------|----------|-----------| +| `aid` | required | The source ID from Copper6 Media. | `12412` | `integer` | + +### Description +Copper6 Media header bidding adapter connects with Copper6 Media demand sources in order to fetch bids. +This adapter provides a solution for accessing Video demand and display demand. + + +### Test Parameters +``` + var adUnits = [ + + // Video instream adUnit + { + code: 'test-div', + mediaTypes: { + video: { + context: 'instream', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: 'copper6', + params: { + aid: 472386 + } + }] + }, + + // Video outstream adUnit + { + code: 'test-div', + mediaTypes: { + video: { + context: 'outstream', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: 'copper6', + params: { + aid: 472386 + } + }] + }, + + // Video ADPOD adUnit + { + code: 'test-div', + sizes: [[640, 480]], + mediaTypes: { + video: { + context: 'adpod', + playerSize: [640, 480] + } + }, + bids: [{ + bidder: 'copper6', + params: { + aid: 472386 + } + }] + }, + + // Banner adUnit + { + code: 'test-div', + mediaTypes:{ + banner:{ + sizes: [[300, 250]] + } + } + bids: [{ + bidder: 'copper6', + params: { + aid: 529814 + } + }] + } + ]; +``` From 26ad317791742ad8245c19e40e677117306737e9 Mon Sep 17 00:00:00 2001 From: Sir-Will Date: Fri, 2 Jun 2023 11:56:33 +0200 Subject: [PATCH 186/564] Auto select modules with URL param (#4542) * Auto select modules with URL param * Update download URL on modules change * Fix prepicks being set to early * setting ID to biddercode * Use element id as module code * Fix module code of "ID Import Library" --------- Co-authored-by: bretg --- dev-docs/modules/idLibrary.md | 2 +- download.md | 79 ++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/dev-docs/modules/idLibrary.md b/dev-docs/modules/idLibrary.md index 5874353f8e..1abb7d4548 100644 --- a/dev-docs/modules/idLibrary.md +++ b/dev-docs/modules/idLibrary.md @@ -3,7 +3,7 @@ layout: page_v2 page_type: module title: ID Import Library description: Retrieve user ids deployed on your site, and return them to a configurable endpoint for ID Graphing. -module_code : currency +module_code : idImportLibrary display_name : ID Import Library enable_download : true sidebarType : 1 diff --git a/download.md b/download.md index 2728e6f03d..084b55b3fd 100644 --- a/download.md +++ b/download.md @@ -35,6 +35,8 @@ a.tip:hover span { diff --git a/adops/adops-general-sbs.md b/adops/adops-general-sbs.md index 80ed48e50b..47003d7f2c 100644 --- a/adops/adops-general-sbs.md +++ b/adops/adops-general-sbs.md @@ -17,10 +17,10 @@ sidebarType: 3 Prebid.org provides step-by-step instructions for manually configuring Prebid in the following ad servers: -- [Google Ad Manager](/adops/step-by-step.html) -- [Xandr Monetize Ad Server](/adops/setting-up-prebid-with-the-appnexus-ad-server.html) -- [Freewheel](/adops/setting-up-prebid-video-in-freewheel.html) -- [Smart Ad Server](/adops/setting-up-prebidjs-with-Smart-Ad-Server.html) +* [Google Ad Manager](/adops/step-by-step.html) +* [Xandr Monetize Ad Server](/adops/setting-up-prebid-with-the-appnexus-ad-server.html) +* [Freewheel](/adops/setting-up-prebid-video-in-freewheel.html) +* [Smart Ad Server](/adops/setting-up-prebidjs-with-Smart-Ad-Server.html) If you’re using a different ad server, you can use the general instructions provided here and adapt them to your ad server. @@ -40,8 +40,8 @@ For the purposes of this discussion, we’re going to refer to the elements in y Ad servers typically work in a hierarchical structure, with advertisers containing orders, which in turn contain line items. You need to have your advertisers and orders set up before you can start creating line items and creatives. The advertisers you create for Prebid will typically depend on whether you’re sending all bids or only the top price bid to the ad server. -- Send Top Bid: Create one general Prebid advertiser -- Send All Bids: Create one Prebid advertiser per bidder where orders are organized by bidder, with one or more orders containing line items targeted towards a single bidder. +* Send Top Bid: Create one general Prebid advertiser +* Send All Bids: Create one Prebid advertiser per bidder where orders are organized by bidder, with one or more orders containing line items targeted towards a single bidder. ### Create Native Template @@ -58,12 +58,12 @@ See [Key Values](/adops/key-values.html) for information on the keys you’ll ne The exact order of the following steps will differ depending on your ad server. ### General Settings - + 1. Enter a name for your line item. Suggested format: Prebid – format - bidder – price bucket. For example, `Prebid – banner - BidderA – 1.50`. 2. Set the priority of your line item to whatever you think is appropriate. Typically Prebid line items are prioritized below direct-sold but above house/remnant. 3. Enter the sizes of your creatives: -- Banner/Outstream/AMP/Video: Select the sizes of all ad slots included in the Prebid process. -- Native: Select a native template. + * Banner/Outstream/AMP/Video: Select the sizes of all ad slots included in the Prebid process. + * Native: Select a native template. 4. Long-Form (OTT) Video only: If you’re using competitive exclusions, fill in the associated field with the appropriate value. You’ll need to include this value when you set your targeting for the `hb_pb_cat_dur` key. See [Targeting](#targeting) below for more information. 5. Set your line item to start immediately, with no end date. @@ -72,16 +72,16 @@ If you’re using competitive exclusions, fill in the associated field with the ### Targeting -You’ll need to apply custom targeting specific to the Prebid values that are passed in with the ad request. - +You’ll need to apply custom targeting specific to the Prebid values that are passed in with the ad request. + {: .alert.alert-info :} These instructions assume you’re sending all bids to the ad server (the default). If you’re sending only the top price bid, your targeting keys will not include the bidder code. For example, rather than targeting price buckets with `hb_pb_BidderA`, you’ll target `hb_pb`. See [Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) for more information. Target the price bucket key: `hb_pb_BIDDERCODE` (where BIDDERCODE is the actual code for your bidder, such as BidderA) with the value of the price bucket you entered as the price for this line item. The following additional keys must be added for the corresponding formats: - -**Banner/Outstream/Native:** + +**Banner/Outstream/Native:** You can use the same line item for banner, outstream, and/or native creatives. If your ad slot could be filled by two or more of these formats, you should include the hb_format_BIDDERCODE key with values specifying all expected formats. @@ -90,16 +90,16 @@ If you combine native with another format in a single line item, you’ll need t **In-Player and Outstream Video:** -Both in-player (instream) and outstream video ads receive the `hb_format_BIDDERCODE=video` key-value pair, so targeting on that key alone is not enough to choose the correct line items. If you're running both in-player and outstream video ads, they will most likely be separate line items, so you will need to target outstream line items to a “display” inventory type, or perhaps separate them by adunits. +Both in-player (instream) and outstream video ads receive the `hb_format_BIDDERCODE=video` key-value pair, so targeting on that key alone is not enough to choose the correct line items. If you're running both in-player and outstream video ads, they will most likely be separate line items, so you will need to target outstream line items to a “display” inventory type, or perhaps separate them by adunits. **Long-Form (OTT) Video:** - + For long-form video the custom key `hb_pb_cat_dur_BIDDERCODE` is required. The value of this key breaks down like this: -- _pb represents the price bucket. This is the currency amount entered as the line item price. -- _cat indicates the competitive exclusion industry code. (For engineering information, refer to the [Category Translation module](/dev-docs/modules/categoryTranslation.html)). This is the value entered as the competitive exclusion. If you are not using competitive exclusion, you can omit this portion of the value. -- _dur is the length of the video in seconds. This is the value you’ll enter as the maximum duration of the video. - +* _pb represents the price bucket. This is the currency amount entered as the line item price. +* _cat indicates the competitive exclusion industry code. (For engineering information, refer to the [Category Translation module](/dev-docs/modules/categoryTranslation.html)). This is the value entered as the competitive exclusion. If you are not using competitive exclusion, you can omit this portion of the value. +* _dur is the length of the video in seconds. This is the value you’ll enter as the maximum duration of the video. + For example, for a line item with a $10.00 CPM as the price, a competitive exclusion of “news”, and 30s entered for the video duration, you would enter the following in the custom key-value field: `hb_pb_cat_dur_BIDDERCODE = 10.00_news_30s`. If you’re not using competitive exclusion, you can have a value such as this: `hb_pb_cat_dur_BIDDERCODE = 10.00_30s`. {: .alert.alert-info :} @@ -118,19 +118,19 @@ You’ve now added all fields required for targeting Prebid line items. You can ## Create Your Creatives -The process of creating your creatives will differ based on the type of creative. +The process of creating your creatives will differ based on the type of creative. In general, you can interpret the instructions for setting up creatives in Google Ad Manager with some modifications; specifically, to the MACROs used in the ad tag. (See below for details.) Refer to the following for GAM documentation: -- [GAM Creative Setup: Banner/Outstream/AMP](/adops/gam-creative-banner-sbs.html) -- [GAM Creative Setup: Native](/adops/gam-native.html) -- [GAM Creative Setup: Video](/adops/setting-up-prebid-video-in-dfp.html) +* [GAM Creative Setup: Banner/Outstream/AMP](/adops/gam-creative-banner-sbs.html) +* [GAM Creative Setup: Native](/adops/gam-native.html) +* [GAM Creative Setup: Video](/adops/setting-up-prebid-video-in-dfp.html) We recommend using the [Prebid Universal Creative](/overview/prebid-universal-creative.html) and targeting an ad unit size of 1x1. If you’re working with banner or outstream creatives, the HTML you’ll enter in the creatives will be similar to the following (utilizing whatever macro format is supported by your ad server): -``` +```html ``` {: .alert.alert-warning :} -- Replace `%%MACRO%%` with the appropriate macro for your ad server. (Refer to your ad server’s documentation or consult with a representative for specific details regarding the proper macros and how to use them.) -- Replace BIDDERCODE with the appropriate code for the bidder your line item is targeting. For example, if you’re targeting BidderA, the macro variable for adId might look like `ucTagData.adId = "%%PATTERN:hb_adid_BidderA%%";`. -- If you're hosting your own Prebid Universal Creative, make sure it's version 1.15 or later, or replace `%%PATTERN:hb_format%%.js` with `creative.js`. + +* Replace `%%MACRO%%` with the appropriate macro for your ad server. (Refer to your ad server’s documentation or consult with a representative for specific details regarding the proper macros and how to use them.) +* Replace BIDDERCODE with the appropriate code for the bidder your line item is targeting. For example, if you’re targeting BidderA, the macro variable for adId might look like `ucTagData.adId = "%%PATTERN:hb_adid_BidderA%%";`. +* If you're hosting your own Prebid Universal Creative, make sure it's version 1.15 or later, or replace `%%PATTERN:hb_format%%.js` with `creative.js`. The example above uses the jsdelvr CDN as the domain from which the creative will serve. However, you may obtain the creative from a managed service or host it yourself. You might need to edit the creative and make adjustments to your creative settings depending on the CDN you're using. @@ -169,6 +170,6 @@ The final steps in configuring Prebid on your ad server are to do the following: ## Further Reading -- [Ad Ops Planning Guide](/adops/adops-planning-guide.html) -- [Ad Ops and Prebid Overview](/adops/before-you-start.html) - +* [Ad Ops Planning Guide](/adops/adops-planning-guide.html) +* [Ad Ops and Prebid Overview](/adops/before-you-start.html) + \ No newline at end of file diff --git a/adops/gam-creative-banner-sbs.md b/adops/gam-creative-banner-sbs.md index 796234ee8a..a2ee3cef86 100644 --- a/adops/gam-creative-banner-sbs.md +++ b/adops/gam-creative-banner-sbs.md @@ -15,7 +15,6 @@ This page walks you through the steps required to create banner and outstream cr {: .alert.alert-success :} For complete instructions on setting up Prebid line items in Google Ad Manager, see [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html). - 1. In GAM, select **Delivery** > **Creatives**. 2. Under the **Display creatives** tab, click **New Creative**. 3. Select your advertiser, then click **Third party**. @@ -42,28 +41,28 @@ These instructions assume you're using the Prebid Universal Creative (PUC) after {: .alert.alert-warning :} Be sure to replace BIDDERCODE with the appropriate bidder. For example, if the bidder code is `PBbidder`, the `adid` would be `%%PATTERN:hb_adid_PBbidder%%`. -``` - - +```html + + ``` {: .alert.alert-danger :} @@ -73,7 +72,7 @@ Warning: Be sure none of the attribute names are longer than 20 characters. See In top-price mode, you can make use of the GAM `TARGETINGMAP` feature instead of listing out each attribute. -``` +```html -{% endhighlight %} +``` {: .alert.alert-warning :} **Creative Expiration** @@ -107,7 +106,6 @@ Note that creatives are automatically marked as inactive by the Xandr systems af **SafeFrame** If you want your creative to serve into a SafeFrame, this will need to be enabled on the site-side of the Prebid.js implementation rather than as a setting in the ad server. A developer can learn how to enable this setting for the publisher by referencing [Using Prebid.js with Xandr Publisher Ad Server]({{site.github.url}}/dev-docs/examples/use-prebid-with-appnexus-ad-server.html). Additionally if the Xandr ad server tags are configured to use SafeFrames, you **will** need to use the above creative template to properly render the creative. Earlier versions of the Prebid.js creative template may not be fully SafeFrame compliant (if they are still in-use from older setups), so it is recommended to switch to the above template in this scenario. - ## Step 3. Set up Line Items You'll need to create one line item for every price bucket you intend to serve. @@ -116,17 +114,17 @@ For example, if you want to have $0.10 price granularity, you'll need 201 line i For each line item, follow the line item setup instructions in [Create a Line Item](https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/create-a-standard-line-item.html), with the following settings: -- Set the **Revenue Type** to *CPM*. +* Set the **Revenue Type** to *CPM*. -- Set the **Revenue Value** to one of the price bucket key-values from Step 1, e.g., \$0.2. +* Set the **Revenue Value** to one of the price bucket key-values from Step 1, e.g., \$0.2. -- Under **Associated Creatives**, choose to manage creatives at the line item level. +* Under **Associated Creatives**, choose to manage creatives at the line item level. -- Associate as many creative sizes with the line item as you need. Set the **Creative Rotation** to *Even*. +* Associate as many creative sizes with the line item as you need. Set the **Creative Rotation** to *Even*. -- In your line item's targeting settings, use the key-value that matches the line item's price bucket, e.g. (you set these up in Step 1). +* In your line item's targeting settings, use the key-value that matches the line item's price bucket, e.g. (you set these up in Step 1). -- Still in the targeting settings, target the custom category `prebid_enabled`. This will allow you to turn targeting on and off for a placement (or an entire placement group) by adding it to the custom category, which you'll do in one of the later steps. This is useful for troubleshooting. +* Still in the targeting settings, target the custom category `prebid_enabled`. This will allow you to turn targeting on and off for a placement (or an entire placement group) by adding it to the custom category, which you'll do in one of the later steps. This is useful for troubleshooting. For more information about targeting custom content categories, see [Content Category Targeting](https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/content-category-targeting.html). @@ -148,7 +146,7 @@ It will also make it easy to turn the targeting on and off for a given placement ## Related Topics -- [Ad Ops and Prebid](/adops/before-you-start.html) -- [Ad Ops Planning Guide](/adops/adops-planning-guide.html) -- [Getting Started with Prebid.js for Developers](/dev-docs/getting-started.html) -- [Using Prebid.js with Xandr Publisher Ad Server](/dev-docs/examples/use-prebid-with-appnexus-ad-server.html) (Developer example) +* [Ad Ops and Prebid](/adops/before-you-start.html) +* [Ad Ops Planning Guide](/adops/adops-planning-guide.html) +* [Getting Started with Prebid.js for Developers](/dev-docs/getting-started.html) +* [Using Prebid.js with Xandr Publisher Ad Server](/dev-docs/examples/use-prebid-with-appnexus-ad-server.html) (Developer example) diff --git a/assets/css/prism.css b/assets/css/prism.css index 7375d36283..010c4405ba 100644 --- a/assets/css/prism.css +++ b/assets/css/prism.css @@ -8,79 +8,79 @@ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javasc code[class*="language-"], pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; + text-shadow: none; + background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; + text-shadow: none; + background: #b3d4fc; } @media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } } /* Code blocks */ pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; + padding: 1em; + margin: .5em 0; + overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { - background: #f5f2f0; + background: #f5f2f0; } /* Inline code */ :not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; + padding: .1em; + border-radius: .3em; + white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { - color: slategray; + color: slategray; } .token.punctuation { - color: #999; + color: #999; } .namespace { - opacity: .7; + opacity: .7; } .token.property, @@ -90,7 +90,7 @@ pre[class*="language-"] { .token.constant, .token.symbol, .token.deleted { - color: #905; + color: #905; } .token.selector, @@ -99,7 +99,7 @@ pre[class*="language-"] { .token.char, .token.builtin, .token.inserted { - color: #690; + color: #690; } .token.operator, @@ -107,36 +107,36 @@ pre[class*="language-"] { .token.url, .language-css .token.string, .style .token.string { - color: #9a6e3a; - background: hsla(0, 0%, 100%, .5); + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); } .token.atrule, .token.attr-value, .token.keyword { - color: #07a; + color: #07a; } .token.function, .token.class-name { - color: #DD4A68; + color: #DD4A68; } .token.regex, .token.important, .token.variable { - color: #e90; + color: #e90; } .token.important, .token.bold { - font-weight: bold; + font-weight: bold; } .token.italic { - font-style: italic; + font-style: italic; } .token.entity { - cursor: help; + cursor: help; } diff --git a/assets/css/style.css b/assets/css/style.css index 0af6a31a4c..7f63345730 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -37,12 +37,12 @@ h4 { /* Paragraph & Typographic */ p { - line-height: 28px; - margin-bottom: 25px; - font-family: 'Lato', sans-serif; - color: #222222; - font-size: 18px; - font-weight: 400;} + line-height: 28px; + margin-bottom: 25px; + font-family: 'Lato', sans-serif; + color: #222222; + font-size: 18px; + font-weight: 400;} .centered { text-align: center; @@ -130,228 +130,228 @@ hr { } .wrapper { - display: flex; - width: 100%; - align-items: stretch; + display: flex; + width: 100%; + align-items: stretch; } /* alerts */ .pb-alert { - padding:10px; - width:65wv; - margin: 10px 0; + padding:10px; + width:65wv; + margin: 10px 0; } .pb-alert-note { - background-color: #deecf7; - color: #4b6f8d; - border: 1px solid #4b6f8d; + background-color: #deecf7; + color: #4b6f8d; + border: 1px solid #4b6f8d; } .pb-alert-warning { - background-color: #f3ddde; - color: #a94443; - border: 1px solid #a94443; + background-color: #f3ddde; + color: #a94443; + border: 1px solid #a94443; } .pb-alert-important { - background-color: #ede5ba; - color: #85720f; - border: 1px solid #85720f; + background-color: #ede5ba; + color: #85720f; + border: 1px solid #85720f; } .pb-alert-tip { - background-color: #e3efd8; - color: #527542; - border: 1px solid #527542; + background-color: #e3efd8; + color: #527542; + border: 1px solid #527542; } /********************** - API + API *********************/ .pb-api-on { - display: block; + display: block; } .pb-api-off { - display: none; + display: none; } .pb-api-list ul { - list-style-type: none; - margin: 0; - padding: 0; - overflow: hidden; + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; } .pb-api-list-item li { - border-bottom: 1px solid #cccccc; - border-bottom-width: 75%; - background-color:transparent; - margin-bottom: 10px; + border-bottom: 1px solid #cccccc; + border-bottom-width: 75%; + background-color:transparent; + margin-bottom: 10px; } .pb-api-list-item-sans-border li { - background-color:transparent; - margin-bottom: 10px; + background-color:transparent; + margin-bottom: 10px; } .pb-api-categories { - margin-top:15px; + margin-top:15px; } .pb-api-categories li { - float: left; - margin-right: 15px; - background-color: #eeeeee; + float: left; + margin-right: 15px; + background-color: #eeeeee; } .pb-api-categories a { - color: #333333; - font-family: 'Verdana', sans-serif; - font-size: 17px; - font-weight: 400; - padding: 4px 10px; + color: #333333; + font-family: 'Verdana', sans-serif; + font-size: 17px; + font-weight: 400; + padding: 4px 10px; } .pb-api-categories a:hover { - color: #3498db; + color: #3498db; } .pb-api-search { - float:right; - margin-right: 30px; + float:right; + margin-right: 30px; } .pb-api-title { - color: #EA9622; - font-family: 'Verdana', sans-serif; - font-size: 22px; - font-weight: 400; - margin-bottom: 10px; - margin-top: 15px; + color: #EA9622; + font-family: 'Verdana', sans-serif; + font-size: 22px; + font-weight: 400; + margin-bottom: 10px; + margin-top: 15px; } .pb-api-code { - margin: 20px 0 20px 20px; + margin: 20px 0 20px 20px; } .pb-api-code-wrapper { - margin-left: 20px; + margin-left: 20px; } .pb-api-code-display { - margin: 20px 0 0 20px; - width: 70%; + margin: 20px 0 0 20px; + width: 70%; } .pb-api-code-block { - width: 70%; - backgeound-color: #333333; + width: 70%; + backgeound-color: #333333; } .pb-api-block { - margin: 20px 0 20px 20px; + margin: 20px 0 20px 20px; } .pb-api-doc-title { - color: #EA9622; - font-family: 'Verdana', sans-serif; - font-size: 20px; - font-weight: 400; - margin-bottom: 10px; + color: #EA9622; + font-family: 'Verdana', sans-serif; + font-size: 20px; + font-weight: 400; + margin-bottom: 10px; } .pb-api-doc-description { - color: #222222; - font-size: 16px; - font-family: 'Roboto', sans-serif; - font-weight: 300; - margin-bottom:10px; + color: #222222; + font-size: 16px; + font-family: 'Roboto', sans-serif; + font-weight: 300; + margin-bottom:10px; } .pb-api-doc-description ul, ol { - font-size: 15px; + font-size: 15px; } .pb-api-code-title-bar { - background-color: #E4E8ED; - text-align: left; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - padding-left: 5px; - margin-left: 20px; - margin-top: 10px; + background-color: #E4E8ED; + text-align: left; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + padding-left: 5px; + margin-left: 20px; + margin-top: 10px; } .pb-api-doc-sub-title { - color: #EA9622; - font-family: 'Verdana', sans-serif; - font-size: 17px; - font-weight: 400; - margin: 15px 0; + color: #EA9622; + font-family: 'Verdana', sans-serif; + font-size: 17px; + font-weight: 400; + margin: 15px 0; } .pb-api-doc-section-title { - font-size: 17px; - font-weight: 400; - color: #333333; - margin:15px 0; + font-size: 17px; + font-weight: 400; + color: #333333; + margin:15px 0; } .pb-api-list-item-description { - margin-top 5px; - font-size:17px; + margin-top 5px; + font-size:17px; } .pb-api-table { - margin-top: 20px; - width:70%; + margin-top: 20px; + width:70%; } .pb-api-table-title { - color: #333333; - font-family: 'Verdana', sans-serif; - font-size: 17px; - font-weight: 400; - text-align: center; - background-color: #aaaaaa; - border-top-left-radius: 5px; - border-top-right-radius: 5px; + color: #333333; + font-family: 'Verdana', sans-serif; + font-size: 17px; + font-weight: 400; + text-align: center; + background-color: #aaaaaa; + border-top-left-radius: 5px; + border-top-right-radius: 5px; } .pb-api-table-text { - color: #222222; - font-size: 16px; - font-family: 'Roboto', sans-serif; - font-weight: 300; + color: #222222; + font-size: 16px; + font-family: 'Roboto', sans-serif; + font-weight: 300; } .pb-api-spacing { - margin-top: 25px; + margin-top: 25px; } .pb-api-alert { - font-size:15px; + font-size:15px; } .pb-api-button { - width: 120px; - height: 30px; - background-color: #cccccc; - border: 1px solid #333333; - color: #33333; - font-size: 15px; - font-family: 'Roboto', sans-serif; - font-weight: 400; + width: 120px; + height: 30px; + background-color: #cccccc; + border: 1px solid #333333; + color: #33333; + font-size: 15px; + font-family: 'Roboto', sans-serif; + font-weight: 400; } @@ -393,17 +393,17 @@ hr { /* API */ .categoryBox { - background-color: #f3ddde; - color: #a94443; - border: 1px solid #a94443; + background-color: #f3ddde; + color: #a94443; + border: 1px solid #a94443; } /* NavBar */ .navbar { - z-index:100 - font-family: 'Roboto', sans-serif; + z-index:100 + font-family: 'Roboto', sans-serif; } .navbar-default { @@ -428,63 +428,63 @@ hr { } .navbar-brand img { - max-width: 200px; - max-height: 35px; + max-width: 200px; + max-height: 35px; } .navbar-brand{ - float:left; - height:50px; - padding:10px 15px; - font-size:18px; - line-height:20px + float:left; + height:50px; + padding:10px 15px; + font-size:18px; + line-height:20px } .pb-mobile-nav { - display: none; + display: none; } .pb-mobile-dropdown-header { - font-size: 13px; - font-weight: 500; - color: #3498db; + font-size: 13px; + font-weight: 500; + color: #3498db; } .pb-mobile-dropdown-item { - font-size: 13px; - font-weight: 400; + font-size: 13px; + font-weight: 400; } .navbar-default .navbar-nav > li > a.pb-mobile-dropdown { - font-size:13px; - margin:0; - padding-left:5px; - padding-top:2px; - padding-bottom:2px; + font-size:13px; + margin:0; + padding-left:5px; + padding-top:2px; + padding-bottom:2px; } .pb_menu_btn { - display: none; - float:left; - margin-right: 5px; - margin-top: 10px; + display: none; + float:left; + margin-right: 5px; + margin-top: 10px; } .pb-video-list-title { - margin-top: 15px; - font-weight: 700; + margin-top: 15px; + font-weight: 700; } .pb-video-list { - margin-top: 5px; - padding-top: 0; - list-style-type:none; - font-weight:400; + margin-top: 5px; + padding-top: 0; + list-style-type:none; + font-weight:400; } .pb-video-link { - font-weight: 400; + font-weight: 400; } /* DropDown*/ @@ -495,11 +495,11 @@ hr { } .dropdown-toggle { - font-weight: 400; + font-weight: 400; } .dropdown-menu>li>a { - font-weight: 400; + font-weight: 400; } .dropdown-submenu { @@ -534,23 +534,23 @@ hr { /* 404 error */ .error404 { - width:100%; - height: 100%; - text-align: center; - margin-top: 100px; + width:100%; + height: 100%; + text-align: center; + margin-top: 100px; } .error404 h1 { - color: #FF0000; - font-size: 60px; - font-weight: bold; + color: #FF0000; + font-size: 60px; + font-weight: bold; } /************** - Sidebar + Sidebar **************/ /* side bar */ @@ -570,62 +570,62 @@ hr { .sidebar { - min-width: 300px; - background-color: #f6f8fa; - padding-left: 50px; - padding-top: 20px; - padding-bottom: 10px; - padding-right:30px; - margin-left: 0px; - font-family: 'Verdana', sans-serif; + min-width: 300px; + background-color: #f6f8fa; + padding-left: 50px; + padding-top: 20px; + padding-bottom: 10px; + padding-right:30px; + margin-left: 0px; + font-family: 'Verdana', sans-serif; } .sidebar ul { - color: #333333; + color: #333333; } .pb-section-title { - display: inline-block; - font-size:17px; - padding-bottom: 10px; - margin-top:5px; - margin-bottom: 5px; - color: #3498db; + display: inline-block; + font-size:17px; + padding-bottom: 10px; + margin-top:5px; + margin-bottom: 5px; + color: #3498db; } .pb-section-subtitle { - font-size:16px; - padding-bottom: 10px; - margin-top:5px; - margin-bottom: 5px; + font-size:16px; + padding-bottom: 10px; + margin-top:5px; + margin-bottom: 5px; } .pb-nav-item { - display:inline-block; - font-size:14px; - padding-left: 5px; + display:inline-block; + font-size:14px; + padding-left: 5px; } .pb-first-item { - padding-top: 10px; + padding-top: 10px; } .pb-last-item { - padding-bottom: 10px; + padding-bottom: 10px; } .list-group-item-header { - font-weight: 400; - font-size: 20px; + font-weight: 400; + font-size: 20px; } .list-group-item { - font-weight: 400; - margin:0; - padding: 3px 0 3px 5px; - border-width:0; - font-size: 16px; - background-color: transparent; + font-weight: 400; + margin:0; + padding: 3px 0 3px 5px; + border-width:0; + font-size: 16px; + background-color: transparent; } @@ -650,65 +650,65 @@ pre { /************* Home Page ************/ .pb-homepage { - position: relative; - margin-top:70px; - width:100%; - height: 90%; + position: relative; + margin-top:70px; + width:100%; + height: 90%; } .pb-homepage-container { - text-align: center; + text-align: center; } .pb-message-box { - display: inline-block; - width: 70%; - border: 1px solid gray; - border-radius: 50px; - font-family: 'Roboto', sans-serif; - font-size: 16px; - padding: 4px; + display: inline-block; + width: 70%; + border: 1px solid gray; + border-radius: 50px; + font-family: 'Roboto', sans-serif; + font-size: 16px; + padding: 4px; } .pb-message-box a:link { - color: #dd9e21; + color: #dd9e21; } .pb-message-box a:hover { - color: #855a09; + color: #855a09; } .pb-message-box a:visited { - color: #1689db; + color: #1689db; } .pb-align-left { - text-align: start; + text-align: start; } .pb-align-right { - text-align: right; + text-align: right; } .pb-margin-top { - margin-top:20px; + margin-top:20px; } .pb-outline { - border: 1px dashed purple; + border: 1px dashed purple; } .pb-rule { - padding-top: 10px; + padding-top: 10px; } .pb-link-title { - font-family: 'Roboto', sans-serif; - font-weight: 700; - padding-top: 5px; - padding-bottom: 10px; - border-bottom-left-radius: 20px; - border-bottom-right-radius: 20px; + font-family: 'Roboto', sans-serif; + font-weight: 700; + padding-top: 5px; + padding-bottom: 10px; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; } @@ -717,295 +717,295 @@ pre { /**********Container****************/ .pb-container { - width:75%; - margin-left:auto; - margin-right:auto; + width:75%; + margin-left:auto; + margin-right:auto; } .pb-outer { - width:100%; - padding-top:25%; - position:relative + width:100%; + padding-top:25%; + position:relative } .pb-inner { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; } /*************Hover Effect***************/ .pb-home-links { - width: 75%; - font-family: 'Verdana', sans-serif; - margin-left:auto; - margin-right:auto; + width: 75%; + font-family: 'Verdana', sans-serif; + margin-left:auto; + margin-right:auto; } .pb-home-links-panel { - float:left; - margin-left:auto; - margin-right: auto; - width: 33%; - height: 100%; - text-align: center; + float:left; + margin-left:auto; + margin-right: auto; + width: 33%; + height: 100%; + text-align: center; } .pb-home-links-panel img { - display: inline-block; - width: 60%; - height: 60%; + display: inline-block; + width: 60%; + height: 60%; } .pb-home-links-outer-panel { - float:left; - margin-top:40px; - margin-left:auto; - margin-right: auto; - width: 33%; - height: 100%; - text-align: center; + float:left; + margin-top:40px; + margin-left:auto; + margin-right: auto; + width: 33%; + height: 100%; + text-align: center; } .pb-home-links-outer-panel img { - display: inline-block; - width: 50%; - height: 50%; + display: inline-block; + width: 50%; + height: 50%; } .pb-home-links-panel p { - margin-top:0px; + margin-top:0px; } .pb-panel-title { - display: block; - font-size:35px; - color: #ffffff; - margin-top: 30px; + display: block; + font-size:35px; + color: #ffffff; + margin-top: 30px; } .pb-center-title { - font-size:35px; - color: #ffffff; - margin-top: 20px; + font-size:35px; + color: #ffffff; + margin-top: 20px; } .pb-home-link-container:hover .pb-home-link-visible { - display: none; + display: none; } .pb-home-link-container:hover .pb-home-link-hidden { - display: block; + display: block; } .pb-home-link-hidden { - display:none; + display:none; } .pb-lg-homelink { - width: 40%; - height: 40%; + width: 40%; + height: 40%; } .pb-md-honelink { - width:30%; - height:3 0%; + width:30%; + height:3 0%; } /**********Message****************/ .pb-message-container { - margin-top: 140px; - width:75%; - margin-left:auto; - margin-right:auto; - text-align: center; + margin-top: 140px; + width:75%; + margin-left:auto; + margin-right:auto; + text-align: center; } .pb-message { - display: inline-block; - margin-left: auto; - margin-right: auto; - width: 100%; - background-color: white; - opacity: .8; - text-align: center; - padding: 5px; + display: inline-block; + margin-left: auto; + margin-right: auto; + width: 100%; + background-color: white; + opacity: .8; + text-align: center; + padding: 5px; } .pb--empty-message { - display: inline-block; - margin-left: auto; - margin-right: auto; - width: 100%; - opacity: .8; - text-align: center; - padding: 5px; + display: inline-block; + margin-left: auto; + margin-right: auto; + width: 100%; + opacity: .8; + text-align: center; + padding: 5px; } .pb-message > h3 { - color: #333333; - font-size:1.7vw; - font-family: 'Roboto', sans-serif; - margin-right: auto; - margin-left: auto; + color: #333333; + font-size:1.7vw; + font-family: 'Roboto', sans-serif; + margin-right: auto; + margin-left: auto; } /*===========Benefits===================*/ .pb_benefits { - background-color: #ffffff; - width: 80%; - padding-bottom: 40px; - margin-top:260px; - margin-left: auto; - margin-right: auto; - opacity:.80; - overflow:hidden; + background-color: #ffffff; + width: 80%; + padding-bottom: 40px; + margin-top:260px; + margin-left: auto; + margin-right: auto; + opacity:.80; + overflow:hidden; } .pb-benefits-title { - text-align: center; - padding-top:5px; - padding-bottom:5px; + text-align: center; + padding-top:5px; + padding-bottom:5px; } .pb-benefits-title > h2 { - font-family: 'Roboto', sans-serif; - color: #47547c; - font-size:3.5vw; - font-weight: 400; + font-family: 'Roboto', sans-serif; + color: #47547c; + font-size:3.5vw; + font-weight: 400; } .pb-benefits-container { - width: 100%; - height: 100%; + width: 100%; + height: 100%; } .pb-benefits-row { - display: inline-block; - width:100%; - height: 42%; + display: inline-block; + width:100%; + height: 42%; } .pb-benefits-panel { - width:100%; - height:100%; - margin-top:100px; + width:100%; + height:100%; + margin-top:100px; } .pb-benefits-panel-left { - float:left; - width:50%; + float:left; + width:50%; } .pb-benefits-panel-right { - float:right; - width:50%; - padding-right: 5%; + float:right; + width:50%; + padding-right: 5%; } .pb-benefits-panel-img { - float: left; - height: 100%; - width:30%; - text-align:right; - padding-right:10px; + float: left; + height: 100%; + width:30%; + text-align:right; + padding-right:10px; } .pb-benefits-panel-img > img { - max-width:60%; - max-height:60%; + max-width:60%; + max-height:60%; } .pb-benefits-panel-content { - float:right; - height: 100%; - width:70%; + float:right; + height: 100%; + width:70%; } .pb-benefits-panel-content-title { - font-family: 'Roboto', sans-serif; - color: #47547c; - font-size:2.5vw; - font-weight: 400; + font-family: 'Roboto', sans-serif; + color: #47547c; + font-size:2.5vw; + font-weight: 400; } .pb-benefits-panel-content-text { - font-family: 'Lato', sans-serif; - color: #47547c; - font-size:1.7vw; - font-weight: 400; + font-family: 'Lato', sans-serif; + color: #47547c; + font-size:1.7vw; + font-weight: 400; } /************ Carousel ****************/ .pb_home_belowfold_carousel { - border-top-left-radius: 12px; - border-top-right-radius: 12px; - padding-top: 20px; - text-align:center; + border-top-left-radius: 12px; + border-top-right-radius: 12px; + padding-top: 20px; + text-align:center; } .pb_carousel_title { - margin-top:100px; - margin-bottom:50px; - margin-left:auto; - margin-right:auto; - padding-bottom: 10px; - color: #ffffff; - font-family: 'Roboto', sans-serif; - font-size: 4vw; - font-weight: 700; + margin-top:100px; + margin-bottom:50px; + margin-left:auto; + margin-right:auto; + padding-bottom: 10px; + color: #ffffff; + font-family: 'Roboto', sans-serif; + font-size: 4vw; + font-weight: 700; } .carousel-item > h3 { - font-family: 'Roboto', sans-serif; - font-size: 2.4vw; - padding-top: 5px; - padding-bottom:3px; - border-top-left-radius: 12px; - border-top-right-radius: 12px; - background-color: #47547c; - color: #ffffff; - margin:0; + font-family: 'Roboto', sans-serif; + font-size: 2.4vw; + padding-top: 5px; + padding-bottom:3px; + border-top-left-radius: 12px; + border-top-right-radius: 12px; + background-color: #47547c; + color: #ffffff; + margin:0; } .carousel-item > h4 { - font-family: 'Lato', sans-serif; - font-size: 1.7vw; - color: #47547c; - padding-left: 10px; - padding-right: 10px; + font-family: 'Lato', sans-serif; + font-size: 1.7vw; + color: #47547c; + padding-left: 10px; + padding-right: 10px; } .slide { - background-color: #ffffff; - width: 70%; - height:250px; - margin-left: auto; - margin-right: auto; - border-top-left-radius: 12px; - border-top-right-radius: 12px; + background-color: #ffffff; + width: 70%; + height:250px; + margin-left: auto; + margin-right: auto; + border-top-left-radius: 12px; + border-top-right-radius: 12px; } .item { - text-align: center; + text-align: center; } .pb_carousel_indicators { - margin-top: 150px; + margin-top: 150px; } @@ -1106,58 +1106,58 @@ pre { /************ Partners ****************/ .partners { - text-align: center; + text-align: center; } .partners div.title { - width:100%; - padding-top: 30px; + width:100%; + padding-top: 30px; } .partners div.tableTitle { - width:100%; - padding-top: 30px; - padding-bottom: 30px; + width:100%; + padding-top: 30px; + padding-bottom: 30px; } .partners h3 { - margin:0; - padding: 0; - font-size:large; + margin:0; + padding: 0; + font-size:large; } .partners img.founders { - width: 100px; + width: 100px; } .partners img.standard { - width: 125px; + width: 125px; } .pb_tbl_title h3 { - padding-bottom: 20px; + padding-bottom: 20px; } .pb_standard_tbl td { - padding-left: 10px; - padding-right: 10px; + padding-left: 10px; + padding-right: 10px; } .partners ul { - list-style-type: none; + list-style-type: none; display: table; - width: 100%; + width: 100%; } .partners li { - display: table-cell; - text-align: center; + display: table-cell; + text-align: center; } .partners a[href^="http://"]:after, @@ -1166,7 +1166,7 @@ pre { } .pb-sm-img { - width: 50%; + width: 50%; height: 50%; } @@ -1177,7 +1177,7 @@ pre { } .pb-lg-img { - width: 70%; + width: 70%; height: 70%; } @@ -1186,105 +1186,105 @@ pre { } /**************************** - Blog + Blog ***************************/ .pb-blog { - margin-left:50px; - font-family: 'Verdana', sans-serif; - font-size: 34px; - font-weight: 400; + margin-left:50px; + font-family: 'Verdana', sans-serif; + font-size: 34px; + font-weight: 400; } .pb-blog h1 { - display: table; - padding: 3px 8px; - font-family: 'Verdana', sans-serif; - color: #ffffff; - font-size: 34px; - font-weight: 400; + display: table; + padding: 3px 8px; + font-family: 'Verdana', sans-serif; + color: #ffffff; + font-size: 34px; + font-weight: 400; } /******************************** - Content Pages + Content Pages *********************************/ .bs-docs-container { - margin-top: 70px; - margin-left:0; + margin-top: 70px; + margin-left:0; } .col-sm-9 { - padding-top: 20px; - margin:0; + padding-top: 20px; + margin:0; } .pb-content { - padding: 20px; - margin-left: 20px; + padding: 20px; + margin-left: 20px; } .pb-blog p { - font-family: 'Lato', sans-serif; - color: #222222; - font-size: 16px; - font-weight: 400; + font-family: 'Lato', sans-serif; + color: #222222; + font-size: 16px; + font-weight: 400; } .pb-content h1 { - /*background-color: #EA9622;*/ - display: table; - padding: 3px 0px; - font-family: 'Verdana', sans-serif; - color: #EA9622; - font-size: 34px; - font-weight: 400; - width:75wv; + /*background-color: #EA9622;*/ + display: table; + padding: 3px 0px; + font-family: 'Verdana', sans-serif; + color: #EA9622; + font-size: 34px; + font-weight: 400; + width:75wv; } .pb-content, .pb-blog h2 { - font-family: 'Verdana', sans-serif; - color: #000000; - font-size: 27px; - font-weight: 400; + font-family: 'Verdana', sans-serif; + color: #000000; + font-size: 27px; + font-weight: 400; } .pb-content, .pb-blog h3 { - font-family: 'Verdana', sans-serif; - color: #333333; - font-size: 24px; - font-weight: 400; + font-family: 'Verdana', sans-serif; + color: #333333; + font-size: 24px; + font-weight: 400; } .pb-content, .pb-blog h4 { - font-family: 'Verdana', sans-serif; - color: #333333; - font-size: 20px; - font-weight: 400; + font-family: 'Verdana', sans-serif; + color: #333333; + font-size: 20px; + font-weight: 400; } .pb-content, .pb-blog h5 { - font-family: 'Verdana', sans-serif; - color: #333333; - font-size: 18px; - font-weight: 400; + font-family: 'Verdana', sans-serif; + color: #333333; + font-size: 18px; + font-weight: 400; } .pb-content, .pb-blog ul, ol, li { - font-family: 'Lato', sans-serif; - font-size: 18px; + font-family: 'Lato', sans-serif; + font-size: 18px; } .pb-img, ,pb-blog { @@ -1297,633 +1297,633 @@ pre { /************* - Footer + Footer ******************/ .pb_footer { - display: block; - width: 75%; - font-family: 'Dosis', sans-serif; - font-weight: 400; - font-size:21px; - padding-top: 30px 0; - margin-left: auto; - margin-right: auto; - text-align: center; + display: block; + width: 75%; + font-family: 'Dosis', sans-serif; + font-weight: 400; + font-size:21px; + padding-top: 30px 0; + margin-left: auto; + margin-right: auto; + text-align: center; } /************ Was This Helpful Form ****************/ .wthHeader { - background-color: #EA9622; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - height: 10px; - width: 100%; - margin-bottom: 15px; + background-color: #EA9622; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + height: 10px; + width: 100%; + margin-bottom: 15px; } .wthBordered { - border: 1px solid #cccccc; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - margin-top: 10px; - padding-left: 7px; + border: 1px solid #cccccc; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin-top: 10px; + padding-left: 7px; } .wthForm { - padding-left: 15px; + padding-left: 15px; } .wthForm.input { - margin-top: 5px; - margin-bottom: 5px; + margin-top: 5px; + margin-bottom: 5px; } .wthSubmit { - margin-top: 5px; - margin-bottom: 5px; + margin-top: 5px; + margin-bottom: 5px; } .wthLabel { - font-family: 'Lato', sans-serif; - font-weight: 400; - font-size:18px; - color: #EA9622; - margin-top: 5px; - margin-bottom: 5px; + font-family: 'Lato', sans-serif; + font-weight: 400; + font-size:18px; + color: #EA9622; + margin-top: 5px; + margin-bottom: 5px; } .wthTitle { - font-family: 'Lato', sans-serif; - font-weight: 700; - font-size:24px; - color: #3498db; + font-family: 'Lato', sans-serif; + font-weight: 700; + font-size:24px; + color: #3498db; } /* - Responsive - There are 3 trigger levels, 1024, 768 and 480 + Responsive + There are 3 trigger levels, 1024, 768 and 480 */ /*small browsers*/ @media screen and (max-width: 1300px) { - .pb-top-text h1 { - font-size:60px; - } + .pb-top-text h1 { + font-size:60px; + } - .pb-top-text h2 { - font-size:30px; - } + .pb-top-text h2 { + font-size:30px; + } - .pb-panel-title { - font-size:33px; - } + .pb-panel-title { + font-size:33px; + } - .slide { - height: 140px; - } + .slide { + height: 140px; + } - } + } - /*iPad Pro*/ - @media screen and (max-width: 1024px) { + /*iPad Pro*/ + @media screen and (max-width: 1024px) { - .pb-message-container { - margin-top: 100px; - } + .pb-message-container { + margin-top: 100px; + } - .pb_benefits { - margin-top: 50px; - } + .pb_benefits { + margin-top: 50px; + } - .pb-benefits-panel { - margin-top:0px; + .pb-benefits-panel { + margin-top:0px; - .carousel-inner h3 { - font-size: 30px; - } + .carousel-inner h3 { + font-size: 30px; + } - .carousel-inner h4 { - padding-top: 20px; - font-size: 24px; - } + .carousel-inner h4 { + padding-top: 20px; + font-size: 24px; + } - .pb_carousel_indicators { - margin-top: 100px; - } + .pb_carousel_indicators { + margin-top: 100px; + } - .bs-docs-section { - line-height: 1.6; - font-size: large; - margin-right: 10em; - } + .bs-docs-section { + line-height: 1.6; + font-size: large; + margin-right: 10em; + } - .slide { - height: 160px; - } + .slide { + height: 160px; + } - .container { - width: 88%; - } + .container { + width: 88%; + } - } + } - /*iPad */ - @media screen and (max-width: 768px) { + /*iPad */ + @media screen and (max-width: 768px) { - .pb-top-text h1 { - font-size:40px; - } + .pb-top-text h1 { + font-size:40px; + } - .pb-top-text h2 { - font-size:20px; - } + .pb-top-text h2 { + font-size:20px; + } - .pb-panel-title { - font-size:30px; - } + .pb-panel-title { + font-size:30px; + } - .pb_benefits { - margin-top: 50px; - } + .pb_benefits { + margin-top: 50px; + } - .pb_carousel_title { - margin-top:50px; - margin-bottom:10px; - } + .pb_carousel_title { + margin-top:50px; + margin-bottom:10px; + } - .slide { - height: 110px; - } + .slide { + height: 110px; + } - .pb_carousel_indicators { - margin-top: 150px; - } + .pb_carousel_indicators { + margin-top: 150px; + } - } + } - /*iPhone Plus */ - @media screen and (max-width: 414px) { + /*iPhone Plus */ + @media screen and (max-width: 414px) { - /* hide side nav on phone devices*/ - #sidebar { - display: none; - } + /* hide side nav on phone devices*/ + #sidebar { + display: none; + } - .pb-top-text h1 { - font-size:20px; - } + .pb-top-text h1 { + font-size:20px; + } - .pb-top-text h2 { - font-size:12px; - } + .pb-top-text h2 { + font-size:12px; + } - .pb-home-links-panel { - margin-top: -10px; - } + .pb-home-links-panel { + margin-top: -10px; + } - .pb-outer-title { - margin-top: 5px; - } + .pb-outer-title { + margin-top: 5px; + } - .pb-home-links { - margin-top:-10px; - } + .pb-home-links { + margin-top:-10px; + } - .pb-home-links-outer-panel { - margin-top:20px; - } + .pb-home-links-outer-panel { + margin-top:20px; + } - .pb-panel-title { - font-size:14px; - } + .pb-panel-title { + font-size:14px; + } - .pb-message-container { - margin-top: 50px; - } + .pb-message-container { + margin-top: 50px; + } - .pb_benefits { - margin-top: 20px; - } + .pb_benefits { + margin-top: 20px; + } - .pb_carousel_title { - margin-top:-10px; - margin-bottom:20px; - } + .pb_carousel_title { + margin-top:-10px; + margin-bottom:20px; + } - .slide { - height: 70px; - } + .slide { + height: 70px; + } - .pb-main-nav { - display:none; - } + .pb-main-nav { + display:none; + } - .pb-mobile-nav { - display: block; - } + .pb-mobile-nav { + display: block; + } - .pb_carousel_indicators { - margin-top: 10px; - height: 10px; - } + .pb_carousel_indicators { + margin-top: 10px; + height: 10px; + } - .pb-content { - width: 85%; - margin-left: -20px; - } + .pb-content { + width: 85%; + margin-left: -20px; + } - .pb-content p { - font-size: 15px; - font-weight: 400; - line-height: inherit; - width: 85%; - } + .pb-content p { + font-size: 15px; + font-weight: 400; + line-height: inherit; + width: 85%; + } - } + } - /* iPhone X*/ - @media screen and (max-width: 375px) { + /* iPhone X*/ + @media screen and (max-width: 375px) { - .pb-top-text h1 { - font-size:22px; - } + .pb-top-text h1 { + font-size:22px; + } - .pb-top-text h2 { - font-size:11px; - margin-top: 0px; - } + .pb-top-text h2 { + font-size:11px; + margin-top: 0px; + } - .pb-panel-title { - font-size:12px; - } + .pb-panel-title { + font-size:12px; + } - .pb-home-links-panel { - margin-top: -15px; - } + .pb-home-links-panel { + margin-top: -15px; + } - .pb_benefits { - margin-top: 40px; - } + .pb_benefits { + margin-top: 40px; + } - .pb_home_belowfold_carousel { - padding-top: 60px; - } + .pb_home_belowfold_carousel { + padding-top: 60px; + } - .pb_carousel_title { - margin-top:-20px; - margin-bottom:0px; - } + .pb_carousel_title { + margin-top:-20px; + margin-bottom:0px; + } - .slide { - height: 80px; - } + .slide { + height: 80px; + } - .pb_carousel_indicators { - margin-top: 0px; - height: 22px; - } + .pb_carousel_indicators { + margin-top: 0px; + height: 22px; + } - .carousel-indicators { - padding-top: 140px; - } + .carousel-indicators { + padding-top: 140px; + } - } + } - /* iPhone 6, 7, 8 Galaxy S5 (different width) */ - @media screen and (max-width: 360px) { + /* iPhone 6, 7, 8 Galaxy S5 (different width) */ + @media screen and (max-width: 360px) { - .pb-top-text h1 { - font-size:18px; - } + .pb-top-text h1 { + font-size:18px; + } - .pb-top-text > h2 { - font-size:9px; - margin-top: 0px; - } + .pb-top-text > h2 { + font-size:9px; + margin-top: 0px; + } - .pb-home-links-outer-panel { - margin-top:10px; - } + .pb-home-links-outer-panel { + margin-top:10px; + } - .pb_benefits { - margin-top: 70px; - } + .pb_benefits { + margin-top: 70px; + } - } + } - /*iPhone 5*/ - @media screen and (max-width: 320px) { + /*iPhone 5*/ + @media screen and (max-width: 320px) { - .pb-home-links-outer-panel { - margin-top:3px; - } + .pb-home-links-outer-panel { + margin-top:3px; + } - .pb_benefits { - margin-top: 50px; - } + .pb_benefits { + margin-top: 50px; + } - } + } @media screen and (max-width: 768px) { - .col-sm-9 { - padding-top: 10px; - } + .col-sm-9 { + padding-top: 10px; + } - .pb-content { + .pb-content { - font-size: 15px; - font-weight: 400; - width: 85%; - margin-left: 0px; - - } - - .pb-content p { - font-size: 15px; - font-weight: 400; - line-height: inherit; - width: 85%; - } - - .pb-content li { - font-size: 15px; - font-weight: 400; - } - - .pb-content h1 { - font-size: 24px; - } - - .pb-content h2 { - font-size: 20px; - } - - .pb-content h3 { - font-size: 18px; - } - - .pb_footer { - display: block; - font-size:15px; - } - - /*Previous @media*/ - - #pb-home-demo { - margin-top: 30px; - } - - #pb-home-demo .col-sm-7 .lead { - margin-left: 0; - padding-left: 0; - } - - .pb-sm-left { - text-align: left; - } - - .pb-sm-center { - text-align: center; - } - - .pb-sm-right { - text-align: right; - } - - .pb-img { - -webkit-box-shadow: 2px 2px 8px -2px rgba(0,0,0,0.35); - -moz-box-shadow: 2px 2px 8px -2px rgba(0,0,0,0.35); - box-shadow: 2px 2px 8px -2px rgba(0,0,0,0.35); - margin-top: 10px; - margin-bottom: 10px; - } - - - .blog-related-posts { - color: #aaa; - margin-top: 40px; - } - - .bs-callout code { - background-color: transparent; - } - - .bs-docs-footer { - margin-top: 60px; - } - - - .nav.nav-tabs { - margin-bottom: 15px; - font-weight: bold; - } - - .bs-callout { - padding-top: 0px; - padding-bottom: 10px; - } - - #chart_div { - height: 400px; - } - - .docs-sidebar { - margin-top: 20px; - padding: 20px; - padding-top: 10px; - padding-bottom: 10px; - border-radius: 2px; - } - - .docs-sidebar .nav>li>a{ - padding: 0px; - padding-bottom: 10px; - color: #555; - } - - .docs-sidebar .nav>li>a:hover{ - color: #337ab7; - background: transparent; - } - - .docs-sidebar .nav>li>a.selected { - color: #337ab7; - } - - .docs-sidebar h5 { - font-weight: 700; - font-size: 13px; - margin-top: 15px; - } - - .bs-docs-nav { - border-bottom: solid 1px #AAA; - } - - .bg-info { - padding: 10px; - border-radius: 5px; - } - - .bg-warning { - padding: 10px; - border-radius: 5px; - margin-bottom: 5px; - } - - .bg-danger { - padding: 10px; - border-radius: 5px; - } - - table.jsfiddle-line-number { - width: 100%; - border: 0; - } - - table.jsfiddle-line-number .line-number { - padding-top: 61px; - vertical-align: text-top; - line-height: 21px; - width: 17px; - color: #aaa; - font-size: 13px; - text-align: right; - } - - .blog-date { - margin-top: 45px; - text-align: right; - width: 80%; - font-size: 20px; - color: #aaa; - } - - #example-tab { - padding-left:10px; - } - - #example-tab li { - margin-bottom: 6px; - } - - table:not(.jsfiddle-line-number) { - table-layout: fixed; - word-wrap: break-word; - } - - div.pl-doc-entry{ - position: absolute; - } - - .prebid-mobile-notice { - margin-top: 2em; - } - - .pb-lg-img { - width: 85%; - height: 85%; - } - - .pb-xlg-img { + font-size: 15px; + font-weight: 400; + width: 85%; + margin-left: 0px; + + } + + .pb-content p { + font-size: 15px; + font-weight: 400; + line-height: inherit; + width: 85%; + } + + .pb-content li { + font-size: 15px; + font-weight: 400; + } + + .pb-content h1 { + font-size: 24px; + } + + .pb-content h2 { + font-size: 20px; + } + + .pb-content h3 { + font-size: 18px; + } + + .pb_footer { + display: block; + font-size:15px; + } + + /*Previous @media*/ + + #pb-home-demo { + margin-top: 30px; + } + + #pb-home-demo .col-sm-7 .lead { + margin-left: 0; + padding-left: 0; + } + + .pb-sm-left { + text-align: left; + } + + .pb-sm-center { + text-align: center; + } + + .pb-sm-right { + text-align: right; + } + + .pb-img { + -webkit-box-shadow: 2px 2px 8px -2px rgba(0,0,0,0.35); + -moz-box-shadow: 2px 2px 8px -2px rgba(0,0,0,0.35); + box-shadow: 2px 2px 8px -2px rgba(0,0,0,0.35); + margin-top: 10px; + margin-bottom: 10px; + } + + + .blog-related-posts { + color: #aaa; + margin-top: 40px; + } + + .bs-callout code { + background-color: transparent; + } + + .bs-docs-footer { + margin-top: 60px; + } + + + .nav.nav-tabs { + margin-bottom: 15px; + font-weight: bold; + } + + .bs-callout { + padding-top: 0px; + padding-bottom: 10px; + } + + #chart_div { + height: 400px; + } + + .docs-sidebar { + margin-top: 20px; + padding: 20px; + padding-top: 10px; + padding-bottom: 10px; + border-radius: 2px; + } + + .docs-sidebar .nav>li>a{ + padding: 0px; + padding-bottom: 10px; + color: #555; + } + + .docs-sidebar .nav>li>a:hover{ + color: #337ab7; + background: transparent; + } + + .docs-sidebar .nav>li>a.selected { + color: #337ab7; + } + + .docs-sidebar h5 { + font-weight: 700; + font-size: 13px; + margin-top: 15px; + } + + .bs-docs-nav { + border-bottom: solid 1px #AAA; + } + + .bg-info { + padding: 10px; + border-radius: 5px; + } + + .bg-warning { + padding: 10px; + border-radius: 5px; + margin-bottom: 5px; + } + + .bg-danger { + padding: 10px; + border-radius: 5px; + } + + table.jsfiddle-line-number { + width: 100%; + border: 0; + } + + table.jsfiddle-line-number .line-number { + padding-top: 61px; + vertical-align: text-top; + line-height: 21px; + width: 17px; + color: #aaa; + font-size: 13px; + text-align: right; + } + + .blog-date { + margin-top: 45px; + text-align: right; + width: 80%; + font-size: 20px; + color: #aaa; + } + + #example-tab { + padding-left:10px; + } + + #example-tab li { + margin-bottom: 6px; + } + + table:not(.jsfiddle-line-number) { + table-layout: fixed; + word-wrap: break-word; + } + + div.pl-doc-entry{ + position: absolute; + } + + .prebid-mobile-notice { + margin-top: 2em; + } + + .pb-lg-img { + width: 85%; + height: 85%; + } + + .pb-xlg-img { width: 100%; } - .pb-md-img { - width: 60%; - height: 60%; - } + .pb-md-img { + width: 60%; + height: 60%; + } - #pb-home-demo { - margin-top: 30px; - } + #pb-home-demo { + margin-top: 30px; + } - #pb-home-demo .col-sm-7 .lead { - margin-left: 0; - padding-left: 0; - } + #pb-home-demo .col-sm-7 .lead { + margin-left: 0; + padding-left: 0; + } - .pb-sm-left { - text-align: left; - } + .pb-sm-left { + text-align: left; + } - .pb-sm-center { - text-align: center; - } + .pb-sm-center { + text-align: center; + } - .pb-sm-right { - text-align: right; - } + .pb-sm-right { + text-align: right; + } } @media screen and (max-width: 414px) { - #wrapper { - padding-left: 0; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - transition: all 0.5s ease; - } - - #wrapper.toggled { - padding-left: 250px; - } - - #sidebar-wrapper { - z-index: 1000; - position: fixed; - left: 250px; - width: 0; - height: 100%; - margin-left: -250px; - overflow-y: auto; - background: #f6f8fa; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - transition: all 0.5s ease; - } - - #wrapper.toggled #sidebar-wrapper { - width: 250px; - } - - .pb-lg-img { - width: 65%; - height: 65%; - } - - .pb-xlg-img { + #wrapper { + padding-left: 0; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; + } + + #wrapper.toggled { + padding-left: 250px; + } + + #sidebar-wrapper { + z-index: 1000; + position: fixed; + left: 250px; + width: 0; + height: 100%; + margin-left: -250px; + overflow-y: auto; + background: #f6f8fa; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; + } + + #wrapper.toggled #sidebar-wrapper { + width: 250px; + } + + .pb-lg-img { + width: 65%; + height: 65%; + } + + .pb-xlg-img { width: 100%; } - .pb-md-img { - width: 45%; - height: 45%; - } + .pb-md-img { + width: 45%; + height: 45%; + } - .pb_footer { - display: block; - font-size:10px; - } + .pb_footer { + display: block; + font-size:10px; + } } @@ -2113,21 +2113,21 @@ div.pl-doc-entry{ } /******************* - API + API .categoryBox { - display:block; - float: left; - margin-right:10px; - line-height:40px; - height: 40px; - padding-left: 15px; - padding-right: 15px; - background-color:#f6f8fa; - text-align:center; + display:block; + float: left; + margin-right:10px; + line-height:40px; + height: 40px; + padding-left: 15px; + padding-right: 15px; + background-color:#f6f8fa; + text-align:center; } diff --git a/dev-docs/activity-controls.md b/dev-docs/activity-controls.md index c4642272f5..2b01c46523 100644 --- a/dev-docs/activity-controls.md +++ b/dev-docs/activity-controls.md @@ -19,8 +19,8 @@ These controls are intended to serve as building blocks for privacy protection m There are many privacy regulations that Prebid publishers need to accomodate. Prebid supplies [modules](/dev-docs/faq.html#how-does-prebid-support-privacy-regulations) to help Publishers implement their legal policies, but there are scenarios where extra control is needed: -- a Publisher's lawyers want to make a particular exception -- a module hasn't been built for a regulation the Publisher needs to support +* a Publisher's lawyers want to make a particular exception +* a module hasn't been built for a regulation the Publisher needs to support ### Prebid Is a Toolkit @@ -37,19 +37,19 @@ Important: This resource should not be construed as legal advice and Prebid.org We did an analysis of the things Prebid.js does and identified those related to privacy regulations. We call these things "potentially restricted activities", or just "activities" for short. Here are some: -- Setting a cookie -- Syncing ID cookies -- Transmitting user first party data -- etc. +* Setting a cookie +* Syncing ID cookies +* Transmitting user first party data +* etc. The [full list of activities Prebid.js supports](#activities) is below. Think of an activity control as a 'gatekeeper' that makes the decision about whether the activity should be allowed in this specific context: -- Should I allow this cookie to be set for bidderA? -- Should I allow this usersync for bidderB? -- Is it ok for this data to be passed to bidderC and analyticsD? -- etc. +* Should I allow this cookie to be set for bidderA? +* Should I allow this usersync for bidderB? +* Is it ok for this data to be passed to bidderC and analyticsD? +* etc. Prebid.js core checks with the Activity Controls to see whether an activity is allowed. The configuration for the activity can come from modules, custom functions in the page, or a rule-based JSON config. @@ -60,7 +60,7 @@ In this example, bidderX wants to set a cookie through StorageManager, which que Here's an example JSON config that disables accessing local storage (including cookies) for everything except the bid adapter `bidderX`: -``` +```javascript pbjs.setConfig({ allowActivities: { accessDevice: { @@ -76,14 +76,14 @@ pbjs.setConfig({ }) ``` -
+ ## Configuration `allowActivities` is a new option to [setConfig](/dev-docs/publisher-api-reference/setConfig.html). It contains a list of activity names -- see the [full list of activities below](#activities). Each activity is an object that can contain these attributes: {: .table .table-bordered .table-striped } -| Name | Type | Description | +| Name | Type | Description | |------|------|-------------| | `default` | Boolean | Whether the activity should be allowed if no other rule applies. Defaults to true. | | `rules` | Array of objects | Rules for this activity | @@ -93,14 +93,14 @@ pbjs.setConfig({ `Rules` is an array of objects that a publisher can contruct to provide fine-grained control over a given activity. For instance, you could set up a series of rules that says: -- Amongst the bid adapters, BidderA is always allowed to receive user first party data -- Always let analytics adapters receive user first party data -- otherwise, let the active privacy modules decide -- if they refuse to decide, then the overall default is to allow the transmitting of user first party data +* Amongst the bid adapters, BidderA is always allowed to receive user first party data +* Always let analytics adapters receive user first party data +* otherwise, let the active privacy modules decide +* if they refuse to decide, then the overall default is to allow the transmitting of user first party data There's more about [rules](#parameters) below. - + ### Activities @@ -112,7 +112,7 @@ Here's the list of the 'potentially restricted activities' that Prebid.js core c | `accessDevice` | A component wants to use device storage | Storage is disabled | [`storageType`](#params-accessDevice) | | `enrichEids` | A user ID or RTD submodule wants to add user IDs to outgoing requests | User IDs are discarded | None | | `enrichUfpd` | A Real Time Data (RTD) submodule wants to add user first party data to outgoing requests (`user.data` in ORTB) | User FPD is discarded | None | -| `fetchBids` | A bid adapter wants to participate in an auction | Bidder is removed from the auction | [`configName`](#params-fetchBids) | +| `fetchBids` | A bid adapter wants to participate in an auction | Bidder is removed from the auction | [`configName`](#params-fetchBids) | | `reportAnalytics` | An analytics adapter is being enabled through `pbjs.enableAnalytics` | Adapter remains disabled | None | | `syncUser` | A bid adapter wants to fetch a [user sync](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) | User sync is skipped | [`syncType`, `syncUrl`](#params-syncUser) | | `transmitEids` | A bid adapter or RTD submodule wants to access and/or transmit user IDs to their endpoint | User IDs are hidden from the component | [`configName`](#params-fetchBids) | @@ -121,37 +121,38 @@ Here's the list of the 'potentially restricted activities' that Prebid.js core c | `transmitUfpd` | A bid adapter or RTD submodule wants to access and/or transmit user FPD to their endpoint | User FPD is hidden from the component | [`configName`](#params-fetchBids) | - + ### Rules - - There are three parts to an Activity Control's rule: - + +There are three parts to an Activity Control's rule: + 1. The priority 2. The condition 3. The allow flag - For example, this rule would allow bidderX to perform the activity if no higher priority rules take precedence. - ``` - ... - rules: [{ - priority: 10, // average priority - condition(params) { - return params.componentName === 'bidderX' - }, - allow: true - }] - ... +For example, this rule would allow bidderX to perform the activity if no higher priority rules take precedence. + +```javascript +... + rules: [{ + priority: 10, // average priority + condition(params) { + return params.componentName === 'bidderX' + }, + allow: true + }] +... ``` - + #### Rule Priority Activity control rules in Prebid.js can be created by two main sources: -- Publisher `setConfig({allowActivities})` as in the examples shown here. When set this way, rules are consider the highest priority value of 1. -- Modules can set activity control rules, e.g. [usersync](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing), [bidderSettings](/dev-docs/publisher-api-reference/bidderSettings.html), the [GPP](/dev-docs/modules/consentManagementGpp.html) or [GDPR](/dev-docs/modules/gdprEnforcement.html) modules. Rules set by modules have a less urgent priority of 10. +* Publisher `setConfig({allowActivities})` as in the examples shown here. When set this way, rules are consider the highest priority value of 1. +* Modules can set activity control rules, e.g. [usersync](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing), [bidderSettings](/dev-docs/publisher-api-reference/bidderSettings.html), the [GPP](/dev-docs/modules/consentManagementGpp.html) or [GDPR](/dev-docs/modules/gdprEnforcement.html) modules. Rules set by modules have a less urgent priority of 10. When rules are processed, they are sorted by priority, and all rules of the same priority are considered to happen at the same time. The details: @@ -204,7 +205,7 @@ pbjs.setConfig({ ``` #### Rule Conditions - + A `condition` is a javascript function that receives information about the activity that is about to be performed. If a condition evaluates to true, the `allow` attribute of the rule will be utilized. If there's no condition specified, the rule's `allow` attribute will always be utilized. These are the parameters available to the condition function: @@ -212,13 +213,13 @@ These are the parameters available to the condition function: {: .table .table-bordered .table-striped } | Name | Type | Available for | Description | |------|------|-------------|---------------| -| `componentType` | String | All activities | One of: `'bidder'`, `'userId'`, `'rtd'`, `'analytics'`, or `'prebid'`; identifies the type of component (usually a module) that wishes to perform the activity. `'prebid'` is reserved for Prebid core itself and a few "privileged" modules such as the [PBS adapter](/dev-docs/modules/prebidServer.html). | +| `componentType` | String | All activities | One of: `'bidder'`, `'userId'`, `'rtd'`, `'analytics'`, or `'prebid'`; identifies the type of component (usually a module) that wishes to perform the activity. `'prebid'` is reserved for Prebid core itself and a few "privileged" modules such as the [PBS adapter](/dev-docs/modules/prebidServer.html). | | `componentName` | String | All activities | Name of the component; this is (depending on the type) either a bidder code, user ID or RTD submodule name, analytics provider code, or module name. | | `component` | String | All activities | This is always a dot-separated concatenation of `componentType` and `componentName`; for example, with `{componentType: 'bidder', componentName: 'bidderX'}`, `component` is `'bidder.bidderX'`. | | `adapterCode` | String | All activities | If `componentType` is `'bidder'`, and `componentName` is an [alias](/dev-docs/publisher-api-reference/aliasBidder.html), then `adapterCode` is the bidder code that was aliased; or identical to `componentName` if the bidder is not an alias. This is undefined when the component is not a bidder.| -| `configName` | String | `fetchBids` | When the Prebid Server adapter is part of an auction, this is the name given to its [s2s configuration](/dev-docs/modules/prebidServer.md), if any. | -| `storageType` | String | `accessDevice` | Either `'html5'` or `'cookie'` - the device storage mechanism being accessed. | -| `syncType` | String | `syncUser` | Either `'iframe'` or `'image'` - the type of user sync. | +| `configName` | String | `fetchBids` | When the Prebid Server adapter is part of an auction, this is the name given to its [s2s configuration](/dev-docs/modules/prebidServer.md), if any. | +| `storageType` | String | `accessDevice` | Either `'html5'` or `'cookie'` - the device storage mechanism being accessed. | +| `syncType` | String | `syncUser` | Either `'iframe'` or `'image'` - the type of user sync. | | `syncUrl` | String | `syncUser` | URL of the user sync. | #### Allow Flag @@ -286,5 +287,6 @@ pbjs.setConfig({ }) ``` -## Further Reading -- [FAQ: How does Prebid.js support privacy regulations](/dev-docs/faq.html#how-does-prebid-support-privacy-regulations) +## Further Reading + +* [FAQ: How does Prebid.js support privacy regulations](/dev-docs/faq.html#how-does-prebid-support-privacy-regulations) diff --git a/dev-docs/add-rtd-submodule.md b/dev-docs/add-rtd-submodule.md index b2c118c06b..fbf85669cf 100644 --- a/dev-docs/add-rtd-submodule.md +++ b/dev-docs/add-rtd-submodule.md @@ -6,16 +6,17 @@ sidebarType: 1 --- # How to Add a Real Time Data Submodule + {:.no_toc} Sub-modules interact with the Real-Time Data (RTD) core module to add data to bid requests or add targeting values for the primary ad server. - * TOC {:toc } ## Overview + The point of the Real Time Data (RTD) infrastructure is to make configuration consistent for publishers. Rather than having dozens of different modules with disparate config approaches, being a Real-Time Data sub-module means plugging into a framework for publishers to control how sub-modules behave. For example, publishers can define how long the auction can be delayed and give some sub-modules priority over others. @@ -40,13 +41,13 @@ Here is the flow for how the RTD-core module interacts with its sub-modules: The activities performed by the RTD-core module are on the left-hand side, while the functions that can be provided by your RTD sub-module are on the right-hand side. Note that you don't need to implement all of the functions - you'll want to plan out your functionality and develop the appropriate functions. - ## Creating a Sub-Module When you create a Real-Time Data sub-module, you will be operating under the umbrella of the Real-Time Data core module. Here are the services core provides: -- your sub-module will be initialized as soon as pbjs.setConfig({realTimeData}) is called. If you can initialize at the time of code load, that can be done at the bottom of your javascript file. -- whenever any of your functions is called, it will be passed the config params provided by the publisher. As a result, you should not call getConfig(). -- your functions will also be passed all available privacy information. As a result, you do not need to query to get GDPR, US Privacy, or any other consent parameters. + +* your sub-module will be initialized as soon as pbjs.setConfig({realTimeData}) is called. If you can initialize at the time of code load, that can be done at the bottom of your javascript file. +* whenever any of your functions is called, it will be passed the config params provided by the publisher. As a result, you should not call getConfig(). +* your functions will also be passed all available privacy information. As a result, you do not need to query to get GDPR, US Privacy, or any other consent parameters. Working with any Prebid project requires using Github. In general, we recommend the same basic workflow for any project: @@ -65,7 +66,8 @@ with the [module rules](/dev-docs/module-rules.html) that apply globally and to Create a markdown file under `modules` with the name of the module suffixed with 'RtdProvider', e.g., `exRtdProvider.md` Example markdown file: -{% highlight text %} + +```md # Overview Module Name: Ex Rtd Provider @@ -76,7 +78,7 @@ Maintainer: prebid@example.com RTD provider for Example.com. Contact prebid@example.com for information. -{% endhighlight %} +``` ### Step 2: Build the Module @@ -90,7 +92,7 @@ In order to let RTD-core know where to find the functions in your sub-module, cr | param name | type | Scope | Description | Params | | :------------ | :------------ | :------ | :------ | :------ | | name | string | required | must match the name provided by the publisher in the on-page config | n/a | -| gvlid | number | optional | global vendor list ID for your submodule | n/a | +| gvlid | number | optional | global vendor list ID for your submodule | n/a | | init | function | required | defines the function that does any auction-level initialization required | config, userConsent | | getTargetingData | function | optional | defines a function that provides ad server targeting data to RTD-core | adUnitArray, config, userConsent | | getBidRequestData | function | optional | defines a function that provides bid request data to RTD-core | reqBidsConfigObj, callback, config, userConsent | @@ -100,32 +102,35 @@ In order to let RTD-core know where to find the functions in your sub-module, cr | onBidResponseEvent | function |optional | listens to the BID_RESPONSE event and calls a sub-module function that lets it know when a bid response has been collected | bidResponse, config, userConsent | For example: -{% highlight text %} + +```javascript export const subModuleObj = { name: 'ExampleRTDModule', init: init, getTargetingData: sendDataToModule }; -{% endhighlight %} +``` #### Register the submodule Register submodule to RTD-core: -{% highlight text %} +```javascript submodule('realTimeData', subModuleObject); -{% endhighlight %} +``` #### User Consent Several of the interfaces get a `userConsent` object. It's an object that carries these attributes: -- [gdpr](/dev-docs/modules/consentManagement.html#bidder-adapter-gdpr-integration) - GDPR -- [usp](/dev-docs/modules/consentManagementUsp.html#bidder-adapter-us-privacy-integration) - US Privacy (aka CCPA) -- [coppa](/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa) - the Child Online Privacy Protection Act + +* [gdpr](/dev-docs/modules/consentManagement.html#bidder-adapter-gdpr-integration) - GDPR +* [usp](/dev-docs/modules/consentManagementUsp.html#bidder-adapter-us-privacy-integration) - US Privacy (aka CCPA) +* [coppa](/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa) - the Child Online Privacy Protection Act These are provided so you can do the right thing with respect to regulations. The only privacy requirement imposed by the RTD-core is that sub-modules make make use of the StorageManager instead of attempting to access cookies or localstorage directly. #### The init() function + 1. This function receives module configuration and userConsent parameters 2. If the function returns `false`, the submodule will be ignored. @@ -137,7 +142,8 @@ This is the function that will allow RTD sub-modules to merge ad server targetin 1. RTD-core will call this function with an array of adUnits, config, and userConsent as parameters 2. Your sub-module should respond with per-adslot data that should be set as key values on the ad server targeting in this format: -{% highlight text %} + +```json { "slotA":{ "p":0.56, // ad server targeting variable (e.g. p) for slotA is 0.56 @@ -146,11 +152,11 @@ This is the function that will allow RTD sub-modules to merge ad server targetin "p":0.824, // ad server targeting variable (e.g. p) for slotB is 0.824 } } -{% endhighlight %} +``` **Code Example** -{% highlight text %} +```javascript /** @type {RtdSubmodule} */ export const subModuleObj = { name: 'ExampleRTDModule', @@ -170,34 +176,34 @@ function returnTargetingData(adUnits, config, userConsent) { } submodule('realTimeData', subModuleObj); -{% endhighlight %} +``` #### getBidRequestData This is the function that will allow RTD sub-modules to modify the AdUnit object for each auction. It's called as part of the requestBids hook. 1. RTD-core will call this function with: - - reqBidsConfigObj: a slightly modified version of the object that's passed to `pbjs.requestBids` (see [below](#reqBidsConfigObj)). Note that several auctions can happen concurrently, so the sub-module must be ready to support this. - - callback: lets RTD-core know which auction the sub-module is done with. - - config: the sub-module's config params provided by the publisher - - userConsent object (see above) + 1. reqBidsConfigObj: a slightly modified version of the object that's passed to `pbjs.requestBids` (see [below](#reqBidsConfigObj)). Note that several auctions can happen concurrently, so the sub-module must be ready to support this. + 2. callback: lets RTD-core know which auction the sub-module is done with. + 3. config: the sub-module's config params provided by the publisher + 4. userConsent object (see above) 2. Your sub-module may update the reqBidsConfigObj and hit the callback. To inject data into the bid requests, you should follow one of these conventions: - - Recommended: use one of these [First Party Data](/features/firstPartyData.html) conventions: - - For AdUnit-specific first party data, set AdUnit.ortb2Imp.ext.data.ATTRIBUTES - - For global first party data, including bidder-specific data, modify the `reqBidsConfigObj` as shown [below](#reqBidsConfigObj) - - Not recommended: Place your data in bidRequest.rtd.RTDPROVIDERCODE.ATTRIBUTES and then get individual adapters to specifically read that location. Note that this method won't pass data to Prebid Server adapters. + 1. Recommended: use one of these [First Party Data](/features/firstPartyData.html) conventions: + 1. For AdUnit-specific first party data, set AdUnit.ortb2Imp.ext.data.ATTRIBUTES + 2. For global first party data, including bidder-specific data, modify the `reqBidsConfigObj` as shown [below](#reqBidsConfigObj) + 2. Not recommended: Place your data in bidRequest.rtd.RTDPROVIDERCODE.ATTRIBUTES and then get individual adapters to specifically read that location. Note that this method won't pass data to Prebid Server adapters. - + The `reqBidsConfigObj` parameter is a copy of the object passed to [`requestBids`](/dev-docs/publisher-api-reference/requestBids.html), except for: -- `adUnits` and `timeout` are always defined (if the publisher didn't provide them, the default values are filled in - `pbjs.adUnits` and `getConfig('bidderTimeout')` respectively) -- `ortb2` is replaced with an `ortb2Fragments` object, intended to be inspected and / or modified by your module. +* `adUnits` and `timeout` are always defined (if the publisher didn't provide them, the default values are filled in - `pbjs.adUnits` and `getConfig('bidderTimeout')` respectively) +* `ortb2` is replaced with an `ortb2Fragments` object, intended to be inspected and / or modified by your module. The `ortb2Fragments` parameter is an object containing two properties: -- `global`, an object containing global (not bidder-specific) first party data in the same OpenRTB format used by `setConfig({ortb2})` -- `bidder`, a map from bidder code to bidder-specific, OpenRTB-formatted first party data. +* `global`, an object containing global (not bidder-specific) first party data in the same OpenRTB format used by `setConfig({ortb2})` +* `bidder`, a map from bidder code to bidder-specific, OpenRTB-formatted first party data. Your module may modify either or both with additional data. If adding bidder-specific data in `ortb2Fragments.bidder`, it should also support a parameter to allow the publisher to define which bidders are to receive the data. @@ -207,7 +213,7 @@ at the time `requestBids` is called, and RTD submodules that wish to modify it a **Code Example** -{% highlight text %} +```javascript /** @type {RtdSubmodule} */ export const subModuleObj = { name: 'ExampleRTDModule2', @@ -233,13 +239,15 @@ function alterBidRequests(reqBidsConfigObj, callback, config, userConsent) { } submodule('realTimeData', subModuleObj); -{% endhighlight %} +``` #### beforeInit + 1. Use this function to take action to make sure data will be served as soon as possible (AJAX calls, pixels, etc..) 2. This function is **not** invoked by the RTD module, and should be invoked at the bottom of the submodule. #### Using event listeners + 1. The RTD-core module listens for 3 events - `AUCTION_INIT`, `AUCTION_END`, and `BID_RESPONSE`. 2. Each time one of the events fires, RTD-core will invoke the corresponding function on each sub-module, allowing the sub-module to make changes to the event object. 3. To use this on your sub-module, define the required functions as noted in the table above and the examples below. @@ -247,7 +255,8 @@ submodule('realTimeData', subModuleObj); **Code Example** Here is a code example with both mandatory and optional functions: -{% highlight text %} + +```javascript /** @type {RtdSubmodule} */ export const subModuleObj = { name: 'ExampleRTDModule3', @@ -286,8 +295,7 @@ function beforeInit(){ } beforeInit(); -{% endhighlight %} - +``` ### Step 3: Add unit tests @@ -305,7 +313,7 @@ Once everything looks good, submit the code, tests, and markdown as a pull reque 2. Create a new file for your RTD sub-module in dev-docs/modules/ExampleRtdProvider.md. Take a look at the other *RtdProvider.md files in that directory for the important header values. Specifically it requires the following: - ``` + ```markdown --- layout: page_v2 title: Example Module @@ -322,6 +330,7 @@ Once everything looks good, submit the code, tests, and markdown as a pull reque [Useful publisher-facing documentation] ``` + 3. Submit the pull request to the prebid.github.io repo. ### Step 6: Wait for Prebid volunteers to review diff --git a/dev-docs/add-video-submodule.md b/dev-docs/add-video-submodule.md index 811494d780..bb44cdebc0 100644 --- a/dev-docs/add-video-submodule.md +++ b/dev-docs/add-video-submodule.md @@ -9,10 +9,10 @@ sidebarType: 1 {:.no_toc} Video submodules interact with the Video Module to integrate Prebid with Video Players, allowing Prebid to automatically: -- render bids in the desired video player. -- mark used bids as won. -- trigger player and media events. -- populate the oRTB Video Impression and Content params in the bid request. +* render bids in the desired video player. +* mark used bids as won. +* trigger player and media events. +* populate the oRTB Video Impression and Content params in the bid request. * TOC {:toc } @@ -28,11 +28,12 @@ Publishers who use players from different vendors on the same page can use multi ## Requirements The Video Module only supports integration with Video Players that meet the following requirements: -- Must support parsing and reproduction of VAST ads. - - Input can be an ad tag URL or the actual Vast XML. -- Must expose an API that allows the procurement of [Open RTB params](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for Video (section 3.2.7) and Content (section 3.2.16). -- Must emit javascript events for Ads and Media. - - see [Event Registration](#event-registration). + +* Must support parsing and reproduction of VAST ads. + * Input can be an ad tag URL or the actual Vast XML. +* Must expose an API that allows the procurement of [Open RTB params](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for Video (section 3.2.7) and Content (section 3.2.16). +* Must emit javascript events for Ads and Media. + * see [Event Registration](#event-registration). ## Creating a Submodule @@ -49,7 +50,8 @@ Working with any Prebid project requires using Github. In general, we recommend Create a markdown file under `modules` with the name of the module suffixed with 'VideoProvider', i.e. `exampleVideoProvider.md`. Example markdown file: -{% highlight text %} + +```md # Overview Module Name: Example Video Provider @@ -66,16 +68,16 @@ Video provider for Example Player. Contact someone@example.com for information. Your page must link the Example Player build from our CDN. Alternatively you can use npm to load the build. -{% endhighlight %} +``` ### Step 2: Add a Vendor Code Vendor codes are required to indicate which submodule type to instantiate. Add your vendor code constant to an export const in `vendorCodes.js` in Prebid.js under `libraries/video/constants/vendorCodes.js`. i.e. in `vendorCodes.js`: -{% highlight text %} +```javascript export const EXAMPLE_PLAYER_VENDOR = 3; -{% endhighlight %} +``` ### Step 3: Build the Module @@ -89,7 +91,7 @@ Your submodule should also import the `submodule` function from `src/hook.js` an **Code Example** -{% highlight text %} +```javascript import { submodule } from '../src/hook.js'; function exampleSubmoduleFactory(videoProviderConfig) { @@ -102,7 +104,7 @@ function exampleSubmoduleFactory(videoProviderConfig) { exampleSubmoduleFactory.vendorCode = EXAMPLE_VENDOR; submodule('video', exampleSubmoduleFactory); -{% endhighlight %} +``` #### The Submodule object @@ -121,7 +123,8 @@ The submodule object must adhere to the following interface: | destroy | function | required | Deallocates the submodule and destroys the associated video player. n/a | void | void | For example: -{% highlight text %} + +```javascript const exampleSubmodule = { init: init, getId: getId, @@ -132,9 +135,9 @@ const exampleSubmodule = { offEvent: offEvent, destroy: destroy }; -{% endhighlight %} +``` - + #### Event Registration @@ -158,7 +161,8 @@ Submodules must support attaching and detaching event listeners on the video pla #### Update .submodules.json In prebid.js, add your new submodule to `.submodules.json` under the `videoModule` as such: -{% highlight text %} + +```json { "parentModules": { "videoModule": [ @@ -166,7 +170,7 @@ In prebid.js, add your new submodule to `.submodules.json` under the `videoModul ] } } -{% endhighlight %} +``` ## Shared Resources for Developers diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 88213cc124..471d79c0e4 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -6,18 +6,19 @@ sidebarType: 1 --- # Ad Unit Reference + {:.no_toc} The ad unit object is where you configure what kinds of ads you will show in a given ad slot on your page, including: -+ Allowed media types (e.g., banner, native, and/or video) -+ Allowed sizes -+ AdUnit-specific first party data +* Allowed media types (e.g., banner, native, and/or video) +* Allowed sizes +* AdUnit-specific first party data It's also where you will configure bidders, e.g.: -+ Which bidders are allowed to bid for that ad slot -+ What information is passed to those bidders via their [parameters]({{site.baseurl}}/dev-docs/bidders.html) +* Which bidders are allowed to bid for that ad slot +* What information is passed to those bidders via their [parameters]({{site.baseurl}}/dev-docs/bidders.html) This page describes the properties of the `adUnit` object. @@ -42,7 +43,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `video` | Optional | Object | Used to link an Ad Unit to the [Video Module][videoModule]. For allowed params see the [adUnit.video reference](#adUnit-video). | | `deferBilling` | Optional | Boolean | Used by a publisher to flag adUnits as being separately billable. This allows for a publisher to trigger billing manually for winning bids. See [pbjs.triggerBilling](/dev-docs/publisher-api-reference/triggerBilling.html) and [onBidBillable](/dev-docs/bidder-adaptor.html#registering-on-bid-billable) for more info. | - + ### adUnit.bids @@ -61,7 +62,7 @@ Note that `bids` is optional only for [Prebid Server stored impressions](#stored | `ortb2Imp` | Optional | Object | OpenRTB first-party data specific to this bidder. This is merged with, and takes precedence over, `adUnit.ortb2Imp`.| | `renderer` | Optional | Object | Custom renderer. Takes precedence over `adUnit.renderer`, but applies only to this bidder. | - + ### adUnit.mediaTypes @@ -74,7 +75,7 @@ See the table below for the list of properties in the `mediaTypes` object of the | [`native`](#adUnit.mediaTypes.native) | At least one of the `banner`, `native`, or `video` objects are required. | Object | Defines properties of a native ad. For properties, see [`adUnit.mediaTypes.native`](#adUnit.mediaTypes.native). | | [`video`](#adUnit.mediaTypes.video) | At least one of the `banner`, `native`, or `video` objects are required. | Object | Defines properties of a video ad. For examples, see [`adUnit.mediaTypes.video`](#adUnit.mediaTypes.video). | - + #### adUnit.mediaTypes.banner @@ -85,7 +86,7 @@ See the table below for the list of properties in the `mediaTypes` object of the | `pos` | Optional | Integer | OpenRTB page position value: 0=unknown, 1=above-the-fold, 3=below-the-fold, 4=header, 5=footer, 6=sidebar, 7=full-screen | | `name` | Optional | String | Name for this banner ad unit. Can be used for testing and debugging. | - + #### adUnit.mediaTypes.native @@ -93,7 +94,7 @@ The `native` object contains properties that correspond to the assets of the nat See [Prebid Native Implementation](/prebid/native-implementation.html) for details. - + #### adUnit.mediaTypes.video @@ -140,10 +141,9 @@ If `'video.context'` is set to `'adpod'` then the following parameters are also | `contentLengthSec` | Optional | Number | A number representing the length of the video in seconds. Example: `contentLengthSec = 1` | | `contentMode` | Optional | String | A string indicating the type of content being displayed in the video player. There are two options, `live` and `on-demand`. Example: `contentMode = 'on-demand'` | + - - - + ### adUnit.video @@ -163,18 +163,18 @@ When using the Video Module, the mediaTypes.video properties get filled out auto ## Examples -+ [Banner](#adUnit-banner-example) -+ [Video](#adUnit-video-example) - - [With the Video Module](#adUnit-video-module-example) - - [Instream](#adUnit-video-example-instream) - - [Outstream](#adUnit-video-example-outstream) - - [Adpod (Long-Form)](#adUnit-video-example-adpod) -+ [Native](#adUnit-native-example) -+ [Multi-Format](#adUnit-multi-format-example) -+ [Twin Codes](#adUnit-twin-codes-example) -+ [First Party Data](#adUnit-fpd-example) +* [Banner](#adUnit-banner-example) +* [Video](#adUnit-video-example) + * [With the Video Module](#adUnit-video-module-example) + * [Instream](#adUnit-video-example-instream) + * [Outstream](#adUnit-video-example-outstream) + * [Adpod (Long-Form)](#adUnit-video-example-adpod) +* [Native](#adUnit-native-example) +* [Multi-Format](#adUnit-multi-format-example) +* [Twin Codes](#adUnit-twin-codes-example) +* [First Party Data](#adUnit-fpd-example) - + ### Banner @@ -208,6 +208,7 @@ pbjs.addAdUnits({ #### With the Video Module For an example of a video ad unit linked to the Video Module, see below. For more detailed instructions see the [Video Module docs][videoModule]. + ```javascript pbjs.addAdUnits({ code: slot.code, @@ -230,7 +231,7 @@ pbjs.addAdUnits({ }); ``` - + #### Instream @@ -258,7 +259,7 @@ pbjs.addAdUnits({ }); ``` - + #### Outstream @@ -312,7 +313,8 @@ pbjs.addAdUnits({ ... }); ``` - + + #### Adpod (Long-Form) @@ -346,7 +348,7 @@ var longFormatAdUnit = { } ``` - + ### Native @@ -362,27 +364,27 @@ pbjs.addAdUnits({ assets: [{ required: 1, img: { - type: 1, + type: 1, hmin: 50 }, - },{ + },{ required: 1, title: { len: 80 }, - },{ + },{ required: 1, data: { type: 1, len: 30 }, - },{ + },{ required: 1, data: { type: 2, len: 100 }, - },{ + },{ required: 1, img: { type: 3, @@ -390,8 +392,8 @@ pbjs.addAdUnits({ wmin: 267 } }] - } - } + } + } }, bids: [ { @@ -404,13 +406,13 @@ pbjs.addAdUnits({ }); ``` - + ### Multi-Format For an example of a multi-format ad unit, see below. For more detailed instructions, see [Show Multi-Format Ads]({{site.baseurl}}/dev-docs/show-multi-format-ads.html). -{% highlight js %} +```javascript pbjs.addAdUnits([{ code: 'div-banner-native', @@ -421,16 +423,16 @@ pbjs.addAdUnits([{ ] }, native: { - ortb: { - ver: "1.2", - assets: [{ - required: 1, - img: { - type: 1, - hmin: 50 - } - }] - } + ortb: { + ver: "1.2", + assets: [{ + required: 1, + img: { + type: 1, + hmin: 50 + } + }] + } }, }, bids: [{ @@ -471,16 +473,16 @@ pbjs.addAdUnits([{ ] }, native: { - ortb: { - ver: "1.2", - assets: [{ - required: 1, - img: { - type: 1, - hmin: 50 - } - }] - } + ortb: { + ver: "1.2", + assets: [{ + required: 1, + img: { + type: 1, + hmin: 50 + } + }] + } }, video: { context: 'outstream', @@ -496,20 +498,21 @@ pbjs.addAdUnits([{ } ]); -{% endhighlight %} +``` - + ### Twin AdUnit Codes It's ok to have multiple AdUnits with the same `code`. This can be useful in scenarios where bidders have different capabilities for the same spot on the page. e.g. -- BidderA should receive both media types, while BidderB gets only one -- BidderA gets one size while BidderB gets another +* BidderA should receive both media types, while BidderB gets only one +* BidderA gets one size while BidderB gets another In this example, bidderA gets both banner and outstream, while bidderB gets only banner. -{% highlight js %} + +```javascript var adUnits = [ { code: 'test-div', @@ -550,18 +553,18 @@ In this example, bidderA gets both banner and outstream, while bidderB gets only ] } ]; -{% endhighlight %} +``` In this example, bidderA receives 2 bidRequest objects while bidderB receives one. If a bidder provides more than one bid for the same AdUnit.code, Prebid.js will use the highest bid when it's time to set targeting. - + ### First Party Data Example of an adunit-specific block of first party data: -{% highlight js %} +```javascript pbjs.addAdUnits({ code: "test-div", mediaTypes: { @@ -571,27 +574,28 @@ pbjs.addAdUnits({ }, ortb2Imp: { ext: { - data: { + data: { pbadslot: "homepage-top-rect", adUnitSpecificContextAttribute: "123" - } + } } }, ... }); -{% endhighlight %} +``` Notes: -- Only contextual data should be added on the AdUnit; user-related data goes in the [global first party data](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd) config. -- For additional help with analytics and reporting you can use the [Prebid Ad Slot](/features/pbAdSlot.html), a special type of first party data. - +* Only contextual data should be added on the AdUnit; user-related data goes in the [global first party data](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd) config. +* For additional help with analytics and reporting you can use the [Prebid Ad Slot](/features/pbAdSlot.html), a special type of first party data. + + ### Interstitial Ads Example of an adunit-specific interstitial signal: -{% highlight js %} +```javascript pbjs.addAdUnits({ code: "test-div", mediaTypes: { @@ -600,15 +604,15 @@ pbjs.addAdUnits({ } }, ortb2Imp: { - instl:1 + instl:1 }, ... }); -{% endhighlight %} +``` For more information on Interstitial ads, reference the [Interstitial feature page](/features/InterstitialAds.html). Additionally, to assist with billing optimization and interstitial ads, the triggerBilling and onBidBillable functionality can be utilized. See [pbjs.triggerBilling](/dev-docs/publisher-api-reference/triggerBilling.html) and [onBidBillable](/dev-docs/bidder-adaptor.html#registering-on-bid-billable) for more info. - + ### Prebid Server stored impressions @@ -675,16 +679,14 @@ pbjs.addAdUnits({ ## Related Topics -+ [Publisher API Reference](/dev-docs/publisher-api-reference) -+ [Conditional Ad Units][conditionalAds] -+ [Show Native Ads](/prebid/native-implementation.html) -+ [Show Video Ads](/dev-docs/show-video-with-a-dfp-video-tag.html) -+ [Show Outstream Video Ads](/dev-docs/show-outstream-video-ads.html) -+ [Show Long-Form Video Ads](/prebid-video/video-long-form.html) -+ [Prebid.org Video Examples](/examples/video/) -+ [Prebid.org Native Examples](/dev-docs//examples/native-ad-example.html) - - +* [Publisher API Reference](/dev-docs/publisher-api-reference) +* [Conditional Ad Units][conditionalAds] +* [Show Native Ads](/prebid/native-implementation.html) +* [Show Video Ads](/dev-docs/show-video-with-a-dfp-video-tag.html) +* [Show Outstream Video Ads](/dev-docs/show-outstream-video-ads.html) +* [Show Long-Form Video Ads](/prebid-video/video-long-form.html) +* [Prebid.org Video Examples](/examples/video/) +* [Prebid.org Native Examples](/dev-docs//examples/native-ad-example.html) diff --git a/dev-docs/analytics-ga.md b/dev-docs/analytics-ga.md index 6e9ebaa939..b147025d48 100644 --- a/dev-docs/analytics-ga.md +++ b/dev-docs/analytics-ga.md @@ -19,7 +19,7 @@ nav_section: reference ### Code Example -{% highlight js %} +```javascript // If you're using GA, this should already be in your page: (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ @@ -38,7 +38,7 @@ pbjs.que.push(function() { }); }); -{% endhighlight %} +``` ##### A Few Requirements @@ -56,7 +56,7 @@ See [this link](https://developers.google.com/analytics/devguides/collection/pro To track a lower volume of traffic in Google Analytics, you may specify a sample rate in the options. For example, to set up a 5% sample rate: -{% highlight js %} +```javascript pbjs.que.push(function() { pbjs.enableAnalytics({ provider: 'ga', @@ -67,7 +67,7 @@ pbjs.que.push(function() { } }); }); -{% endhighlight %} +``` At the start of each page, Prebid chooses a random number between 0 and 1 and logs the analytics only if the number is less than the supplied sample rate, which defaults to 1 (100%). @@ -82,11 +82,11 @@ Prebid.js sends out GA-compatible [Events](https://support.google.com/analytics/ In this example, the page has 1 ad unit with 3 bidders. The timeout is set to 400ms. Let's go through what Prebid Analytics sends out to GA: {: .table .table-bordered .table-striped } -| Time | What Happened | GA Events Sent | +| Time | What Happened | GA Events Sent | | :---- |:--------| :-------| -| 15ms | Prebid.js sends out bid requests to bidders AppNexus, OpenX, and Pubmatic. | Event 1: Category=`Prebid.js Bids`, Action=`Requests`, Label=`appnexus`, Value=1.
Event 2: Category=`Prebid.js Bids`, Action=`Requests`, Label=`openx`, Value=1.
Event 3: Category=`Prebid.js Bids`, Action=`Requests`, Label=`pubmatic`, Value=1 | -| 203ms | AppNexus' bid came back with a CPM of $2.314 and a latency of 188ms. | Event 1: Category=`Prebid.js Bids`, Action=`Bids`, Label=`appnexus`, Value=231.
Event 2: Category=`Prebid.js Bids`, Action=`Bid Load Time`, Label=`appnexus`, Value=188 | -| 274ms | Pubmatic's bid came back with a CPM of $0 and a latency of 259ms. | No bid event sent out because it is a no bid.
Event 1: Category=`Prebid.js Bids`, Action=`Bid Load Time`, Label=`appnexus`, Value=259 | +| 15ms | Prebid.js sends out bid requests to bidders AppNexus, OpenX, and Pubmatic. | Event 1: Category=`Prebid.js Bids`, Action=`Requests`, Label=`appnexus`, Value=1.
Event 2: Category=`Prebid.js Bids`, Action=`Requests`, Label=`openx`, Value=1.
Event 3: Category=`Prebid.js Bids`, Action=`Requests`, Label=`pubmatic`, Value=1 | +| 203ms | AppNexus' bid came back with a CPM of $2.314 and a latency of 188ms. | Event 1: Category=`Prebid.js Bids`, Action=`Bids`, Label=`appnexus`, Value=231.
Event 2: Category=`Prebid.js Bids`, Action=`Bid Load Time`, Label=`appnexus`, Value=188 | +| 274ms | Pubmatic's bid came back with a CPM of $0 and a latency of 259ms. | No bid event sent out because it is a no bid.
Event 1: Category=`Prebid.js Bids`, Action=`Bid Load Time`, Label=`appnexus`, Value=259 | | 415ms | Timeout is up because 400ms has passed since bid requests were sent. OpenX has timed out. | Event 1: Category=`Prebid.js Bids`, Action=`Timeouts`, Label=`openx`, Value=1 | | 476ms | OpenX's bid came back with a CPM of $2.831 and a latency of 461ms (a bid may still come back after a timeout). | Event 1: Category=`Prebid.js Bids`, Action=`Bids`, Label=`openx`, Value=283.
Event 2: Category=`Prebid.js Bids`, Action=`Bid Load Time`, Label=`openx`, Value=461 | | 572ms | Google Ad Manager completed its auction and the AppNexus $2.314 bid won. | Event 3: Category=`Prebid.js Bids`, Action=`Wins`, Label=`appnexus`, Value=231 | diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 1f1ea8a295..cb671cfda5 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -9,6 +9,7 @@ sidebarType: 1 # How to Add a New Prebid.js Bidder Adapter + {:.no_toc} At a high level, a bidder adapter is responsible for: @@ -23,12 +24,12 @@ This page has instructions for writing your own bidder adapter. The instruction ## Planning your Adapter -+ [Required Adapter Rules](#bidder-adaptor-Required-Adapter-Conventions) -+ [Required Files](#bidder-adaptor-Required-Files) -+ [Designing your Bid Params](#bidder-adaptor-Designing-your-Bid-Params) -+ [HTTP Simple Requests](#bidder-adaptor-HTTP-simple-requests) +* [Required Adapter Rules](#bidder-adaptor-Required-Adapter-Conventions) +* [Required Files](#bidder-adaptor-Required-Files) +* [Designing your Bid Params](#bidder-adaptor-Designing-your-Bid-Params) +* [HTTP Simple Requests](#bidder-adaptor-HTTP-simple-requests) - + ### Required Adapter Rules @@ -43,7 +44,7 @@ In order to provide a fast and safe header bidding environment for publishers, t {: .alert.alert-danger :} The above list is **not** the full list of requirements. Failure to follow any of the required conventions defined in the [Module Rules](/dev-docs/module-rules.html) could lead to delays in approving your adapter for inclusion in Prebid.js. If you'd like to apply for an exception to one of the rules, make your request in a new [Prebid.js issue](https://github.com/prebid/Prebid.js/issues). - + ### Required Files @@ -51,16 +52,16 @@ With each adapter submission, there are two files required to be in the pull req * `modules/exampleBidAdapter.js`: the file containing the code for the adapter * `modules/exampleBidAdapter.md`: a markdown file containing key information about the adapter: - * The contact email of the adapter's maintainer. - * A test ad unit that will consistently return test creatives. This helps us to ensure future Prebid.js updates do not break your adapter. Note that if your adapter supports video (instream and/or outstream context) or native, you must also provide example parameters for each type. + * The contact email of the adapter's maintainer. + * A test ad unit that will consistently return test creatives. This helps us to ensure future Prebid.js updates do not break your adapter. Note that if your adapter supports video (instream and/or outstream context) or native, you must also provide example parameters for each type. Example markdown file: -{% highlight text %} +```md # Overview -``` +```markdown Module Name: Example Bidder Adapter Module Type: Bidder Adapter Maintainer: prebid@example.com @@ -71,7 +72,8 @@ Maintainer: prebid@example.com Module that connects to Example's demand sources # Test Parameters -``` + +```javascript var adUnits = [ { code: 'test-div', @@ -107,9 +109,9 @@ Module that connects to Example's demand sources ]; ``` -{% endhighlight %} +```html - + ### Designing your Bid Params @@ -117,7 +119,7 @@ The parameters of your ad request will be stored in the ad unit's `bid.params` o For more information about the kinds of information that can be passed using these parameters, see the example below, as well as [the existing bidder parameters]({{site.baseurl}}/dev-docs/bidders.html). -{% highlight js %} +```javascript { var adUnits = [{ @@ -144,9 +146,9 @@ For more information about the kinds of information that can be passed using the }] }]; -{% endhighlight %} +``` - + ### HTTP Simple Requests @@ -188,19 +190,20 @@ If you're the type that likes to skip to the answer instead of going through a t {: .alert.alert-warning :} If your adapter interfaces with an ORTB backend, you may take advantage of Prebid's [ORTB conversion library](https://github.com/prebid/Prebid.js/blob/master/libraries/ortbConverter/README.md), which provides most of the implementation for `buildRequests` and `interpretResponse`. -+ [Overview](#bidder-adaptor-Overview) -+ [Building the Request](#bidder-adaptor-Building-the-Request) -+ [Interpreting the Response](#bidder-adaptor-Interpreting-the-Response) -+ [Registering User Syncs](#bidder-adaptor-Registering-User-Syncs) -+ [Registering on Timeout](#bidder-adaptor-Registering-on-Timout) +* [Overview](#bidder-adaptor-Overview) +* [Building the Request](#bidder-adaptor-Building-the-Request) +* [Interpreting the Response](#bidder-adaptor-Interpreting-the-Response) +* [Registering User Syncs](#bidder-adaptor-Registering-User-Syncs) +* [Registering on Timeout](#bidder-adaptor-Registering-on-Timout) - + ### Overview The new code will reside under the `modules` directory with the name of the bidder suffixed by 'BidAdapter', e.g., `exampleBidAdapter.js`. Here are some guidelines for choosing a bidder code: + - The bidder code must be lower case alphanumeric. The only special character allowed is underscore. - The bidder code must be unique - make sure none of the other bid adapters is using the same code. - The bidder code should be unique for the first 6 characters - this consideration helps with generating unique targeting keys for use by some ad exchanges, such as Google Ad Manager. @@ -216,7 +219,7 @@ Compared to previous versions of Prebid, the new `BaseAdapter` model saves the a A high level example of the structure: -{% highlight js %} +```javascript import * as utils from 'src/utils'; import { registerBidder } from 'src/adapters/bidderFactory'; @@ -241,15 +244,15 @@ export const spec = { } registerBidder(spec); -{% endhighlight %} +``` - + ### Note on ORTB adapters If your adapter interfaces with an ORTB backend, you may take advantage of Prebid's [ORTB conversion library](https://github.com/prebid/Prebid.js/blob/master/libraries/ortbConverter/README.md), which provides most of the implementation for `buildRequests` and `interpretResponse`. - + ### Building the Request @@ -258,12 +261,12 @@ When the page asks Prebid.js for bids, your module's `buildRequests` function wi - `validBidRequests[]` - An array of bidRequest objects, one for each AdUnit that your module is involved in. This array has been processed for special features like sizeConfig, so it's the list that you should be looping through. - `bidderRequest` - The master bidRequest object. This object is useful because it carries a couple of bid parameters that are global to all the bids. -{% highlight js %} +```javascript buildRequests: function(validBidRequests, bidderRequest) { ... return ServerRequestObjects; } -{% endhighlight %} +``` Building the request will use data from several places: @@ -276,7 +279,7 @@ Building the request will use data from several places: Here is a sample array entry for `validBidRequests[]`: -{% highlight js %} +```javascript [{ adUnitCode: "test-div", auctionId: "b06c5141-fe8f-4cdf-9d7d-54415490a917", @@ -294,7 +297,7 @@ Here is a sample array entry for `validBidRequests[]`: src: "client", transactionId: "54a58774-7a41-494e-9aaf-fa7b79164f0c" }] -{% endhighlight %} +``` Retrieve your bid parameters from the `params` object. @@ -312,7 +315,7 @@ Other notes: Here is a sample bidderRequest object: -{% highlight js %} +```javascript { auctionId: "b06c5141-fe8f-4cdf-9d7d-54415490a917", auctionStart: 1579746300522, @@ -332,7 +335,7 @@ Here is a sample bidderRequest object: stack: ["http://mypage.org?pbjs_debug=true"] } } -{% endhighlight %} +``` Notes on parameters in the bidderRequest object: - **auctionID** is unique per call to `requestBids()`, but is the same across ad units. @@ -403,7 +406,7 @@ ServerRequest objects. These objects have this structure: Here's a sample block of code returning a ServerRequest object: -{% highlight js %} +```javascript return { method: 'POST', @@ -411,15 +414,15 @@ return { data: payloadObject }; -{% endhighlight %} +``` - + ### Interpreting the Response The `interpretResponse` function will be called when the browser has received the response from your server. The function will parse the response and create a bidResponse object containing one or more bids. The adapter should indicate no valid bids by returning an empty array. An example showing a single bid: -{% highlight js %} +```javascript // if the bid response was empty or an error, return [] // otherwise parse the response and return a bidResponses array @@ -450,7 +453,7 @@ The `interpretResponse` function will be called when the browser has received th brandId: BRAND_ID, brandName: BRAND_NAME, dchain: DEMAND_CHAIN_OBJECT, - demandSource: DEMAND_SOURCE + demandSource: DEMAND_SOURCE mediaType: MEDIA_TYPE, networkId: NETWORK_ID, networkName: NETWORK_NAME, @@ -461,7 +464,7 @@ The `interpretResponse` function will be called when the browser has received th bidResponses.push(bidResponse); return bidResponses; -{% endhighlight %} +``` {: .alert.alert-info :} Please provide as much information as possible in the `meta` object. Publishers use this @@ -519,7 +522,7 @@ bid currency. Header Bidding is a first-price auction, the best candidate for Prebid won't resolve any other macros in the creative (e.g. AUCTION_ID, AUCTION_CURRENCY). - + ### Registering User Syncs @@ -529,7 +532,7 @@ Given an array of all the responses from the server, `getUserSyncs` is used to d See below for an example implementation. For more examples, search for `getUserSyncs` in the [modules directory in the repo](https://github.com/prebid/Prebid.js/tree/master/modules). -{% highlight js %} +```javascript { getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) { @@ -558,9 +561,9 @@ See below for an example implementation. For more examples, search for `getUser } } -{% endhighlight %} +``` - + ### Registering on Timeout @@ -568,7 +571,7 @@ The `onTimeout` function will be called when an adapter has timed out for an auc Sample data passed to this function: -{% highlight js %} +```javascript [{ "bidder": "example", "bidId": "51ef8751f9aead", @@ -579,7 +582,7 @@ Sample data passed to this function: "timeout": 3000, "auctionId": "18fd8b8b0bd757" }] -{% endhighlight %} +``` ### Registering on Bid Won @@ -587,7 +590,7 @@ The `onBidWon` function will be called when a bid from the adapter won the aucti Sample data received by this function: -{% highlight js %} +```javascript { "bidder": "example", "width": 300, @@ -606,7 +609,7 @@ Sample data received by this function: "hb_size": "350x250" } } -{% endhighlight %} +``` ### Registering on Bid Billable @@ -614,7 +617,7 @@ The `onBidBillable` function will be called when it deems a bid to be billable. Sample data received by this function (same as what is recieved for onBidWon): -{% highlight js %} +```javascript { "bidder": "example", "width": 300, @@ -633,7 +636,7 @@ Sample data received by this function (same as what is recieved for onBidWon): "hb_size": "350x250" } } -{% endhighlight %} +``` ### Registering on Set Targeting @@ -641,7 +644,7 @@ The `onSetTargeting` function will be called when the adserver targeting has bee Sample data received by this function: -{% highlight js %} +```javascript { "bidder": "example", "width": 300, @@ -660,7 +663,7 @@ Sample data received by this function: "hb_size": "350x250" } } -{% endhighlight %} +``` ### Registering on Bidder Error @@ -668,7 +671,7 @@ The `onBidderError` function will be called when the bidder responded with an er Sample data received by this function: -{% highlight js %} +```javascript { error: XMLHttpRequest, bidderRequest: { @@ -692,13 +695,13 @@ Sample data received by this function: } } } -{% endhighlight %} +``` ### Adding adapter aliases Use aliases if you want to reuse your adapter using other name for your partner/client, or just a shortcut name. -{% highlight js %} +```javascript export const spec = { code: 'appnexus', @@ -713,7 +716,7 @@ export const spec = { ... } -{% endhighlight %} +``` spec.aliases can be an array of strings or objects. @@ -748,7 +751,7 @@ Follow the steps in this section to ensure that your adapter properly supports v Add the `supportedMediaTypes` argument to the spec object, and make sure VIDEO is in the list: -{% highlight js %} +```javascript export const spec = { code: BIDDER_CODE, @@ -756,7 +759,7 @@ export const spec = { ... } -{% endhighlight %} +``` {: .alert.alert-info :} If your adapter supports banner and video media types, make sure to include `'banner'` in the `supportedMediaTypes` array as well @@ -793,11 +796,11 @@ Video ad units have a publisher-defined video context, which can be either `'ins mediaTypes: { video: { context: 'outstream', - playerSize: [640, 480], - mimes: ['video/mp4'], - protocols: [1, 2, 3, 4, 5, 6, 7, 8], - playbackmethod: [2], - skip: 1 + playerSize: [640, 480], + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 // video params must be read from here in place of // or instead of bidder-specific parameters }, @@ -896,7 +899,7 @@ In both use cases, adapter is requesting bid responses for 20 placements in one Adapter must add following new properties to bid response -{% highlight js %} +```javascript { meta: { primaryCatId: '', // only needed if you want to ensure competitive separation @@ -906,7 +909,7 @@ Adapter must add following new properties to bid response durationSeconds: 30 } } -{% endhighlight %} +``` Appnexus Adapter uses above explained approach. You can refer [here](https://github.com/prebid/Prebid.js/blob/master/modules/appnexusBidAdapter.js) @@ -927,7 +930,7 @@ If the demand partner is going to use Prebid API for this process, their adapter **Example** -``` +```javascript getMappingFileInfo: function() { return { url: '', @@ -941,7 +944,7 @@ The mapping file is stored locally to expedite category conversion. Depending on To get the subcategory to use, call this function, which needs to be imported from the `bidderFactory`. -``` +```javascript getIabSubCategory(bidderCode, pCategory) ``` @@ -955,12 +958,12 @@ getIabSubCategory(bidderCode, pCategory) **Example** -{% highlight js %} +```javascript import { getIabSubCategory } from '../src/adapters/bidderFactory'; let primaryCatId = getIabSubCategory(bidderCode, pCategory) -{% endhighlight %} +``` #### Outstream Video Renderers @@ -976,7 +979,7 @@ The returned VAST URL or raw VAST XML should be added into `bid.vastUrl` or `bid For example: -{% highlight js %} +```javascript function createBid(status, reqBid, response) { let bid = bidfactory.createBid(status, reqBid); @@ -991,7 +994,7 @@ function createBid(status, reqBid, response) { return bid; } -{% endhighlight %} +``` ### Deals in Ad Pods @@ -1023,7 +1026,7 @@ The adapter code sample below fulfills requirement #2, unpacking the server's re 1. Checking for native assets on the response. 2. If present, filling in the `native` object with those assets. -{% highlight js %} +```javascript /* Does the bidder respond with native assets? */ else if (FEATURES.NATIVE && rtbBid.rtb.native) { @@ -1045,7 +1048,7 @@ else if (FEATURES.NATIVE && rtbBid.rtb.native) { }; } -{% endhighlight %} +``` The full list of assets your bidder can set are defined [by legacy Prebid.js](/prebid/native-implementation-legacy.html#3-prebidjs-native-adunit-overview). All assets can be returned as strings, or images can be returned as objects with attributes `url`, `height`, and `width`. @@ -1097,7 +1100,7 @@ For example tests, see [the existing adapter test suites](https://github.com/pre ## Full Bid Adapter Example -{% highlight js %} +```javascript import * as utils from 'src/utils'; import {config} from 'src/config'; @@ -1106,8 +1109,8 @@ import {BANNER, VIDEO, NATIVE} from 'src/mediaTypes.js'; const BIDDER_CODE = 'example'; export const spec = { code: BIDDER_CODE, - gvlid: 0000000000, - supportedMediaTypes: [BANNER, VIDEO, NATIVE], + gvlid: 0000000000, + supportedMediaTypes: [BANNER, VIDEO, NATIVE], aliases: [{code: "myAlias", gvlid: 99999999999} ], /** * Determines whether or not the given bid request is valid. @@ -1239,7 +1242,7 @@ export const spec = { } registerBidder(spec); -{% endhighlight %} +``` ## Submitting your adapter @@ -1317,5 +1320,5 @@ The Prebid.org [download page](/download.html) will automatically be updated wit ## Further Reading -+ [Prebid.js Repo - Bidder Adapter Sources](https://github.com/prebid/Prebid.js/tree/master/modules) -+ [Module Rules](/dev-docs/module-rules.html) +* [Prebid.js Repo - Bidder Adapter Sources](https://github.com/prebid/Prebid.js/tree/master/modules) +* [Module Rules](/dev-docs/module-rules.html) diff --git a/dev-docs/bidders/aax.md b/dev-docs/bidders/aax.md index 0d242b4194..011159bfb8 100644 --- a/dev-docs/bidders/aax.md +++ b/dev-docs/bidders/aax.md @@ -29,7 +29,7 @@ sidebarType: 1 | `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 @@ -40,20 +40,21 @@ sidebarType: 1 |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| +|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 -``` + +```javascript var videoAdUnit = { code: 'video1', mediaTypes: { @@ -75,7 +76,8 @@ var videoAdUnit = { ``` #### Example of Native Ad-unit -``` + +```javascript var adUnits = [{ code: 'div-gpt-ad-6874091242345-0', mediaTypes: { @@ -102,7 +104,8 @@ var adUnits = [{ ``` #### Example of Banner Ad-unit -``` + +```javascript var adUnits = [{ code: 'div-gpt-ad-6874091242345-0', mediaTypes: { diff --git a/dev-docs/bidders/adlivetech.md b/dev-docs/bidders/adlivetech.md index 3f378af1dd..bb2d7921e8 100644 --- a/dev-docs/bidders/adlivetech.md +++ b/dev-docs/bidders/adlivetech.md @@ -24,7 +24,7 @@ sidebarType: 1 - [Bidder Config](#bidder-config) - [First Party Data](#first-party-data) - + ### Bid Params @@ -35,12 +35,13 @@ sidebarType: 1 | `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` -``` + +```javascript pbjs.setBidderConfig({ bidders: ["adlivetech"], config: { @@ -48,9 +49,10 @@ pbjs.setBidderConfig({ } }) ``` + If it will be "true" this allow Adlivetech Bid Adapter to write userId in first party localStorage - + ### First Party Data diff --git a/dev-docs/bidders/apacdex.md b/dev-docs/bidders/apacdex.md index 9ba8994acb..1806244443 100644 --- a/dev-docs/bidders/apacdex.md +++ b/dev-docs/bidders/apacdex.md @@ -25,7 +25,7 @@ sidebarType: 1 - [Sample Video Ad Unit: Instream](#sample-video-ad-unit-instream) - [Sample Video Ad Unit: Outstream](#sample-video-ad-unit-outstream) - + ### Bid Params @@ -39,7 +39,7 @@ sidebarType: 1 (*) Please do not use `placementId` and `siteId` at the same time. - + ### Geo Object @@ -54,7 +54,7 @@ If the publisher has GEO data of the user's device. Make it available through th | `lastfix` | optional | Number of seconds since this geolocation fix was established. Note that devices may cache location data across multiple fetches. Ideally, this value should be from the time the actual fix was taken. | `30` | `integer` | | `utcoffset` | optional | Local time as the number +/- of minutes from UTC. | `-420` | `integer` | - + ### Video Ad Unit @@ -80,10 +80,11 @@ Publishers declare video inventory by passing the following parameters via media Lists of values are in the [OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) documentation as referenced above. - + ### Sample Banner Ad Unit -``` + +```javascript var adUnits = [ { code: 'test-div', @@ -105,10 +106,11 @@ var adUnits = [ ]; ``` - + ### Sample Video Ad Unit: Instream -``` + +```javascript var instreamAdUnit = { code: 'test-div', sizes: [[640, 480]], @@ -139,13 +141,15 @@ var instreamAdUnit = { ] }; ``` -mediaTypes.video object reference to section 3.2.7 Object: Video in the OpenRTB 2.5 document + +`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 - + ### Sample Video Ad Unit: Outstream -``` + +```javascript var outstreamAdUnit = { code: 'test-div', sizes: [[410, 231]], @@ -175,5 +179,6 @@ var outstreamAdUnit = { ] }; ``` -mediaTypes.video object reference to section 3.2.7 Object: Video in the OpenRTB 2.5 document + +`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 diff --git a/dev-docs/bidders/appier.md b/dev-docs/bidders/appier.md index 6271f7dec7..5061024784 100644 --- a/dev-docs/bidders/appier.md +++ b/dev-docs/bidders/appier.md @@ -9,7 +9,7 @@ gdpr_supported: true sidebarType: 1 --- - + #### Bid Params @@ -18,14 +18,13 @@ sidebarType: 1 |-----------|----------|---------------------------|------------|----------| | `hzid` | required | The zone ID from Appier. | `"WhM5WIOp"` | `string` | - - + #### Custom Settings (Optional) Set the "farm" to use region-specific server -``` +```javascript pbjs.que.push(function() { // use the bid server in Taiwan (country code: tw) pbjs.setConfig({ @@ -38,7 +37,7 @@ pbjs.que.push(function() { Explicitly override the bid server used for bidding -``` +```javascript pbjs.que.push(function() { pbjs.setConfig({ appier: { diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 4eb2b4f7c9..255049c3a1 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -20,7 +20,7 @@ gvl_id: 32 sidebarType: 1 --- -### Disclosure: +### 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. @@ -41,7 +41,7 @@ This adapter is known to use an HTTP 1 endpoint. Header bidding often generates - [Debug Auction](#debug-auction) - [Prebid Server Test Request](#prebid-server-test-request) - + {: .alert.alert-danger :} All AppNexus (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 AppNexus bidder will not return any demand for those placements.
@@ -77,7 +77,7 @@ The table below will reflect both formats, though it's recommended to use the lo | `externalImpId` or `external_imp_id` | 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` | - + #### Video Object @@ -92,8 +92,7 @@ The table below will reflect both formats, though it's recommended to use the lo | `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 @@ -107,8 +106,7 @@ The table below will reflect both formats, though it's recommended to use the lo | `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 @@ -121,13 +119,13 @@ AppNexus supports using prebid within a mobile app's webview. If you are interes | `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 AppNexus 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. -``` +```javascript pbjs.bidderSettings = { appnexus: { adserverTargeting: [ @@ -153,14 +151,15 @@ 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: -``` + +```javascript pbjs.setConfig({ appnexusAuctionKeywords: { genre: ['classical', 'jazz'], @@ -171,14 +170,13 @@ pbjs.setConfig({ 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 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 AppNexus. The following are examples of sending keys with empty values: - -``` +```javascript keywords: { myKeyword: '', myOtherKeyword: [''] @@ -189,14 +187,14 @@ The preceding example passes the key `myKeyword` with an empty value. The key `m 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. -``` +```javascript keywords: { color: ['red', 'blue', 'green'], otherKeyword: [''] } ``` - + #### First Party Data @@ -206,14 +204,13 @@ At this time however, the `appnexus` bidder only reads the First Party Data when PBS/PSP supports all first party data fields: site, user, segments, and imp-level first party data. - - + #### User Sync in AMP If you are syncing user id's with Prebid Server and are using AppNexus' 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 @@ -231,9 +228,9 @@ Enabling the AppNexus Debug Auction feature should only be done for diagnosing t To understand what is happening behind the scenes during an auction, you can enable a debug auction by adding an `apn_prebid_debug` cookie with a JSON string. For example: -{% highlight js %} +```javascript { "enabled": true, "dongle": "QWERTY", "debug_timeout": 1000, "member_id": 958 } -{% endhighlight %} +``` To view the results of the debug auction, add the `pbjs_debug=true` query string parameter and open your browser's developer console. @@ -251,22 +248,22 @@ The following test parameters can be used to verify that Prebid Server is workin server-side Appnexus adapter. This example includes an `imp` object with an Appnexus test placement ID and sizes that would match with the test creative. -``` - "imp": [{ - "id": "some-impression-id", - "banner": { - "format": [{ - "w": 600, - "h": 500 - }, { - "w": 300, - "h": 600 - }] - }, - "ext": { - "appnexus": { - "placement_id": 13144370 - } - } - }] +```json +"imp": [{ + "id": "some-impression-id", + "banner": { + "format": [{ + "w": 600, + "h": 500 + }, { + "w": 300, + "h": 600 + }] + }, + "ext": { + "appnexus": { + "placement_id": 13144370 + } + } +}] ``` diff --git a/dev-docs/bidders/astraone.md b/dev-docs/bidders/astraone.md index e286f085af..044075e224 100644 --- a/dev-docs/bidders/astraone.md +++ b/dev-docs/bidders/astraone.md @@ -15,28 +15,25 @@ You can use this adapter to get a bid from AstraOne. Please reach out to your AstraOne account team before using this plugin to get placeId. The code below returns a demo ad. - ### Bid Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------------|---------------------|-------------------------------------------------------------------|-------------------------------------------------------------------------------|----------| | `placeId` | required | The place id. | '5af45ad34d506ee7acad0c26' | `string` | -| `imageUrl` | required | URL of the image on which the banner will be displayed. | 'https://creative.astraone.io/files/default_image-1-600x400.jpg' | `string` | +| `imageUrl` | required | URL of the image on which the banner will be displayed. | `'https://creative.astraone.io/files/default_image-1-600x400.jpg'` | `string` | | `placement` | required | Adunit placement, possible values: inImage | 'inImage' | `string` | - ### InImage Example page - ```html - - Prebid.js Banner Example - - - + + Prebid.js Banner Example + + + + -

Prebid.js InImage Banner Test

+

Prebid.js InImage Banner Test

-
- +
+ - -
+ +
``` diff --git a/dev-docs/bidders/duration.md b/dev-docs/bidders/duration.md index 4943f68984..f7980da4b3 100644 --- a/dev-docs/bidders/duration.md +++ b/dev-docs/bidders/duration.md @@ -26,51 +26,52 @@ sidebarType: 1 | `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 + +```javascript +var adUnits = [ + { + code: 'test-div1', + mediaTypes: { + banner: { + sizes: [[300, 250]], // a display size + } + }, + bids: [ + { + bidder: "duration", + params: { + siteId: 2, + placementId: 3 } - }, - bids: [ - { - bidder: "duration", - params: { - siteId: 2 - } + } + ] + },{ + code: 'test-div2', + mediaTypes: { + banner: { + sizes: [[320, 50]], // a mobile size + } + }, + bids: [ + { + bidder: "duration", + params: { + siteId: 2 } - ] - } - ]; + } + ] + } +]; ``` - + #### Video Object @@ -84,4 +85,3 @@ If you absolutely want to run Duration Media in a Saferame creative, please cont | `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/goldbach.md b/dev-docs/bidders/goldbach.md index 343dbbaa1e..f637f537c6 100644 --- a/dev-docs/bidders/goldbach.md +++ b/dev-docs/bidders/goldbach.md @@ -29,7 +29,7 @@ sidebarType: 1 - [Mobile App Display Manager Version](#mobile-app-display-manager-version) - [Debug Auction](#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.
@@ -61,7 +61,7 @@ All Goldbach (Xandr) placements included in a single call to `requestBids` must | `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 @@ -76,8 +76,7 @@ All Goldbach (Xandr) placements included in a single call to `requestBids` must | `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 @@ -91,8 +90,7 @@ All Goldbach (Xandr) placements included in a single call to `requestBids` must | `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 @@ -105,13 +103,13 @@ Goldbach supports using prebid within a mobile app's webview. If you are interes | `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. -``` +```javascript pbjs.bidderSettings = { godlbach: { adserverTargeting: [ @@ -137,14 +135,14 @@ pbjs.bidderSettings = { } ``` - + #### 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: -``` +```javascript keywords: { myKeyword: '', myOtherKeyword: [''] @@ -155,20 +153,20 @@ The preceding example passes the key `myKeyword` with an empty value. The key `m 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. -``` +```javascript 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 @@ -186,9 +184,9 @@ Enabling the Goldbach Debug Auction feature should only be done for diagnosing t To understand what is happening behind the scenes during an auction, you can enable a debug auction by adding an `apn_prebid_debug` cookie with a JSON string. For example: -{% highlight js %} +```javascript { "enabled": true, "dongle": "QWERTY", "debug_timeout": 1000, "member_id": 958 } -{% endhighlight %} +``` To view the results of the debug auction, add the `pbjs_debug=true` query string parameter and open your browser's developer console. @@ -199,4 +197,3 @@ To view the results of the debug auction, add the `pbjs_debug=true` query string | `dongle` | Your account's unique debug password. | `QWERTY` | `string` | | `member_id` | The ID of the member running the debug auction | `958` | `integer` | | `debug_timeout` | The timeout for the debug auction results to be returned | `3000` | `integer` | - diff --git a/dev-docs/bidders/grid.md b/dev-docs/bidders/grid.md index c3984c8b5c..f366b36fca 100644 --- a/dev-docs/bidders/grid.md +++ b/dev-docs/bidders/grid.md @@ -27,7 +27,7 @@ sidebarType: 1 - [First Party Data](#first-party-data) - [Native setup example (s2s only)](#native-setup-example-s2s-only) - + ### Bid Params @@ -37,12 +37,13 @@ sidebarType: 1 | `uid` | required | Represents the MediaGrid bidder system Ad Slot ID associated with the respective div id from the site page. | `1` | `integer` | | `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 `grid` -``` + +```javascript pbjs.setBidderConfig({ bidders: ["grid"], config: { @@ -50,9 +51,10 @@ pbjs.setBidderConfig({ } }) ``` + If it will be "true" this allow TheMediaGrid Bid Adapter to write userId in first party localStorage - + ### First Party Data @@ -73,12 +75,13 @@ AdUnit-specific data using `AdUnit.ortb2Imp` supports following fields: - `ortb2.imp[].ext.data.*` - `ortb2.imp[].instl` - + ### Native setup example (s2s only) Setup native in adUnit mediaTypes, for example: -``` + +```javascript ... mediaTypes: { native: { diff --git a/dev-docs/bidders/hybrid.md b/dev-docs/bidders/hybrid.md index aaeebc1e85..7520627d31 100644 --- a/dev-docs/bidders/hybrid.md +++ b/dev-docs/bidders/hybrid.md @@ -15,16 +15,14 @@ You can use this adapter to get a bid from Hybrid.ai Please reach out to your Hybrid.ai account team before using this plugin to get placeId. The code below returns a demo ad. - ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------------|------------------------|-------------------------------------------------------------------|--------------------------------------|----------| -| `placeId` | required | The place id. | '5af45ad34d506ee7acad0c26' | `string` | -| `placement` | required | Adunit placement, possible values: banner, video, inImage | 'banner' | `string` | -| `imageUrl` | required for inImage | URL of the image on which the banner will be displayed | 'https://hybrid.ai/images/image.jpg' | `string` | - +| Name | Scope | Description | Example | Type | +|---------------------|------------------------|-------------------------------------------------------------------|----------------------------------------|----------| +| `placeId` | required | The place id. | '5af45ad34d506ee7acad0c26' | `string` | +| `placement` | required | Adunit placement, possible values: banner, video, inImage | 'banner' | `string` | +| `imageUrl` | required for inImage | URL of the image on which the banner will be displayed | `'https://hybrid.ai/images/image.jpg'` | `string` | ### Sample Banner Ad Unit @@ -94,10 +92,10 @@ var adUnits = [{ - - Prebid.js Banner Example - - - + + Prebid.js Banner Example + + + + -

Prebid.js Banner Ad Unit Test

-
- - -
+

Prebid.js Banner Ad Unit Test

+
+ + +
``` diff --git a/dev-docs/bidders/improvedigital.md b/dev-docs/bidders/improvedigital.md index eebe5e9af3..739baf9f0f 100755 --- a/dev-docs/bidders/improvedigital.md +++ b/dev-docs/bidders/improvedigital.md @@ -33,7 +33,6 @@ sidebarType: 1 | `extend` | optional | See the [Extend mode section](#improvedigital-extend) | `true` | `boolean` | | `rendererConfig` | optional | Configuration object for JS renderer of the RAZR creatives. Provided by Improve Digital. | `{ key1: value1 }` | `object` | - ### Configuration @@ -41,7 +40,8 @@ sidebarType: 1 #### Sizes By default, the adapter doesn't send Prebid ad unit sizes to Improve Digital's ad server and the sizes defined for each placement in the Polaris platform will be used. If the ad server should only respond with creative sizes as defined in Prebid ad unit configuration, turn on `usePrebidSizes` adapter parameter like this: -``` + +```javascript pbjs.setConfig({ improvedigital: { usePrebidSizes: true } }); @@ -53,7 +53,7 @@ pbjs.setConfig({ Global configuration for the special creative format renderer. Please use [rendererConfig bid param](#improvedigital-params) for ad slot specific configuration. -``` +```javascript pbjs.setConfig({ improvedigital: { rendererConfig: { @@ -69,10 +69,11 @@ pbjs.setConfig({ Improve Digital Extend mode provides publishers with access to additional demand from other SSPs. Before enabling please contact our team for more information. The Extend mode can be enabled: + * per ad unit via the `extend` [bid param](#improvedigital-params) * for all ad units via `setConfig()`: -``` +```javascript pbjs.setConfig({ improvedigital: { extend: true @@ -80,42 +81,46 @@ pbjs.setConfig({ }); ``` - + ### Examples Examples of different ad unit formats can be found in [Prebid.js ad unit reference](https://docs.prebid.org/dev-docs/adunit-reference.html#adUnit-banner-example). Improve Digital bidder must be added in the ad unit's `bids` array. Example: - pbjs.addAdUnits({ - code: 'banner1', - sizes: [[728, 90], [970, 250]], - bids: [ - { - bidder: 'improvedigital', - params: { - placementId: 1111111, - publisherId: 1234 - } +```javascript +pbjs.addAdUnits({ + code: 'banner1', + sizes: [[728, 90], [970, 250]], + bids: [ + { + bidder: 'improvedigital', + params: { + placementId: 1111111, + publisherId: 1234 } - ] - }); + } + ] +}); +``` #### Example for Key-Values - pbjs.addAdUnits({ - code: 'banner1', - sizes: [[600, 290]], - bids: [ - { - bidder: 'improvedigital', - params: { - placementId: 1111111, - publisherId: 1234, - keyValues: { - testKey1: ["testValueA"], - testKey2: ["testValueB", "testValueC"] - } +```javascript +pbjs.addAdUnits({ + code: 'banner1', + sizes: [[600, 290]], + bids: [ + { + bidder: 'improvedigital', + params: { + placementId: 1111111, + publisherId: 1234, + keyValues: { + testKey1: ["testValueA"], + testKey2: ["testValueB", "testValueC"] } } - ] - }); + } + ] +}); +``` diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md index dbcd1baaa5..1c9e08bb2d 100644 --- a/dev-docs/bidders/ix-server.md +++ b/dev-docs/bidders/ix-server.md @@ -26,21 +26,20 @@ sidebarType: 1 ## Table of contents -- [Table of contents](#table-of-contents) -- [Introduction](#introduction) -- [Supported media types](#supported-media-types) -- [Setup instructions to call Index through Prebid Server](#setup-instructions-to-call-index-through-prebid-server) - - [Call Index from a web browser](#call-index-from-a-web-browser) - - [Call Index from Prebid Mobile SDK](#call-index-from-prebid-mobile-sdk) - - [Call Index from CTV/long-form video environment](#call-index-from-ctvlong-form-video-environment) - - [Call Index from any other server-to-server OpenRTB environment](#call-index-from-any-other-server-to-server-openrtb-environment) -- [Bid request parameters](#bid-request-parameters) - - [Banner](#banner) - - [Video](#video) -- [Examples](#examples) - - - +* [Table of contents](#table-of-contents) +* [Introduction](#introduction) +* [Supported media types](#supported-media-types) +* [Setup instructions to call Index through Prebid Server](#setup-instructions-to-call-index-through-prebid-server) + * [Call Index from a web browser](#call-index-from-a-web-browser) + * [Call Index from Prebid Mobile SDK](#call-index-from-prebid-mobile-sdk) + * [Call Index from CTV/long-form video environment](#call-index-from-ctvlong-form-video-environment) + * [Call Index from any other server-to-server OpenRTB environment](#call-index-from-any-other-server-to-server-openrtb-environment) +* [Bid request parameters](#bid-request-parameters) + * [Banner](#banner) + * [Video](#video) +* [Examples](#examples) + + ## Introduction @@ -51,11 +50,11 @@ Publishers can use Prebid Server in any of the following ways with Index Exchang * In CTV apps and other long-form video environments, you (or the SSAI vendor) can make a call to Prebid Server using OpenRTB, and then Prebid Server uses our server-side adapter to call Index. For set up instructions, see [Call Index from CTV/long-form video environment](#set-up-instructions-to-call-index-through-prebid-server) section on this page. * In any other server-to-server OpenRTB environment, you can send OpenRTB bid requests to the Prebid Server host of your choice. For set up instructions, see [Call Index from any other server-to-server OpenRTB environment](#call-index-from-ortb) section on this page. -**Note about sending multiple ad slots in a single bid request:** Index accepts up to 100 valid ad slots in a single bid request. If a single bid request contains more than 100 ad slots (including invalid ad slots), only the first 100 valid ad slots are accepted and the rest are ignored. For example streaming TV media owners can signal multiple ad pods for long-form programming in a single request. +**Note about sending multiple ad slots in a single bid request:** Index accepts up to 100 valid ad slots in a single bid request. If a single bid request contains more than 100 ad slots (including invalid ad slots), only the first 100 valid ad slots are accepted and the rest are ignored. For example streaming TV media owners can signal multiple ad pods for long-form programming in a single request. - + -## Supported media types +## Supported media types The following table lists the media types that Index supports. For information about the the Time-To-Live (TTL) for each media type, see [How Index counts impressions](https://kb.indexexchange.com/publishers/billing/how_Index_counts_impressions.htm) in our Knowledge Base. @@ -66,24 +65,23 @@ The following table lists the media types that Index supports. For information a | video | Supported, including ad pods for OTT | | native | Supported | - -## Setup instructions to call Index through Prebid Server + + +## Setup instructions to call Index through Prebid Server **Note:** If you are hosting your own Prebid Server instance, you must contact your Index Exchange Representative to get an endpoint and setup instructions. If you are using an existing Prebid Server instance that is already configured to call Index, depending on whether you want to call Index from the browser, mobile app, CTV, or long-form video, follow any of the below sections to complete the Index-specific configuration. + - - -### Call Index from a web browser +### Call Index from a web browser If you want to call Index from a web environment, you can use Prebid.js to call Prebid Server and then Prebid Server uses our server-side adapter to call Index. For setup instructions, see the Index-specific configuration steps in [Set up instructions for Prebid.js](https://docs.prebid.org/dev-docs/bidders/ix.html) in our Prebid.js documentation on the Prebid site. + - - -### Call Index from Prebid Mobile SDK +### Call Index from Prebid Mobile SDK **Before you begin:** Contact your Index Exchange representative to get your `siteId`. You must provide this site ID to your Prebid Server host company. @@ -91,31 +89,32 @@ If you want to call Index from a web environment, you can use Prebid.js to call To add Index as a bidder to your mobile app: -1. Inform your Prebid Server hosting company to add `ix `as a bidder in the configuration and include the `siteId` that Index provides to you at the time of integration. +1. Inform your Prebid Server hosting company to add `ix`as a bidder in the configuration and include the `siteId` that Index provides to you at the time of integration. 2. Define the Index-specific parameters at the bidder level. For information about these parameters, see the [Bid request parameters](#bid-request-parameters) section below. 3. Include any ad unit level required or optional parameters provided in Prebid's [Prebid Mobile API - iOS](https://docs.prebid.org/prebid-mobile/pbm-api/ios/ios-sdk-integration-gam-original-api.html) and [Prebid Mobile API - Android](https://docs.prebid.org/prebid-mobile/pbm-api/android/android-sdk-integration-gam-original-api.html) documentation. - + ### Call Index from CTV/long-form video environment - + **Before you begin:** Contact your Index Exchange Representative to get the `siteId`. You must provide this site ID to your Prebid Server host company. **Note:** To implement CTV and long-form video using Prebid Server, follow Prebid's [Long Form Video](https://docs.prebid.org/prebid-server/use-cases/pbs-lfv.html) documentation. To add Index as a bidder: -1. Inform your Prebid Server hosting company to add `ix `as a bidder in the configuration and include the `siteId` that Index provides to you at the time of integration. +1. Inform your Prebid Server hosting company to add `ix`as a bidder in the configuration and include the `siteId` that Index provides to you at the time of integration. 2. Define the Index-specific parameters at the bidder level. For information about these parameters, see the [Bid request parameters](#bid-request-parameters) section below. 3. Include any ad unit level required or optional parameters provided in Prebid's [/openrtb2/video](https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-video.html) documentation. - + -### Call Index from any other server-to-server OpenRTB environment +### Call Index from any other server-to-server OpenRTB environment To request bids from Index: -* In requests that you make to your Prebid Server host, add `imp.ext.ix` and include the `siteId `that Index provides to you at the time of integration.
+* In requests that you make to your Prebid Server host, add `imp.ext.ix` and include the `siteId` that Index provides to you at the time of integration.
+ **Example:** ```javascript @@ -128,27 +127,24 @@ To request bids from Index: }], ``` + - - -## Bid request parameters +## Bid request parameters For a list of the OpenRTB fields that Index supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://kb.indexexchange.com/publishers/openrtb_integration/list_of_supported_openrtb_bid_request_fields_for_sellers.htm#List_of_supported_OpenRTB_bid_request_fields_for_sellers). The following are the required fields for the various supported media types. +### Banner -### Banner - -You must include these parameters at the bidder level. +You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } | Key | Scope | Type | Description | |---|---|---|---| | `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`| -### Video - -You must include these parameters at the bidder level. +### Video +You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } | Key | Scope | Type | Description | @@ -157,7 +153,6 @@ You must include these parameters at the bidder level. If you are using Index's outstream player and have placed the video object at the bidder level, you must include the Index required parameters at the bidder level. You can include the optional parameters to specify the outstream player configurations. - {: .table .table-bordered .table-striped } | Key | Scope | Type | Description | |---|---|---|---| @@ -168,14 +163,13 @@ If you are using Index's outstream player and have placed the video object at th | `video.playerConfig.floatOnScroll` | Optional | Boolean | A boolean specifying whether you want to use the player's floating capabilities, where:
- `true`: Use the Index player's float capabilities.
**Note:** If you set `floatOnScroll` to `true`, Index updates the placement value to `5`.
**Note:** We do not recommend using the player's default float capabilities if you have more than one outstream ad unit per page.
-`false`: Do not use the Index player's float capabilities (default). | | `video.playerConfig.floatSize` | Optional | Integer[] | The height and width of the floating player in pixels. If you do not specify a float size, the player adjusts to the aspect ratio of the player size that is defined when it is not floating. Index recommends that you review and test the float size to your user experience preference. | -
+ -## Examples +## Examples **Banner** - -```javascript +```json { "id": "ix-banner-id", "imp": [ @@ -230,11 +224,9 @@ If you are using Index's outstream player and have placed the video object at th } ``` +**Video** -**Video** - - -```javascript +```json { "id": "ix-video-example", "imp": [ diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 9f528a1aa1..57beb1b495 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -25,27 +25,27 @@ sidebarType: 1 ## Table of contents -- [Table of contents](#table-of-contents) -- [Introduction](#introduction) -- [Supported media types](#supported-media-types) -- [Set up Prebid.js to call Index directly from the browser (client-side adapter)](#set-up-prebidjs-to-call-index-directly-from-the-browser-client-side-adapter) -- [Set up Prebid.js to call Index through Prebid Server (server-side adapter)](#set-up-prebidjs-to-call-index-through-prebid-server-server-side-adapter) -- [Modules to include in your build process](#modules-to-include-in-your-build-process) -- [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) - - [Global data](#prebid-fpd-module) - - [Index bidder-specific data](#index-bidder-specific-fpd-module) - - [AdUnit-specific data](#adunit-specific-data) -- [Index's outstream video player](#indexs-outstream-video-player) -- [Prebid Native configuration](#prebid-native-configuration) -- [Bid request parameters](#bid-request-parameters) - - [Banner](#banner) - - [Video](#video) - - [Native](#native) -- [Multi-format ad units](#multi-format-ad-units) -- [Examples](#examples) - - - +* [Table of contents](#table-of-contents) +* [Introduction](#introduction) +* [Supported media types](#supported-media-types) +* [Set up Prebid.js to call Index directly from the browser (client-side adapter)](#set-up-prebidjs-to-call-index-directly-from-the-browser-client-side-adapter) +* [Set up Prebid.js to call Index through Prebid Server (server-side adapter)](#set-up-prebidjs-to-call-index-through-prebid-server-server-side-adapter) +* [Modules to include in your build process](#modules-to-include-in-your-build-process) +* [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) + * [Global data](#prebid-fpd-module) + * [Index bidder-specific data](#index-bidder-specific-fpd-module) + * [AdUnit-specific data](#adunit-specific-data) +* [Index's outstream video player](#indexs-outstream-video-player) +* [Prebid Native configuration](#prebid-native-configuration) +* [Bid request parameters](#bid-request-parameters) + * [Banner](#banner) + * [Video](#video) + * [Native](#native) +* [Multi-format ad units](#multi-format-ad-units) +* [Examples](#examples) + + + ## Introduction @@ -54,15 +54,18 @@ Publishers can use Prebid.js to call Index Exchange (Index) in any of the follow * **Call through our client-side adapter:** Prebid.js calls Index directly from the browser using our client-side adapter. This option tends to have a better cookie match rate. For configuration instructions, see the [Set up Prebid.js to call Index directly from the browser (client-side adapter)](#client-side-adapter) on this page. * **Call through our server-side adapter**: Prebid.js makes a call to Prebid Server and then Prebid Server uses our server-side adapter to call Index. This reduces workload on the browser. For configuration instructions, see the [Set up Prebid.js to call Index through Prebid Server (server-side adapter)](#server-side-adapter) on this page. -**Notes:** +**Notes:** + * **Send multiple ad slots in a single bid request**: Index accepts up to 100 valid ad slots in a single bid request. If a single bid request contains more than 100 ad slots (including invalid ad slots), only the first 100 valid ad slots are accepted and the rest are ignored. For example streaming TV media owners can signal multiple ad pods for long-form programming in a single request. * **How to view bid requests sent to Index:** - * In your browser, open a new tab. - * Open the **Developer tools**. - * In **Developer tools**, click the **Network** tab. - * In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. -* **Recommended Global Bidder settings:** For our adapter, Index recommends enabling local storage. As of Prebid.js 7.x, local storage access must be explicitly specified. By leveraging local storage, Index is able to take advantage of the latest features our exchange has to offer. For instructions on enabling local storage, see Prebid’s [pbjs.bidderSettings](https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html) documentation.
-Example: + * In your browser, open a new tab. + * Open the **Developer tools**. + * In **Developer tools**, click the **Network** tab. + * In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. +* **Recommended Global Bidder settings:** For our adapter, Index recommends enabling local storage. As of Prebid.js 7.x, local storage access must be explicitly specified. By leveraging local storage, Index is able to take advantage of the latest features our exchange has to offer. For instructions on enabling local storage, see Prebid’s [pbjs.bidderSettings](https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html) documentation. + +### Example + ```javascript pbjs.bidderSettings = { ix: { @@ -71,9 +74,9 @@ pbjs.bidderSettings = { }; ``` - + -## Supported media types +## Supported media types The following table lists the media types that Index supports. For information about the the Time-To-Live (TTL) for each media type, see [How Index counts impressions](https://kb.indexexchange.com/publishers/billing/how_Index_counts_impressions.htm) in our Knowledge Base. @@ -85,30 +88,32 @@ The following table lists the media types that Index supports. For information a | video | Supported | | native | Supported | - + ## Set up Prebid.js to call Index directly from the browser (client-side adapter) In this configuration Prebid.js calls Index directly from the browser using our client-side adapter. Follow the quick start instructions provided in Prebid's [Getting Started for Developers](https://docs.prebid.org/dev-docs/getting-started.html) documentation. Complete the following steps to complete the Index-specific configuration: - 1. Build the binary in one of the following ways: * [Download Prebid.js](https://docs.prebid.org/download.html) from the Prebid site to use the standard compiled binary that Prebid includes in the download process and select **Index Exchange** as an adapter. - * Build it on your own from the source code by following the instructions in [Prebid.js project README](https://github.com/prebid/Prebid.js/blob/master/README.md#build-optimization). If you use this method, you will need to include several modules in your build process. See the [Index modules to include in your build process](#modules-to-include-in-your-build-process) section below. + * Build it on your own from the source code by following the instructions in [Prebid.js project README](https://github.com/prebid/Prebid.js/blob/master/README.md#build-optimization). If you use this method, you will need to include several modules in your build process. See the [Index modules to include in your build process](#modules-to-include-in-your-build-process) section below. 2. Define the Index-specific parameters at the bidder level which include adding `ix` as the bidder and the `siteId`. For Index's bidder-specific parameters, see the [Bid request parameters](#bid-request-parameters) section below.
-**Example:** +**Example:** + ```javascript { - bidder: 'ix', - params: { - siteId: '123456' - } + bidder: 'ix', + params: { + siteId: '123456' } +} ``` 3. Define your ad units in the `adUnit` object. This includes the details about the ad slots such as the media types, ad size, and ad code. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. 4. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames, though we do also support image-based syncing. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Make sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
-**Example:** + +**Example:** + ```javascript pbjs.setConfig({ userSync: { @@ -122,21 +127,22 @@ In this configuration Prebid.js calls Index directly from the browser using our } }); ``` + 5. (Optional) Set up First Party Data (FPD). For more information about the data types we support and the instructions for each option, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. 6. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function as follows:
-```javascript - pbjs.setConfig({ - cache: { - url: 'https://prebid.adnxs.com/pbc/v1/cache' - } - }); -``` + ```javascript + pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } + }); + ``` 7. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. * Use Index’s outstream video player. For more information, see the [Index's outstream video player ](#indexs-outstream-video-player)section below. * Use your own outstream video player. For more information, see [Prebid's documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) 8. (Optional) Configure Prebid Native with Index. For more information, see the [Prebid Native](#prebid-native-configuration) section below. Prebid Native is available from Prebid.js version 7.4.0 or higher. - + ## Set up Prebid.js to call Index through Prebid Server (server-side adapter) @@ -176,14 +182,15 @@ In this configuration, Prebid.js makes a call to Prebid Server and then Prebid S - + ## Modules to include in your build process If you are building the JS binary on your own from source code, follow the instructions in [Prebid.js project README](https://github.com/prebid/Prebid.js/blob/master/README.md#build-optimization). You will need to include the `ixBidAdapter`. If you want to show video ads with Google Ad Manager, also include the `dfpAdServerVideo` module. We highly recommend adding the `gptPreAuction` module as well, which improves a DSP's ability to bid accurately on your supply. The following is an example build command that include these modules:
`gulp build --modules=ixBidAdapter,dfpAdServerVideo,gptPreAuction,fooBidAdapter,bazBidAdapter` -If you are using a JSON file to specify modules, add `ixBidAdapter` and `dfpAdServerVideo` to the modules array as follows: +If you are using a JSON file to specify modules, add `ixBidAdapter` and `dfpAdServerVideo` to the modules array as follows: + ```javascript [ "ixBidAdapter", @@ -195,13 +202,13 @@ If you are using a JSON file to specify modules, add `ixBidAdapter` and `dfpAdSe ``` - + ## Set up First Party Data (FPD) You can set up the Prebid.js FPD module using Global data, Index bidder-specific site data, or ad unit-specific data. Index supports deal targeting in all the three FPD types. - + ### Global data @@ -222,7 +229,7 @@ pbjs.setConfig({ }); ``` - + ### Index bidder-specific data @@ -241,30 +248,30 @@ To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the ` } }); ``` - + + ### AdUnit-specific data Use this data type to specify key-value pairs at the ad unit level when targeting deals and apply it to all bidders. This will be available from Prebid.js version 7.46 and above. To include the adUnit-specific data in a bid request, see Prebid's [Supplying AdUnit-Specific Data](https://docs.prebid.org/features/firstPartyData.html#supplying-adunit-specific-data) documentation. - ```javascript ortb2Imp: { ext: { data: { pbadslot: "homepage-top-rect", adUnitSpecificAttribute: "123" - } - } - } + } + } +} ``` - + ## Index's outstream video player Publishers who are using Index as a bidding adapter in Prebid.js can show outstream video ads on their site using Index's outstream video player. This allows a video ad to be placed anywhere on a publisher’s site, such as in-article, in-feed, and more. Outstream video is available from Prebid.js version 6.25 or higher.
-**Note:** When you use the Index renderer for outstream video, all impressions are considered viewable, which is similar to how Google's ActiveView counts impressions for outstream. This is because Index renders the outstream video as soon as it is in view and concurrently fires any impression pixels in the VAST. +**Note:** When you use the Index renderer for outstream video, all impressions are considered viewable, which is similar to how Google's ActiveView counts impressions for outstream. This is because Index renders the outstream video as soon as it is in view and concurrently fires any impression pixels in the VAST. To use Index’s outstream video player, in your Prebid.js configuration:
@@ -304,10 +311,9 @@ var adUnits = [{ }] ``` - *Please note that your use of the outstream video player will be governed by and subject to the terms and conditions of i) any master services or license agreement entered into by you and Index Exchange; ii) the information provided on our knowledge base linked [here](https://kb.indexexchange.com/publishers/prebid_integration/outstream_video_prebidjs.htm) and [here](https://kb.indexexchange.com/publishers/guidelines/standard_contractual_clauses.htm), and iii) our [Privacy Policy](https://www.indexexchange.com/privacy/). Your use of Index's outstream video player constitutes your acknowledgement and acceptance of the foregoing.* - + ## Prebid Native configuration @@ -354,17 +360,15 @@ pbjs.addAdUnits({ }); ``` + - - -## Bid request parameters +## Bid request parameters For a list of the OpenRTB fields that Index supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://kb.indexexchange.com/publishers/openrtb_integration/list_of_supported_openrtb_bid_request_fields_for_sellers.htm#List_of_supported_OpenRTB_bid_request_fields_for_sellers). The following are the required fields for the various supported media types. +### Banner -### Banner - -You must include these parameters at the bidder level. +You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } @@ -372,10 +376,9 @@ You must include these parameters at the bidder level. |---|---|---|---| | `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`| -### Video - -You must include these parameters at the bidder level. +### Video +You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } @@ -397,14 +400,14 @@ If you are using Index's outstream player and have placed the video object at th | `video.playerConfig.floatOnScroll` | Optional | Boolean | A boolean specifying whether you want to use the player's floating capabilities, where:
- `true`: Use the Index player's float capabilities.
**Note:** If you set `floatOnScroll` to `true`, Index updates the placement value to `5`.
**Note:** We do not recommend using the player's default float capabilities if you have more than one outstream ad unit per page.
-`false`: Do not use the Index player's float capabilities (default). | | `video.playerConfig.floatSize` | Optional | Integer[] | The height and width of the floating player in pixels. If you do not specify a float size, the player adjusts to the aspect ratio of the player size that is defined when it is not floating. Index recommends that you review and test the float size to your user experience preference. | - ### Native Index supports the same set of native assets that Prebid.js recognizes. For the list of native assets, see [Prebid.js Native Implementation Guide on the Prebid site.](https://docs.prebid.org/prebid/native-implementation.html#3-prebidjs-native-adunit-overview) -
+ ## Multi-format ad units + Index supports multi-format ad units, see [Show Multi-Format Ads with Prebid.js](https://docs.prebid.org/dev-docs/show-multi-format-ads.html). For multi-format ad units, you can optionally specify a different siteId for each multi-format type at the bidder level. This is useful if you have deals set up with Index at the siteId level. See multi-format examples [here](#examples). The following are the parameters that you can specify for each multi-format type at the bidder level. @@ -418,15 +421,12 @@ The following are the parameters that you can specify for each multi-format type | `video.siteId` | Optional | String | An Index-specific identifier that is associated with this ad unit. This siteId will be prioritized over the default siteID for `video` format in the multi-format ad unit.| | `native.siteId` | Optional | String | An Index-specific identifier that is associated with this ad unit. This siteId will be prioritized over the default siteID for `native` format in the multi-format ad unit.| + - - -## Examples - +## Examples **Banner** - ```javascript var adUnits = [{ code: 'banner-div-a', @@ -444,15 +444,13 @@ var adUnits = [{ siteId: '123456' } } - }] + ] }]; ``` - **Video (instream):**
-**Note**: `context` can either be `'instream'` or `'outstream'`. - +**Note**: `context` can either be `'instream'` or `'outstream'`. ```javascript var adUnits = [{ @@ -485,10 +483,8 @@ var adUnits = [{ ``` - **Video (outstream)** - ```javascript var adUnits = [{ code: 'div-gpt-ad-1571167646410-1', @@ -520,10 +516,8 @@ var adUnits = [{ ``` - **Prebid Native** - ```javascript pbjs.addAdUnits({ code: slot.code, @@ -567,6 +561,7 @@ pbjs.addAdUnits({ ``` **Multi-format SiteId Overrides** + ```javascript var adUnits = [{ code: slot.code, diff --git a/dev-docs/bidders/medianet.md b/dev-docs/bidders/medianet.md index 7f38bd69fb..d882554e04 100644 --- a/dev-docs/bidders/medianet.md +++ b/dev-docs/bidders/medianet.md @@ -26,7 +26,7 @@ sidebarType: 1 | `bidfloor` | optional | Bidfloor for the impression | `1.0` | `float` | | `video` | required for video Ad units | Object containing video targeting parameters. See [Video Object](#media.net-video-object) for details.|`video: { maxduration: 60 }` | `object` | -
+ #### Video Object @@ -37,20 +37,21 @@ sidebarType: 1 |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| +|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`, Media.net adapter consumes parameters specified in the `mediaTypes.video`. #### Example of Instream Video Ad-unit -``` + +```javascript var videoAdUnit = { code: 'video1', mediaTypes: { @@ -78,7 +79,8 @@ var videoAdUnit = { ``` #### Example of Native Ad-unit -``` + +```javascript var adUnits = [{ code: 'div-gpt-ad-1544091247692-0', mediaTypes: { @@ -111,7 +113,8 @@ var adUnits = [{ ``` #### Example of Banner Ad-unit -``` + +```javascript var adUnits = [{ code: 'div-gpt-ad-1460505748561-0', mediaTypes: { @@ -138,4 +141,3 @@ var adUnits = [{ }] }]; ``` - diff --git a/dev-docs/bidders/mgid.md b/dev-docs/bidders/mgid.md index d52a4baf94..6e0047424b 100644 --- a/dev-docs/bidders/mgid.md +++ b/dev-docs/bidders/mgid.md @@ -23,7 +23,7 @@ sidebarType: 1 - [Test Parameters](#test-parameters) - [User Sync](#user-sync) - + ### Description @@ -31,7 +31,7 @@ One of the easiest way to gain access to MGID demand sources - MGID header bidd MGID header bidding adapter connects with MGID demand sources to fetch bids for display placements. Please reach out to your account manager or for more information. - + ### Bid params @@ -43,13 +43,13 @@ MGID header bidding adapter connects with MGID demand sources to fetch bids for | `bidFloor` | optional | Lowest value of expected bid price | `1.1` | `float` | | `currency` | optional | Currency of request and response | `'GBP'` | `string` | - - + ### Test Parameters 300x600 banner test -``` + +```javascript var adUnits = [{ code: 'div-prebid', mediaTypes: { @@ -68,7 +68,8 @@ var adUnits = [{ ``` 300x250 banner test -``` + +```javascript var adUnits = [{ code: 'div-prebid', mediaTypes: { @@ -87,7 +88,8 @@ var adUnits = [{ ``` native test -``` + +```javascript var adUnits = [{ code: 'div-prebid', mediaTypes: { @@ -120,7 +122,7 @@ var adUnits = [{ }]; ``` - + ### User Sync diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index 7e3fc168e3..56ebee98bd 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -22,7 +22,7 @@ sidebarType: 1 ### Registration -If you have any questions regarding set up, please reach out to your account manager or support@openx.com. +If you have any questions regarding set up, please reach out to your account manager or [support@openx.com]. Please note that OpenX is transitioning its serving architecture and currently has 2 bid adapters as of Prebid 7. The legacy adapter is named openxBidAdapter. The newer of the two is openxOrtbBidAdapter. Publishers are welcome to test with openxOrtbBidAdapter and give feedback. @@ -31,6 +31,7 @@ After the transition openxOrtbBidAdapter will replace openxBidAdapter. IMPORTANT: only include either openxBidAdapter or openxOrtbBidAdapter in your build. ### Bid Parameters + #### Banner {: .table .table-bordered .table-striped } @@ -45,8 +46,8 @@ IMPORTANT: only include either openxBidAdapter or openxOrtbBidAdapter in your bu ** platform is deprecated. Please use delDomain instead. If you have any questions please contact your representative. - ### AdUnit Format for Banner + ```javascript var adUnits = [ { @@ -113,8 +114,8 @@ The following video parameters are supported here so publishers may fully declar | placement | recommended | Placement type for the impression. (see openRTB v2.5 section 5.9 for options) | 1 | integer | | | | | | | - ### AdUnit Format for Video + ```javascript var videoAdUnits = [ { @@ -147,8 +148,8 @@ var videoAdUnits = [ }] ``` - ## Example + ```javascript var adUnits = [ { @@ -199,13 +200,14 @@ var adUnits = [ ]; ``` -#### First Party Data +### First Party Data + OpenX supports FPD configured under `ortb2.user`and `ortb2.site.content` as described [here](/features/firstPartyData.html). -Ad unit specific FPD is not supported, and segment taxonomies (`segtax`) are simply passed through. If you have any -questions, please reach out to us at prebid@openx.com +Ad unit specific FPD is not supported, and segment taxonomies (`segtax`) are simply passed through. If you have any questions, please reach out to us at [prebid@openx.com] -Example: -``` +Example: + +```javascript pbjs.setConfig({ ... ortb2: { @@ -236,6 +238,7 @@ pbjs.setConfig({ ``` ### Configuration + Add the following code to enable user syncing. By default, Prebid.js version 0.34.0+ turns off user syncing through iframes. OpenX strongly recommends enabling user syncing through iframes. This functionality improves DSP user match rates and increases the OpenX bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. @@ -249,6 +252,6 @@ pbjs.setConfig({ ``` ## Additional Details -[Banner Ads](https://docs.openx.com/Content/developers/containers/prebid-adapter.html) (Customer login required.) -[Video Ads](https://docs.openx.com/Content/developers/containers/prebid-video-adapter.html) (Customer login required.) +* [Banner Ads](https://docs.openx.com/Content/developers/containers/prebid-adapter.html) (Customer login required.) +* [Video Ads](https://docs.openx.com/Content/developers/containers/prebid-video-adapter.html) (Customer login required.) diff --git a/dev-docs/bidders/playwire.md b/dev-docs/bidders/playwire.md index 325e7748af..a2e47aecb7 100644 --- a/dev-docs/bidders/playwire.md +++ b/dev-docs/bidders/playwire.md @@ -25,7 +25,7 @@ sidebarType: 1 - [Bidder Config](#bidder-config) - [First Party Data](#first-party-data) - + ### Bid Params @@ -36,12 +36,13 @@ sidebarType: 1 | `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 `playwire` -``` + +```javascript pbjs.setBidderConfig({ bidders: ["playwire"], config: { @@ -49,9 +50,10 @@ pbjs.setBidderConfig({ } }) ``` + If it will be "true" this allow Playwire Bid Adapter to write userId in first party localStorage - + ### First Party Data diff --git a/dev-docs/bidders/redtram.md b/dev-docs/bidders/redtram.md index 211f5d062f..8d18f3ecf0 100644 --- a/dev-docs/bidders/redtram.md +++ b/dev-docs/bidders/redtram.md @@ -29,13 +29,13 @@ sidebarType: 1 - [Bid params](#bid-params) - [Test Parameters](#test-parameters) - + ### Description Redtram header bidding adapter connects with redtram demand sources to fetch bids for display placements. Please reach out to your account manager or for more information. - + ### Bid params @@ -45,13 +45,13 @@ Redtram header bidding adapter connects with redtram demand sources to fetch bid | `placementId`| optional | The placement ID from Redtram | `'23611'` | `string` | | `bidFloor` | optional | Lowest value of expected bid price | `1.1` | `float` | - - + ### Test Parameters 300x250 banner test -``` + +```javascript var adUnits = [{ code: 'prebid-place', mediaTypes: { diff --git a/dev-docs/bidders/richaudience.md b/dev-docs/bidders/richaudience.md index ec16d027da..c61810348c 100644 --- a/dev-docs/bidders/richaudience.md +++ b/dev-docs/bidders/richaudience.md @@ -28,8 +28,8 @@ sidebarType: 1 | `keywords` | optional | A key-value applied only to the configured bid. This value is optional. Strings separated by semicolon. | `car=mercedes;car=audi;` | `string` | | `player` | optional | Object containing video targeting parameters. See [Video Object](#ra-video-object) for details. | `player: {init: 'open', end: 'close', skin: 'dark'}` | `object` | + - ### Video Object {: .table .table-bordered .table-striped } diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index 0ac9554abb..9514c03512 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -25,7 +25,7 @@ sidebarType: 1 ### Registration -For both Prebid.js and Prebid Server, the Rubicon Project adapter requires setup and approval from the Magnite team, even for existing accounts. Please reach out to your account team or globalsupport@magnite.com for more information. +For both Prebid.js and Prebid Server, the Rubicon Project adapter requires setup and approval from the Magnite team, even for existing accounts. Please reach out to your account team or [globalsupport@magnite.com] for more information. ### Bid Params @@ -42,23 +42,25 @@ For both Prebid.js and Prebid Server, the Rubicon Project adapter requires setup | `inventory` | optional | See below for details on First Party Data. In release 4.29 and earlier, this parameter allows the definition of an object defining arbitrary key-value pairs concerning the page for use in targeting. The values must be arrays of strings. | `{"rating":["5-star"], "prodtype":["tech","mobile"]}` | `object` | | `visitor` | optional | See below for details on First Party Data. In release 4.29 and earlier, this parameter allows the definition of an object defining arbitrary key-value pairs concerning the visitor for use in targeting. The values must be arrays of strings. | `{"ucat":["new"], "search":["iphone"]}` | `object` | | `keywords` | optional | See below for details on First Party Data. In release 4.29 and earlier, this can be used to influence reports for client-side display. To get video or server-side reporting, please use First Party data or the inventory/visitor parameters. | `["travel", "tourism"]` | `Array` | -| `video` | required for video | Video targeting parameters. See the [video section below](#rubicon-video). | `{"language": "en"}` | `object` | +| `video` | required for video | Video targeting parameters. See the [video section below](#mediatypesvideo). | `{"language": "en"}` | `object` | | pchain | optional | deprecated option that was an early alternative to schain | "GAM:11111-reseller1:22222" | string | | `bidonmultiformat` | optional | Beta parameter - please check with your account manager before setting this value | `boolean` | `true` | #### First Party Data In release 4.30 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[] + +* ortb2.site.ext.data.* +* ortb2.site.keywords +* ortb2.site.content.data[] +* ortb2.user.ext.data.* +* ortb2.user.data[] With regards to Contextual and Audience segments, the Magnite exchange supports the IAB standard taxonomies. See [the segment management user guide](https://resources.rubiconproject.com/resource/publisher-resources/segment-management-user-guide/) for more information. Example first party data that's available to all bidders and all adunits: -``` + +```javascript pbjs.setConfig({ ortb2: { site: { @@ -81,7 +83,8 @@ pbjs.setConfig({ ``` Example of first party data available only to the Rubicon Project bidder. Applies across all ad units. -``` + +```javascript pbjs.setBidderConfig({ bidders: ["rubicon"], config: { @@ -107,7 +110,8 @@ pbjs.setBidderConfig({ ``` For Prebid.js 4.29 and before, use the bidder specific AdUnit parameters noted above: -``` + +```javascript var adUnit = { ... bids: [{ @@ -137,12 +141,13 @@ Rubicon supports passing up to 50 domains in `badv` for anything hitting Prebid 4. AMP For example: -``` + +```javascript pbjs.setConfig({ ortb2: { badv: ["domain1.com", "domain2.com"] } -)}; +}); ``` #### mediaTypes.video @@ -152,7 +157,7 @@ The following video parameters are supported here so publishers may fully declar {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |----------------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-----------| -| context | required | instream or outstream |"outstream" | string | +| 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| @@ -169,7 +174,6 @@ The following video parameters are supported here so publishers may fully declar | placement* | recommended | Placement type for the impression. (see openRTB v2.5 section 5.9 for options) | 1 | integer | | | | | | | - #### bids.params.video The following Rubicon Project-specific video parameters are supported: @@ -182,7 +186,7 @@ The following Rubicon Project-specific video parameters are supported: Here's a video example for Prebid.js 2.5 or later: -``` +```javascript var videoAdUnit = { code: 'myVideoAdUnit', mediaTypes: { @@ -216,7 +220,6 @@ We recommend discussing video demand with your Magnite account representative. Lists of values are in the [OpenRTB 2.5](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) documentation as referenced above. - #### Outstream Video As of Prebid.js 4.37 Magnite's Rubicon Project adapter supports outstream video in two ways: using your own renderer or using ours. See the [Prebid.org Outstream documentation](/dev-docs/show-outstream-video-ads.html) for more information on using your own renderer. @@ -227,7 +230,7 @@ The Magnite outstream renderer is a JavaScript tag that will load our outstream The renderer appearance can be configured with the following parameters, all of them optional. If any parameter is missing, the default value will be used. All options are case-sensitive and unknown options will be ignored. Additional advanced options are available by calling your Magnite account representative. -``` +```javascript pbjs.setConfig({ rubicon: { rendererConfig: { @@ -241,15 +244,15 @@ pbjs.setConfig({ }); ``` - * The Rubicon Project exchange does not make multi-format requests. If multiple mediatypes are defined, we bid on banner first, then video. Native bids will only be made if it's the only mediatype present. * Note that only the Prebid-Server-side rubicon adapter currently supports native. ### Setting up the Prebid Server Adapter -If you're a Prebid Server host company looking to enable the Rubicon server-side adapter, you'll need to contact globalsupport@magnite.com. They will provide: -- a Magnite DV+ XAPI login and password that you'll place in the PBS config -- a partner code you can use for cookie-syncing with Magnite's service +If you're a Prebid Server host company looking to enable the Rubicon server-side adapter, you'll need to contact [globalsupport@magnite.com]. They will provide: + +* a Magnite DV+ XAPI login and password that you'll place in the PBS config +* a partner code you can use for cookie-syncing with Magnite's service ### Configuration @@ -258,7 +261,8 @@ If you're a Prebid Server host company looking to enable the Rubicon server-side By default, the Rubicon Project adapter sends one request to rubiconproject.com for each AdUnit. For example, if there are 4 PBJS AdUnits defined on the page, you'll see 4 calls out to rubiconproject.com/fastlane.json. As of PBJS 1.12, the Rubicon Project adapter supports `Single Request` mode, where all AdUnit requests are made in a single call to rubiconproject.com. To turn this feature on, call `setConfig`: -``` + +```javascript pbjs.setConfig({ rubicon: {singleRequest: true} }); @@ -276,6 +280,6 @@ For Prebid, the Rubicon Project bid adapter reports the revenue type as ‘gross It’s important to note that what the Rubicon Prebid bid adapter reports is not directly related to the setting with the Rubicon Project exchange. If you are a publisher who has set your Rubicon exchange revenue type set to ‘gross’ and you'd like the Rubicon bid adapter to also report 'gross', you can change the 2.35+ default 'net' setting in Prebid.js with: -``` +```javascript pbjs.setConfig({ rubicon: {netRevenue: false} }); ``` diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index dfab0ab753..1dd1b947b0 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -35,19 +35,19 @@ sidebarType: 1 - [First Party Data](#first-party-data) - [Test Parameters](#test-parameters) -
+ ### Registration -The Smaato adapter requires setup and approval from the Smaato team, even for existing Smaato publishers. Please reach out to your account team or prebid@smaato.com for more information. +The Smaato adapter requires setup and approval from the Smaato team, even for existing Smaato publishers. Please reach out to your account team or [prebid@smaato.com] for more information. - + ### Note The Smaato adapter will convert bidfloors to 'USD' currency as needed. - + ### Bid Params @@ -63,7 +63,7 @@ The Smaato adapter will convert bidfloors to 'USD' currency as needed. In case of AdPods, the Smaato adapter will only read the first `imp[].skadn` entry for each AdPod, such that there should only be one `skadn` occurrence per AdPod. - + #### App Object @@ -75,7 +75,7 @@ Smaato supports using prebid within a mobile app's webview. | `ifa` | String that contains the advertising identifier of the user (e.g. idfa or aaid). | `'56700000-9cf0-22bd-b23e-46b96e40003a'` | `string` | | `geo` | Object that contains the latitude (`lat`) and longitude (`lon`) of the user. | `{ lat: 33.3, lon: -88.8 }` | `object` | - + ### Example Ad Units @@ -205,10 +205,12 @@ var adUnit = { }; ``` - + ### First Party Data + Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported: + - ortb2.site.keywords - ortb2.site.content - ortb2.user.keywords @@ -248,13 +250,13 @@ pbjs.setConfig({ }); ``` - + ### Test Parameters Following example includes sample `imp` object with publisherId and adSlot which can be used to test Smaato Adapter -``` +```json "imp":[ { "id":"1C86242D-9535-47D6-9576-7B1FE87F282C", diff --git a/dev-docs/bidders/smartadserver.md b/dev-docs/bidders/smartadserver.md index 2b24156ef1..295ee92166 100644 --- a/dev-docs/bidders/smartadserver.md +++ b/dev-docs/bidders/smartadserver.md @@ -39,7 +39,7 @@ The Smart AdServer bidder adapter requires setup and approval from the Equativ ( **Note:** The site, page and format identifiers have to all be provided or all empty. - + #### Video Object @@ -70,47 +70,48 @@ The Smart AdServer bidder adapter requires setup and approval from the Equativ ( ### Examples Without site/page/format : -``` - "imp": [{ - "id": "some-impression-id", - "banner": { - "format": [{ - "w": 600, - "h": 500 - }, { - "w": 300, - "h": 600 - }] - }, - "ext": { - "smartadserver": { - "networkId": 73 - } - } - }] + +```json + "imp": [{ + "id": "some-impression-id", + "banner": { + "format": [{ + "w": 600, + "h": 500 + }, { + "w": 300, + "h": 600 + }] + }, + "ext": { + "smartadserver": { + "networkId": 73 + } + } + }] ``` With site/page/format : -``` - "imp": [{ - "id": "some-impression-id", - "banner": { - "format": [{ - "w": 600, - "h": 500 - }, { - "w": 300, - "h": 600 - }] - }, - "ext": { - "smartadserver": { +```json + "imp": [{ + "id": "some-impression-id", + "banner": { + "format": [{ + "w": 600, + "h": 500 + }, { + "w": 300, + "h": 600 + }] + }, + "ext": { + "smartadserver": { "networkId": 73 "siteId": 1, "pageId": 2, "formatId": 3 - } - } - }] + } + } + }] ``` diff --git a/dev-docs/bidders/smartx.md b/dev-docs/bidders/smartx.md index 678ae6cd86..453d58a9ed 100644 --- a/dev-docs/bidders/smartx.md +++ b/dev-docs/bidders/smartx.md @@ -16,6 +16,7 @@ sidebarType: 1 --- ### Registration + Please reach out to your smartclip business contact for any questions and assistance in configuration. ### Bid Params @@ -37,7 +38,7 @@ Please reach out to your smartclip business contact for any questions and assist | `max_duration` | optional | Maximum video ad duration in seconds | `60` | `integer` | | `sitekey` | optional | Sitekey provided by smartclip. | `'foo.bar.baz'` | `string` | - + #### outstream_options Object diff --git a/dev-docs/bidders/spotx.md b/dev-docs/bidders/spotx.md index a692ccb0e8..c9863480ff 100644 --- a/dev-docs/bidders/spotx.md +++ b/dev-docs/bidders/spotx.md @@ -41,8 +41,7 @@ The SpotX adapter requires setup and approval from your Magnite account manager. | `position` | optional | Number corresponding to the position of the ad. See SpotX documentation [here](https://developer.spotxchange.com/content/local/docs/sdkDocs/EASI/easi-integration.md#common-javascript-attributes) | | `integer` | | `page` | optional | The URL of the page the ad is being displayed on. Used to override the detected referrer if necessary | `'https://www.spotx.tv'` | `string` | - - + #### outstream_options Object diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md index 109444a6e3..e5c1d5144f 100644 --- a/dev-docs/bidders/triplelift.md +++ b/dev-docs/bidders/triplelift.md @@ -30,13 +30,13 @@ sidebarType: 1 - [Banner](#banner) - [Video](#video) - [Example Configuration](#example-configuration) - - [Banner](#banner-1) + - [Banner](#banner-configuration) - [Video (Instream)](#video-instream) - [Video (Outstream)](#video-outstream) - [First Party Data](#first-party-data) - [Programmatic DMP](#triplelift-programmatic-dmp) - + ### Overview @@ -45,7 +45,7 @@ Publishers may integrate with Triplelift through our Prebid.js and/or Prebid Ser {: .alert.alert-info :} The Triplelift Prebid Server bidding adapter and user sync endpoint require setup before beginning. Please contact us at prebid@triplelift.com. - + ### Bid Params @@ -58,7 +58,6 @@ The Triplelift Prebid Server bidding adapter and user sync endpoint require setu | `inventoryCode` | required | TripleLift inventory code for this ad unit (provided to you by your partner manager) | `'pubname_top_banner'` | `string` | | `floor` | optional | Bid floor | `1.00` | `float` | - #### Video Triplelift bid params for video mediaTypes are identical, but be sure to include the appropriate video.placement value to indicate instream/outstream format. Speak with your partner manager about which value to place here based on what formats are enabled. @@ -72,13 +71,13 @@ See the [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.ht | `adUnit.mediaTypes.video.placement` | required | Instream: 1; Outstream: 3, 4, 5. | `3` | `int` | | `adUnit.mediaTypes.video.playerSize` | required | Video player dimensions or size in pixels | `[640, 480]` | `integer array` | - + ### Example Configuration -#### Banner +#### Banner Configuration -``` +```javascript var adUnits = [ { code: 'top-banner', @@ -101,7 +100,7 @@ var adUnits = [ #### Video (Instream) -``` +```javascript var videoAdUnit = { code: 'video1', mediaTypes: { @@ -123,7 +122,7 @@ var videoAdUnit = { #### Video (Outstream) -``` +```javascript var videoAdUnit = { code: 'video1', mediaTypes: { @@ -143,27 +142,29 @@ var videoAdUnit = { }; ``` - + ### First Party Data Publishers should use the `ortb2` method of setting [First Party Data](https://docs.prebid.org/features/firstPartyData.html). The following fields are supported: + - `ortb2.site.*`: Standard IAB OpenRTB 2.5 site fields - `ortb2.user.*`: Standard IAB OpenRTB 2.5 user fields AdUnit-specific data is supported using `AdUnit.ortb2Imp.ext.*` - + ### Programmatic DMP -Triplelift provides audience and contextual targeting via the integration of a Programmatic DMP tag. Please reach out to your Triplelift representative to discuss specifics of the integration. +Triplelift provides audience and contextual targeting via the integration of a Programmatic DMP tag. Please reach out to your Triplelift representative to discuss specifics of the integration. + +#### Requirements -#### Requirements: - Prebid v7.1.0 or later - In Prebid's `bidderSettings`, the `storageAllowed` parameter must be set to **true**. In Prebid v7.0 and later, `storageAllowed` defaults to false, so you will need to explicitly set this value to true. - ``` + ```javascript pbjs.bidderSettings = { triplelift: { storageAllowed: true diff --git a/dev-docs/bidders/triplelift_native.md b/dev-docs/bidders/triplelift_native.md index 4085b6e4bd..7a58f447e4 100644 --- a/dev-docs/bidders/triplelift_native.md +++ b/dev-docs/bidders/triplelift_native.md @@ -23,10 +23,10 @@ sidebarType: 1 --- {: .alert.alert-info :} -This is a Prebid Server adapter for running component native only. For the standard Prebid JS Triplelift bid adapter, see the "Triplelift" bidder. If you are interested in running component native via Prebid JS, please contact us at prebid@triplelift.com. +This is a Prebid Server adapter for running component native only. For the standard Prebid JS Triplelift bid adapter, see the "Triplelift" bidder. If you are interested in running component native via Prebid JS, please contact us at [prebid@triplelift.com]. {: .alert.alert-info :} -The Triplelift Prebid Server bidding adapter and user sync endpoint require setup before beginning. Please contact us at prebid@triplelift.com. +The Triplelift Prebid Server bidding adapter and user sync endpoint require setup before beginning. Please contact us at [prebid@triplelift.com]. ### Table of Contents @@ -34,7 +34,7 @@ The Triplelift Prebid Server bidding adapter and user sync endpoint require setu - [Bid Params](#bid-params) - [First Party Data](#first-party-data) - + ### Bid Params @@ -44,10 +44,11 @@ The Triplelift Prebid Server bidding adapter and user sync endpoint require setu | inventoryCode | required | TripleLift inventory code for this ad unit (provided to you by your partner manager) | 'code1' | string | | floor | optional | the bid floor, in usd | 1.2 | number | - + ### First Party Data Triplelift supports standard IAB OpenRTB 2.5 First Party Data fields, including: + - `site.*` - `user.*` diff --git a/dev-docs/bidders/trustx.md b/dev-docs/bidders/trustx.md index f05359fd35..bf7fbbf18d 100644 --- a/dev-docs/bidders/trustx.md +++ b/dev-docs/bidders/trustx.md @@ -27,7 +27,7 @@ sidebarType: 1 - [Bidder Config](#bidder-config) - [First Party Data](#first-party-data) - + ### Bid Params @@ -39,7 +39,8 @@ sidebarType: 1 | `bidFloor` | optional | Floor of the impression opportunity. If present in the request overrides XML info. | `0.8` | `float` | Parameter `keywords` must have following format: -``` + +```javascript { "site":{ "publisher1":[ @@ -61,12 +62,13 @@ Parameter `keywords` must have following format: } ``` - + ### Bidder Config You can allow writing in localStorage `pbjs.setBidderConfig` for the bidder `trustx` -``` + +```javascript pbjs.setBidderConfig({ bidders: ["trustx"], config: { @@ -74,10 +76,12 @@ pbjs.setBidderConfig({ } }) ``` + If it will be "true" this allow TheMediaGrid Bid Adapter to write userId in first party localStorage If you want to make alias on TrustX Bid Adapter, you must set `forceBidderName` in bidderConfig as `"trustx"`. -``` + +```javascript pbjs.setBidderConfig({ bidders: ["aliasName"], config: { @@ -86,7 +90,7 @@ pbjs.setBidderConfig({ }) ``` - + ### First Party Data diff --git a/dev-docs/bidders/trustxstandalone.md b/dev-docs/bidders/trustxstandalone.md index f67fa71d6b..f29d509159 100644 --- a/dev-docs/bidders/trustxstandalone.md +++ b/dev-docs/bidders/trustxstandalone.md @@ -21,7 +21,7 @@ sidebarType: 1 - [Bid Params](#bid-params) - [First Party Data](#first-party-data) - + ### Bid Params @@ -33,7 +33,7 @@ sidebarType: 1 | `keywords` | optional (pbjs only) | A set of key-value pairs applied to all ad slots on the page. Values can be empty. | `keywords: { topic: ['stress', 'fear'] }` | `object` | | `useNewFormat` | optional (pbjs only) | Indicates to use the new ad request format. | `true` | `boolean` | - + ### First Party Data diff --git a/dev-docs/bidders/ucfunnel.md b/dev-docs/bidders/ucfunnel.md index 3ea94149bb..78e9a0d3d6 100644 --- a/dev-docs/bidders/ucfunnel.md +++ b/dev-docs/bidders/ucfunnel.md @@ -18,14 +18,14 @@ sidebarType: 1 ### Prebid JS -#### Bid params +#### Bid params (Prebid.js) {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |--------|----------|-------------------------------------------------|---------|----------| | `adid` | required | The ad unit ID retrived from ucfunnel dashboard | | `string` | -``` +```javascript var adUnits = [{ code: 'div-gpt-ad-1460505748511-01', sizes: [ @@ -43,17 +43,17 @@ var adUnits = [{ {: .alert.alert-info :} Sizes set in the `adUnit` object will also apply to the ucfunnel bid requests. - -### Examples + - - [Banner Ads](https://cdn.aralego.net/ucfad/test/ucfunnel/compliance/pbjs_banner.html) - - [Instream Video Ads](https://cdn.aralego.net/ucfad/test/ucfunnel/compliance/pbjs_video.html) - - [Native Ads](https://cdn.aralego.net/ucfad/test/ucfunnel/compliance/pbjs_native.html) +### Examples +- [Banner Ads](https://cdn.aralego.net/ucfad/test/ucfunnel/compliance/pbjs_banner.html) +- [Instream Video Ads](https://cdn.aralego.net/ucfad/test/ucfunnel/compliance/pbjs_video.html) +- [Native Ads](https://cdn.aralego.net/ucfad/test/ucfunnel/compliance/pbjs_native.html) ### Prebid server -#### Bid params +#### Bid params (Prebid Server) {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | diff --git a/dev-docs/conditional-ad-units.md b/dev-docs/conditional-ad-units.md index dfcfbbc799..41d7b54dbb 100644 --- a/dev-docs/conditional-ad-units.md +++ b/dev-docs/conditional-ad-units.md @@ -37,7 +37,7 @@ to send them requests from display or tablets. We'll start with how to set up the labels from `sizeConfig`: -{% highlight js %} +```javascript pbjs.setConfig({ sizeConfig: [{ @@ -55,12 +55,12 @@ pbjs.setConfig({ }] }); -{% endhighlight %} +``` In the above `sizeConfig`, labels are applied for each of the 3 screen sizes that can later be used in conditional ad unit logic. Now you need to label your AdUnits to match. For example: -{% highlight js %} +```javascript var AdUnits = [{ code: "ad-slot-1", @@ -85,7 +85,7 @@ var AdUnits = [{ ] }] -{% endhighlight %} +``` How this works: @@ -113,7 +113,7 @@ Assuming the same `sizeConfig` as in the first use case above, the AdUnit would placements, but the conditional `labelAny` is added to them both. This will cause the bid to be fired only if one or more of the strings in the array matches a defined label. -{% highlight js %} +```javascript var AdUnits = [{ code: "ad-slot-1", @@ -139,7 +139,7 @@ var AdUnits = [{ ] }] -{% endhighlight %} +``` How this works: @@ -153,7 +153,7 @@ How this works: Here's another way of doing the same thing as shown in the previous section: -{% highlight js %} +```javascript var AdUnits = [{ code: "ad-slot-1", @@ -185,7 +185,7 @@ var AdUnits = [{ ] }] -{% endhighlight %} +``` ## Some Ad Unit Auctions Should Be Skipped Entirely for Some Devices @@ -193,7 +193,7 @@ var AdUnits = [{ Say there's a responsive page where one of the ad units only supports larger sizes, so it doesn't make sense on phones. To suppress the ad unit for mobile users, we can apply conditional logic to the entire ad unit. Here's an example using the global sizeConfig approach (banner only): -{% highlight js %} +```javascript var AdUnits = [{ code: "ad-slot-1", @@ -221,7 +221,7 @@ var AdUnits = [{ See the [Advanced Size Mapping module](/dev-docs/modules/sizeMappingV2.html) if you need to do something like this for video. -{% endhighlight %} +``` ## Some Bid Requests Apply Only to Users Originating from Certain Countries @@ -232,17 +232,17 @@ certain region. It's really not worth sending them bid requests for users outside of their geographic area. Assuming the page can figure out where the user's from, a label can be implemented and applied to make the bid conditional. -{% highlight js %} +```javascript // page logic determines the 'europeanUser' boolean If (europeanUser) { reqArgs={labels:['eur']}; } pbjs.requestBids(reqArgs); -{% endhighlight %} +``` Then this label can be applied to conditions in the AdUnit just like labels that originate from `sizeConfig`. E.g. -{% highlight js %} +```javascript var AdUnits = [{ code: "ad-slot-1", mediaTypes: { @@ -261,7 +261,7 @@ var AdUnits = [{ ... ] }] -{% endhighlight %} +``` This example shows that the 'euroMobileBidder' is only interested in receiving bids that have **both** labels: diff --git a/dev-docs/faq.md b/dev-docs/faq.md index d5dc451d09..f5dd81376d 100644 --- a/dev-docs/faq.md +++ b/dev-docs/faq.md @@ -140,7 +140,7 @@ All prebid adapters that get merged should automatically detect if they're servi In other words, you shouldn't have to do anything other than make sure your own page loads Prebid.js securely, e.g., ```html - ``` (Except that you should *never never never* use the copy of Prebid.js at that URL in production, it isn't meant for production use and may break everything at any time.) diff --git a/dev-docs/integrate-with-the-prebid-analytics-api.md b/dev-docs/integrate-with-the-prebid-analytics-api.md index a433dfc4be..960a5d49ba 100644 --- a/dev-docs/integrate-with-the-prebid-analytics-api.md +++ b/dev-docs/integrate-with-the-prebid-analytics-api.md @@ -12,19 +12,21 @@ sidebarType: 1 # How to Add a Prebid.js Analytics Adapter + {:.no_toc} The Prebid Analytics API provides a way to get analytics data from `Prebid.js` and send it to the analytics provider of your choice, such as Google Analytics. Because it's an open source API, you can write an adapter to send analytics data to any provider you like. Integrating with the Prebid Analytics API has the following benefits: -+ It decouples your analytics from the `Prebid.js` library so you can choose the analytics provider you like, based on your needs. +* It decouples your analytics from the `Prebid.js` library so you can choose the analytics provider you like, based on your needs. -+ You can selectively build the `Prebid.js` library to include only the analytics adapters for the provider(s) you want. This keeps the library small and minimizes page load time. +* You can selectively build the `Prebid.js` library to include only the analytics adapters for the provider(s) you want. This keeps the library small and minimizes page load time. -+ Since this API separates your analytics provider's code from `Prebid.js`, the upgrade and maintenance of the two systems are separate. If you want to upgrade your analytics library, there is no need to upgrade or test the core of `Prebid.js`. +* Since this API separates your analytics provider's code from `Prebid.js`, the upgrade and maintenance of the two systems are separate. If you want to upgrade your analytics library, there is no need to upgrade or test the core of `Prebid.js`. [//]: # (This comment is a separator that allows the list above and the TOC to be rendered at the same time) * TOC + {:toc } ## Architecture of the Analytics API @@ -56,7 +58,9 @@ with the [module rules](/dev-docs/module-rules.html) that apply globally and to Create a markdown file under `modules` with the name of the bidder suffixed with 'AnalyticsAdapter', e.g., `exAnalyticsAdapter.md` Example markdown file: -{% highlight text %} + +```md + # Overview Module Name: Ex Analytics Adapter @@ -67,7 +71,7 @@ Maintainer: prebid@example.com Analytics adapter for Example.com. Contact prebid@example.com for information. -{% endhighlight %} +``` ### Step 2: Add analytics source code @@ -77,8 +81,8 @@ Analytics adapter for Example.com. Contact prebid@example.com for information. 3. There are two types of analytics adapters. The example here focuses on the 'endpoint' type. See [AnalyticsAdapter.js](https://github.com/prebid/Prebid.js/blob/master/libraries/analyticsAdapter/AnalyticsAdapter.js) for more info on the 'bundle' type. - * endpoint - Calls the specified URL on analytics events. Doesn't require a global context. - * bundle - An advanced option expecting a global context. + 1. endpoint - Calls the specified URL on analytics events. Doesn't require a global context. + 2. bundle - An advanced option expecting a global context. 4. In order to get access to the configuration passed in from the page, the analytics adapter needs to specify an enableAnalytics() function, but it should also call @@ -92,7 +96,7 @@ The best way to get started is to look at some of the existing AnalyticsAdapter. Here's a skeleton outline: -{% highlight js %} +```javascript import {ajax} from '../src/ajax.js'; import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js'; import CONSTANTS from '../src/constants.json'; @@ -121,7 +125,7 @@ adaptermanager.registerAnalyticsAdapter({ }); export default exAnalytics; -{% endhighlight %} +``` #### Reading TCF2 enforcement actions @@ -129,7 +133,7 @@ Analytics adapters can learn what happened with regards to GDPR TCF2 enforcement The callback will receive an object with the following attributes: -``` +```javascript { storageBlocked: ['moduleA', 'moduleB'], biddersBlocked: ['moduleB'], @@ -146,8 +150,8 @@ There are two error events analytics modules may wish to listen for: auctionDebu #### Analytics adapter best practices -+ listen only to the events required -+ batch up calls to the backend for post-auction logging rather than calling immediately after each event. +* listen only to the events required +* batch up calls to the backend for post-auction logging rather than calling immediately after each event. ### Step 3: Add unit tests @@ -169,7 +173,7 @@ Add a documentation file for your new analytics adapter. 3. Update the metadata fields at the top of the file to suit your needs: -``` +```markdown layout: analytics title: Your Company Name description: Your Company Analytics Adapter @@ -186,13 +190,11 @@ What does it mean to "support" the privacy protocols? At a high level, it means specifically discussed privacy policy actions and rules with your lawyers and implemented the results of that discussion. Some specific examples: -- GDPR support means: the analytics endpoint respects GDPR consent, Special Feature 1, and deals with any other Purposes declared in the vendor's Global Vendor List -- COPPA support means: analytics companies should not be building targeting profiles for users on sites flagged as COPPA -- USP/CCPA support means: analytics adapters cannot share user information if that user has opted out of sale - +1. GDPR support means: the analytics endpoint respects GDPR consent, Special Feature 1, and deals with any other Purposes declared in the vendor's Global Vendor List +2. COPPA support means: analytics companies should not be building targeting profiles for users on sites flagged as COPPA +3. USP/CCPA support means: analytics adapters cannot share user information if that user has opted out of sale 4. Update the body of the file to describe the options publishers have when configuring your adapter. See other adapters (e.g. rubicon.md) for a template. - 5. Submit the pull request to the prebid.github.io repo. ### Step 6: Wait for Prebid volunteers to review @@ -201,6 +203,6 @@ We sometimes get pretty busy, so it can take a couple of weeks for the review pr ## Further Reading -- [Analytics for Prebid](/overview/analytics.html) (Overview and list of analytics providers) -- [Module Rules](/dev-docs/module-rules.html) -- [Instream Video Ads Tracking](/dev-docs/modules/instreamTracking.html) +* [Analytics for Prebid](/overview/analytics.html) (Overview and list of analytics providers) +* [Module Rules](/dev-docs/module-rules.html) +* [Instream Video Ads Tracking](/dev-docs/modules/instreamTracking.html) diff --git a/dev-docs/modules/adpod.md b/dev-docs/modules/adpod.md index 0519cd9db6..bab5d9381b 100644 --- a/dev-docs/modules/adpod.md +++ b/dev-docs/modules/adpod.md @@ -75,7 +75,7 @@ To enable publishers to prioritize video deals with direct buys and over deals a ### Examples: -{% highlight js %} +```javascript // This will replace the cpm with dealId in cache key as well as targeting kv pair when prioritizeDeals flag is set to true. pbjs.setConfig({ adpod: { @@ -92,10 +92,10 @@ pbjs.setConfig({ } } }) -{% endhighlight %} +``` If the bidder returns multiple bid, each bid can have a different priority/deal tier set. To give publishers control over the deal tier a `filterBids` option has been added to `pbjs.adServers.freewheel.getTargeting` to select certain deal bids. -{% highlight js %} +```javascript pbjs.adServers.freewheel.getTargeting({ codes: [adUnitCode1], @@ -103,11 +103,11 @@ pbjs.adServers.freewheel.getTargeting({ //pass targeting to player api } }); -{% endhighlight %} +``` #### Return -{% highlight js %} +```javascript // Sample return targeting key value pairs { 'adUnitCode-1': [ @@ -125,7 +125,7 @@ pbjs.adServers.freewheel.getTargeting({ } ] } -{% endhighlight %} +``` ## Further Reading diff --git a/dev-docs/modules/bidViewable.md b/dev-docs/modules/bidViewable.md index a9da963a12..f5776afbad 100644 --- a/dev-docs/modules/bidViewable.md +++ b/dev-docs/modules/bidViewable.md @@ -49,7 +49,7 @@ The default logic used to find a matching Prebid.js bid for a GPT slot is | `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 %} +```javascript pbjs.setConfig({ bidViewability: { enabled: true, @@ -60,14 +60,14 @@ The default logic used to find a matching Prebid.js bid for a GPT slot is } } }); -{% endhighlight %} +``` ## Example of consuming BID_VIEWABLE event -{% highlight js %} +```javascript pbjs.onEvent('bidViewable', function(bid){ console.log('got bid details in bidViewable event', bid); }); -{% endhighlight %} +``` ## Related Reading diff --git a/dev-docs/modules/bidViewableIO.md b/dev-docs/modules/bidViewableIO.md index 92d79be58c..d6fe041630 100644 --- a/dev-docs/modules/bidViewableIO.md +++ b/dev-docs/modules/bidViewableIO.md @@ -50,20 +50,20 @@ Note that there are other viewability modules in Prebid.js: | `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 %} +```javascript pbjs.setConfig({ bidViewabilityIO: { enabled: true, } }); -{% endhighlight %} +``` ## Example of consuming BID_VIEWABLE event -{% highlight js %} +```javascript pbjs.onEvent('bidViewable', function(bid){ console.log('got bid details in bidViewable event', bid); }); -{% endhighlight %} +``` ## Related Reading diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md index 963b003db9..2b956730b1 100644 --- a/dev-docs/modules/consentManagement.md +++ b/dev-docs/modules/consentManagement.md @@ -98,7 +98,7 @@ A related parameter is `deviceAccess`, which is at the global level of Prebid.js Example 1: IAB CMP using custom timeout and setting GDPR in-scope by default. -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -112,11 +112,11 @@ Example 1: IAB CMP using custom timeout and setting GDPR in-scope by default. } }); }); -{% endhighlight %} +``` Example 2: IAB CMP using custom timeout in combination with actionTimeout and setting GDPR in-scope by default. The following will wait `500ms` for the CMP to load, if it does an additional `10000ms` will be waited for a user to provide consent (if none had yet been provided). -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -131,11 +131,11 @@ Example 2: IAB CMP using custom timeout in combination with actionTimeout and se } }); }); -{% endhighlight %} +``` Example 3: Static CMP using custom data passing. -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -173,15 +173,15 @@ Example 3: Static CMP using custom data passing. } }); }); -{% 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: -{% highlight bash %} +```bash gulp build --modules=consentManagement,bidAdapter1,bidAdapter2 -{% endhighlight %} +``` You can also use the [Prebid.js Download](/download.html) page. @@ -196,7 +196,7 @@ If you are submitting changes to an adapter to support TCF v2.0, please also sub To find the GDPR consent information to pass along to your system, adapters should look for the `bidderRequest.gdprConsent` field in their `buildRequests()` method. Here is a sample of how the data is structured in the `bidderRequest` object: -{% highlight js %} +```javascript { "bidderCode": "bidderA", "auctionId": "e3a336ad-2222-4a1c-bbbb-ecc7c5294a34", @@ -209,7 +209,7 @@ Here is a sample of how the data is structured in the `bidderRequest` object: }, ... } -{% endhighlight %} +``` **gdprConsent Data Fields** @@ -236,7 +236,7 @@ One of two general approaches can be taken by the adapter to populate this field The following is an example of how the integration could look for the former option: -{% highlight js %} +```javascript ... buildRequests: function (bidRequests, bidderRequest) { ... @@ -250,7 +250,7 @@ buildRequests: function (bidRequests, bidderRequest) { ... } ... -{% endhighlight %} +``` The implementation of the latter option is up to the adapter, but the general premise is the same. You would check to see if the `bidderRequest.gdprConsent.gdprApplies` field is undefined and if so, set the derived value from your independent system. @@ -261,11 +261,11 @@ If neither option are taken, then there is the remote chance this field's value The `gdprConsent` object is also available when registering `userSync` pixels. The object can be accessed by including it as an argument in the `getUserSyncs` function: -{% highlight js %} +```javascript getUserSyncs: function(syncOptions, responses, gdprConsent, usPrivacy) { ... } -{% endhighlight %} +``` Depending on your needs, you could include the consent information in a query of your pixel and/or, given the consent choices, determine if you should drop the pixels at all. @@ -297,7 +297,7 @@ At a high level, this could be done as follows: Below is sample code for implementing the stub functions. Sample code for formatting the consent string can be obtained [here](https://github.com/appnexus/cmp). -{% highlight js %} +```javascript var iabConsentData; // build the IAB consent string var gdprApplies; // true if gdpr applies to the user, else false var responseCode; // false if there was an error, else true @@ -355,7 +355,7 @@ var responseCode; // false if there was an error, else true } } })(window, document); -{% endhighlight %} +``` #### Explanation of Parameters diff --git a/dev-docs/modules/consentManagementGpp.md b/dev-docs/modules/consentManagementGpp.md index c0e3be1ff2..d5c46f463a 100644 --- a/dev-docs/modules/consentManagementGpp.md +++ b/dev-docs/modules/consentManagementGpp.md @@ -78,7 +78,7 @@ In addition to the static approach described above, there is another means to pa Example 1: IAB CMP using a custom timeout -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -91,11 +91,11 @@ Example 1: IAB CMP using a custom timeout } }); }); -{% endhighlight %} +``` Example 2: Static CMP using custom data passing. -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -115,15 +115,15 @@ Example 2: Static CMP using custom data passing. } }); }); -{% 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: -{% highlight bash %} +```bash gulp build --modules=consentManagementGpp,bidAdapter1,bidAdapter2 -{% endhighlight %} +``` You can also use the [Prebid.js Download](/download.html) page. @@ -138,7 +138,7 @@ If you are submitting changes to an adapter to support GPP, please also submit a To find the GPP consent information to pass along to your system, adapters should look for the `bidderRequest.gppConsent` field in their `buildRequests()` method; this field includes a copy of the full GPPData object from the CMP, in case additional information (beyond the gppString and applicableSections values) is needed. Alternatively if only the consent string and/or the applicableSections values are needed, these two values can also be found in the `bidderRequest.ortb2.regs` field under the OpenRTB 2.6 field names (`gpp` and `gpp_sid`). Here is a sample of how the data is structured in the `bidderRequest` object: -{% highlight js %} +```javascript { "bidderCode": "bidderA", "auctionId": "e3a336ad-2222-4a1c-bbbb-ecc7c5294a34", @@ -157,18 +157,18 @@ Here is a sample of how the data is structured in the `bidderRequest` object: }, ... } -{% endhighlight %} +``` ### UserSync Integration The `gppConsent` object is also available when registering `userSync` pixels. The object can be accessed by including it as an argument in the `getUserSyncs` function: -{% highlight js %} +```javascript getUserSyncs: function(syncOptions, responses, gdprConsent, usPrivacy, gppConsent) { ... } -{% endhighlight %} +``` Depending on your needs, you could include the consent information in a query of your pixel and/or, given the consent choices, determine if you should drop the pixels at all. diff --git a/dev-docs/modules/consentManagementUsp.md b/dev-docs/modules/consentManagementUsp.md index f42bf1cdb2..c9853e7753 100644 --- a/dev-docs/modules/consentManagementUsp.md +++ b/dev-docs/modules/consentManagementUsp.md @@ -97,7 +97,7 @@ to the GDPR implementation, though US-Privacy doesn't specifically use that term Example 1: Support both US Privacy and GDPR -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -114,11 +114,11 @@ Example 1: Support both US Privacy and GDPR } }); }); -{% endhighlight %} +``` Example 2: Support US Privacy; timeout the api availability at zero because it is always available if it applies -{% highlight js %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -131,11 +131,11 @@ Example 2: Support US Privacy; timeout the api availability at zero because it i } }); }); -{% endhighlight %} +``` 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 %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -152,11 +152,11 @@ Example 3: Static CMP using custom data passing. Placing this config call in the } }); }); -{% 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 %} +```javascript var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; pbjs.que.push(function() { @@ -173,14 +173,14 @@ Example 4: Static CMP with USP string set to does not apply for all fields, whic } }); }); -{% 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: -{% highlight bash %} +```bash gulp build --modules=consentManagementUsp,bidAdapter1,bidAdapter2 -{% endhighlight %} +``` ## Adapter Integration @@ -191,7 +191,7 @@ If you are submitting changes to an adapter to support this approach, please als To find the US Privacy/CCPA notice and opt-out status information to pass along to your system, adapters should look for the `bidderRequest.uspConsent` field in their `buildRequests()` method. Below is a sample of how the data is structured in the `bidderRequest` object: -{% highlight js %} +```javascript { "bidderCode": "bidderA", "auctionId": "e3a336ad-2222-4a1c-bbbb-ecc7c5554a34", @@ -199,18 +199,18 @@ Below is a sample of how the data is structured in the `bidderRequest` object: "uspConsent": "1YYY", ... } -{% endhighlight %} +``` ### UserSync Integration The `usPrivacy` object is also available when registering `userSync` pixels. The object can be accessed by including it as an argument in the `getUserSyncs` function: -{% highlight js %} +```javascript getUserSyncs: function(syncOptions, responses, gdprConsent, usPrivacy) { ... } -{% endhighlight %} +``` Depending on your needs, you could include the US-Privacy information in a query of your pixel and/or, given the notice and opt-out status choices, determine if you should drop the pixels at all. diff --git a/dev-docs/modules/currency.md b/dev-docs/modules/currency.md index bc8dd3562d..9d18ac35de 100644 --- a/dev-docs/modules/currency.md +++ b/dev-docs/modules/currency.md @@ -53,7 +53,7 @@ For example, the default Prebid "low granularity" bucket is: The following config translates the "low granularity" bucket with a conversion rate of 108 yen to 1 US dollar. It also defines the default conversion rate as being 110 yen to the dollar. -{% highlight js %} +```javascript pbjs.setConfig({ "priceGranularity": "low", "currency": { @@ -62,7 +62,7 @@ pbjs.setConfig({ "defaultRates": { "USD": { "JPY": 110 }} } }); -{% endhighlight %} +``` This results in a granularity rule that's scaled up to make sense in Yen: @@ -172,7 +172,7 @@ from USD to JPY is 110. Adding the currency module to a page is done with a call to the setConfig API with one or more parameters. The simplest recommended implementation would be: -{% highlight js %} +```javascript pbjs.setConfig({ "currency": { "adServerCurrency": "JPY", @@ -180,13 +180,13 @@ pbjs.setConfig({ "defaultRates": { "USD": { "JPY": 110 }} } }); -{% endhighlight %} +``` {: .alert.alert-warning :} Note that the `defaultRates` attribute is optional, but recommended in case there's an issue loading the currency file. In this example, the publisher is providing their own `conversionRateFile`: -{% highlight js %} +```javascript pbjs.setConfig({ "currency": { // enables currency feature @@ -198,10 +198,10 @@ pbjs.setConfig({ "defaultRates": { "USD": { "GPB": 0.75 }} } }); -{% endhighlight %} +``` And finally, here's an example where the conversion rate is specified right in the config, so the external file won't be loaded: -{% highlight js %} +```javascript pbjs.setConfig({ "currency": { "adServerCurrency": "JPY", @@ -209,7 +209,7 @@ pbjs.setConfig({ "rates": { "USD": { "JPY": 110.21 }} } }); -{% endhighlight %} +``` ## Building the Prebid package with Currency Support @@ -218,9 +218,9 @@ pbjs.setConfig({ Follow the basic build instructions on the Gihub repo's main README. To include the module, an additional option must be added to the the gulp build command: -{% highlight js %} +```javascript gulp build --modules=currency,exampleBidAdapter -{% endhighlight %} +``` This command will build the following files: @@ -235,7 +235,7 @@ After testing, get your javascript file(s) out to your Content Delivery Network Note that there are more dynamic ways of combining these components for publishers or integrators ready to build a more advanced infrastructure. - + ## Functions diff --git a/dev-docs/modules/debugging.md b/dev-docs/modules/debugging.md index 23538a64ff..35f3ea0678 100644 --- a/dev-docs/modules/debugging.md +++ b/dev-docs/modules/debugging.md @@ -13,15 +13,16 @@ sidebarType : 1 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. +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`: +## 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({ @@ -56,7 +57,8 @@ pbjs.setConfig({ 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: @@ -79,9 +81,9 @@ pbjs.setConfig({ 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]`. +- `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: @@ -103,7 +105,8 @@ To illustrate, these definitions are equivalent: }; ``` - + + ### 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: @@ -144,7 +147,8 @@ To illustrate, the following definitions are equivalent: } ``` - + + ### Rule options {: .table .table-bordered .table-striped } diff --git a/dev-docs/modules/dfp_express.md b/dev-docs/modules/dfp_express.md index 55da3c2036..37183767cf 100644 --- a/dev-docs/modules/dfp_express.md +++ b/dev-docs/modules/dfp_express.md @@ -36,9 +36,9 @@ Definitions: ## Page integration Adding the module to a page is done by adding just one line of javascript: -{% highlight js %} +```javascript + ## pbjs + {% for page in api_pages %}
  • {{page.title}}
  • {% endfor %} - - diff --git a/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md b/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md index abb5491e1a..02adfbb293 100644 --- a/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md +++ b/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.adServers.dfp.buildAdpodVideoUrl(options) [Alpha] -description: +description: adServers.dfp.buildAdpodVideoUrl API sidebarType: 1 --- @@ -57,4 +57,4 @@ pbjs.que.push(function(){ }); ``` -{% include alerts/alert_warning.html content="Set the `pbjs.setConfig.cache.url` to the URL that will cache the VAST XML. " %} \ No newline at end of file +{% include alerts/alert_warning.html content="Set the `pbjs.setConfig.cache.url` to the URL that will cache the VAST XML. " %} diff --git a/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.md b/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.md index bac83f2a52..6c8ccae331 100644 --- a/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.md +++ b/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.adServers.dfp.buildVideoUrl(options) -description: +description: adServers.dfp.buildVideoUrl API sidebarType: 1 --- @@ -81,4 +81,4 @@ var videoUrl = pbjs.adServers.dfp.buildVideoUrl({ {: .alert.alert-warning :} -In the event of collisions, querystring values passed via `options.params` take precedence over those passed via `options.url`. \ No newline at end of file +In the event of collisions, querystring values passed via `options.params` take precedence over those passed via `options.url`. diff --git a/dev-docs/publisher-api-reference/adServers.freewheel.getTargeting.md b/dev-docs/publisher-api-reference/adServers.freewheel.getTargeting.md index d45c2e2367..12b22adfb9 100644 --- a/dev-docs/publisher-api-reference/adServers.freewheel.getTargeting.md +++ b/dev-docs/publisher-api-reference/adServers.freewheel.getTargeting.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.adServers.freewheel.getTargeting(options) -description: +description: adServers.freewheel.getTargeting API sidebarType: 1 --- @@ -14,7 +14,6 @@ Use this method to get targeting key-value pairs to be sent to the ad server. + `pbjs.adServers.freewheel.getTargeting(options)`: returns key-value pair from the ad server. ```javascript - pbjs.adServers.freewheel.getTargeting({ codes: [adUnitCode1], callback: function(err, targeting) { @@ -22,6 +21,7 @@ pbjs.adServers.freewheel.getTargeting({ } }); ``` + #### Argument Reference ##### The `options` object @@ -30,4 +30,4 @@ pbjs.adServers.freewheel.getTargeting({ | Param | Scope | Type | Description | | --- | --- | --- | --- | | codes | Optional | `Array` | [`adUnitCode1`] | -| callback | Required | `Function` | Callback function to execute when targeting data is back. | \ No newline at end of file +| callback | Required | `Function` | Callback function to execute when targeting data is back. | diff --git a/dev-docs/publisher-api-reference/addAdUnits.md b/dev-docs/publisher-api-reference/addAdUnits.md index b5eefaef0a..4af75f0210 100644 --- a/dev-docs/publisher-api-reference/addAdUnits.md +++ b/dev-docs/publisher-api-reference/addAdUnits.md @@ -8,10 +8,10 @@ sidebarType: 1 Takes one ad unit object or an array of ad unit objects and adds them to the Prebid auction. For usage examples, see [Examples](#addAdUnits-Examples) below and the [Getting Started]({{site.baseurl}}/dev-docs/getting-started.html) page. -+ [Ad Unit Properties](#addAdUnits-AdUnitProperties) -+ [Examples](#addAdUnits-Examples) +* [Ad Unit Properties](#addAdUnits-AdUnitProperties) +* [Examples](#addAdUnits-Examples) - + #### Ad Unit Properties @@ -28,13 +28,13 @@ See the table below for the list of properties on the ad unit. For example ad u | `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). | | `video` | Optional | Object | Used to link an Ad Unit to the [Video Module]({{site.github.url}}/prebid-video/video-module.html). For allowed params see the [adUnit.video reference](#adUnit-video). | - + ##### Bids 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. +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 } @@ -45,7 +45,7 @@ Note that `bids` is optional only for [Prebid Server stored impressions](/dev-do | `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). | - + ##### Media Types @@ -62,24 +62,23 @@ See the table below for the list of properties in the `mediaTypes` object of the For the list of properties please visit the [adUnit.video reference]({{site.baseurl}}/dev-docs/adunit-reference.html#adUnit.video). - + #### Examples -- [Ad Unit Properties](#ad-unit-properties) - - [Bids](#bids) - - [Media Types](#media-types) -- [Video](#video) -- [Examples](#examples) - - [Native](#native) - - [Video](#video-1) - - [Banner](#banner) - - [Multi-format](#multi-format) +* [Ad Unit Properties](#ad-unit-properties) + * [Bids](#bids) + * [Media Types](#media-types) +* [Video](#video) +* [Examples](#examples) + * [Native](#mediatype-native) + * [Video](#mediatype-video) + * [Banner](#mediatype-banner) + * [Multi-format](#multi-format) + - - -##### Native +##### MediaType Native For an example of a native ad unit, see below. For more detailed instructions, see [Show Native Ads]({{site.baseurl}}/dev-docs/show-native-ads.html). @@ -124,11 +123,11 @@ pbjs.addAdUnits({ {% include dev-docs/native-image-asset-sizes.md %} - + -##### Video +##### MediaType Video -If using the Video Module, see below. For more information on the Video Module, see the [Video Module docs]({{site.github.url}}/prebid-video/video-module.html). +If using the Video Module, see below. For more information on the Video Module, see the [Video Module docs]({{site.github.url}}/prebid-video/video-module.html). ```javascript pbjs.addAdUnits({ @@ -204,9 +203,9 @@ pbjs.addAdUnit({ }) ``` - + -##### Banner +##### MediaType Banner For an example of a banner ad unit, see below. For more detailed instructions, see [Getting Started]({{site.baseurl}}/dev-docs/getting-started.html). @@ -229,7 +228,7 @@ pbjs.addAdUnits({ }) ``` - + ##### Multi-format @@ -251,10 +250,10 @@ pbjs.addAdUnits({ video: { context: 'outstream', playerSize: [640, 480], - mimes: ['video/mp4'], - protocols: [1, 2, 3, 4, 5, 6, 7, 8], - playbackmethod: [2], - skip: 1 + mimes: ['video/mp4'], + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 }, }, bids: [ diff --git a/dev-docs/publisher-api-reference/aliasBidder.md b/dev-docs/publisher-api-reference/aliasBidder.md index 1b5c6ee32d..ff4886f2f4 100644 --- a/dev-docs/publisher-api-reference/aliasBidder.md +++ b/dev-docs/publisher-api-reference/aliasBidder.md @@ -8,11 +8,11 @@ sidebarType: 1 To define an alias for a bidder adapter, call this method at runtime: -{% highlight js %} +```javascript pbjs.aliasBidder('appnexus', 'newAlias', optionsObject ); -{% endhighlight %} +``` Defining an alias can help avoid user confusion since it's possible to send parameters to the same adapter but in different contexts (e.g, The publisher uses `"appnexus"` for demand and also uses `"newAlias"` which is an SSP partner that uses the `"appnexus"` adapter to serve their own unique demand). diff --git a/dev-docs/publisher-api-reference/aliasRegistry.md b/dev-docs/publisher-api-reference/aliasRegistry.md index f3773f5512..6740d839ca 100644 --- a/dev-docs/publisher-api-reference/aliasRegistry.md +++ b/dev-docs/publisher-api-reference/aliasRegistry.md @@ -8,16 +8,16 @@ sidebarType: 1 Exposes the aliasRegistry. It can be used to fetch the entire aliasRegistry object or an individual adapter code by alias name. -{% highlight js %} - -pbjs.aliasRegistry; or pbjs.aliasRegistry[aliasName]; - -{% endhighlight %} +```javascript +pbjs.aliasRegistry; +// or +pbjs.aliasRegistry['aliasName']; +``` {: .alert.alert-warning :} Note that by default, the alias registry will be made public. If you would like the registry to be private, you can utilize the `setConfig` option below: -``` +```javascript pbjs.setConfig({aliasRegistry: 'private'}) ``` diff --git a/dev-docs/publisher-api-reference/bidderSettings.md b/dev-docs/publisher-api-reference/bidderSettings.md index 34b7810e43..c8079ca699 100644 --- a/dev-docs/publisher-api-reference/bidderSettings.md +++ b/dev-docs/publisher-api-reference/bidderSettings.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.bidderSettings -description: +description: bidderSettings API sidebarType: 1 --- @@ -11,8 +11,7 @@ sidebarType: 1 The bidderSettings object provides a way to define some behaviors for the platform and specific adapters. The basic structure is a 'standard' section with defaults for all adapters, and then one or more adapter-specific sections that override behavior for that bidder: -{% highlight js %} - +```javascript pbjs.bidderSettings = { standard: { [...] @@ -24,8 +23,7 @@ pbjs.bidderSettings = { [...] }, } - -{% endhighlight %} +``` Defining bidderSettings is optional; the platform has default values for all of the options. Adapters may specify their own default settings, though this isn't common. @@ -42,7 +40,7 @@ Some sample scenarios where publishers may wish to alter the default settings: | --- | --- | --- | --- | --- | | adserverTargeting | standard or adapter-specific | all | see below | Define which key/value pairs are sent to the ad server. | | bidCpmAdjustment | standard or adapter-specific | all | n/a | Custom CPM adjustment function. Could, for example, adjust a bidder's gross-price bid to net price. | -| inverseCpmAdjustment | standard or adapter-specific | 7.33.0 | n/a | Inverse of `bidCpmAdjustment` | +| inverseCpmAdjustment | standard or adapter-specific | 7.33.0 | n/a | Inverse of `bidCpmAdjustment` | | 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. | @@ -72,12 +70,11 @@ The key value pair targeting is applied to the bid's corresponding ad unit. Your 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. - + There's no need to include the following code if you choose to use the *below default setting*. -{% highlight js %} - +```javascript pbjs.bidderSettings = { standard: { adserverTargeting: [{ @@ -113,8 +110,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, 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. @@ -127,7 +123,7 @@ settings as the below example for AppNexus shows. *Note that the line item setup has to match the targeting change* -{% highlight js %} +```javascript pbjs.bidderSettings = { appnexus: { sendStandardTargeting: false, @@ -146,8 +142,7 @@ pbjs.bidderSettings = { ] } } -{% endhighlight %} - +``` In other words, the above config sends 2 pairs of key/value strings targeting for every AppNexus bid and for every ad unit. The 1st pair would be `apn_pbMg` => the value of `bidResponse.pbMg`. The 2nd pair would be `apn_adId` => the value of `bidResponse.adId`. You can find the bidResponse object documentation [here](/troubleshooting/troubleshooting-guide.html#common-bid-response-parameters). @@ -159,8 +154,7 @@ Now let's say you would like to define a bidder-specific price bucket function r *Note: this will only impact the price bucket sent to the ad server for targeting. It won't actually impact the cpm value used for ordering the bids.* -{% highlight js %} - +```javascript pbjs.bidderSettings = { standard: { [...] @@ -181,10 +175,10 @@ pbjs.bidderSettings = { return "pb6"; // all bids $6 and above are assigned to price bucket 'pb6' } }] - [...] + // [...] } } -{% endhighlight %} +``` ##### 2.2. bidCpmAdjustment @@ -194,13 +188,12 @@ In this case, the publisher may want to adjust the bidder's returned price to ru header bidding auction. Otherwise, this bidder's gross price will unfairly win over your other demand sources who report the real price. -Custom adjustment can be provided as a function taking 3 arguments: `bidCpmAdjustment(cpm, bidResponse, bidRequest)`. -Note that either `bidResponse` or `bidRequest` may be missing, although at least one of them is guaranteed to be present. This is because Prebid will sometimes need to run adjustment when no bid has been made yet; see [inverseCpmAdjustment](#inverseCpmAdjustment) below. +Custom adjustment can be provided as a function taking 3 arguments: `bidCpmAdjustment(cpm, bidResponse, bidRequest)`. +Note that either `bidResponse` or `bidRequest` may be missing, although at least one of them is guaranteed to be present. This is because Prebid will sometimes need to run adjustment when no bid has been made yet; see [inverseCpmAdjustment](#23-inversecpmadjustment) below. For example: -{% highlight js %} - +```javascript pbjs.bidderSettings = { standard: { ... } aol: { @@ -211,20 +204,18 @@ pbjs.bidderSettings = { } } }; - -{% endhighlight %} +``` In the above example, the AOL bidder will inherit from "standard" adserverTargeting keys, so that you don't have to define the targeting keywords again. ##### 2.3. inverseCpmAdjustment -When using [price floors](/dev-docs/modules/floors.html), Prebid attempts to calculate the inverse of `bidCpmAdjustment`, so that the floor values it requests from SSPs take into account how the bid will be adjusted. +When using [price floors](/dev-docs/modules/floors.html), Prebid attempts to calculate the inverse of `bidCpmAdjustment`, so that the floor values it requests from SSPs take into account how the bid will be adjusted. For example, if the adjustment is `bidCpm * .85` as above, floors are adjusted by `bidFloor * 1 / .85`. The automatically derived inverse function is correct only when `bidCpmAdjustment` is a simple multiplication. If it isn't, the inverse should also be provided through `inverseCpmAdjustment`. For example: -{% highlight js %} - +```javascript pbjs.bidderSettings = { aol: { bidCpmAdjustment : function(cpm) { @@ -234,12 +225,8 @@ pbjs.bidderSettings = { return Math.max(0.2, (cpm / .85) + 0.2) } } -} }; - -{% endhighlight %} - - +``` ##### 2.4. sendStandardTargeting @@ -258,23 +245,24 @@ If a custom adServerTargeting function can return an empty value, this boolean f ##### 2.6. 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 +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.7. storageAllowed This setting defines if the bid adapter can access browser cookies or local storage. Allowed values are: - - an array containing either `'html5'`, `'cookie'` or both to allow specific storage methods (e.g. `['cookie']` enables cookies but not local storage) - - `true` to allow any storage method; - - `false` to disable all storage. - +* an array containing either `'html5'`, `'cookie'` or both to allow specific storage methods (e.g. `['cookie']` enables cookies but not local storage) +* `true` to allow any storage method; +* `false` to disable all storage. +
    Default value is `true` in version 6.x
    Default value is `false` in version 7.x 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). + +* [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). @@ -284,12 +272,11 @@ If this flag is set to `true`, bidders that have not been explicitly requested i
    Default value is `true` in version 6.x
    Default value will be `false` from version 7.0 - ##### 2.9. 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 %} +```javascript pbjs.bidderSettings = { standard: { @@ -313,7 +300,7 @@ pbjs.bidderSettings = { [...] } } -{% 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` @@ -326,7 +313,7 @@ Optionally allow alternate bidder codes originating from a specific bid adapter 2. Adapter bidCpmAdjustment function 3. The standard bidCpmAdjustment function -{% highlight js %} +```javascript pbjs.bidderSettings = { standard: { @@ -348,7 +335,7 @@ pbjs.bidderSettings = { [...] } } -{% endhighlight %} +``` In the above example, if PubMatic were to return the "groupm" bidder code then the bidCpmAdjustment function under `pubmatic` would be used instead of what is available under `standard`. diff --git a/dev-docs/publisher-api-reference/enableAnalytics.md b/dev-docs/publisher-api-reference/enableAnalytics.md index 7e6ac4fb02..7ba8ac6852 100644 --- a/dev-docs/publisher-api-reference/enableAnalytics.md +++ b/dev-docs/publisher-api-reference/enableAnalytics.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.enableAnalytics(config) -description: +description: enableAnalytics API sidebarType: 1 --- @@ -10,7 +10,7 @@ Enables sending event data to the analytics provider of your choice. For a list ### Example -``` +```javascript pbjs.enableAnalytics([{ provider: "analyticsA", options: { @@ -31,16 +31,13 @@ pbjs.enableAnalytics([{ | `includeEvents` | Optional | Array of strings | Event whitelist; if provided, only these events will be forwarded to the adapter | | `excludeEvents` | Optional | Array of strings | Event blacklist; if provided, these events will not be forwarded to the adapter | - Note each analytics adapter has its own invocation parameters. Analytics adapters that are built in the standard way should support a `option.sampling` parameter. You'll need to check with your analytics provider to confirm whether their system recommends the use of this parameter. They may have alternate methods of sampling. - ### See also -- [Prebid.js events](/dev-docs/publisher-api-reference/getEvents.html) -- [How to Add an Analytics Adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html). - +* [Prebid.js events](/dev-docs/publisher-api-reference/getEvents.html) +* [How to Add an Analytics Adapter](/dev-docs/integrate-with-the-prebid-analytics-api.html).
    diff --git a/dev-docs/publisher-api-reference/getAdserverTargeting.md b/dev-docs/publisher-api-reference/getAdserverTargeting.md index d054407e12..296c69a785 100644 --- a/dev-docs/publisher-api-reference/getAdserverTargeting.md +++ b/dev-docs/publisher-api-reference/getAdserverTargeting.md @@ -1,13 +1,12 @@ --- layout: api_prebidjs title: pbjs.getAdserverTargeting() -description: +description: getAdserverTargeting API sidebarType: 1 ---
    - Returns all ad server targeting for all ad units. Note that some bidder's response may not have been received if you call this function too quickly after the requests are sent. The targeting keys can be configured in [ad server targeting](/dev-docs/publisher-api-reference/bidderSettings.html). @@ -20,7 +19,7 @@ When [deals are enabled]({{site.baseurl}}/adops/deals.html), the object returned **Returned Object Example:** -{% highlight js %} +```javascript { "/9968336/header-bid-tag-0": { "hb_bidder": "rubicon", @@ -39,4 +38,4 @@ When [deals are enabled]({{site.baseurl}}/adops/deals.html), the object returned "hb_deal_appnexus": "ABC_123" } } -{% endhighlight %} +``` diff --git a/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCode.md b/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCode.md index 94e6056b9e..4d76b7681e 100644 --- a/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCode.md +++ b/dev-docs/publisher-api-reference/getAdserverTargetingForAdUnitCode.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getAdserverTargetingForAdUnitCode([adunitCode]) -description: +description: getAdserverTargetingForAdUnitCode API sidebarType: 1 --- @@ -21,10 +21,10 @@ This function returns the query string targeting parameters available at this mo **Returned Object Example:** -{% highlight js %} +```javascript { "hb_bidder": "rubicon", "hb_adid": "13f44b0d3c", "hb_pb": "0.50" } -{% endhighlight %} +``` diff --git a/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md b/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md index 8c3fac6925..9d9bb09271 100644 --- a/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md +++ b/dev-docs/publisher-api-reference/getAllPrebidWinningBids.md @@ -1,11 +1,11 @@ --- layout: api_prebidjs title: pbjs.getAllPrebidWinningBids() -description: +description: getAllPrebidWinningBids API sidebarType: 1 --- Use this method to get all of the bids that have won their respective auctions but not rendered on the page. Useful for [troubleshooting your integration]({{site.baseurl}}/dev-docs/prebid-troubleshooting-guide.html). -+ `pbjs.getAllPrebidWinningBids()`: returns an array of bid objects that have won their respective auctions but not rendered on the page. \ No newline at end of file +* `pbjs.getAllPrebidWinningBids()`: returns an array of bid objects that have won their respective auctions but not rendered on the page. diff --git a/dev-docs/publisher-api-reference/getAllWinningBids.md b/dev-docs/publisher-api-reference/getAllWinningBids.md index b47fc716d1..f05f13bb93 100644 --- a/dev-docs/publisher-api-reference/getAllWinningBids.md +++ b/dev-docs/publisher-api-reference/getAllWinningBids.md @@ -1,11 +1,11 @@ --- layout: api_prebidjs title: pbjs.getAllWinningBids() -description: +description: getAllWinningBids API sidebarType: 1 --- Use this method to get all of the bids that have won their respective auctions and also rendered on the page. Useful for [troubleshooting your integration]({{site.baseurl}}/dev-docs/prebid-troubleshooting-guide.html). -+ `pbjs.getAllWinningBids()`: returns an array of bid objects that have won their respective auctions and also rendered on the page. \ No newline at end of file +* `pbjs.getAllWinningBids()`: returns an array of bid objects that have won their respective auctions and also rendered on the page. diff --git a/dev-docs/publisher-api-reference/getBidResponses.md b/dev-docs/publisher-api-reference/getBidResponses.md index cab2bcf46e..44ae1d92d0 100644 --- a/dev-docs/publisher-api-reference/getBidResponses.md +++ b/dev-docs/publisher-api-reference/getBidResponses.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getBidResponses() -description: +description: getBidResponses API sidebarType: 1 --- @@ -47,14 +47,12 @@ This function returns the bid responses at the given moment. -
    - -{% highlight bash %} +```json { "/9968336/header-bid-tag-0": { "bids": [ @@ -168,7 +166,8 @@ This function returns the bid responses at the given moment. ] } } -{% endhighlight %} +``` +
    @@ -182,84 +181,83 @@ This function returns the bid responses at the given moment. -
    -{% highlight bash %} +```json { - "div-banner-outstream-native" : { - "bids" : [ - { - "pbMg" : "10.00", - "pbLg" : "5.00", - "width" : 0, - "requestTimestamp" : 1516315716062, - "creativeId" : 81589325, - "pbCg" : "", - "adUnitCode" : "div-banner-outstream-native", - "size" : "0x0", - "bidder" : "appnexus", - "pbAg" : "10.00", - "adId" : "473965c9df19d2", - "adserverTargeting" : { - "hb_native_icon" : "https://vcdn.adnxs.com/p/creative-image/d4/06/e2/33/d406e233-a5f9-44a6-a3e0-8a714bf0e980.png", - "hb_native_title" : "This is a Prebid Native Multi-Format Creative", - "hb_native_brand" : "Prebid.org", - "hb_adid" : "473965c9df19d2", - "hb_pb" : "10.00", - "hb_source" : "client", - "hb_bidder" : "appnexus", - "hb_native_image" : "https://vcdn.adnxs.com/p/creative-image/9e/26/5f/b2/9e265fb2-50c8-43f0-88ef-a5a48a9d0dcf.jpg", - "hb_size" : "0x0", - "hb_mediatype" : "native", - "hb_native_body" : "This is a Prebid Native Creative. There are many like it, but this one is mine.", - "hb_native_linkurl" : "https://prebid.org/dev-docs/show-native-ads.html" - }, - "native" : { - "icon" : { - "url" : "https://vcdn.adnxs.com/p/creative-image/d4/06/e2/33/d406e233-a5f9-44a6-a3e0-8a714bf0e980.png", - "height" : 75, - "width" : 75 - }, - "body" : "This is a Prebid Native Creative. There are many like it, but this one is mine.", - "image" : { - "url" : "https://vcdn.adnxs.com/p/creative-image/9e/26/5f/b2/9e265fb2-50c8-43f0-88ef-a5a48a9d0dcf.jpg", - "height" : 2250, - "width" : 3000 - }, - "clickUrl" : "https://prebid.org/dev-docs/show-native-ads.html", - "clickTrackers" : [ - "..." - ], - "title" : "This is a Prebid Native Multi-Format Creative", - "impressionTrackers" : [ - "..." - ], - "sponsoredBy" : "Prebid.org" - }, - "timeToRespond" : 143, - "mediaType" : "native", - "bidderCode" : "appnexus", - "source" : "client", - "auctionId" : "1338a6fb-e514-48fc-8db6-872ddf3babdb", - "responseTimestamp" : 1516315716205, - "netRevenue" : true, - "pbDg" : "10.00", - "pbHg" : "10.00", - "ttl" : 300, - "status" : "targetingSet", - "height" : 0, - "statusMessage" : "Bid available", - "cpm" : 10, - "currency" : "USD" - } - ] - } - } -{% endhighlight %} + "div-banner-outstream-native" : { + "bids" : [ + { + "pbMg" : "10.00", + "pbLg" : "5.00", + "width" : 0, + "requestTimestamp" : 1516315716062, + "creativeId" : 81589325, + "pbCg" : "", + "adUnitCode" : "div-banner-outstream-native", + "size" : "0x0", + "bidder" : "appnexus", + "pbAg" : "10.00", + "adId" : "473965c9df19d2", + "adserverTargeting" : { + "hb_native_icon" : "https://vcdn.adnxs.com/p/creative-image/d4/06/e2/33/d406e233-a5f9-44a6-a3e0-8a714bf0e980.png", + "hb_native_title" : "This is a Prebid Native Multi-Format Creative", + "hb_native_brand" : "Prebid.org", + "hb_adid" : "473965c9df19d2", + "hb_pb" : "10.00", + "hb_source" : "client", + "hb_bidder" : "appnexus", + "hb_native_image" : "https://vcdn.adnxs.com/p/creative-image/9e/26/5f/b2/9e265fb2-50c8-43f0-88ef-a5a48a9d0dcf.jpg", + "hb_size" : "0x0", + "hb_mediatype" : "native", + "hb_native_body" : "This is a Prebid Native Creative. There are many like it, but this one is mine.", + "hb_native_linkurl" : "https://prebid.org/dev-docs/show-native-ads.html" + }, + "native" : { + "icon" : { + "url" : "https://vcdn.adnxs.com/p/creative-image/d4/06/e2/33/d406e233-a5f9-44a6-a3e0-8a714bf0e980.png", + "height" : 75, + "width" : 75 + }, + "body" : "This is a Prebid Native Creative. There are many like it, but this one is mine.", + "image" : { + "url" : "https://vcdn.adnxs.com/p/creative-image/9e/26/5f/b2/9e265fb2-50c8-43f0-88ef-a5a48a9d0dcf.jpg", + "height" : 2250, + "width" : 3000 + }, + "clickUrl" : "https://prebid.org/dev-docs/show-native-ads.html", + "clickTrackers" : [ + "..." + ], + "title" : "This is a Prebid Native Multi-Format Creative", + "impressionTrackers" : [ + "..." + ], + "sponsoredBy" : "Prebid.org" + }, + "timeToRespond" : 143, + "mediaType" : "native", + "bidderCode" : "appnexus", + "source" : "client", + "auctionId" : "1338a6fb-e514-48fc-8db6-872ddf3babdb", + "responseTimestamp" : 1516315716205, + "netRevenue" : true, + "pbDg" : "10.00", + "pbHg" : "10.00", + "ttl" : 300, + "status" : "targetingSet", + "height" : 0, + "statusMessage" : "Bid available", + "cpm" : 10, + "currency" : "USD" + } + ] + } +} +```
    diff --git a/dev-docs/publisher-api-reference/getBidResponsesForAdUnitCode.md b/dev-docs/publisher-api-reference/getBidResponsesForAdUnitCode.md index 64c39ab4b9..1b95567d74 100644 --- a/dev-docs/publisher-api-reference/getBidResponsesForAdUnitCode.md +++ b/dev-docs/publisher-api-reference/getBidResponsesForAdUnitCode.md @@ -1,12 +1,11 @@ --- layout: api_prebidjs title: pbjs.getBidResponsesForAdUnitCode(adUnitCode) -description: +description: getBidResponsesForAdUnitCode API sidebarType: 1 --- - -Returns bidResponses for the specified adUnitCode. See full documentation at [pbjs.getBidResponses()](#module_pbjs.getBidResponses). +Returns bidResponses for the specified adUnitCode. See full documentation at [pbjs.getBidResponses()](module_pbjs.getBidResponses). **Kind**: static method of `pbjs` diff --git a/dev-docs/publisher-api-reference/getConfig.md b/dev-docs/publisher-api-reference/getConfig.md index c85d4f3cc5..d614562e17 100644 --- a/dev-docs/publisher-api-reference/getConfig.md +++ b/dev-docs/publisher-api-reference/getConfig.md @@ -1,29 +1,27 @@ --- layout: api_prebidjs title: pbjs.getConfig([string]) -description: +description: getConfig API sidebarType: 1 --- ## Overview -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. +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 %} +```javascript /* Get config object */ config.getConfig() /* Get debug config */ config.getConfig('debug') -{% endhighlight %} - +``` ### 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 %} - +```javascript /* Subscribe to all configuration changes */ getConfig((config) => console.log('config set:', config)); @@ -33,7 +31,6 @@ getConfig('logging', (config) => console.log('logging set:', config)); /* Unsubscribe */ const unsubscribe = getConfig(...); unsubscribe(); // no longer listening - -{% endhighlight %} +```
    diff --git a/dev-docs/publisher-api-reference/getConsentMetadata.md b/dev-docs/publisher-api-reference/getConsentMetadata.md index c3afe05324..663dac84b9 100644 --- a/dev-docs/publisher-api-reference/getConsentMetadata.md +++ b/dev-docs/publisher-api-reference/getConsentMetadata.md @@ -1,14 +1,13 @@ --- layout: api_prebidjs title: pbjs.getConsentMetadata() -description: +description: getConsentMetadata API sidebarType: 1 --- - The `getConsentMetadata()` function will return basic information about the status of supported (and configured!) consent content within Prebid. -``` +```javascript pbjs.getConsentMetadata() // returns e.g. { "coppa": false, @@ -23,4 +22,4 @@ pbjs.getConsentMetadata() // returns e.g. "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 399c899fc8..cc643102e0 100644 --- a/dev-docs/publisher-api-reference/getEvents.md +++ b/dev-docs/publisher-api-reference/getEvents.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getEvents() -description: +description: getEvents API sidebarType: 1 --- @@ -14,10 +14,11 @@ The `getEvents` method returns a copy of all emitted events since the page loade **Returns**: `array of objects` **Returned Object Params**: -- eventType (see table below) -- args (varies for each event type) -- id (only for bidWon, set to adUnit.code) -- elapsedTime + +* eventType (see table below) +* args (varies for each event type) +* id (only for bidWon, set to adUnit.code) +* elapsedTime The available events are: @@ -47,13 +48,13 @@ The available events are: The example below shows how these events can be used. -{% highlight js %} - pbjs.getEvents().forEach(event => { - console.log("event: "+event.eventType) - }); -{% endhighlight %} - +```javascript +pbjs.getEvents().forEach(event => { + console.log("event: "+event.eventType) +}); +``` ## See Also -- [onEvent](/dev-docs/publisher-api-reference/onEvent.html) -- [offEvent](/dev-docs/publisher-api-reference/offEvent.html) + +* [onEvent](/dev-docs/publisher-api-reference/onEvent.html) +* [offEvent](/dev-docs/publisher-api-reference/offEvent.html) diff --git a/dev-docs/publisher-api-reference/getHighestCpmBids.md b/dev-docs/publisher-api-reference/getHighestCpmBids.md index ac3051d795..6794aac0e2 100644 --- a/dev-docs/publisher-api-reference/getHighestCpmBids.md +++ b/dev-docs/publisher-api-reference/getHighestCpmBids.md @@ -1,15 +1,15 @@ --- layout: api_prebidjs title: pbjs.getHighestCpmBids([adUnitCode]) -description: +description: getHighestCpmBids API sidebarType: 1 --- Use this method to retrieve an array of winning bids. -+ `pbjs.getHighestCpmBids()`: with no argument, returns an array of winning bid objects for each ad unit on page -+ `pbjs.getHighestCpmBids(adUnitCode)`: when passed an ad unit code, returns an array with the winning bid object for that ad unit +* `pbjs.getHighestCpmBids()`: with no argument, returns an array of winning bid objects for each ad unit on page +* `pbjs.getHighestCpmBids(adUnitCode)`: when passed an ad unit code, returns an array with the winning bid object for that ad unit {: .alert.alert-warning :} -Note that from **Prebid 3.0** onwards, `pbjs.getHighestCpmBids` will not return rendered bids. \ No newline at end of file +Note that from **Prebid 3.0** onwards, `pbjs.getHighestCpmBids` will not return rendered bids. diff --git a/dev-docs/publisher-api-reference/getHighestUnusedBidResponseForAdUnitCode.md b/dev-docs/publisher-api-reference/getHighestUnusedBidResponseForAdUnitCode.md index b6a584c7d0..03058d70c3 100644 --- a/dev-docs/publisher-api-reference/getHighestUnusedBidResponseForAdUnitCode.md +++ b/dev-docs/publisher-api-reference/getHighestUnusedBidResponseForAdUnitCode.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getHighestUnusedBidResponseForAdUnitCode(adUnitCode) -description: +description: getHighestUnusedBidResponseForAdUnitCode API sidebarType: 1 --- diff --git a/dev-docs/publisher-api-reference/getNoBids.md b/dev-docs/publisher-api-reference/getNoBids.md index 399fc947bd..deb7ff2082 100644 --- a/dev-docs/publisher-api-reference/getNoBids.md +++ b/dev-docs/publisher-api-reference/getNoBids.md @@ -1,11 +1,11 @@ --- layout: api_prebidjs title: pbjs.getNoBids() -description: +description: getNoBids API sidebarType: 1 --- 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. +* `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/getNoBidsForAdUnitCode.md b/dev-docs/publisher-api-reference/getNoBidsForAdUnitCode.md index c8eae80746..395e46d353 100644 --- a/dev-docs/publisher-api-reference/getNoBidsForAdUnitCode.md +++ b/dev-docs/publisher-api-reference/getNoBidsForAdUnitCode.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getNoBidsForAdUnitCode(adUnitCode) -description: +description: getNoBidsForAdUnitCode API sidebarType: 1 --- diff --git a/dev-docs/publisher-api-reference/getUserIds.md b/dev-docs/publisher-api-reference/getUserIds.md index 56a68932d7..839454f111 100644 --- a/dev-docs/publisher-api-reference/getUserIds.md +++ b/dev-docs/publisher-api-reference/getUserIds.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getUserIds() -description: +description: getUserIds API sidebarType: 1 --- @@ -11,6 +11,6 @@ To use this function, include the [UserId module](/dev-docs/modules/userId.html) If you need to export the user IDs stored by Prebid User ID module, the `getUserIds()` function will return an object formatted the same as bidRequest.userId. -``` +```javascript pbjs.getUserIds() // returns object like bidRequest.userId. e.g. {"pubcid":"1111", "tdid":"2222"} -``` \ No newline at end of file +``` diff --git a/dev-docs/publisher-api-reference/getUserIdsAsEids.md b/dev-docs/publisher-api-reference/getUserIdsAsEids.md index 69e6a5629c..2aa58a6965 100644 --- a/dev-docs/publisher-api-reference/getUserIdsAsEids.md +++ b/dev-docs/publisher-api-reference/getUserIdsAsEids.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getUserIdsAsEids() -description: +description: getUserIdsAsEids API sidebarType: 1 --- @@ -11,7 +11,7 @@ To use this function, include the [UserId module](/dev-docs/modules/userId.html) If you need to export the user IDs stored by Prebid User ID module in ORTB Eids frormat, then the `getUserIdsAsEids()` function will return an array formatted as per [ORTB Eids](https://github.com/prebid/Prebid.js/blob/master/modules/userId/eids.md). -``` +```javascript pbjs.getUserIdsAsEids() // returns userIds in ORTB Eids format. e.g. [ { @@ -33,4 +33,4 @@ pbjs.getUserIdsAsEids() // returns userIds in ORTB Eids format. e.g. }] } ] -``` \ No newline at end of file +``` diff --git a/dev-docs/publisher-api-reference/getUserIdsAsync.md b/dev-docs/publisher-api-reference/getUserIdsAsync.md index 639cef4c86..fb00216016 100644 --- a/dev-docs/publisher-api-reference/getUserIdsAsync.md +++ b/dev-docs/publisher-api-reference/getUserIdsAsync.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.getUserIdsAsync() -description: +description: getUserIdsAsync API sidebarType: 1 --- @@ -10,7 +10,7 @@ To use this function, include the [UserId module](/dev-docs/modules/userId.html) `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: -``` +```javascript pbjs.getUserIdsAsync().then(function (userIds) { // all IDs are available here: pbjs.getUserIds() // same as the `userIds` argument diff --git a/dev-docs/publisher-api-reference/installedModules.md b/dev-docs/publisher-api-reference/installedModules.md index 465de4dcd9..51686a3cdd 100644 --- a/dev-docs/publisher-api-reference/installedModules.md +++ b/dev-docs/publisher-api-reference/installedModules.md @@ -1,14 +1,15 @@ --- layout: api_prebidjs title: pbjs.installedModules -description: +description: installedModules API sidebarType: 1 --- When a Prebid.js package is built, the list of modules compiled into it are placed in the pbjs.installedModules array. e.g. if this builds the package: -``` + +```bash gulp build --modules=a,b,c ``` diff --git a/dev-docs/publisher-api-reference/markWinningBidAsUsed.md b/dev-docs/publisher-api-reference/markWinningBidAsUsed.md index 8562bf26bf..45dfbdd629 100644 --- a/dev-docs/publisher-api-reference/markWinningBidAsUsed.md +++ b/dev-docs/publisher-api-reference/markWinningBidAsUsed.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.markWinningBidAsUsed(markBidRequest) -description: +description: markWinningBidAsUsed API sidebarType: 1 --- @@ -17,4 +17,4 @@ If you know the adId, then be specific, otherwise Prebid will retrieve the winni | Param | Type | Description | | --- | --- | --- | | adUnitCode | `string` | (Optional) The ad unit code | -| adId | `string` | (Optional) The id representing the ad we want to mark | \ No newline at end of file +| adId | `string` | (Optional) The id representing the ad we want to mark | diff --git a/dev-docs/publisher-api-reference/mergeBidderConfig.md b/dev-docs/publisher-api-reference/mergeBidderConfig.md index a99a68cff8..25673d0027 100644 --- a/dev-docs/publisher-api-reference/mergeBidderConfig.md +++ b/dev-docs/publisher-api-reference/mergeBidderConfig.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.mergeBidderConfig(options) -description: +description: mergeBidderConfig API sidebarType: 1 --- @@ -9,13 +9,13 @@ This is the same as [`setBidderConfig(options, true)`](/dev-docs/publisher-api-r The page usage is: -{% highlight js %} +```javascript 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 index 968cf13755..ef31eacf83 100644 --- a/dev-docs/publisher-api-reference/mergeConfig.md +++ b/dev-docs/publisher-api-reference/mergeConfig.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.mergeConfig(options) -description: +description: mergeConfig API sidebarType: 1 --- diff --git a/dev-docs/publisher-api-reference/offEvent.md b/dev-docs/publisher-api-reference/offEvent.md index bc220b9caf..603b168032 100644 --- a/dev-docs/publisher-api-reference/offEvent.md +++ b/dev-docs/publisher-api-reference/offEvent.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.offEvent(eventType, handler, id) -description: +description: offEvent API sidebarType: 1 --- @@ -24,34 +24,34 @@ 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 %} +```javascript +/* 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); +}); +``` ## See Also -- [getEvents](/dev-docs/publisher-api-reference/getEvents.html) -- [onEvent](/dev-docs/publisher-api-reference/onEvent.html) + +* [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 9aa5d9f4b2..92d26e975a 100644 --- a/dev-docs/publisher-api-reference/onEvent.md +++ b/dev-docs/publisher-api-reference/onEvent.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.onEvent(eventType, handler, id) -description: +description: onEvent API sidebarType: 1 --- @@ -31,39 +31,42 @@ this method registers the callback for every `bidWon` event. 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'); - }); +```javascript +/* 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); + +```javascript +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 - }); + +```javascript +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) + +* [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 index 38caa096b6..8d1c53a0f6 100644 --- a/dev-docs/publisher-api-reference/readConfig.md +++ b/dev-docs/publisher-api-reference/readConfig.md @@ -6,14 +6,14 @@ sidebarType: 1 --- -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. +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 %} +```javascript /* 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 c698413f2d..8e7eccb5f2 100644 --- a/dev-docs/publisher-api-reference/refreshUserIds.md +++ b/dev-docs/publisher-api-reference/refreshUserIds.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.refreshUserIds(options, callback) -description: +description: refreshUserIds API sidebarType: 1 --- @@ -18,8 +18,7 @@ The `refreshUserIds` function allows you to force either all or a subset of user | options.submoduleNames | optional | Array of strings | The userId submodule names that should be refreshed. If this option is omitted, all userId submodules are refreshed. | | callback | optional | Function | Callback that is called after refreshing user ids has completed | - -``` +```javascript pbjs.refreshUserIds(); pbjs.refreshUserIds({ submoduleNames: ['britepoolId'] }, () => console.log("Done!")); ``` diff --git a/dev-docs/publisher-api-reference/registerSignalSources.md b/dev-docs/publisher-api-reference/registerSignalSources.md index 7529cc3651..aca0b73b8d 100644 --- a/dev-docs/publisher-api-reference/registerSignalSources.md +++ b/dev-docs/publisher-api-reference/registerSignalSources.md @@ -8,7 +8,7 @@ sidebarType: 1 {: .alert.alert-info :} To use this function, include the [UserId module](/dev-docs/modules/userId.html) in your Prebid.js build. -This function will register all configured encrypted signals as described in the [UserId module ESP configuration](/dev-docs/modules/userId.html#esp-configurations). +This function will register all configured encrypted signals as described in the [UserId module ESP configuration](/dev-docs/modules/userId.html#esp-configurations). The condition can only be called under two conditions diff --git a/dev-docs/publisher-api-reference/removeAdUnit.md b/dev-docs/publisher-api-reference/removeAdUnit.md index 54c6f2099c..e70baf5f7c 100644 --- a/dev-docs/publisher-api-reference/removeAdUnit.md +++ b/dev-docs/publisher-api-reference/removeAdUnit.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.removeAdUnit(adUnitCode) -description: +description: removeAdUnit API sidebarType: 1 --- @@ -10,7 +10,6 @@ Remove adUnit(s) from the pbjs configuration, If adUnit is not given then it wil **Kind**: static method of pbjs API. - {: .table .table-bordered .table-striped } | Param | Scope | Type | Description | | --- | --- | --- | --- | diff --git a/dev-docs/publisher-api-reference/renderAd.md b/dev-docs/publisher-api-reference/renderAd.md index 5d9b1d7d37..8e07f516e1 100644 --- a/dev-docs/publisher-api-reference/renderAd.md +++ b/dev-docs/publisher-api-reference/renderAd.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.renderAd(doc, id, options) -description: +description: renderAd API sidebarType: 1 --- @@ -16,12 +16,12 @@ If this property is set the value of clickThrough will replace any occurrence of {: .alert.alert-info :} Note: In regards to `options.clickThrough`: + - To make use of this feature, bid adapters would be required to respond with ad tags including the ${CLICKTHROUGH} macro. - The renderAd function must be invoked with the options argument. Ex: `renderAd(doc, bidId, {clickThrough: 'https://someadserverclickurl.com'});` - Not compatible with safeframes (since the logic around rendering safeframe's does not invoke the renderAd function). - Not supported with Prebid Universal Creative at this time, only the standard pbjs.renderAd method. - {: .table .table-bordered .table-striped } | Param | Scope | Type | Description | | --- | --- | --- | --- | diff --git a/dev-docs/publisher-api-reference/requestBids.md b/dev-docs/publisher-api-reference/requestBids.md index c1e0791054..94af1512c9 100644 --- a/dev-docs/publisher-api-reference/requestBids.md +++ b/dev-docs/publisher-api-reference/requestBids.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.requestBids(requestObj) -description: +description: requestBids API sidebarType: 1 --- @@ -22,26 +22,25 @@ Request bids. When `adUnits` or `adUnitCodes` are not specified, request bids fo | requestObj.adUnits | Optional | `Array of objects` | AdUnitObjects to request. Use this or `requestObj.adUnitCodes`. Default to all `adUnits` if empty. | | requestObj.timeout | Optional | `Integer` | Timeout for requesting the bids specified in milliseconds | | requestObj.bidsBackHandler | Optional | `function` | Callback to execute when all the bid responses are back or the timeout hits. Callback will be passed 3 arguments - `bids`, `timedOut`, and `auctionId` - [see below](#result) | -| requestObj.labels | Optional | `Array of strings` | Defines [labels](#labels) that may be matched on ad unit targeting conditions. | +| requestObj.labels | Optional | `Array of strings` | Defines `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 | | requestObj.ttlBuffer | Optional | `Number` | TTL buffer override for this auction. See [setConfig({ttlBuffer})](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ttlBuffer) | - - + **Result**: {: .table .table-bordered .table-stripped :} | Param | Type | Description | | --- | --- | --- | -| bids | Object | Bids received; see [getBidResponses](getBidResponses.html) for details | +| bids | Object | Bids received; see [getBidResponses](getBidResponses.html) for details | | timedOut | Boolean | true if any bidder timed out | | auctionId | String | the auction's ID | Example call: -``` +```javascript pbjs.requestBids({ bidsBackHandler: sendAdserverRequest, timeout: 1000, @@ -50,7 +49,8 @@ pbjs.requestBids({ ``` Example parameters sent to the bidsBackHandler: -``` + +```javascript function sendAdserverRequest(bids, timedOut, auctionId) { // bids // {"test-div":{"bids":[{"bidderCode":"bidderA", ...}]}} diff --git a/dev-docs/publisher-api-reference/setBidderConfig.md b/dev-docs/publisher-api-reference/setBidderConfig.md index e882f2336b..3a2cbf0a26 100644 --- a/dev-docs/publisher-api-reference/setBidderConfig.md +++ b/dev-docs/publisher-api-reference/setBidderConfig.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.setBidderConfig(options, mergeFlag) -description: +description: setBidderConfig API sidebarType: 1 --- @@ -17,16 +17,18 @@ Note if you would like to add to existing config you can pass `true` for the opt The page usage is: -{% highlight js %} +```javascript pbjs.setBidderConfig({ bidders: ['bidderA'], config: { customArg: "customVal" } }); -{% endhighlight %} +``` + or -{% highlight js %} + +```javascript pbjs.setBidderConfig({ bidders: ['bidderB'], config: { @@ -50,11 +52,12 @@ pbjs.setBidderConfig({ } } }); -{% endhighlight %} +``` How to interpret these examples: -- When 'bidderA' calls `getConfig('customArg')`, it will receive the object that contains 'customArg'. If any other bidder calls `getConfig('customArg')`, it will receive nothing. -- When 'bidderB' calls `getConfig('ortb2')`, it will receive this override definition rather than whatever else might have been defined globally. If any other bidder calls `getConfig('ortb2')`, it will receive the globally defined objects. + +* When 'bidderA' calls `getConfig('customArg')`, it will receive the object that contains 'customArg'. If any other bidder calls `getConfig('customArg')`, it will receive nothing. +* When 'bidderB' calls `getConfig('ortb2')`, it will receive this override definition rather than whatever else might have been defined globally. If any other bidder calls `getConfig('ortb2')`, it will receive the globally defined objects. {: .alert.alert-info :} This function is also used by the `schain` feature. Refer to the [schain](/dev-docs/modules/schain.html) documentation for examples. diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index eadf9a5fad..f581026536 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.setConfig(options) -description: +description: setConfig API sidebarType: 1 --- @@ -14,44 +14,45 @@ See below for usage examples. Core config: -+ [Debugging](#setConfig-Debugging) -+ [Device Access](#setConfig-deviceAccess) -+ [Bidder Timeouts](#setConfig-Bidder-Timeouts) -+ [Max Requests Per Origin](#setConfig-Max-Requests-Per-Origin) -+ [Disable Ajax Timeout](#setConfig-Disable-Ajax-Timeout) -+ [Set Timeout Buffer](#setConfig-timeoutBuffer) -+ [Set TTL Buffer](#setConfig-ttlBuffer) -+ [Turn on send all bids mode](#setConfig-Send-All-Bids) -+ [Configure send bids control](#setConfig-Send-Bids-Control) -+ [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 price granularity](#setConfig-Price-Granularity) -+ [Set media type price granularity](#setConfig-MediaType-Price-Granularity) -+ [Set custom cpm rounding](#setConfig-Cpm-Rounding) -+ [Configure server-to-server header bidding](#setConfig-Server-to-Server) -+ [Configure user syncing](#setConfig-Configure-User-Syncing) -+ [Configure targeting controls](#setConfig-targetingControls) -+ [Configure responsive ad units with `sizeConfig` and `labels`](#setConfig-Configure-Responsive-Ads) -+ [COPPA](#setConfig-coppa) -+ [First Party Data](#setConfig-fpd) -+ [Video Module to integrate with Video Players](#video-module) -+ [Caching VAST XML](#setConfig-vast-cache) -+ [Site Metadata](#setConfig-site) -+ [Disable performance metrics](#setConfig-performanceMetrics) -+ [Setting alias registry to private](#setConfig-aliasRegistry) -+ [Generic Configuration](#setConfig-Generic-Configuration) -+ [Troubleshooting configuration](#setConfig-Troubleshooting-your-configuration) +* [Debugging](#setConfig-Debugging) +* [Device Access](#setConfig-deviceAccess) +* [Bidder Timeouts](#setConfig-Bidder-Timeouts) +* [Max Requests Per Origin](#setConfig-Max-Requests-Per-Origin) +* [Disable Ajax Timeout](#setConfig-Disable-Ajax-Timeout) +* [Set Timeout Buffer](#setConfig-timeoutBuffer) +* [Set TTL Buffer](#setConfig-ttlBuffer) +* [Turn on send all bids mode](#setConfig-Send-All-Bids) +* [Configure send bids control](#setConfig-Send-Bids-Control) +* [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 price granularity](#setConfig-Price-Granularity) +* [Set media type price granularity](#setConfig-MediaType-Price-Granularity) +* [Set custom cpm rounding](#setConfig-Cpm-Rounding) +* [Configure server-to-server header bidding](#setConfig-Server-to-Server) +* [Configure user syncing](#setConfig-Configure-User-Syncing) +* [Configure targeting controls](#setConfig-targetingControls) +* [Configure responsive ad units with `sizeConfig` and `labels`](#setConfig-Configure-Responsive-Ads) +* [COPPA](#setConfig-coppa) +* [First Party Data](#setConfig-fpd) +* [Video Module to integrate with Video Players](#video-module) +* [Caching VAST XML](#setConfig-vast-cache) +* [Site Metadata](#setConfig-site) +* [Disable performance metrics](#setConfig-performanceMetrics) +* [Setting alias registry to private](#setConfig-aliasRegistry) +* [Generic Configuration](#setConfig-Generic-Configuration) +* [Troubleshooting configuration](#setConfig-Troubleshooting-your-configuration) + Module config: other options to `setConfig()` are available if the relevant module is included in the Prebid.js build. -+ [Currency module](/dev-docs/modules/currency.html) -+ [Consent Management](/dev-docs/modules/consentManagement.html#page-integration) -+ [User ID module](/dev-docs/modules/userId.html#configuration) -+ [Adpod](/dev-docs/modules/adpod.html) -+ [IAB Category Translation](/dev-docs/modules/categoryTranslation.html) +* [Currency module](/dev-docs/modules/currency.html) +* [Consent Management](/dev-docs/modules/consentManagement.html#page-integration) +* [User ID module](/dev-docs/modules/userId.html#configuration) +* [Adpod](/dev-docs/modules/adpod.html) +* [IAB Category Translation](/dev-docs/modules/categoryTranslation.html) - + #### Debugging @@ -62,34 +63,35 @@ 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 guide](/troubleshooting/troubleshooting-guide.html) for more information. Turn on debugging permanently in the page: -{% highlight js %} + +```javascript pbjs.setConfig({ debug: true }); -{% endhighlight %} +``` {: .alert.alert-warning :} Note that turning on debugging for Prebid Server causes most server-side adapters to consider it a test request, meaning that they won't count on reports. - + #### Device Access You can prevent Prebid.js from reading or writing cookies or HTML localstorage by setting this flag: -{% highlight js %} +```javascript pbjs.setConfig({ deviceAccess: false }); -{% endhighlight %} +``` This can be useful in GDPR, CCPA, COPPA or other privacy scenarios where a publisher has determined that header bidding should not read from or write the user's device. - + #### Bidder Timeouts Set a global bidder timeout: -{% highlight js %} +```javascript pbjs.setConfig({ bidderTimeout: 3000 }); -{% endhighlight %} +``` {: .alert.alert-warning :} **Bid Timeouts and JavaScript Timers** @@ -99,57 +101,57 @@ For more information about the asynchronous event loop and `setTimeout`, see [Ho #### Max Requests Per Origin - + Since browsers have a limit of how many requests they will allow to a specific domain before they block, Prebid.js will queue auctions that would cause requests to a specific origin to exceed that limit. The limit is different for each browser. Prebid.js defaults to a max of `4` requests per origin. That value can be configured with `maxRequestsPerOrigin`. -{% highlight js %} +```javascript // most browsers allow at least 6 requests, but your results may vary for your user base. Sometimes using all // `6` requests can impact performance negatively for users with poor internet connections. pbjs.setConfig({ maxRequestsPerOrigin: 6 }); // to emulate pre 1-x behavior and have all auctions queue (no concurrent auctions), you can set it to `1`. pbjs.setConfig({ maxRequestsPerOrigin: 1 }); -{% endhighlight %} +``` #### Disable Ajax Timeout - + Prebid core adds a timeout on XMLHttpRequest request to terminate the request once auction is timedout. Since Prebid is ignoring all the bids after timeout it does not make sense to continue the request after timeout. However, you have the option to disable this by using `disableAjaxTimeout`. -{% highlight js %} +```javascript pbjs.setConfig({ disableAjaxTimeout: true }); -{% endhighlight %} +``` #### Set Timeout Buffer - + Prebid core adds a timeout buffer to extend the time that bidders have to return a bid after the auction closes. This buffer is used to offset the "time slippage" of the setTimeout behavior in browsers. Prebid.js sets the default value to 400ms. You can change this value by setting `timeoutBuffer` to the amount of time you want to use. The following example sets the buffer to 300ms. -{% highlight js %} +```javascript pbjs.setConfig({ timeoutBuffer: 300 }); -{% endhighlight %} +``` #### Set TTL Buffer - + When an adapter bids, it provides a TTL (time-to-live); the bid is considered expired and unusuable after that time has elapsed. Core subtracts from it a buffer of 1 second; that is, a bid with TTL of 30 seconds is considered expired after 29 seconds. You can adjust this buffer with: -{% highlight js %} +```javascript pbjs.setConfig({ ttlBuffer: 10 // TTL buffer in seconds }); -{% endhighlight %} +``` #### Send All Bids - + When enableSendAllBids is **true** (the default), the page will send keywords for all bidders to your ad server. The ad server can then make the decision on which bidder will win. Some ad servers, such as Google Ad Manager, can then generate reporting on historical bid prices from all bidders. @@ -166,7 +168,7 @@ Note that targeting config must be set before either `pbjs.setTargetingForGPTAsy ##### Example results where enableSendAllBids is true -{% highlight bash %} +```bash { "hb_adid_audienceNetw": "1663076dadb443d", "hb_pb_audienceNetwor": "9.00", @@ -191,7 +193,7 @@ Note that targeting config must be set before either `pbjs.setTargetingForGPTAsy "hb_size": "300x250", "hb_format": "banner" } -{% endhighlight %} +``` You can see how the number of ad server targeting variable could get large when many bidders are present. @@ -218,11 +220,11 @@ pbjs.setConfig({ }); ``` - + #### Configure Send Bids Control - + The `sendBidsControl` object passed to `pbjs.setConfig` provides the publisher with the ability to adjust the targeting behavior when [sendAllBids](#setConfig-Send-All-Bids) is enabled. @@ -243,6 +245,7 @@ pbjs.setConfig({ } }); ``` + When this property is set, the value assigned to `bidLimit` is the maximum number of bids that will be sent to the ad server. If `bidLimit` is set to 0, sendAllBids will have no maximum bid limit and *all* bids will be sent. This setting can be helpful if you know that your ad server has a finite limit to the amount of query characters it will accept and process. {: .alert.alert-info :} @@ -250,7 +253,7 @@ Note that this feature overlaps and can be used in conjunction with [targetingCo #### Use Bid Cache - + Prebid.js currently allows for [caching and reusing bids in a very narrowly defined scope](/dev-docs/faq.html#does-prebidjs-cache-bids). However, if you'd like, you can disable this feature and prevent Prebid.js from using anything but the latest bids for @@ -260,86 +263,83 @@ a given auction. This option is available in version 1.39 as true-by-default and became false-by-default as of Prebid.js 2.0. If you want to use this feature in 2.0 and later, you'll need to set the value to true. -{% highlight js %} +```javascript 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 %} +```javascript pbjs.setConfig({ useBidCache: true, bidCacheFilterFunction: bid => bid.mediaType !== 'video' }); -{% endhighlight %} - +``` #### Bidder Order Set the order in which bidders are called: -{% highlight js %} +```javascript pbjs.setConfig({ bidderSequence: "fixed" }) /* default is "random" */ -{% endhighlight %} +``` - + #### Page URL Override the Prebid.js page referrer for some bidders. -{% highlight js %} +```javascript pbjs.setConfig({ pageUrl: "https://example.com/index.html" }) -{% endhighlight %} - +``` - + #### Price Granularity This configuration defines the price bucket granularity setting that will be used for the `hb_pb` keyword. -{% highlight js %} +```javascript pbjs.setConfig({ priceGranularity: "medium" }) -{% endhighlight %} +``` Standard values: -+ `"low"`: $0.50 increments, capped at $5 CPM -+ `"medium"`: $0.10 increments, capped at $20 CPM (the default) -+ `"high"`: $0.01 increments, capped at $20 CPM -+ `"auto"`: Applies a sliding scale to determine granularity as shown in the [Auto Granularity](#autoGranularityBucket) table below. -+ `"dense"`: Like `"auto"`, but the bid price granularity uses smaller increments, especially at lower CPMs. For details, see the [Dense Granularity](#denseGranularityBucket) table below. -+ `customConfigObject`: If you pass in a custom config object (as shown in the [Custom CPM Bucket Sizing](#customCPMObject) example below), you can have much finer control over CPM bucket sizes, precision, and caps. +* `"low"`: $0.50 increments, capped at $5 CPM +* `"medium"`: $0.10 increments, capped at $20 CPM (the default) +* `"high"`: $0.01 increments, capped at $20 CPM +* `"auto"`: Applies a sliding scale to determine granularity as shown in the [Auto Granularity](#autoGranularityBucket) table below. +* `"dense"`: Like `"auto"`, but the bid price granularity uses smaller increments, especially at lower CPMs. For details, see the [Dense Granularity](#denseGranularityBucket) table below. +* `customConfigObject`: If you pass in a custom config object (as shown in the [Custom CPM Bucket Sizing](#customCPMObject) example below), you can have much finer control over CPM bucket sizes, precision, and caps. ##### Auto Granularity {: .table .table-bordered .table-striped } -| CPM | Granularity | Example | +| CPM | Granularity | Example | |---------------------+----------------------------------+--------| -| CPM <= $5 | $0.05 increments | $1.87 floored to $1.85 | -| CPM <= $10 and > $5 | $0.10 increments | $5.09 floored to $5.00 | -| CPM <= $20 and > $10 | $0.50 increments | $14.26 floored to $14.00 | -| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 | +| CPM <= $5 | $0.05 increments | $1.87 floored to $1.85 | +| CPM <= $10 and > $5 | $0.10 increments | $5.09 floored to $5.00 | +| CPM <= $20 and > $10 | $0.50 increments | $14.26 floored to $14.00 | +| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 | ##### Dense Granularity {: .table .table-bordered .table-striped } -| CPM | Granularity | Example | +| CPM | Granularity | Example | |------------+-------------------------------+---------| -| CPM <= $3 | $0.01 increments | $1.87 floored to $1.87 | -| CPM <= $8 and >$3 | $0.05 increments | $5.09 floored to $5.05 | -| CPM <= $20 and >$8 | $0.50 increments | $14.26 floored to $14.00 | -| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 | +| CPM <= $3 | $0.01 increments | $1.87 floored to $1.87 | +| CPM <= $8 and >$3 | $0.05 increments | $5.09 floored to $5.05 | +| CPM <= $20 and >$8 | $0.50 increments | $14.26 floored to $14.00 | +| CPM > $20 | Caps the price bucket at $20 | $24.82 floored to $20.00 | @@ -372,9 +372,9 @@ pbjs.setConfig({ Here are the rules for CPM intervals: -- `max` and `increment` must be specified -- A range's minimum value is assumed to be the max value of the previous range. The first interval starts at a min value of 0. -- `precision` is optional and defaults to 2 +* `max` and `increment` must be specified +* A range's minimum value is assumed to be the max value of the previous range. The first interval starts at a min value of 0. +* `precision` is optional and defaults to 2 {% capture warning-granularity %} As of Prebid.js 3.0, the 'min' parameter is no longer supported in custom granularities. @@ -390,8 +390,7 @@ This implies that ranges should have max values that are really the min value of {% include alerts/alert_warning.html content=warning-granularity %} - - + #### Media Type Price Granularity @@ -399,10 +398,11 @@ The standard [Prebid price granularities](#setConfig-Price-Granularity) cap out 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 %} +* 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. + +```javascript const customPriceGranularityVideo = { 'buckets': [ { 'precision': 2, 'max': 5, 'increment': 0.25 }, @@ -419,11 +419,11 @@ const customPriceGranularityBanner = { pbjs.setConfig({'mediaTypePriceGranularity': { 'video': customPriceGranularity, // used as default for instream video - 'video-outstream': customPriceGranularityBanner, + 'video-outstream': customPriceGranularityBanner, 'banner': 'customPriceGranularityBanner' } }); -{% endhighlight %} +``` Any `mediaTypePriceGranularity` setting takes precedence over `priceGranularity`. @@ -437,16 +437,17 @@ are recognized. This was driven by the recognition that outstream often shares l 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'. - + #### Custom CPM Rounding -Prebid defaults to rounding down all bids to the nearest increment, which may cause lower CPM ads to be selected. -While this can be addressed through higher [price granularity](#setConfig-Price-Granularity), Prebid also allows setting a custom rounding function. -This function will be used by Prebid to determine what increment a bid will round to. +Prebid defaults to rounding down all bids to the nearest increment, which may cause lower CPM ads to be selected. +While this can be addressed through higher [price granularity](#setConfig-Price-Granularity), Prebid also allows setting a custom rounding function. +This function will be used by Prebid to determine what increment a bid will round to.

    You can set a simple rounding function: + ```javascript // Standard rounding pbjs.setConfig({'cpmRoundingFunction': Math.round}); @@ -468,13 +469,13 @@ const roundToNearestEvenIncrement = function (number) { pbjs.setConfig({'cpmRoundingFunction': roundToNearestEvenIncrement}); ``` - + #### Server to Server See the [Prebid Server module](/dev-docs/modules/prebidServer.html). - + #### Mobile App Post-Bid @@ -482,7 +483,7 @@ To support [post-bid](/overview/what-is-post-bid.html) scenarios on mobile apps, prebidServerBidAdapter module will accept `ortb2.app` config to forward details through the server: -{% highlight js %} +```javascript pbjs.setConfig({ ortb2: { app: { @@ -491,12 +492,12 @@ pbjs.setConfig({ } } }); -{% endhighlight %} +``` {: .alert.alert-warning :} In PBJS 4.29 and earlier, don't add the `ortb2` level here -- just `app` directly. Oh, and please upgrade. 4.29 was a long time ago. - + #### Configure User Syncing @@ -505,9 +506,9 @@ This practice is called "user syncing" because the aim is to let the bidders mat There's a good reason for bidders to be doing this -- DSPs are more likely to bid on impressions where they know something about the history of the user. However, there are also good reasons why publishers may want to control the use of these practices: -- *Page performance*: Publishers may wish to move ad-related cookie work to much later in the page load after ads and content have loaded. -- *User privacy*: Some publishers may want to opt out of these practices even though it limits their users' values on the open market. -- *Security*: Publishers may want to control which bidders are trusted to inject images and JavaScript into their pages. +* *Page performance*: Publishers may wish to move ad-related cookie work to much later in the page load after ads and content have loaded. +* *User privacy*: Some publishers may want to opt out of these practices even though it limits their users' values on the open market. +* *Security*: Publishers may want to control which bidders are trusted to inject images and JavaScript into their pages. {: .alert.alert-info :} **User syncing default behavior** @@ -515,11 +516,11 @@ If you don't tweak any of the settings described in this section, the default be For more information, see the sections below. -- [User Sync Properties](#setConfig-ConfigureUserSyncing-UserSyncProperties) -- [User Sync Examples](#setConfig-ConfigureUserSyncing-UserSyncExamples) -- [How User Syncing Works](#setConfig-ConfigureUserSyncing-HowUserSyncingWorks) +* [User Sync Properties](#setConfig-ConfigureUserSyncing-UserSyncProperties) +* [User Sync Examples](#setConfig-ConfigureUserSyncing-UserSyncExamples) +* [How User Syncing Works](#setConfig-ConfigureUserSyncing-HowUserSyncingWorks) - + ##### User Sync Properties @@ -536,7 +537,7 @@ For descriptions of all the properties that control user syncs, see the table be | `enableOverride` | Boolean | Enable/disable publisher to trigger user syncs by calling `pbjs.triggerUserSyncs()`. Default: `false`. | | `aliasSyncEnabled` | Boolean | Enable/disable registered syncs for aliased adapters. Default: `false`. | - + ##### User Sync Examples @@ -544,37 +545,37 @@ For examples of configurations that will change the default behavior, see below. Push the user syncs to later in the page load: -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { syncDelay: 5000 // write image pixels 5 seconds after the auction } }); -{% endhighlight %} +``` Turn off user syncing entirely: -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { syncEnabled: false } }); -{% endhighlight %} +``` Delay auction to retrieve userId module IDs first: -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { auctionDelay: 1000 // delay auction up to 1 second } }); -{% endhighlight %} +``` Allow iframe-based syncs (the presence of a valid `filterSettings.iframe` object automatically enables iframe type user-syncing): -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { filterSettings: { @@ -585,12 +586,13 @@ pbjs.setConfig({ } } }); -{% endhighlight %} -_Note - iframe-based syncing is disabled by default. Image-based syncing is enabled by default; it can be disabled by excluding all/certain bidders via the `filterSettings` object._ +``` + +Note - iframe-based syncing is disabled by default. Image-based syncing is enabled by default; it can be disabled by excluding all/certain bidders via the `filterSettings` object._ Only certain bidders are allowed to sync and only certain types of sync pixels: -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { filterSettings: { @@ -607,11 +609,11 @@ pbjs.setConfig({ syncDelay: 6000, // 6 seconds after the auction } }); -{% endhighlight %} +``` If you want to apply the same bidder inclusion/exlusion rules for both types of sync pixels, you can use the `all` object instead specifying both `image` and `iframe` objects like so: -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { /* only these bidders are allowed to sync. Both iframe and image pixels are permitted. */ @@ -625,13 +627,13 @@ pbjs.setConfig({ syncDelay: 6000, // 6 seconds after the auction } }); -{% endhighlight %} +``` -_Note - the `all` field is mutually exclusive and cannot be combined with the `iframe`/`image` fields in the `userSync` config. This restriction is to promote clear logic as to how bidders will operate in regards to their `userSync` pixels. If the fields are used together, this will be considered an invalid config and Prebid will instead use the default `userSync` logic (all image pixels permitted and all iframe pixels are blocked)._ +Note - the `all` field is mutually exclusive and cannot be combined with the `iframe`/`image` fields in the `userSync` config. This restriction is to promote clear logic as to how bidders will operate in regards to their userSync` pixels. If the fields are used together, this will be considered an invalid config and Prebid will instead use the default `userSync` logic (all image pixels permitted and all iframe pixels are blocked)._ The same bidders can drop sync pixels, but the timing will be controlled by the page: -{% highlight js %} +```javascript pbjs.setConfig({ userSync: { /* only these bidders are allowed to sync, and only image pixels */ @@ -644,15 +646,15 @@ pbjs.setConfig({ enableOverride: true // publisher will call `pbjs.triggerUserSyncs()` } }); -{% endhighlight %} +``` As noted, there's a function available to give the page control of when registered user syncs are added. -{% highlight js %} +```javascript pbjs.triggerUserSyncs(); -{% endhighlight %} +``` - + ##### How User Syncing Works @@ -664,7 +666,7 @@ The [userSync.registerSync()]({{site.baseurl}}/dev-docs/bidder-adaptor.html#bidd When user syncs are run, regardless of whether they are invoked by the platform or by the page calling pbjs.triggerUserSyncs(), the queue entries are randomized and appended to the bottom of the HTML tag. - + #### Configure Targeting Controls @@ -722,7 +724,7 @@ 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 @@ -731,6 +733,7 @@ The `allowTargetingKeys` config creates a targeting key mask based on the defaul Prebid.js introduced the concept of optional targeting keys with 4.23. CONSTANTS.DEFAULT_TARGETING_KEYS is defined as a subset of CONSTANTS.TARGETING_KEYS. When a publisher defines targetingControls.allowTargetingKeys, this replaces the constant CONSTANTS.DEFAULT_TARGETING_KEYS and can include optional keys defined in CONSTANTS.TARGETING_KEYS. One example of this would be to make `hb_adomain` part of the default set. To accomplish this, Prebid does the following: + * Collect original targeting generated by the auction. * Generate new targeting filtered against allowed keys. * Custom targeting keys are always added to targeting. @@ -783,6 +786,7 @@ config.setConfig({ } }); ``` + Another example config showing the addition of `hb_adomain` and excluding all default targeting keys except `hb_bidder`, `hb_adid`, `hb_size` and `hb_pb`: ```javascript @@ -793,11 +797,11 @@ 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). +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`. @@ -851,7 +855,6 @@ config.setConfig({ }); ``` - ##### 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`. @@ -866,8 +869,7 @@ config.setConfig({ }); ``` - - + #### Configure Responsive Ads @@ -889,19 +891,19 @@ If, on the other hand, you're only working with the banner mediaType and the AdU {% endcapture %} {% include alerts/alert_tip.html content=tip-choosing %} -+ [How it works](#sizeConfig-How-it-Works) -+ [Example](#sizeConfig-Example) -+ [Labels](#labels) +* [How it works](#sizeConfig-How-it-Works) +* [Example](#sizeConfig-Example) +* [Labels](#labels) - + ##### How Size Config Works for Banners -- Before `requestBids` sends bid requests to adapters, it will evaluate and pick the appropriate label(s) based on the `sizeConfig.mediaQuery` and device properties. Once it determines the active label(s), it will then filter the `adUnit.bids` array based on the `labels` defined and whether the `banner` mediaType was included. Ad units that include a `banner` mediaType that don't match the label definition are dropped. -- The required `sizeConfig.mediaQuery` property allows [CSS media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries). The queries are tested using the [`window.matchMedia`](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia) API. -- If a label conditional (e.g. `labelAny`) doesn't exist on an ad unit, it is automatically included in all requests for bids. -- If multiple rules match, the sizes will be filtered to the intersection of all matching rules' `sizeConfig.sizesSupported` arrays. -- The `adUnit.mediaTypes.banner.sizes` selected will be filtered based on the `sizesSupported` of the matched `sizeConfig`. So the `adUnit.mediaTypes.banner.sizes` is a subset of the sizes defined from the resulting intersection of `sizesSupported` sizes and `adUnit.mediaTypes.banner.sizes`. (Note: size config will also operate on `adUnit.sizes`, however `adUnit.sizes` is deprecated in favor of `adUnit.mediaTypes`) +* Before `requestBids` sends bid requests to adapters, it will evaluate and pick the appropriate label(s) based on the `sizeConfig.mediaQuery` and device properties. Once it determines the active label(s), it will then filter the `adUnit.bids` array based on the `labels` defined and whether the `banner` mediaType was included. Ad units that include a `banner` mediaType that don't match the label definition are dropped. +* The required `sizeConfig.mediaQuery` property allows [CSS media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries). The queries are tested using the [`window.matchMedia`](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia) API. +* If a label conditional (e.g. `labelAny`) doesn't exist on an ad unit, it is automatically included in all requests for bids. +* If multiple rules match, the sizes will be filtered to the intersection of all matching rules' `sizeConfig.sizesSupported` arrays. +* The `adUnit.mediaTypes.banner.sizes` selected will be filtered based on the `sizesSupported` of the matched `sizeConfig`. So the `adUnit.mediaTypes.banner.sizes` is a subset of the sizes defined from the resulting intersection of `sizesSupported` sizes and `adUnit.mediaTypes.banner.sizes`. (Note: size config will also operate on `adUnit.sizes`, however `adUnit.sizes` is deprecated in favor of `adUnit.mediaTypes`) ###### Note on sizeConfig and different mediaTypes @@ -911,13 +913,13 @@ For example, if a request contained the `banner` and `video` `mediaTypes` and i If the ad unit does not include `banner` `mediaType` at all, then the sizeConfig logic will not influence that ad Unit; it will automatically be passed into the auction. - + -##### Example +##### Size Config Example To set size configuration rules, pass in `sizeConfig` as follows: -{% highlight js %} +```javascript pbjs.setConfig({ sizeConfig: [{ @@ -954,7 +956,7 @@ pbjs.setConfig({ }] }); -{% endhighlight %} +``` ##### Labels @@ -968,22 +970,24 @@ Labels may be defined in two ways: 1. Through [`sizeConfig`](#setConfig-Configure-Responsive-Ads) 2. As an argument to [`pbjs.requestBids`](/dev-docs/publisher-api-reference/requestBids.html) -{% highlight js %} +```javascript pbjs.requestBids({labels: []}); -{% endhighlight %} +``` Labels may be targeted in the AdUnit structure by two conditional operators: `labelAny` and `labelAll`. With the `labelAny` operator, just one label has to match for the condition to be true. In the example below, either A or B can be defined in the label array to activate the bid or ad unit: -{% highlight bash %} + +```javascript labelAny: ["A", "B"] -{% endhighlight %} +``` 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. In the example below, both A and B must be defined in the label array to activate the bid or ad unit: -{% highlight bash %} + +```javascript labelAll: ["A", "B"] -{% endhighlight %} +``` {: .alert.alert-warning :} Only one conditional may be specified on a given AdUnit or bid -- if both `labelAny` and `labelAll` are specified, only the first one will be utilized and an error will be logged to the console. It is allowable for an AdUnit to have one condition and a bid to have another. @@ -996,8 +1000,7 @@ It is important to note that labels do not act as filters for sizeConfig. In the Label targeting on the ad unit looks like the following: -{% highlight js %} - +```javascript pbjs.addAdUnits([{ code: "ad-slot-1", mediaTypes: { @@ -1048,12 +1051,11 @@ pbjs.addAdUnits([{ ] }]); -{% endhighlight %} +``` See [Conditional Ad Units]({{site.baseurl}}/dev-docs/conditional-ad-units.html) for additional use cases around labels. - - + #### COPPA @@ -1061,11 +1063,11 @@ Bidder adapters that support the Child Online Privacy Protection Act (COPPA) rea Publishers with content falling under the scope of this regulation should consult with their legal teams. The flag may be passed to supporting adapters with this config: -{% highlight js %} +```javascript pbjs.setConfig({coppa: true}); -{% endhighlight %} +``` - + #### First Party Data @@ -1077,24 +1079,25 @@ Not all bid adapters currently support reading first party data in this way, but **Scenario 1** - Global (cross-adunit) First Party Data open to all bidders -{% highlight js %} +```javascript pbjs.setConfig({ ortb2: { site: { - ... + // ... }, user: { - ... + // ... } } }); -{% endhighlight %} +``` The `ortb2` JSON structure reflects the OpenRTB standard: -- Fields that like keywords, search, content, gender, yob, and geo are values defined in OpenRTB, so should go directly under the site or user objects. -- Arbitrary values should go in site.ext.data or user.ext.data. -- 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. + +* Fields that like keywords, search, content, gender, yob, and geo are values defined in OpenRTB, so should go directly under the site or user objects. +* Arbitrary values should go in site.ext.data or user.ext.data. +* 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** - Auction (cross-adunit) First Party Data open to all bidders @@ -1110,7 +1113,7 @@ See the [AdUnit Reference](/dev-docs/adunit-reference.html) for AdUnit-specific See [Prebid Server First Party Data](/prebid-server/features/pbs-fpd.html) for details about passing data server-side. - + #### Video Module to integrate with Video Players @@ -1142,10 +1145,11 @@ To register a video player with Prebid, you must use `setConfig` to set a `video **Note:** You can integrate with different Player vendors. For this to work, you must ensure that the right Video Submodules are included in your build, and that the providers have the right `vendorCode`s and `divId`s. -##### Example +##### Player Integration Example Assuming your page has 2 JW Player video players, 1 video.js video player, and your ad server is GAM. -{% highlight js %} + +```javascript pbjs.setConfig({ video: { providers: [{ @@ -1181,9 +1185,9 @@ pbjs.setConfig({ } } }); -{% endhighlight %} +``` - + #### Client-side Caching of VAST XML @@ -1192,16 +1196,16 @@ video player can retrieve them when it's ready. Players don't obtain the VAST XM the JavaScript DOM in Prebid.js, but rather expect to be given a URL where it can be retrieved. There are two different flows possible with Prebid.js around VAST XML caching: -- Server-side caching: +* Server-side caching: Some video bidders (e.g. Rubicon Project) always cache the VAST XML on their servers as part of the bid. They provide a 'videoCacheKey', which is used in conjunction with the VAST URL in the ad server to retrieve the correct VAST XML when needed. In this case, Prebid.js has nothing else to do. As of Prebid.js 4.28, a publisher may specify the `ignoreBidderCacheKey` flag to re-cache these bids somewhere else using a VAST wrapper. -- Client-side caching: +* Client-side caching: Video bidders that don't cache on their servers return the entire VAST XML body. In this scenario, Prebid.js needs to copy the VAST XML to a publisher-defined cache location on the network. Prebid.js POSTs the VAST XML to the named Prebid Cache URL. It then sets the 'videoCacheKey' to the key that's returned in the response. {: .table .table-bordered .table-striped } | Cache Attribute | Required? | Type | Description | |----+--------+-----+-------| | cache.url | yes | string | The URL of the Prebid Cache server endpoint where VAST creatives will be sent. | -| cache.timeout | no | number | Timeout (in milliseconds) for network requests to the cache | +| cache.timeout | no | number | Timeout (in milliseconds) for network requests to the cache | | cache.vasttrack | no | boolean | Passes additional data to the url, used for additional event tracking data. Defaults to `false`. | | cache.ignoreBidderCacheKey | no | boolean | If the bidder supplied their own cache key, setting this value to true adds a VAST wrapper around that URL, stores it in the cache defined by the `url` parameter, and replaces the original video cache key with the new one. This can dramatically simplify ad server setup because it means all VAST creatives reside behind a single URL. The tradeoff: this approach requires the video player to unwrap one extra level of VAST. Defaults to `false`. | | cache.batchSize | no | number | Enables video cache requests to be batched by a specified amount (defaults to 1) instead of making a single request per each video. | @@ -1209,44 +1213,44 @@ be retrieved. There are two different flows possible with Prebid.js around VAST Here's an example of basic client-side caching. Substitute your Prebid Cache URL as needed: -{% highlight js %} +```javascript pbjs.setConfig({ cache: { url: 'https://prebid.adnxs.com/pbc/v1/cache' } }); -{% endhighlight %} +``` {: .alert.alert-warning :} The endpoint URL provided must be a Prebid Cache or be otherwise compatible with the [Prebid Cache interface](https://github.com/prebid/prebid-cache). As of Prebid.js 4.28, you can specify the `ignoreBidderCacheKey` option: -{% highlight js %} +```javascript pbjs.setConfig({ cache: { url: 'https://my-pbs.example.com/cache', - ignoreBidderCacheKey: true + ignoreBidderCacheKey: true } }); -{% endhighlight %} +``` As of Prebid.js 2.36, you can track client-side cached VAST XML. This functionality is useful for publishers who want to allow their analytics provider to measure video impressions. The prerequisite to using this feature is the availability of a Prebid Server that supports: -- the /vtrack endpoint -- an analytics module with connection to an analytics system that supports joining the impression event to the original auction request on the bidid -- the ability of a publisher to utilize the feature (if account-level permission is enabled) +* the /vtrack endpoint +* an analytics module with connection to an analytics system that supports joining the impression event to the original auction request on the bidid +* the ability of a publisher to utilize the feature (if account-level permission is enabled) Given those conditions, the `vasttrack` flag can be specified: -{% highlight js %} +```javascript pbjs.setConfig({ cache: { url: 'https://my-pbs.example.com/vtrack', vasttrack: true } }); -{% endhighlight %} +``` Setting the `vasttrack` parameter to `true` supplies the POST made to the `/vtrack` Prebid Server endpoint with a couple of additional parameters needed @@ -1254,7 +1258,7 @@ by the analytics system to join the event to the original auction request. Optionally, `batchSize` and `batchTimeout` can be utlilized as illustrated with the example below: -{% highlight js %} +```javascript pbjs.setConfig({ cache: { url: 'https://prebid.adnxs.com/pbc/v1/cache', @@ -1262,16 +1266,17 @@ pbjs.setConfig({ batchTimeout: 50 } }); -{% endhighlight %} +``` The example above states that a timer will be initialized and wait up to 50ms for 4 responses to have been collected and then will fire off one batch video cache request for all 4 responses. Note that the batch request will be made when the specified `batchSize` number is reached or with the number of responses that could be collected within the timeframe specified by the value for `batchTimeout`. If a batchSize is set to 2 and 5 video responses arrive (within the timeframe specified by `batchTimeout`), then three batch requests in total will be made: + 1. Batch 1 will contain cache requests for 2 videos 2. Batch 2 will contain cache requests for 2 videos 3. Batch 3 will contain cache requests for 1 video - + #### Instream tracking @@ -1289,26 +1294,26 @@ This configuration will allow Analytics Adapters and Bid Adapters to track `BID_ | `instreamTracking.pollingFreq` | Optional | Integer |The frequency of polling. Default: `500`ms | | `instreamTracking.urlPattern` | Optional | RegExp | Regex for cache url patterns, to avoid false positives. | -#### Example +#### Instream Tracking Example -{% highlight js %} +```javascript pbjs.setConfig({ 'instreamTracking': { enabled: true, } }); -{% endhighlight %} +``` More examples [here](/dev-docs/modules/instreamTracking.html#example-with-urlpattern). - + #### Site Configuration Adapters, including Prebid Server adapters, can support taking site parameters like language. Just set the `ortb2.site` object as First Party Data to make it available to client- and server-side adapters. -{% highlight js %} +```javascript pbjs.setConfig({ ortb2: { site: { @@ -1318,12 +1323,12 @@ pbjs.setConfig({ } } }); -{% endhighlight %} +``` {: .alert.alert-warning :} In PBJS 4.29 and earlier, don't add the `ortb2` level here -- just `site` directly. Oh, and please upgrade. 4.29 was a long time ago. - + #### Auction Options @@ -1336,47 +1341,51 @@ The `auctionOptions` object controls aspects related to auctions. | `suppressStaleRender` | Optional | Boolean | When true, prevents `banner` bids from being rendered more than once. It should only be enabled after auto-refreshing is implemented correctly. Default is false. ##### Examples -Exclude status of bidder _doNotWaitForMe_ when checking auction completion. -{% highlight js %} + +Exclude status of bidder *doNotWaitForMe* when checking auction completion. + +```javascript pbjs.setConfig({ 'auctionOptions': { 'secondaryBidders': ['doNotWaitForMe'] } }); -{% endhighlight %} +``` Render winning bids only once. -{% highlight js %} + +```javascript pbjs.setConfig({ 'auctionOptions': { 'suppressStaleRender': true } }); -{% endhighlight %} +``` ##### More on Stale Rendering + When auto-refreshing is done incorrectly, it could cause the same bids to be rendered repeatedly. For instance, when googletag.pubads.refresh() is called directly without removing the PBJS targeting, the same hb_ variables get re-sent to GAM, re-chosen, and re-rendered. Over and over without ever asking PBJS for updated targeting variables. PBJS performs following actions when stale rendering is detected. + * Log a warning in the browser console if pbjs_debug=true. * Emit a `STALE_RENDER` event before `BID_WON` event. Stale winning bids will continue to be rendered unless `suppressStaleRender` is set to true. Events including `STALE_RENDER` and `BID_WON` are unaffected by this option. - - + #### maxNestedIframes Prebid.js will loop upward through nested iframes to find the top-most referrer. This setting limits how many iterations it will attempt before giving up and not setting referrer. -``` +```javascript pbjs.setConfig({ maxNestedIframes: 5 // default is 10 }); ``` - + #### Real-Time Data Modules @@ -1386,22 +1395,22 @@ 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. -``` +```javascript pbjs.setConfig({ - ..., + // ..., realTimeData: { auctionDelay: 100, // REQUIRED: applies to all RTD modules dataProviders: [{ name: "RTD-MODULE-1", waitForIt: true, // OPTIONAL: flag this module as important params: { - ... module-specific parameters ... + // ... module-specific parameters ... } },{ name: "RTD-MODULE-2", waitForIt: false, // OPTIONAL: flag this module as less important params: { - ... module-specific parameters ... + //... module-specific parameters ... } }] } @@ -1428,18 +1437,17 @@ Some publishers carefully manage these precious milliseconds, balancing impact of the real-time data with the revenue loss from auction delay. Notes: -- The only time `waitForIt` means anything is if some modules are flagged as true and others as false. If all modules are the same (true or false), it has no effect. -- Likewise, `waitForIt` doesn't mean anything without an auctionDelay specified. - +* The only time `waitForIt` means anything is if some modules are flagged as true and others as false. If all modules are the same (true or false), it has no effect. +* Likewise, `waitForIt` doesn't mean anything without an auctionDelay specified. - + #### Topics Iframe Configuration Topics iframe implementation is the enhancements of existing module under topicsFpdModule.js where different bidders will call the topic API under their domain to fetch the topics for respective domain and the segment data will be part of ORTB request under user.data object. Default config is maintained in the module itself. Below are the configuration which can be used to configure and override the default config maintained in the module. -``` +```javascript pbjs.setConfig({ userSync: { ..., @@ -1474,60 +1482,62 @@ pbjs.setConfig({ | topics.bidders[].iframeURL | yes | string | URL which is hosted on bidder/SSP/third-party domains which will call Topics API. | | topics.bidders[].expiry | no | integer | Max number of days where Topics data will be persist. If Data is stored for more than mentioned expiry day, it will be deleted from storage. Default is 21 days which is hardcoded in Module. | + - #### Disable performance metrics -Since version 7.17, Prebid collects fine-grained performance metrics and attaches them to several events for the purpose of analytics. If you find that this generates too much data for your analytics provider you may disable this feature with: +Since version 7.17, Prebid collects fine-grained performance metrics and attaches them to several events for the purpose of analytics. If you find that this generates too much data for your analytics provider you may disable this feature with: -``` +```javascript pbjs.setConfig({performanceMetrics: false}) ``` - + + #### Setting alias registry to private The alias registry is made public by default during an auction. It can be referenced in the following way: -``` +```javascript pbjs.aliasRegistry or pbjs.aliasRegistry[aliasName]; ``` -Inversely, if you wish for the alias registry to be private you can do so by using the option below (causing `pbjs.aliasRegistry` to return undefined): +Inversely, if you wish for the alias registry to be private you can do so by using the option below (causing `pbjs.aliasRegistry` to return undefined): -``` +```javascript pbjs.setConfig({aliasRegistry: 'private'}) ``` - + + #### Generic setConfig Configuration Some adapters may support other options, as defined in their documentation. To set arbitrary configuration values: -{% highlight js %} +```javascript pbjs.setConfig({ : }); -{% endhighlight %} +``` - + #### Troubleshooting your configuration Towards catching syntax errors, one tip is to call `pbjs.setConfig` without an object, e.g., -{% highlight js %} -pbjs.setConfig('debug', 'true')); -{% endhighlight %} +```javascript +pbjs.setConfig('debug', 'true'); +``` then Prebid.js will print an error to the console that says: -``` +```noformat 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) +* [Prebid.js and Ad Server Key Values](/features/adServerKvps.html) diff --git a/dev-docs/publisher-api-reference/setTargetingForAst.md b/dev-docs/publisher-api-reference/setTargetingForAst.md index 900624dfc3..5a58ec6ff9 100644 --- a/dev-docs/publisher-api-reference/setTargetingForAst.md +++ b/dev-docs/publisher-api-reference/setTargetingForAst.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.setTargetingForAst(adUnitCode) -description: +description: setTargetingForAst API sidebarType: 1 --- diff --git a/dev-docs/publisher-api-reference/setTargetingForGPTAsync.md b/dev-docs/publisher-api-reference/setTargetingForGPTAsync.md index 30a161b674..16d682dfe3 100644 --- a/dev-docs/publisher-api-reference/setTargetingForGPTAsync.md +++ b/dev-docs/publisher-api-reference/setTargetingForGPTAsync.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.setTargetingForGPTAsync([codeArr], customSlotMatching) -description: +description: setTargetingForGPTAsync API sidebarType: 1 --- @@ -20,6 +20,7 @@ This function matches AdUnits that have returned from the auction to a GPT ad sl targeting attributes to the slot so they get sent to GAM. Here's how it works: + 1. For each AdUnit code that's returned from auction or is specified in the `codeArr` parameter: 2. For each GPT ad slot on the page: 3. If the `customSlotMatching` function is defined, call it. Else, try to match the AdUnit `code` with the GPT slot name. Else try to match the AdUnit `code` with the ID of the HTML div containing the slot. @@ -34,7 +35,7 @@ the ad results should render into. This could be useful on long-scrolling pages. short to make sure they get good viewability, the logic can find an appropriate placement for the auction result depending on where the user is once the auction completes. -``` +```javascript // returns a filter function that matches either with the slot or the adUnitCode // this filter function is being invoked after the auction has completed // this means that it can be used in order to place this within viewport instead of a static div naming diff --git a/dev-docs/publisher-api-reference/triggerBilling.md b/dev-docs/publisher-api-reference/triggerBilling.md index bb84d585a9..8e5e314a32 100644 --- a/dev-docs/publisher-api-reference/triggerBilling.md +++ b/dev-docs/publisher-api-reference/triggerBilling.md @@ -1,7 +1,7 @@ --- layout: api_prebidjs title: pbjs.triggerBilling -description: +description: triggerBilling API sidebarType: 1 --- @@ -20,7 +20,7 @@ See below for an example of how triggerBilling can be used: {: .alert.alert-warning :} Note: The logic to decide when to invoke `pbjs.triggerBilling` is open-ended. One common use case could be to listen for an "on view" event emitted from your ad server.

    For instance, the example below listens for GPT's "impressionViewable" event to determine if a deferred ad unit has become visible and is therefore ready for billing. The utilized approach to determine when to invoke `pbjs.triggerBilling` should be customized to your specific needs (For more on GPT's "impressionViewable" event, see: [https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent](https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent)).

    Additionally, the example below takes into account the possibility of multiple deferred ad units being present on a page that could potentially invoke the triggerBilling function (see the "deferredAdUnitIds" variable in the snippet below). The amount of deferred ad units needed on a page are dependent on your needs and could vary. -{% highlight js %} +```javascript ... var adUnits = [ @@ -74,6 +74,6 @@ function sendAdserverRequest(bids, timedOut, auctionId) { ... -{% endhighlight %} +```
    diff --git a/dev-docs/release-notes.md b/dev-docs/release-notes.md index 108c7d80ad..f30b8b0ead 100644 --- a/dev-docs/release-notes.md +++ b/dev-docs/release-notes.md @@ -7,6 +7,7 @@ description: Release Notes
    # Release Notes + {:.no_toc} This page has links to release notes for each of the projects associated with Prebid.org. diff --git a/dev-docs/show-long-form-video-with-gam.md b/dev-docs/show-long-form-video-with-gam.md index b14d30180f..7f9d4ef178 100644 --- a/dev-docs/show-long-form-video-with-gam.md +++ b/dev-docs/show-long-form-video-with-gam.md @@ -16,16 +16,18 @@ In this tutorial, we'll detail how to set up Prebid.js to display a Programmatic ## Prerequisites -The code example below was built with Prebid.js and the following: -- At least one video-enabled bidder supporting `adpod`. -- The [`dfpAdServerVideo` module](/dev-docs/modules/dfp_video.html), which will provide the video ad support. -- The [`categoryTranslation` module](/dev-docs/modules/categoryTranslation.html), to enable competitive separation. +The code example below was built with Prebid.js and the following: + +* At least one video-enabled bidder supporting `adpod`. +* The [`dfpAdServerVideo` module](/dev-docs/modules/dfp_video.html), which will provide the video ad support. +* The [`categoryTranslation` module](/dev-docs/modules/categoryTranslation.html), to enable competitive separation. For example, to build with the AppNexus bidder adapter and GAM use the following command: ```bash gulp build --modules=appnexusBidAdapter,dfpAdServerVideo ``` + For more information about how to build with modules, see the [Prebid module documentation](/dev-docs/modules/). {% include alerts/alert_important.html content="If competitve separation is required the optional [`categoryTranslation` module](/dev-docs/modules/categoryTranslation.html) needs to be added to the build command." %} @@ -33,12 +35,14 @@ For more information about how to build with modules, see the [Prebid module doc {% include alerts/alert_important.html content="Ensure your ad ops team has set up line items in Google Ad Manager." %} ## Ad Pod Module + When the [`dfpAdServerVideo` module](/dev-docs/modules/dfp_video.html) is included in the Prebid.js build, the [Ad Pod module](/dev-docs/modules/adpod.html), for working with ad pods, is automatically included. This module enables developers to add support for an adserver, like Google Ad Manager or Freewheel, that handles ad unit types of adpod. Specifically, the module provides functions to validate, cache, and modify long-form video bids. ## Implementation + This section provides information on how to implement and configure Prebid.js to display ad unit types of adpod. -**1. Create an ad unit** +### 1. Create an ad unit Create an ad unit that contains a video `mediaType` object and set the `mediaTypes.video.context` to `adpod`. Set the other parameters to the specific properties for the publisher's inventory. @@ -46,30 +50,29 @@ Create an ad unit that contains a video `mediaType` object and set the `mediaTyp ```javascript var videoAdUnit = [{ - code: 'sample-code', - sizes: [640,480], - mediaTypes: { - video: { - context: 'adpod', - playerSize: [640, 480], - adPodDurationSec: 300, - durationRangeSec: [15, 30], - requireExactDuration: true - } - }, - bids: [ - { - bidder: 'appnexus', - params: { - placementId: 14542875 - } + code: 'sample-code', + sizes: [640,480], + mediaTypes: { + video: { + context: 'adpod', + playerSize: [640, 480], + adPodDurationSec: 300, + durationRangeSec: [15, 30], + requireExactDuration: true + } + }, + bids: [ + { + bidder: 'appnexus', + params: { + placementId: 14542875 } - ] - }]; -}; + } + ] +}] ``` -**2. Get ad pod targeting** +### 2. Get ad pod targeting If a publisher wants to retrieve ad pod targeting and create the master tag themselves they can use the getAdPodTargeting method of the `dfpAdServerVideo` module. The method requires an array of ad unit codes and returns targeting key values and the cache id as JSON. @@ -86,23 +89,23 @@ pbjs.adServers.dfp.getAdpodTargeting({ Sample return: -```JSON +```json { - 'adUnitCode-1': [ + "adUnitCode-1": [ { - 'hb_pb_cat_dur': '10.00_
    - + -{% highlight js %} +```javascript pbjs.addAdUnits({ code: slot.code, @@ -151,7 +152,7 @@ pbjs.addAdUnits({ }, ] }) -{% endhighlight %} +``` {: .alert.alert-danger :} For each native ad unit, all of the bidders within that ad unit must have declared native support in their adapter if you want ads to appear. If there are any bidders without native support in a native ad unit, requests will not be made to those bidders. For a list of bidders with native support, see [Bidders with Video and Native Demand]({{site.baseurl}}/dev-docs/bidders.html#bidders-with-video-and-native-demand). @@ -164,16 +165,16 @@ For now there is only the `image` type, but more will be added. The image native ad type implies the following required fields: -+ image -+ title -+ sponsoredBy -+ clickUrl +* image +* title +* sponsoredBy +* clickUrl And the following optional fields: -+ body -+ icon -+ cta +* body +* icon +* cta A native "image-type" ad unit can be set up as shown in the following example. @@ -196,9 +197,9 @@ const adUnits = [{ {% include dev-docs/native-image-asset-sizes.md %} -### 3. Add your native ad tag to the page body as usual: +### 3. Add your native ad tag to the page body as usual -{% highlight html %} +```html
    -{% endhighlight %} +``` ## Sending Asset Placeholders @@ -280,8 +281,8 @@ The `native-trk.js` script from `prebid-universal-creative` can replace native p ## Working Examples -+ [Prebid Native Examples](/dev-docs/examples/native-ad-example.html) +* [Prebid Native Examples](/dev-docs/examples/native-ad-example.html) ## Further Reading -+ [GAM Step by Step - Native Creatives](/adops/gam-native.html) (Ad Ops Setup Instructions) +* [GAM Step by Step - Native Creatives](/adops/gam-native.html) (Ad Ops Setup Instructions) diff --git a/dev-docs/show-outstream-video-ads.md b/dev-docs/show-outstream-video-ads.md index 3e551682fa..0f6c066454 100644 --- a/dev-docs/show-outstream-video-ads.md +++ b/dev-docs/show-outstream-video-ads.md @@ -9,6 +9,7 @@ sidebarType: 4
    # Show Outstream Video Ads + {: .no_toc} Unlike instream video ads, which require you to have your own video inventory, Outstream video ads can be shown on any web page, even pages that only have text content. @@ -24,7 +25,7 @@ There should be no changes required on the ad ops side, since the outstream unit ## Prerequisites -+ Inclusion of at least one demand adapter that supports the `"video"` media type +* Inclusion of at least one demand adapter that supports the `"video"` media type ## Step 1: Set up ad units with the video media type and outstream context @@ -32,8 +33,7 @@ Use the `adUnit.mediaTypes` object to set up your ad units with the `video` medi For full details on video ad unit parameters, see [Ad Unit Reference for Video]({{site.baseurl}}/dev-docs/adunit-reference.html#adunitmediatypesvideo) -{% highlight js %} - +```javascript var videoAdUnits = [{ code: 'video1', mediaTypes: { @@ -54,8 +54,7 @@ var videoAdUnits = [{ } }] }]; - -{% endhighlight %} +``` ### Renderers @@ -85,10 +84,9 @@ A renderer is an object containing these properties: 2. `render` -- A function that tells Prebid.js how to invoke the renderer script. 3. `backupOnly` -- Optional field, if set to true, buyer or adapter renderer will be preferred - In a multiFormat adUnit, you might want the renderer to only apply to only one of the mediaTypes. You can do this by defining the renderer on the media type itself. -{% highlight js %} +```javascript pbjs.addAdUnit({ code: 'video1', // This renderer would apply to all prebid creatives... @@ -120,12 +118,11 @@ pbjs.addAdUnit({ }, ... }); -{% endhighlight %} +``` Some demand partners that return a renderer with their video bid responses may support renderer configuration with the `adUnit.renderer.options` object. These configurations are bidder specific and may include options for skippability, player size, and ad text, for example. An example renderer configuration follows: -{% highlight js %} - +```javascript pbjs.addAdUnit({ code: 'video1', mediaTypes: { @@ -145,8 +142,7 @@ pbjs.addAdUnit({ }, ... }); - -{% endhighlight %} +``` For more technical information about renderers, see [the pull request originally adding the 'Renderer' type](https://github.com/prebid/Prebid.js/pull/1082) and [the pull request allowing the 'renderer' type in the mediaType](https://github.com/prebid/Prebid.js/pull/5760). @@ -158,8 +154,7 @@ Invoke your ad server for the outstream adUnit from the body of the page in the For a live example, see [Outstream with Google Ad Manager]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-dfp.html). -{% highlight html %} - +```html

    Prebid Outstream Video Ad

    - -{% endhighlight %} +``` ### Option 2: Serving without an ad server @@ -185,8 +179,7 @@ In the Prebid.js event queue, you'll need to add a function that: 1. Selects the bid that will serve for the appropriate adUnit 2. Renders the ad -{% highlight js %} - +```javascript pbjs.que.push(function () { pbjs.addAdUnits(videoAdUnits); pbjs.requestBids({ @@ -197,20 +190,19 @@ pbjs.que.push(function () { } }); }); - -{% endhighlight %} +``` For more information, see the API documentation for: -+ [requestBids](/dev-docs/publisher-api-reference/requestBids.html) -+ [getHighestCpmBids](/dev-docs/publisher-api-reference/getHighestCpmBids.html) -+ [renderAd](/dev-docs/publisher-api-reference/renderAd.html) +* [requestBids](/dev-docs/publisher-api-reference/requestBids.html) +* [getHighestCpmBids](/dev-docs/publisher-api-reference/getHighestCpmBids.html) +* [renderAd](/dev-docs/publisher-api-reference/renderAd.html) ## Working Examples Below, find links to end-to-end "working examples" demonstrating Prebid Outstream: -+ [Outstream with Google Ad Manager]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-dfp.html) -+ [Outstream without an Ad Server]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-no-server.html) +* [Outstream with Google Ad Manager]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-dfp.html) +* [Outstream without an Ad Server]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-no-server.html)
    diff --git a/dev-docs/show-prebid-ads-on-amp-pages.md b/dev-docs/show-prebid-ads-on-amp-pages.md index f812053d81..555b42648b 100644 --- a/dev-docs/show-prebid-ads-on-amp-pages.md +++ b/dev-docs/show-prebid-ads-on-amp-pages.md @@ -6,6 +6,7 @@ sidebarType: 2 --- # Prebid AMP Implementation Guide + {: .no_toc} This page has instructions for showing ads on Accelerated Mobile Pages (AMP) using Prebid.js. @@ -14,11 +15,11 @@ Through this implementation, [Prebid Server][PBS] fetches demand and returns key For more information about AMP RTC, see: -+ [Prebid Server and AMP](/prebid-server/use-cases/pbs-amp.html) -+ [Prebid Server AMP Endpoint Technical Documentation](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html) -+ [Prebid Server Stored Bid Requests](https://github.com/prebid/prebid-server/blob/master/docs/developers/stored-requests.md#stored-bidrequests) -+ [AMP RTC Overview](https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-documentation.md) -+ [AMP RTC Publisher Integration Guide](https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-publisher-implementation-guide.md) +* [Prebid Server and AMP](/prebid-server/use-cases/pbs-amp.html) +* [Prebid Server AMP Endpoint Technical Documentation](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html) +* [Prebid Server Stored Bid Requests](https://github.com/prebid/prebid-server/blob/master/docs/developers/stored-requests.md#stored-bidrequests) +* [AMP RTC Overview](https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-documentation.md) +* [AMP RTC Publisher Integration Guide](https://github.com/ampproject/amphtml/blob/master/extensions/amp-a4a/rtc-publisher-implementation-guide.md) {% capture tipNote %} For ad ops setup instructions, see [Google Ad Manager with Prebid Step by Step](/adops/step-by-step.html). @@ -33,18 +34,18 @@ For ad ops setup instructions, see [Google Ad Manager with Prebid Step by Step]( To set up Prebid to serve ads into your AMP pages, you'll need: -+ An account with a [Prebid Server][PBS] instance -+ One or more Prebid Server Stored Bid Requests. A Stored Bid Request is a partial OpenRTB JSON request which: - + Specifies properties like currency, schain, price granularity, etc. - + Contains a list of demand partners and their respective parameters -+ An AMP page containing at least one amp-ad element for an AMP ad network that supports Fast Fetch and AMP RTC +* An account with a [Prebid Server][PBS] instance +* One or more Prebid Server Stored Bid Requests. A Stored Bid Request is a partial OpenRTB JSON request which: + * Specifies properties like currency, schain, price granularity, etc. + * Contains a list of demand partners and their respective parameters +* An AMP page containing at least one amp-ad element for an AMP ad network that supports Fast Fetch and AMP RTC ## Implementation -+ [Prebid Server Stored Request](#prebid-server-stored-request): This is the Prebid Server Stored Bid Request. -+ [AMP content page](#amp-content-page): This is where your content lives. -+ [HTML Creative](#html-creative): This is the creative your Ad Ops team puts in your ad server. -+ [User Sync in AMP](#user-sync): This is the `amp-iframe` pixel that must be added to your AMP page to sync users with Prebid Server. +* [Prebid Server Stored Request](#prebid-server-stored-request): This is the Prebid Server Stored Bid Request. +* [AMP content page](#amp-content-page): This is where your content lives. +* [HTML Creative](#html-creative): This is the creative your Ad Ops team puts in your ad server. +* [User Sync in AMP](#user-sync): This is the `amp-iframe` pixel that must be added to your AMP page to sync users with Prebid Server. ### Prebid Server Stored Request @@ -53,15 +54,14 @@ You will have to create at least one Stored Request for Prebid Server. Valid St An example Stored Request is given below. You'll see that the Stored Request contains some important info that doesn't come from /amp parameters: -- cur -- schain -- ext.prebid.cache.bids - needed to let Prebid Server know that you want it to store the result in PBC -- ext.prebid.targeting.pricegranularity - needed to let Prebid Server know how to calculate the price bucket -- ext.prebid.aliases -- bidders and their parameters - -```html +* cur +* schain +* ext.prebid.cache.bids - needed to let Prebid Server know that you want it to store the result in PBC +* ext.prebid.targeting.pricegranularity - needed to let Prebid Server know how to calculate the price bucket +* ext.prebid.aliases +* bidders and their parameters +```json { "id": "some-request-id", "cur": ["USD"], @@ -114,25 +114,28 @@ that doesn't come from /amp parameters: }] } ``` + 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. -``` +```html ``` + 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. -+ `rtc-config`: Used to pass JSON configuration data to [Prebid Server][PBS], which handles the communication with AMP RTC. - + `vendors` is an object that defines any vendors that will be receiving RTC callouts (including Prebid Server) up to a maximum of five. The list of supported RTC vendors is maintained in [callout-vendors.js](https://github.com/ampproject/amphtml/blob/master/src/service/real-time-config/callout-vendors.js). We recommend working with your Prebid Server hosting company to set up which bidders and parameters should be involved for each AMP ad unit. - + `timeoutMillis` is an optional integer that defines the timeout in milliseconds for each individual RTC callout. The configured timeout must be greater than 0 and less than 1000ms. If omitted, the timeout value defaults to 1000ms. +* `data-slot`: Identifies the ad slot for the auction. +* `rtc-config`: Used to pass JSON configuration data to [Prebid Server][PBS], which handles the communication with AMP RTC. + * `vendors` is an object that defines any vendors that will be receiving RTC callouts (including Prebid Server) up to a maximum of five. The list of supported RTC vendors is maintained in [callout-vendors.js](https://github.com/ampproject/amphtml/blob/master/src/service/real-time-config/callout-vendors.js). We recommend working with your Prebid Server hosting company to set up which bidders and parameters should be involved for each AMP ad unit. + * `timeoutMillis` is an optional integer that defines the timeout in milliseconds for each individual RTC callout. The configured timeout must be greater than 0 and less than 1000ms. If omitted, the timeout value defaults to 1000ms. e.g. for the AppNexus cluster of Prebid Servers: + ```html - ``` Replace `MACRO` in the preceding example with the appropriate macro for the ad server. (Refer to your ad server's documentation or consult with a representative for specific details regarding the proper macros and how to use them.) @@ -225,11 +227,13 @@ To sync user IDs with Prebid Server, the `amp-iframe` below may be added to your Note that AMP constrains syncing as described in the [amp-iframe](https://amp.dev/documentation/components/amp-iframe) documentation. You may only have *one* amp-iframe on your page that is small, e.g. 1x1. Many publishers already have some kind of analytics or tracking frame on their page, so they may find it difficult to manage this. Several hacks are possible, including building a 'frankenstein' script that combines all of your required tracking into one or tying the sync to an image that's large enough to be visible. Notes: -- The following examples include a transparent image as a placeholder which will allow you to place the example at the top within the HTML body. If this is not included the iFrame must be either 600px away from the top or not within the first 75% of the viewport when scrolled to the top – whichever is smaller. For more information on this, see [amp-iframe](https://amp.dev/documentation/components/amp-iframe/) -- Note that the `sandbox` parameter to the amp-iframe must include both "allow-scripts" and "allow-same-origin". -- The load-cookie-with-consent.html file has the same argument syntax as load-cookie.html. It's a different file because it's larger and depends on the existence of an AMP Consent Management Platform. + +* The following examples include a transparent image as a placeholder which will allow you to place the example at the top within the HTML body. If this is not included the iFrame must be either 600px away from the top or not within the first 75% of the viewport when scrolled to the top – whichever is smaller. For more information on this, see [amp-iframe](https://amp.dev/documentation/components/amp-iframe/) +* Note that the `sandbox` parameter to the amp-iframe must include both "allow-scripts" and "allow-same-origin". +* The load-cookie-with-consent.html file has the same argument syntax as load-cookie.html. It's a different file because it's larger and depends on the existence of an AMP Consent Management Platform. If you're using AppNexus' managed service, you would enter something like this: + ```html 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 37abf718e6..ce52dee301 100644 --- a/dev-docs/show-video-with-a-dfp-video-tag.md +++ b/dev-docs/show-video-with-a-dfp-video-tag.md @@ -8,6 +8,7 @@ sidebarType: 4
    # Show Video Ads with Google Ad Manager + {: .no_toc} In this tutorial, we'll show how to set up Prebid to show a video ad @@ -22,13 +23,13 @@ different video players and video-enabled bidders. The code example below was built using the following libraries: -+ [video.js](https://videojs.com/) version 5.9.2 -+ MailOnline's [videojs-vast-vpaid plugin](https://github.com/MailOnline/videojs-vast-vpaid) version 2.0.2 +* [video.js](https://videojs.com/) version 5.9.2 +* MailOnline's [videojs-vast-vpaid plugin](https://github.com/MailOnline/videojs-vast-vpaid) version 2.0.2 Also, you need to make sure to build Prebid.js with: -+ Support for at least one video-enabled bidder -+ Support for the `dfpAdServerVideo` ad server adapter, which will provide the video ad support +* Support for at least one video-enabled bidder +* Support for the `dfpAdServerVideo` ad server adapter, which will provide the video ad support For example, to build with the AppNexus bidder adapter and the Google Ad Manager Video ad server adapter, use the following command: @@ -121,12 +122,12 @@ pbjs.que.push(function() { The VAST XML has to be cached somewhere because most video players can only work with a URL that returns VAST XML, not VAST directly. Some bidders cache the VAST XML on the server side, while others depend on Prebid.js to perform the caching. -+ In general, video-enabled bidders must supply `bid.videoCacheKey`, `bid.vastXml`, or `bid.vastUrl` on their responses, and can provide any combination of the three. -+ If `pbjs.setConfig({cache: {URL}})` isn't set and the bidder supplies only `bid.vastXml` in its bid response, [`pbjs.adServers.dfp.buildVideoUrl`](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html) will not be able to generate a videoCacheKey, and it will be dropped from the auction. -+ If `pbjs.setConfig({cache: {URL}})` is defined and the bidder responds with `bid.videoCacheKey`, Prebid.js will not re-cache the VAST XML. -+ If `options.url` is passed as an argument to [`pbjs.adServers.dfp.buildVideoUrl`](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html): - + If Prebid Cache is disabled, Prebid sets `description_url` field to the bid response's `bid.vastUrl`. - + If Prebid Cache is enabled, Prebid sets `description_url` field to the cache URL. +* In general, video-enabled bidders must supply `bid.videoCacheKey`, `bid.vastXml`, or `bid.vastUrl` on their responses, and can provide any combination of the three. +* If `pbjs.setConfig({cache: {URL}})` isn't set and the bidder supplies only `bid.vastXml` in its bid response, [`pbjs.adServers.dfp.buildVideoUrl`](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html) will not be able to generate a videoCacheKey, and it will be dropped from the auction. +* If `pbjs.setConfig({cache: {URL}})` is defined and the bidder responds with `bid.videoCacheKey`, Prebid.js will not re-cache the VAST XML. +* If `options.url` is passed as an argument to [`pbjs.adServers.dfp.buildVideoUrl`](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html): + * If Prebid Cache is disabled, Prebid sets `description_url` field to the bid response's `bid.vastUrl`. + * If Prebid Cache is enabled, Prebid sets `description_url` field to the cache URL. #### Notes on multiple video advertisements on one page @@ -195,19 +196,20 @@ If you have [set up your ad server line items and creatives correctly]({{site.ba Below, find links to end-to-end "working examples" integrating Prebid.js demand with various video players: ### Using client-side adapters -+ [Akamai AMP]({{site.github.url}}/examples/video/instream/akamai/pb-ve-amp.html) -+ [Brid]({{site.github.url}}/examples/video/instream/brid/pb-ve-brid.html) -+ [Brightcove]({{site.github.url}}/examples/video/instream/brightcove/pb-ve-brightcove.html) -+ [Flowplayer]({{site.github.url}}/examples/video/instream/flowplayer/pb-ve-flowplayer.html) -+ [JWPlayer - Platform]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html) -+ [JWPlayer - Hosted]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html) -+ [Kaltura]({{site.github.url}}/examples/video/instream/kaltura/pb-ve-kaltura.html) -+ [Ooyala]({{site.github.url}}/examples/video/instream/ooyala/pb-ve-ooyala.html) -+ [VideoJS]({{site.github.url}}/examples/video/instream/videojs/pb-ve-videojs.html) -+ [Instream and Banner Mixed](/dev-docs/examples/instream-banner-mix.html) + +* [Akamai AMP]({{site.github.url}}/examples/video/instream/akamai/pb-ve-amp.html) +* [Brid]({{site.github.url}}/examples/video/instream/brid/pb-ve-brid.html) +* [Brightcove]({{site.github.url}}/examples/video/instream/brightcove/pb-ve-brightcove.html) +* [Flowplayer]({{site.github.url}}/examples/video/instream/flowplayer/pb-ve-flowplayer.html) +* [JWPlayer - Platform]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html) +* [JWPlayer - Hosted]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html) +* [Kaltura]({{site.github.url}}/examples/video/instream/kaltura/pb-ve-kaltura.html) +* [Ooyala]({{site.github.url}}/examples/video/instream/ooyala/pb-ve-ooyala.html) +* [VideoJS]({{site.github.url}}/examples/video/instream/videojs/pb-ve-videojs.html) +* [Instream and Banner Mixed](/dev-docs/examples/instream-banner-mix.html) ## Related Topics -+ [Setting up Prebid Video in Google Ad Manager]({{site.baseurl}}/adops/setting-up-prebid-video-in-dfp.html) +* [Setting up Prebid Video in Google Ad Manager]({{site.baseurl}}/adops/setting-up-prebid-video-in-dfp.html)
    diff --git a/dev-docs/testing-prebid.md b/dev-docs/testing-prebid.md index 9706a054cd..97168f7182 100644 --- a/dev-docs/testing-prebid.md +++ b/dev-docs/testing-prebid.md @@ -4,14 +4,13 @@ layout: page_v2 title: Testing Prebid.js description: How to write tests for the Prebid.js library pid: 199 - top_nav_section: dev_docs - ---
    # Testing Prebid.js + {: .no_toc} Starting on 21 June 2016, all pull requests to the Prebid.js library will need to include tests with greater than 80% code coverage for any changed/added code before they can be merged into master. @@ -27,68 +26,67 @@ This page describes how to test code in the Prebid.js repository to help prepare When you are adding code to Prebid.js, or modifying code that isn't covered by an existing test, test the code according to these guidelines: -- If the module you are working on is already partially tested by a file within the `test` directory, add tests to that file -- If the module does not have any tests, create a new test file -- Group tests in a `describe` block -- Test individual units of code within an `it` block -- Within an `it` block, it may be helpful to use the "Arrange-Act-Assert" pattern - - _Arrange_: set up necessary preconditions and inputs - - e.g., creating objects, spies, etc. - - _Act_: call or act on the unit under test - - e.g., call the function you are testing with the parameters you set up - - _Assert_: check that the expected results have occurred - - e.g., use Chai assertions to check that the expected output is equal to the actual output -- Test the public interface, not the internal implementation -- If using global `pbjs` data structures in your test, take care to not completely overwrite them with your own data as that may affect other tests relying on those structures, e.g.: - - **OK**: `pbjs._bidsRequested.push(bidderRequestObject);` - - **NOT OK**: `pbjs._bidsRequested = [bidderRequestObject];` -- If you need to check `adloader.loadScript` in a test, use a `stub` rather than a `spy`. `spy`s trigger a network call which can result in a `script error` and cause unrelated unit tests to fail. `stub`s will let you gather information about the `adloader.loadScript` call without affecting external resources - -- When writing tests you may use ES2015 syntax if desired +* If the module you are working on is already partially tested by a file within the `test` directory, add tests to that file +* If the module does not have any tests, create a new test file +* Group tests in a `describe` block +* Test individual units of code within an `it` block +** Within an `it` block, it may be helpful to use the "Arrange-Act-Assert" pattern + * _Arrange_: set up necessary preconditions and inputs + * e.g., creating objects, spies, etc. + * _Act_: call or act on the unit under test + * e.g., call the function you are testing with the parameters you set up + * _Assert_: check that the expected results have occurred + * e.g., use Chai assertions to check that the expected output is equal to the actual output +* Test the public interface, not the internal implementation +* If using global `pbjs` data structures in your test, take care to not completely overwrite them with your own data as that may affect other tests relying on those structures, e.g.: + * **OK**: `pbjs._bidsRequested.push(bidderRequestObject);` + * **NOT OK**: `pbjs._bidsRequested = [bidderRequestObject];` +* If you need to check `adloader.loadScript` in a test, use a `stub` rather than a `spy`. `spy`s trigger a network call which can result in a `script error` and cause unrelated unit tests to fail. `stub`s will let you gather information about the `adloader.loadScript` call without affecting external resources +* When writing tests you may use ES2015 syntax if desired ## Running tests After checking out the Prebid.js repository and installing dev dependencies with `npm install`, use the following commands to run tests as you are working on code: -- `gulp test` will run the test suite once (`npm test` is aliased to call `gulp test`) -- `gulp serve` will run tests once and stay open, re-running tests whenever a file in the `src` or `test` directory is modified +* `gulp test` will run the test suite once (`npm test` is aliased to call `gulp test`) +* `gulp serve` will run tests once and stay open, re-running tests whenever a file in the `src` or `test` directory is modified ## Checking results and code coverage Check the test results using these guidelines: -- Look at the total number of tests run, passed, and failed (shown below the rainbow Nyan Cat in the shell window). -- If all tests are passing, great. -- Otherwise look for errors printed in the console for a description of the failing test. -- You may need to iterate on your code or tests until all tests are passing. -- Make sure existing tests still pass. -- There is a table below the testing report that shows code coverage percentage, for each file under the `src` directory. -- Each time you run tests, a code coverage report is generated in `build/coverage/lcov/lcov-report/index.html`. -- This is a static HTML page that you can load in your browser. -- On that page, navigate to the file you are testing to see which lines are being tested. -- Red indicates that a line isn't covered by a test. -- Gray indicates a line that doesn't need coverage, such as a comment or blank line. -- Green indicates a line that is covered by tests. -- The code you have added or modified must have greater than 80% coverage to be accepted. +* Look at the total number of tests run, passed, and failed (shown below the rainbow Nyan Cat in the shell window). +* If all tests are passing, great. +* Otherwise look for errors printed in the console for a description of the failing test. +* You may need to iterate on your code or tests until all tests are passing. +* Make sure existing tests still pass. +* There is a table below the testing report that shows code coverage percentage, for each file under the `src` directory. +* Each time you run tests, a code coverage report is generated in `build/coverage/lcov/lcov-report/index.html`. +* This is a static HTML page that you can load in your browser. +* On that page, navigate to the file you are testing to see which lines are being tested. +* Red indicates that a line isn't covered by a test. +* Gray indicates a line that doesn't need coverage, such as a comment or blank line. +* Green indicates a line that is covered by tests. +* The code you have added or modified must have greater than 80% coverage to be accepted. ## Examples Prebid.js already has lots of tests. Read them to see how Prebid.js is tested, and for inspiration: -- Look in `test/spec` and its subdirectories -- Tests for bidder adaptors are located in `test/spec/adapters` +* Look in `test/spec` and its subdirectories +* Tests for bidder adaptors are located in `test/spec/adapters` A test module might have the following general structure: -{% highlight js %} +```javascript // Import or require modules necessary for the test, e.g.: import { expect } from 'chai'; // may prefer 'assert' in place of 'expect' -import adapter from 'src/adapters/'; +import adapter from 'src/adapters/[adapter]'; -describe('', () => { +describe('[Adapter]', () => { - it('', () => { + it('[description of unit or feature being tested]', () => { // Arrange - set up preconditions and inputs // Act - call or act on the code under test // Assert - use chai to check that expected results have occurred @@ -98,14 +96,14 @@ describe('', () => { }); -{% endhighlight %} +``` ## Resources The Prebid.js testing stack contains some of the following tools. It may be helpful to consult their documentation during the testing process. -- [Mocha - test framework](https://mochajs.org/) -- [Chai - BDD/TDD assertion library](https://chaijs.com/) -- [Sinon - spy, stub, and mock library](https://sinonjs.org/) +* [Mocha - test framework](https://mochajs.org/) +* [Chai - BDD/TDD assertion library](https://chaijs.com/) +* [Sinon - spy, stub, and mock library](https://sinonjs.org/)
    diff --git a/dev-docs/troubleshooting-tips.md b/dev-docs/troubleshooting-tips.md index 1b2375c9e1..45b47efd77 100644 --- a/dev-docs/troubleshooting-tips.md +++ b/dev-docs/troubleshooting-tips.md @@ -11,6 +11,7 @@ sidebarType: 1 # Tips for Troubleshooting + {:.no_toc} Moved to [the PBJS Troubleshooting Guide](/troubleshooting/troubleshooting-guide.html). diff --git a/dev-docs/vendor-billing.md b/dev-docs/vendor-billing.md index 9dc0bf9f7a..ce22b26d35 100644 --- a/dev-docs/vendor-billing.md +++ b/dev-docs/vendor-billing.md @@ -6,6 +6,7 @@ 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. @@ -16,7 +17,7 @@ In order to emit events, **RTD** modules simply need to utilize the existing Eve 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** +### Event Payload Parameters There are two parameters that emitters of this event must supply. Other parameters may be supplied as desired by the application. @@ -28,28 +29,31 @@ There are two parameters that emitters of this event must supply. Other paramete For example, a RTD module could emit an event like this: +```javascript +events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, { + vendor: 'vendorA', + billingId: generateUUID(), + type: 'ad_request', + transactionId: transactionId, + auctionId: auctionId +}) ``` - 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: - ... + +```javascript +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/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html b/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html index 9b5f087581..55d8d70b81 100644 --- a/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html +++ b/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html @@ -8,11 +8,11 @@ ---
    -
    -
    -

    {{ page.title }}

    -

    {{page.description }}

    -
    +
    +
    +

    {{ page.title }}

    +

    {{page.description }}

    +

    (Sorry, video code examples aren't available with your cookie privacy settings.)

    @@ -154,11 +154,11 @@

    Place this code in the page body.

    OneTrust.InsertHtml(exampleHTML, 'videoExample', null, {deleteSelectorContent: true}, 'C0003'); }) -
    +
    - + - + diff --git a/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html b/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html index 26fb0faa8d..936406e1f4 100644 --- a/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html +++ b/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html @@ -10,11 +10,11 @@
    -
    -
    -

    {{ page.title }}

    -

    {{page.description }}

    -
    +
    +
    +

    {{ page.title }}

    +

    {{page.description }}

    +

    (Sorry, video code examples aren't available with your cookie privacy settings.)

    @@ -151,7 +151,7 @@

    Place this code in the page body.

    `; -
    +
    -
    + - - + diff --git a/examples/video/long-form/long-form-video-with-freewheel.html b/examples/video/long-form/long-form-video-with-freewheel.html index 1917fd8d4f..5d9324187d 100644 --- a/examples/video/long-form/long-form-video-with-freewheel.html +++ b/examples/video/long-form/long-form-video-with-freewheel.html @@ -15,11 +15,11 @@ - - +